playlist-data-engine 1.5.9 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -6
- package/dist/__vite-browser-external-BcPniuRQ.cjs +1 -0
- package/dist/analysis.d.ts +27 -0
- package/dist/analysis.d.ts.map +1 -0
- package/dist/analysis.js +2 -0
- package/dist/analysis.mjs +7518 -0
- package/dist/arweaveGatewayManager-C9SIMDTd.cjs +1 -0
- package/dist/arweaveGatewayManager-DDSO5sLJ.js +1458 -0
- package/dist/core/parser/MetadataExtractor.d.ts +57 -3
- package/dist/core/parser/MetadataExtractor.d.ts.map +1 -1
- package/dist/core/parser/PlaylistParser.d.ts.map +1 -1
- package/dist/core/parser/TrackExtras.d.ts +23 -0
- package/dist/core/parser/TrackExtras.d.ts.map +1 -1
- package/dist/core/types/Playlist.d.ts +4 -1
- package/dist/core/types/Playlist.d.ts.map +1 -1
- package/dist/essentia-wasm.es-7mXF1zkQ.cjs +38 -0
- package/dist/essentia.js-model.es-h47asA0k.cjs +1 -0
- package/dist/gateway-CtmUPK4J.cjs +1 -0
- package/dist/gateway-PjLtANkX.js +662 -0
- package/dist/gateway.d.ts +19 -0
- package/dist/gateway.d.ts.map +1 -0
- package/dist/gateway.js +1 -0
- package/dist/gateway.mjs +20 -0
- package/dist/index.browser-g8_n-BSM.cjs +13 -0
- package/dist/index.d.ts +1 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/playlist-data-engine.js +65 -118
- package/dist/playlist-data-engine.mjs +10450 -29997
- package/dist/unifyBeatMap-DIsNlck4.cjs +4 -0
- package/dist/unifyBeatMap-k6vw_JPQ.js +10234 -0
- package/dist/utils/arweaveGatewayManager.d.ts +18 -3
- package/dist/utils/arweaveGatewayManager.d.ts.map +1 -1
- package/dist/utils/arweaveUtils.d.ts +29 -0
- package/dist/utils/arweaveUtils.d.ts.map +1 -1
- package/dist/utils/playlistUtils.d.ts.map +1 -1
- package/package.json +45 -31
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var m=function(a,t){return m=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var s in r)r.hasOwnProperty(s)&&(e[s]=r[s])},m(a,t)};function p(a,t){m(a,t);function e(){this.constructor=a}a.prototype=t===null?Object.create(t):(e.prototype=t.prototype,new e)}function c(a,t,e,r){return new(e||(e=Promise))(function(s,n){function o(i){try{u(r.next(i))}catch(f){n(f)}}function l(i){try{u(r.throw(i))}catch(f){n(f)}}function u(i){i.done?s(i.value):new e(function(f){f(i.value)}).then(o,l)}u((r=r.apply(a,[])).next())})}function h(a,t){var e={label:0,sent:function(){if(n[0]&1)throw n[1];return n[1]},trys:[],ops:[]},r,s,n,o;return o={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function l(i){return function(f){return u([i,f])}}function u(i){if(r)throw new TypeError("Generator is already executing.");for(;e;)try{if(r=1,s&&(n=i[0]&2?s.return:i[0]?s.throw||((n=s.return)&&n.call(s),0):s.next)&&!(n=n.call(s,i[1])).done)return n;switch(s=0,n&&(i=[i[0]&2,n.value]),i[0]){case 0:case 1:n=i;break;case 4:return e.label++,{value:i[1],done:!1};case 5:e.label++,s=i[1],i=[0];continue;case 7:i=e.ops.pop(),e.trys.pop();continue;default:if(n=e.trys,!(n=n.length>0&&n[n.length-1])&&(i[0]===6||i[0]===2)){e=0;continue}if(i[0]===3&&(!n||i[1]>n[0]&&i[1]<n[3])){e.label=i[1];break}if(i[0]===6&&e.label<n[1]){e.label=n[1],n=i;break}if(n&&e.label<n[2]){e.label=n[2],e.ops.push(i);break}n[2]&&e.ops.pop(),e.trys.pop();continue}i=t.call(a,e)}catch(f){i=[6,f],s=0}finally{r=n=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}}var y=(function(){function a(t,e,r){if(e===void 0&&(e="musicnn"),r===void 0&&(r=!1),this.essentia=null,this.module=null,this.frameSize=512,this.sampleRate=16e3,this.extractorType=e,this.extractorType==="musicnn")this.frameSize=512;else if(this.extractorType==="vggish")this.frameSize=400;else if(this.extractorType==="tempocnn")this.frameSize=1024;else throw Error("Invalid 'extractorType' choice! Available types are [musicnn', 'vggish', 'tempocnn']");this.essentia=new t.EssentiaJS(r),this.module=t}return a.prototype.arrayToVector=function(t){return this.module.arrayToVector(t)},a.prototype.vectorToArray=function(t){return this.module.vectorToArray(t)},a.prototype.getAudioBufferFromURL=function(t,e){return c(this,void 0,void 0,function(){var r,s,n;return h(this,function(o){switch(o.label){case 0:return[4,fetch(t)];case 1:return r=o.sent(),[4,r.arrayBuffer()];case 2:return s=o.sent(),[4,e.decodeAudioData(s)];case 3:return n=o.sent(),[2,n]}})})},a.prototype.audioBufferToMonoSignal=function(t){if(t.numberOfChannels===1)return t.getChannelData(0);if(t.numberOfChannels===2){var e=this.arrayToVector(t.getChannelData(0)),r=this.arrayToVector(t.getChannelData(1)),s=this.essentia.MonoMixer(e,r).audio;return this.vectorToArray(s)}throw new Error("Unexpected number of channels found in audio buffer. Only accepts mono or stereo audio buffers.")},a.prototype.downsampleAudioBuffer=function(t){var e=new OfflineAudioContext(1,t.duration*this.sampleRate,this.sampleRate),r=e.createBuffer(1,t.length,t.sampleRate);r.copyToChannel(this.audioBufferToMonoSignal(t),0);var s=e.createBufferSource();return s.buffer=r,s.connect(e.destination),new Promise(function(n){e.oncomplete=function(o){var l=o.renderedBuffer,u=l.getChannelData(0);n(u)},e.startRendering(),s.start(0)})},a.prototype.compute=function(t){var e;switch(t instanceof Float32Array?e=this.arrayToVector(t):e=t,this.extractorType){case"musicnn":{if(t.length!=this.frameSize)throw new Error("The chosen `extractorType` only works with an audio signal frame size of "+this.frameSize);var r=this.essentia.TensorflowInputMusiCNN(e);return{melSpectrum:this.vectorToArray(r.bands),frameSize:1,patchSize:187,melBandsSize:96}}case"vggish":{if(t.length!=this.frameSize)throw new Error("The chosen `extractorType` only works with an audio signal frame size of 400 "+this.frameSize);var r=this.essentia.TensorflowInputVGGish(e);return{melSpectrum:this.vectorToArray(r.bands),frameSize:1,patchSize:96,melBandsSize:64}}case"tempocnn":{if(t.length!=this.frameSize)throw Error("The chosen `extractorType` only works with an audio signal frame size of "+this.frameSize);var r=this.essentia.TensorflowInputTempoCNN(e);return{melSpectrum:this.vectorToArray(r.bands),frameSize:1,patchSize:256,melBandsSize:40}}default:throw Error("Invalid 'extractorType' choice! Available types are [musicnn', 'vggish', 'tempocnn']")}},a.prototype.computeFrameWise=function(t,e){var r;e?r=e:r=this.frameSize;for(var s=this.essentia.FrameGenerator(t,this.frameSize,r),n=[],o=null,l=0;l<s.size();l++)o=this.compute(this.vectorToArray(s.get(l))),n.push(o.melSpectrum);return o.melSpectrum=n,o.frameSize=s.size(),s.delete(),o},a.prototype.delete=function(){this.essentia.delete()},a.prototype.shutdown=function(){this.essentia.shutdown()},a})();var d=(function(){function a(t,e,r){this.model=null,this.audioSampleRate=16e3,this.tf=null,this.isReady=!1,this.modelPath="",this.IS_TRAIN=null,this.randomTensorInput=null,this.minimumInputFrameSize=null,this.tf=t,this.IS_TRAIN=this.tf.tensor([0],[1],"bool"),this.modelPath=e,this.isReady=!!this.model}return a.prototype.initialize=function(){return c(this,void 0,void 0,function(){var t;return h(this,function(e){switch(e.label){case 0:return t=this,[4,this.tf.loadGraphModel(this.modelPath)];case 1:return t.model=e.sent(),this.isReady=!0,[2]}})})},a.prototype.arrayToTensorAsBatches=function(t,e,r,s){s===void 0&&(s=!1);var n=this.tf.tensor(t,e,"float32"),o,l;return s?e[0]===r?n.as3D(1,r,e[1]):e[0]>r?e[0]%r!=0?(l=Math.floor(e[0]/r)+1,o=this.tf.zeros([Math.floor(l*r-t.length),e[1]],"float32"),n=n.concat(o),o.dispose(),n.as3D(l,r,e[1])):(l=Math.floor(e[0]/r),o=this.tf.zeros([Math.floor(l*r-t.length),e[1]],"float32"),n=n.concat(o),o.dispose(),n.as3D(l,r,e[1])):(l=1,o=this.tf.zeros([r-e[0],e[1]]),n=n.concat(o),o.dispose(),n.as3D(l,r,e[1])):(this.assertMinimumFeatureInputSize({melSpectrum:t,frameSize:e[0],melBandsSize:e[1],patchSize:r}),n.as3D(1,r,e[1]))},a.prototype.dispose=function(){this.model.dispose()},a.prototype.assertMinimumFeatureInputSize=function(t){if(this.minimumInputFrameSize=t.patchSize,t.melSpectrum.length!=this.minimumInputFrameSize)throw Error("When `padding=false` in `predict` method, the model expect audio feature for a minimum frame size of "+this.minimumInputFrameSize+". Was given "+t.melSpectrum.length+" melband frames")},a.prototype.disambiguateExtraInputs=function(){if(!this.isReady)throw Error("No loaded tfjs model found! Make sure to call `initialize` method and resolve the promise before calling `predict` method.");var t=this.model.executor.inputs.length;if(t===1)return[];if(t===2)return[this.IS_TRAIN.clone()];if(t===3)return this.randomTensorInput||(this.randomTensorInput=this.tf.zeros([1,this.model.executor.inputs[0].shape[1]])),[this.randomTensorInput.clone(),this.IS_TRAIN.clone()];throw Error("Found unsupported number of input requirements for the model. Expects the following inputs -> "+this.model.executor.inputs)},a})(),v=(function(a){p(t,a);function t(e,r,s){var n=a.call(this,e,r)||this;return n.minimumInputFrameSize=3,n}return t.prototype.predict=function(e,r){return r===void 0&&(r=!1),c(this,void 0,void 0,function(){var s,n,o,l;return h(this,function(u){switch(u.label){case 0:return s=this.arrayToTensorAsBatches(e.melSpectrum,[e.frameSize,e.melBandsSize],e.patchSize,r),n=this.disambiguateExtraInputs(),n.push(s),o=this.model.execute(n),s.dispose(),[4,o.array()];case 1:return l=u.sent(),o.dispose(),[2,l]}})})},t})(d),T=(function(a){p(t,a);function t(e,r,s){return a.call(this,e,r)||this}return t.prototype.predict=function(e,r){return r===void 0&&(r=!1),c(this,void 0,void 0,function(){var s,n,o,l;return h(this,function(u){switch(u.label){case 0:return s=this.arrayToTensorAsBatches(e.melSpectrum,[e.frameSize,e.melBandsSize],e.patchSize,r),n=this.disambiguateExtraInputs(),n.push(s),o=this.model.execute(n),s.dispose(),[4,o.array()];case 1:return l=u.sent(),o.dispose(),[2,l]}})})},t})(d);exports.EssentiaTFInputExtractor=y;exports.EssentiaTensorflowJSModel=d;exports.TensorflowMusiCNN=v;exports.TensorflowVGGish=T;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";require("./arweaveGatewayManager-C9SIMDTd.cjs");class n{static extractAudioUrl(t){const e=["mp3_url","mp3Url","lossy_audio","lossyAudio","audio_url","audioUrl","audio","lossless_audio","losslessAudio","animation_url","animationUrl","multimedia_url","multimediaUrl"];for(const r of e)if(t[r]&&typeof t[r]=="string")return t[r];return null}static extractAudioUrlLossless(t){const e=["lossless_audio","losslessAudio","wav_url","wavUrl","flac_url","flacUrl","audio_url","audioUrl"];for(const r of e)if(t[r]&&typeof t[r]=="string")return t[r];return null}static extractImageUrl(t){const e=["image_small","imageSmall","image","image_large","imageLarge","image_thumb","imageThumb","image_url","imageUrl","image_uri","imageUri","image_preview","imagePreview"];for(const s of e)if(t[s]&&typeof t[s]=="string")return t[s];const r=[this.extractNestedUri(t,"artwork","uri"),this.extractNestedUri(t,"project","artwork","uri"),this.extractNestedUri(t,"primaryMedia","uri")];for(const s of r)if(s)return s;return null}static extractImageThumbUrl(t){return t.image_thumb_url&&typeof t.image_thumb_url=="string"?t.image_thumb_url:t.image_thumb&&typeof t.image_thumb=="string"?t.image_thumb:null}static extractTitle(t){return t.name&&typeof t.name=="string"?t.name:t.title&&typeof t.title=="string"?t.title:null}static extractArtist(t){const e=["artist","artist_name","artistName","album_artist","albumArtist","created_by","createdBy","minter"];for(const r of e)if(t[r]&&typeof t[r]=="string")return t[r];if(Array.isArray(t.attributes)){const r=t.attributes.find(s=>s.trait_type?.toLowerCase()==="artist"&&s.value!==void 0);if(r&&typeof r.value=="string")return r.value}return null}static parseMetadata(t){if(!t)return null;if(typeof t=="object"&&!Array.isArray(t))return t;if(typeof t=="string")try{const e=JSON.parse(t);if(typeof e=="object"&&!Array.isArray(e))return e}catch(e){return console.warn("Failed to parse metadata:",e),null}return null}static extractGenre(t){if(typeof t.genre=="string")return t.genre;if(Array.isArray(t.genre)&&t.genre.length>0){const r=t.genre[0];return typeof r=="string"?r:""}if(Array.isArray(t.attributes)){const r=t.attributes.find(s=>s.trait_type?.toLowerCase()==="genre"&&s.value!==void 0);if(r){if(typeof r.value=="string")return r.value;if(Array.isArray(r.value)&&r.value.length>0){const s=r.value[0];return typeof s=="string"?s:""}}}if(t.attributes&&typeof t.attributes=="object"&&!Array.isArray(t.attributes)){const r=t.attributes;for(const s of Object.keys(r))if(s.toLowerCase()==="genre"&&typeof r[s]=="string")return r[s]}const e=t["attribute "];if(e&&typeof e=="object"&&!Array.isArray(e)){const r=e.genre;if(typeof r=="string")return r}return""}static extractTags(t){const e=[];if(Array.isArray(t.tags)?e.push(...t.tags):typeof t.tags=="string"&&e.push(...t.tags.split(",")),t.properties&&typeof t.properties=="object"&&!Array.isArray(t.properties)){const r=t.properties.tags;Array.isArray(r)?e.push(...r):typeof r=="string"&&e.push(...r.split(","))}if(Array.isArray(t.attributes))for(const r of t.attributes){if(!r||typeof r!="object")continue;const s=r.trait_type;if(typeof s=="string"&&s.toLowerCase().match(/^tags?$/)){const o=r.value;Array.isArray(o)?e.push(...o):typeof o=="string"&&e.push(...o.split(","))}}else if(t.attributes&&typeof t.attributes=="object"){const r=t.attributes;for(const s of Object.keys(r))if(s.toLowerCase().match(/^tags?$/)){const o=r[s];Array.isArray(o)?e.push(...o):typeof o=="string"&&e.push(...o.split(","))}}return n.normalizeTags(e)}static extractDescription(t){const e=["description","track_description","trackDescription","description_text","descriptionText","desc","blurb"];for(const r of e)if(t[r]&&typeof t[r]=="string")return t[r];if(Array.isArray(t.attributes)){const r=t.attributes.find(s=>s.trait_type?.toLowerCase()==="description"&&typeof s.value=="string");if(r&&typeof r.value=="string")return r.value}return n.deepFindString(t,/description/i)}static extractAlbumDescription(t){const e=["album_description","albumDescription"];for(const s of e)if(t[s]&&typeof t[s]=="string")return t[s];const r=t.album;return r&&typeof r=="object"&&!Array.isArray(r)?n.deepFindString(r,/description|liner|notes/i):null}static extractArtistDescription(t){const e=["artist_description","artistDescription","artist_bio","artistBio"];for(const s of e)if(t[s]&&typeof t[s]=="string")return t[s];const r=t.artist;return r&&typeof r=="object"&&!Array.isArray(r)?n.deepFindString(r,/description|bio|about/i):null}static deepFindString(t,e,r=5){const s=new Set,o=[{node:t,depth:0}];for(;o.length>0;){const{node:u,depth:c}=o.shift();for(const a of Object.keys(u)){const f=u[a];if(typeof f=="string"&&f&&e.test(a))return f}if(!(c>=r))for(const a of Object.keys(u)){const f=u[a];f&&typeof f=="object"&&!Array.isArray(f)&&!s.has(f)&&(s.add(f),o.push({node:f,depth:c+1}))}}return null}static normalizeTags(t){const e=new Set;for(const r of t){if(r==null)continue;const s=String(r).trim().toLowerCase();s&&e.add(s)}return Array.from(e)}static convertAttributes(t){if(!Array.isArray(t))return null;const e={};for(const r of t)r.trait_type&&r.value!==void 0&&(e[r.trait_type]=r.value);return Object.keys(e).length>0?e:null}static extractNestedUri(t,...e){let r=t;for(const s of e)if(r&&typeof r=="object"&&!Array.isArray(r))r=r[s];else return null;return typeof r=="string"?r:null}}function m(i){if("audio_url"in i&&typeof i.audio_url=="string")return i.audio_url;if("metadata"in i){const t=n.parseMetadata(i.metadata);if(t)return n.extractAudioUrl(t)}return null}function b(i){if("audio_url_lossless"in i&&typeof i.audio_url_lossless=="string")return i.audio_url_lossless;if("metadata"in i){const t=n.parseMetadata(i.metadata);if(t)return n.extractAudioUrlLossless(t)}return null}function y(i){if("image_url"in i&&typeof i.image_url=="string")return i.image_url;if("metadata"in i){if("artwork_url"in i&&typeof i.artwork_url=="string")return i.artwork_url;const t=n.parseMetadata(i.metadata);if(t)return n.extractImageUrl(t)}return null}function d(i){if("image_thumb_url"in i&&typeof i.image_thumb_url=="string")return i.image_thumb_url;if("metadata"in i){const t=n.parseMetadata(i.metadata);if(t)return n.extractImageThumbUrl(t)}return null}function _(i){if("metadata"in i){const t=n.parseMetadata(i.metadata);if(t&&typeof t.vrm=="string"&&t.vrm)return t.vrm}return"extras"in i&&i.extras&&typeof i.extras.vrm=="string"&&i.extras.vrm||null}function k(i){const t=[];for(const e of i.tracks){const r=m(e);r&&t.push(r)}return t}function w(i){const t=[];for(const e of i.tracks){const r=y(e);r&&t.push(r)}return t}function T(i){const t=[];for(const e of i.tracks){if("title"in e&&typeof e.title=="string"){t.push(e.title);continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);if(r){const s=n.extractTitle(r);s&&t.push(s)}}}return t}function x(i){const t=[];for(const e of i.tracks){if("artist"in e&&typeof e.artist=="string"){t.push(e.artist);continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);if(r){const s=n.extractArtist(r);s&&t.push(s)}}}return t}function v(i){const t=new Set;for(const e of i.tracks){if("genre"in e&&typeof e.genre=="string"&&e.genre){t.add(e.genre);continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);r&&typeof r.genre=="string"&&r.genre&&t.add(r.genre)}}return Array.from(t).sort()}function U(i){const t=new Set;for(const e of i.tracks){if("tags"in e&&Array.isArray(e.tags)){for(const r of e.tags)r&&t.add(r.toLowerCase());continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);if(r&&Array.isArray(r.tags))for(const s of r.tags)s&&t.add(String(s).toLowerCase())}}return Array.from(t).sort()}function S(i){let t=0;for(const e of i.tracks){if("duration"in e&&typeof e.duration=="number"){t+=e.duration;continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);r&&typeof r.duration=="number"&&(t+=r.duration)}}return t}function F(i){return i.tracks.length}function L(i){const t=[];for(const e of i.tracks){const r=m(e),s=y(e),o=d(e);let u="",c="";if("title"in e)u=e.title||"",c=e.artist||"";else if("metadata"in e){const a=n.parseMetadata(e.metadata);a&&(u=n.extractTitle(a)||"",c=n.extractArtist(a)||"")}if(r){const a={title:u,artist:c,audio_url:r,image_url:s||""},f=b(e);f&&f!==r&&(a.audio_url_lossless=f),o&&(a.image_thumb_url=o),"audio_ipfs_hash"in e&&typeof e.audio_ipfs_hash=="string"&&(a.audio_ipfs_hash=e.audio_ipfs_hash),"artwork_ipfs_hash"in e&&typeof e.artwork_ipfs_hash=="string"&&(a.artwork_ipfs_hash=e.artwork_ipfs_hash),t.push(a)}}return t}function I(i){const t=[];for(const e of i.tracks){if("audio_url"in e){t.push({...e});continue}if("metadata"in e){const r=n.parseMetadata(e.metadata);if(r){const s=n.extractAudioUrlLossless(r),o=n.extractAudioUrl(r);t.push({id:e.chain_name==="AR"?`AR-${e.tx_id}`:`${e.chain_name}-${e.token_address}-${e.token_id}`,chain_name:e.chain_name,token_address:e.token_address,token_id:e.token_id,tx_id:e.tx_id,platform:e.platform,title:n.extractTitle(r),artist:n.extractArtist(r),audio_url:o,image_url:n.extractImageUrl(r),image_thumb_url:n.extractImageThumbUrl(r),duration:r.duration,genre:r.genre,tags:r.tags,bpm:r.bpm,key:r.key,album:r.album,description:r.description,attributes:n.convertAttributes(r.attributes),...s&&s!==o?{audio_url_lossless:s}:{},...e.audio_ipfs_hash?{audio_ipfs_hash:e.audio_ipfs_hash}:{},...e.artwork_ipfs_hash?{artwork_ipfs_hash:e.artwork_ipfs_hash}:{}})}}}return t}function M(i){const t=[];for(const e of i.tracks){const r=_(e);r&&t.push(r)}return t}function P(i){const t=[];for(const e of i.tracks){const r=_(e);if(!r)continue;const s=m(e),o=y(e),u=d(e);let c="",a="";if("title"in e)c=e.title||"",a=e.artist||"";else if("metadata"in e){const p=n.parseMetadata(e.metadata);p&&(c=n.extractTitle(p)||"",a=n.extractArtist(p)||"")}const f={title:c,artist:a,audio_url:s||"",image_url:o||"",vrm:r};u&&(f.image_thumb_url=u),t.push(f)}return t}const l=["ipfs.io","cloudflare-ipfs.com","dweb.link","gateway.pinata.cloud","ipfs.infura.io","nftstorage.link","web3-music-pipeline.mypinata.cloud","soundxyz.mypinata.cloud","gold-broad-gibbon-29.mypinata.cloud","bonfire.mypinata.cloud","spinamp.mypinata.cloud","catalogworks.b-cdn.net","www.heds.cloud"],h="ipfs.io",g="/ipfs/";function A(i){if(!i||typeof i!="string")return null;if(i.startsWith("ipfs://ipfs/"))return i.slice(12);if(i.startsWith("ipfs://"))return i.slice(7);try{const t=new URL(i),{hostname:e,pathname:r}=t,s=e.match(/^([A-Za-z0-9]+)\.ipfs\.dweb\.link$/);if(s)return`${s[1]}${r}`;if(l.some(u=>e===u||e.endsWith("."+u))&&r.startsWith(g))return r.slice(g.length)}catch{}return null}function j(i){if(!i||typeof i!="string")return!1;if(i.startsWith("ipfs://"))return!0;try{const t=new URL(i),{hostname:e,pathname:r}=t;if(/^[A-Za-z0-9]+\.ipfs\.dweb\.link$/.test(e)||l.some(o=>e===o||e.endsWith("."+o))&&r.startsWith(g))return!0}catch{}return!1}function W(i){if(!(!i||i.startsWith("ipfs://")))try{const{hostname:t}=new URL(i);return l.some(r=>t===r||t.endsWith("."+r))?t:void 0}catch{return}}function $(i,t={}){if(!i)return i;const e=typeof t=="string"?{gatewayHost:t}:t,{gatewayHost:r=h,preserveOriginalGateway:s=!1}=e,o=A(i);if(o){if(s){const u=W(i);if(u)return`https://${u}/ipfs/${o}`}return`https://${r}/ipfs/${o}`}return i}exports.DEFAULT_IPFS_GATEWAY=h;exports.KNOWN_IPFS_GATEWAY_HOSTS=l;exports.MetadataExtractor=n;exports.extractIPFSPath=A;exports.getArtists=x;exports.getAudioUrls=k;exports.getFullTracks=I;exports.getGenres=v;exports.getImageUrls=w;exports.getTags=U;exports.getTotalDuration=S;exports.getTrackCount=F;exports.getTrackTitles=T;exports.getTracks=L;exports.getVRMTracks=P;exports.getVRMs=M;exports.isIPFS=j;exports.resolveIPFSLink=$;
|