PageSourceSearch

https://trailence.org/chunk-Ck3tvMkc.js

js trailence.org collected 2026-09-24 15:11:24 UTC 5,151 bytes, 1 lines download raw bytes

1import"./chunk-s0wiiGIr.js";import{t as _}from"./chunk-B7GYYPiL.js";import{D as Gl,Y as Ne,Zt as _g,kn as gs,or as ot,rn as b,s as Bg,u as Cg,xt as Ug}from"./chunk-hDFLhPjY.js";import"./chunk-FC6QOr9W.js";import"./chunk-CliYzLcJ.js";import"./chunk-CcZ3toaq.js";import"./chunk-rZVfv4j_.js";import"./chunk-zDu33c0T.js";import"./chunk-CvaPAsOr.js";import"./chunk-BVtY32wR.js";import"./chunk-CABSGZFi.js";import"./chunk-DD_7l2Gm.js";import"./chunk-DvgwK5vQ.js";import{a as nt,n as O,o as w,r as P}from"./chunk-OfVixYYr.js";import"./chunk-CCKOTdxL.js";import{x as Vi,y as Tn}from"./main-N5A2UYE4.js";import"./chunk-CUE-5jAO.js";import{F as de,K as Pt,N as be,ft as O$1,o as Fe,t as $e,x as fe}from"./chunk-C5uwmGBb.js";import"./chunk-DANXAhNr.js";import"./chunk-ApEGa6EG.js";import"./chunk-CJbVWNpS.js";import"./chunk-Cf0m4eJf.js";import"./chunk-DwJ-SRIz2.js";import{t as G}from"./chunk-KBBZq5hI2.js";var A=class extends G{constructor(t){super(t,`outdooractive`,`outdooractive`,`id`,`id`),this.name=`Outdoor Active`,this.owner=`outdooractive`,this.canFetchFromUrl=!0}getTrailenceUrlFromUrl(t){let e=this.idFromUrl(t);if(e)return`/trail/outdooractive/`+e}canFetchTrailInfoByUrl(t){return this.idFromUrl(t)!==void 0}fetchTrailInfoByUrl(t){let e=this.idFromUrl(t);return e?this.tableInfos.get(e).then(i=>i?i.info:_g(this.requestTrailsByIds([e])).then(a=>a.length===0?null:a[0].info)):Promise.resolve(null)}idFromUrl(t){if(!t.startsWith(`https://www.outdooractive.com/`)||(t=t.substring(29),!t.includes(`/route/`)&&!t.includes(`/track/`)&&!t.includes(`/routes/`)&&!t.includes(`/tracks/`)))return;let e=t.indexOf(`?`);e>0&&(t=t.substring(0,e)),e=t.indexOf(`#`),e>0&&(t=t.substring(0,e)),t.endsWith(`/`)&&(t=t.substring(0,t.length-1)),t=t.substring(1),e=t.lastIndexOf(`/`);let i=t.substring(e+1);if(!Number.isNaN(Number.parseInt(i)))return i}canFetchTrailByUrl(t){return this.canFetchTrailInfoByUrl(t)}fetchTrailByUrl(t){let e=this.idFromUrl(t);return e?this.tableTrails.get(e).then(i=>i?new fe(i):_g(this.requestTrailsByIds([e])).then(a=>a.length===0?null:a[0].trail)):(_.info(`Outdoor active: cannot determine ID from url: `,t),Promise.resolve(null))}canSearchByArea(){return!0}searchByArea(t,e){return this.injector.get(O).get(w.apiBaseUrl+`/search-trails/v1/outdooractive?lat=`+t.getCenter().lat+`&lng=`+t.getCenter().lng+`&radius=`+Math.floor(Math.max(t.getNorthEast().distanceTo(t.getSouthEast()),t.getNorthEast().distanceTo(t.getNorthWest())))+`&limit=`+e).pipe(Gl(i=>Ne(this.tableMetadata.bulkGet(i.map(a=>a+`-original`))).pipe(Gl(a=>new b(r=>{let n=a.filter(o=>o?.bounds&&O$1(o.bounds).overlaps(t)),l=P(a.map((o,s)=>o?void 0:i[s]));if(n.length===0&&l.length===0){r.next({trails:[],end:!0,tooManyResults:!1}),r.complete();return}let d=[];n.length>0&&d.push(Ne(this.tableTrails.bulkGet(n.map(o=>o.uuid.substring(0,o.uuid.length-9))).then(o=>P(o).map(s=>new fe(s))))),l.length>0&&d.push(...Tn.chunk(l,5).map(o=>this.fetchTrailsByIds$(o,5).pipe(ot(s=>s.filter(u=>u.metadata.bounds&&t.overlaps(u.metadata.bounds)).map(u=>u.trail)))));let c=0;Bg(...d).subscribe(o=>{let s=++c===d.length;r.next({trails:o,end:s,tooManyResults:i.length>=e}),s&&r.complete()})})))))}fetchTrailsByIds$(t,e=10){return t.length===0?Cg([]):Ug(Tn.chunk(t,e).map(i=>this.requestTrailsByIds(i).pipe(gs(a=>e>1?this.fetchTrailsByIds$(i,1):Cg([]))))).pipe(ot(i=>i.flat()))}requestTrailsByIds(t){return this.injector.get(O).post(w.apiBaseUrl+`/search-trails/v1/outdooractive/trails?lang=`+this.injector.get(Vi).preferences.lang,t).pipe(ot(e=>{let i=e.map(r=>{let n=new fe({owner:this.owner,uuid:r.id,name:r.title??void 0,description:r.description??void 0,activity:r.activity??void 0,originalTrackUuid:r.id+`-original`,currentTrackUuid:r.id+`-original`,collectionUuid:this.owner,sourceType:Fe.EXTERNAL,source:`https://www.outdooractive.com/routes/`+r.id,sourceDate:Date.now()}),l=new Pt({owner:this.owner,uuid:r.id},!1,this.injector.get(Vi),this.injector.get(be),this.injector.get(de),this.injector.get($e),this.injector.get(nt));return l.newSegment().appendMany(r.points.map((c,o)=>({pos:{lat:c.lat,lng:c.lng},ele:c.ele,time:c.time??(o===0?r.date??void 0:void 0)}))),this.prepareTrailToStore(n,l,r.id)}),a=e.map(r=>({id:r.id,fetchDate:Date.now(),info:{key:r.id,externalUrl:`https://www.outdooractive.com/routes/`+r.id,photos:r.photos?.map(n=>({url:`https://img1.oastatic.com/img2/`+n.id+`/800x800/variant.jpg`,description:n.title,pos:n.point?{lat:n.point.lat,lng:n.point.lng}:void 0,time:n.point?.time})),rating:r.rating??void 0}}));return this.storeTrails(i),this.tableInfos.bulkPut(a),a.map((r,n)=>({trail:i[n].trail,metadata:i[n].currentMetadata??i[n].originalMetadata,info:r.info}))}),gs(e=>(_.error(`Error retrieving trails from Outdoor Active`,e),Cg([]))))}fetchPhoto(t){if(!t.startsWith(`https://img1.oastatic.com/img2/`))return Promise.resolve(void 0);let e=t.substring(31),i=e.indexOf(`/`);return i<=0?Promise.resolve(void 0):(e=e.substring(0,i),_g(this.injector.get(O).getBlob(w.apiBaseUrl+`/search-trails/v1/outdooractive/photo?id=`+e+`&size=800x800`)))}fetchTrailById(t){return _g(this.requestTrailsByIds([t])).then(e=>e.length===0?null:e[0].trail)}};export{A as OutdoorPlugin};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.