diff --git a/dist/worker.js b/dist/worker.js index 98ea89a..61e26f1 100644 --- a/dist/worker.js +++ b/dist/worker.js @@ -1,4 +1,4 @@ -!function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){(function(t){const e=r(6),n=r(7),i=r(8);addEventListener("fetch",t=>{t.respondWith(async function(t){const r=new e;r.get("/track/.*",()=>u("track",t)),r.get("/album/.*",()=>u("album",t)),r.get("/playlist/.*",()=>u("playlist",t));return await r.route(t)}(t.request))});const o=[106,111,54,97,101,121,54,104,97,105,100,50,84,101,105,104];function s(t){return Array.from(t).map((function(t){return t.charCodeAt(0)}))}const a={64:"10",128:"1",320:"3",flac:"9",misc:"0"};async function u(e,r){if(access_token=await KV.get("access_token"),null===access_token){const t=await fetch("https://connect.deezer.com/oauth/access_token.php?grant_type=client_credentials&client_id=447462&client_secret=a83bf7f38ad2f137e444727cfc3775cf&output=json"),e=await t.json();if(void 0!==e.error)return new Response("Couldn't get access token from Deezer",{status:500,headers:{"content-type":"text/plain"}});access_token=e.access_token,await KV.put("access_token",access_token,{expirationTtl:Number(e.expires)})}const n=new URL(r.url),o=n.pathname.split("/")[2];if(""===o)return new Response("ID needs to be specified",{status:400,headers:{"content-type":"text/plain"}});if(format=n.searchParams.get("f"),null===format)format="320";else if(format=format.toLowerCase(),void 0===a[format]){if(index=Object.values(a).indexOf(format),-1===index)return new Response("Invalid format",{status:400,headers:{"content-type":"text/plain"}});format=Object.keys(a)[index]}var s=n.searchParams.get("t");switch(s=("true"===s||"1"===s)&&"flac"!==format,e){case"track":return await async function(e,r,n,o){const s=await fetch(`https://api.deezer.com/track/${e}?access_token=${n}`),a=await s.json();if(void 0!==a.error)return new Response(JSON.stringify(a.error),{status:403,headers:{"content-type":"application/json"}});if(result=await h(a,r),"object"==typeof result)return result;if(o){const e=await fetch(result);if(200!==e.status)return new Response("Couldn't get track stream",{status:403,headers:{"content-type":"text/plain"}});const r=new i(t.alloc(0));if(r.padding=0,r.setFrame("TIT2",a.title).setFrame("TALB",a.album.title).setFrame("TPE2",a.artist.name),void 0!==a.contributors){contr_list=[];for(const t of a.contributors)contr_list.push(t.name);r.setFrame("TPE1",contr_list)}if(void 0!==a.track_position&&r.setFrame("TRCK",a.track_position),void 0!==a.disk_number&&r.setFrame("TPOS",a.disk_number),""!==a.isrc&&r.setFrame("TSRC",a.isrc),void 0!==a.bpm&&r.setFrame("TBPM",a.bpm),void 0!==a.release_date){const t=a.release_date.split("-");r.setFrame("TYER",t[0]),r.setFrame("TDAT",t[2]+t[1])}if(""!==a.md5_image){const t=`https://cdns-images.dzcdn.net/images/cover/${a.md5_image}/1000x1000-000000-80-0-0.jpg`,e=await fetch(t),n=await e.arrayBuffer();r.setFrame("APIC",{type:3,data:n,description:"cover"})}r.addTag();let{readable:n,writable:o}=new TransformStream;const s=o.getWriter();return s.write(r.arrayBuffer),s.releaseLock(),e.body.pipeTo(o),new Response(n,{status:200,headers:{"content-type":"audio/mpeg"}})}return new Response(null,{status:302,headers:{location:result}})}(o,format,access_token,s);case"album":case"playlist":return await async function(t,e,r,n,i){const o=await fetch(`https://api.deezer.com/${t}/${e}?access_token=${n}&limit=-1`),s=await o.json();if(void 0!==s.error)return new Response(JSON.stringify(s.error),{status:403,headers:{"content-type":"application/json"}});var a="#EXTM3U\n";for(const t of s.tracks.data){let e;if(i)t.id<0&&(r="misc"),e=`https://dz.uhwot.workers.dev/track/${t.id}?f=${r}&t=1`;else if(e=await h(t,r),"object"==typeof e)return e;a+=`#EXTINF:${t.duration},${t.title}\n${e}\n`}return new Response(a,{status:200,headers:{"content-type":"audio/mpegurl"}})}(e,o,format,access_token,s)}}async function h(t,e){const r=t.id,i=t.md5_origin,u=t.media_version;return r<0&&(e="misc"),"0"===t["filesize_"+e]?new Response("Format unavailable",{status:403,headers:{"content-type":"text/plain"}}):(e=a[e],await async function(t,e,r,i){const a=new n.ModeOfOperation.ecb(o);let u=[t,e,r,i].join("¤"),h=await crypto.subtle.digest("MD5",new Uint8Array(s(u)));return h=n.utils.hex.fromBytes(new Uint8Array(h)),u=h+"¤"+u+"¤",u.length%16&&(u+="\0".repeat(16-u.length%16)),u=n.utils.hex.fromBytes(a.encrypt(s(u))),`https://cdns-proxy-${t[0]}.dzcdn.net/api/1/${u}`}(i,e,r,u))}}).call(this,r(1).Buffer)},function(t,e,r){"use strict";(function(t){ +!function(t){var e={};function r(n){if(e[n])return e[n].exports;var i=e[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}r.m=t,r.c=e,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)r.d(n,i,function(e){return t[e]}.bind(null,i));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,r){(function(t){const e=r(6),n=r(7),i=r(8);addEventListener("fetch",t=>{t.respondWith(async function(t){const r=new e;r.get("/track/.*",()=>u("track",t)),r.get("/album/.*",()=>u("album",t)),r.get("/playlist/.*",()=>u("playlist",t));return await r.route(t)}(t.request))});const o=[106,111,54,97,101,121,54,104,97,105,100,50,84,101,105,104];function s(t){return Array.from(t).map((function(t){return t.charCodeAt(0)}))}const a={64:"10",128:"1",320:"3",flac:"9",misc:"0"};async function u(e,r){if(access_token=await KV.get("access_token"),null===access_token){const t=await fetch("https://connect.deezer.com/oauth/access_token.php?grant_type=client_credentials&client_id=447462&client_secret=a83bf7f38ad2f137e444727cfc3775cf&output=json"),e=await t.json();if(void 0!==e.error)return new Response("Couldn't get access token from Deezer",{status:500,headers:{"content-type":"text/plain"}});access_token=e.access_token,await KV.put("access_token",access_token,{expirationTtl:Number(e.expires)})}const n=new URL(r.url),o=n.pathname.split("/")[2];if(""===o)return new Response("ID needs to be specified",{status:400,headers:{"content-type":"text/plain"}});if(format=n.searchParams.get("f"),null===format)format="320";else if(format=format.toLowerCase(),void 0===a[format]){if(index=Object.values(a).indexOf(format),-1===index)return new Response("Invalid format",{status:400,headers:{"content-type":"text/plain"}});format=Object.keys(a)[index]}var s=n.searchParams.get("t");switch(s=("true"===s||"1"===s)&&"flac"!==format,e){case"track":return await async function(e,r,n,o){const s=await fetch(`https://api.deezer.com/track/${e}?access_token=${n}`),a=await s.json();if(void 0!==a.error)return new Response(JSON.stringify(a.error),{status:403,headers:{"content-type":"application/json"}});if(result=await h(a,r),"object"==typeof result)return result;if(o){const e=await fetch(result);if(200!==e.status)return new Response("Couldn't get track stream",{status:403,headers:{"content-type":"text/plain"}});const r=new i(t.alloc(0));if(r.padding=0,r.setFrame("TIT2",a.title).setFrame("TALB",a.album.title).setFrame("TPE2",a.artist.name),void 0!==a.contributors){contr_list=[];for(const t of a.contributors)contr_list.push(t.name);r.setFrame("TPE1",contr_list)}if(void 0!==a.track_position&&r.setFrame("TRCK",a.track_position),void 0!==a.disk_number&&r.setFrame("TPOS",a.disk_number),""!==a.isrc&&r.setFrame("TSRC",a.isrc),void 0!==a.bpm&&r.setFrame("TBPM",a.bpm),void 0!==a.release_date){const t=a.release_date.split("-");r.setFrame("TYER",t[0]),r.setFrame("TDAT",t[2]+t[1])}if(""!==a.md5_image){const t=`https://cdns-images.dzcdn.net/images/cover/${a.md5_image}/1000x1000-000000-80-0-0.jpg`,e=await fetch(t),n=await e.arrayBuffer();r.setFrame("APIC",{type:3,data:n,description:"cover"})}r.addTag();let{readable:n,writable:o}=new TransformStream;const s=o.getWriter();return s.write(r.arrayBuffer),s.releaseLock(),e.body.pipeTo(o),new Response(n,{status:200,headers:{"content-type":"audio/mpeg"}})}return new Response(null,{status:302,headers:{location:result}})}(o,format,access_token,s);case"album":case"playlist":return await async function(t,e,r,n,i){const o=await fetch(`https://api.deezer.com/${t}/${e}?access_token=${n}&limit=-1`),s=await o.json();if(void 0!==s.error)return new Response(JSON.stringify(s.error),{status:403,headers:{"content-type":"application/json"}});var a="#EXTM3U\n";for(const t of s.tracks.data){let e;if(i)t.id<0&&(r="misc"),e=`https://dz.uhwot.workers.dev/track/${t.id}?f=${r}&t=1`;else if(e=await h(t,r),"object"==typeof e)return e;a+=`#EXTINF:${t.duration},${t.title}\n${e}\n`}return new Response(a,{status:200,headers:{"content-type":"audio/mpegurl"}})}(e,o,format,access_token,s)}}async function h(t,e){t.alternative&&(t=t.alternative);const r=t.id,i=t.md5_origin,u=t.media_version;return r<0&&(e="misc"),"0"===t["filesize_"+e]?new Response("Format unavailable",{status:403,headers:{"content-type":"text/plain"}}):(e=a[e],await async function(t,e,r,i){const a=new n.ModeOfOperation.ecb(o);let u=[t,e,r,i].join("¤"),h=await crypto.subtle.digest("MD5",new Uint8Array(s(u)));return h=n.utils.hex.fromBytes(new Uint8Array(h)),u=h+"¤"+u+"¤",u.length%16&&(u+="\0".repeat(16-u.length%16)),u=n.utils.hex.fromBytes(a.encrypt(s(u))),`https://cdns-proxy-${t[0]}.dzcdn.net/api/1/${u}`}(i,e,r,u))}}).call(this,r(1).Buffer)},function(t,e,r){"use strict";(function(t){ /*! * The buffer module from node.js, for the browser. * diff --git a/index.js b/index.js index d76649f..bccdc8c 100644 --- a/index.js +++ b/index.js @@ -173,6 +173,11 @@ async function track(id, format, access_token, tagging) { } async function track_url(json, format) { + // needed if track has fallback, like https://www.deezer.com/track/1398759152 + if (json.alternative) { + json = json.alternative + } + const id = json.id const md5_origin = json.md5_origin const media_version = json.media_version