From 7a3d74dc87a5a4721bc9e81449b031c4742b9286 Mon Sep 17 00:00:00 2001 From: reidlab Date: Mon, 19 May 2025 23:49:13 -0700 Subject: [PATCH] playlist endpoint --- README.md | 4 +- public/favicon.png | Bin 49142 -> 769 bytes src/appleMusicApi/index.ts | 22 +- src/appleMusicApi/types/attributes.ts | 18 +- src/appleMusicApi/types/extensions.ts | 8 +- src/appleMusicApi/types/extras.ts | 6 + src/appleMusicApi/types/relationships.ts | 11 +- src/appleMusicApi/types/responses.ts | 21 + src/constants/storefrontMappings.ts | 654 ------------------ src/web/endpoints/back/getPlaylistMetadata.ts | 28 + src/web/endpoints/index.ts | 2 + 11 files changed, 111 insertions(+), 663 deletions(-) delete mode 100644 src/constants/storefrontMappings.ts create mode 100644 src/web/endpoints/back/getPlaylistMetadata.ts diff --git a/README.md b/README.md index 8b985fa..930d804 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ after configuring, it's just as easy as running `npm run build` and running the a system module is provided for your convenience, and the main output is `nixosModules.default` -after importing this module, the option `services.amdl` will show up, which is documented in [`flake.nix`](./flake.nix) somewhat well. everything under the `config` tree follows the `config.toml` well, along with everything under the `env` tree. defaults are provided for everything that isn't the private keys and client ids inside of the env section. make sure to set those!! +after importing this module, the option `services.amdl` will show up, which is documented in [`flake.nix`](./flake.nix) somewhat well. everything under the `config` tree follows the `config.toml` well, along with everything under the `env` tree. defaults are provided for everything that isn't the ITUA inside of the env section. make sure to set those!! ## limitations / the formats -currently you can only get basic widevine ones, everything related to playready and fairplay encryption methods are not supported, sorry!! someday i will get this working, at least for playready. it's just that no one has written a library yet but has for python (yuck!!) +currently you can only get basic widevine ones, everything related to playready and fairplay encryption methods are not supported, sorry!! someday i will get this working, at least for playready. it's just that no one has written a library yet but has for python (yuck!!) lossless audio is unfortunately out of the question currently. it will be a while till someone breaks fairplay drm guaranteed formats to work include: diff --git a/public/favicon.png b/public/favicon.png index 70ad31729b9ea4925d194dd8f82c6aca7e5cc4aa..bb376ca7f7d35f4603530afc9d37fbeacd60561c 100644 GIT binary patch literal 769 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANM!Cp=voLn;{GK46@n;yFph zQ>c5@%-!xTE@^3LVWFX+q2(a({R}NY3CQU1aF8u&X>M*VExTvWi<2(&vcKo!ui3*157hMzTeC??ZD%Pc-Fcn%>RD%&p#;oV($I7 ziy41xn_lK2r_*hps=*t6d*h?|Zv6{--a) zmj9{te-s|LH-y63K2tb%V=yq(UL(EMNEdiX!lH2seP|C$4T zzIT0U?_pif+3@wg?cAR?J1g3!KX-L_dVj&({VWH5y`OjP&l{G89ZBaz-~LgJV+r{; z_0~`C7v}SM4$P@HZ>nDk()HgV;1>_>B2;e~1VC8 zf8HD^&VH`{@z9y`et)!MR~)$9Fxf^P6gsbbSQF~Xoc^>|M=|U_#cgPBZD?=(asHEV z<{yp^I{#d+R{GHV^yT$CCEs+{?|!NDVb_5<|D|>xP_I7_|Nmn?%K`R3U*-QZe0X?3 z_~-fWE)NddKUn|&2RlPk`mcul{~pUT+~fO^^`P^>r2iJ)4>}KoGv|M2tp9u5{($Ho aWlx8W&{Or(T^Se{7(8A5T-G@yGywoQ^rhYa literal 49142 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 diff --git a/src/appleMusicApi/index.ts b/src/appleMusicApi/index.ts index 04da88a..4347ea5 100644 --- a/src/appleMusicApi/index.ts +++ b/src/appleMusicApi/index.ts @@ -1,6 +1,6 @@ import axios, { type AxiosInstance } from "axios"; import { ampApiUrl, appleMusicHomepageUrl, licenseApiUrl, webplaybackApiUrl } from "../constants/urls.js"; -import type { GetSongResponse, SearchResponse } from "./types/responses.js"; +import type { GetPlaylistResponse, GetSongResponse, SearchResponse } from "./types/responses.js"; import type { AlbumAttributesExtensionTypes, AnyAttributesExtensionTypes, SongAttributesExtensionTypes } from "./types/extensions.js"; import { getToken } from "./token.js"; import { config, env } from "../config.js"; @@ -50,9 +50,29 @@ export default class AppleMusicApi { })).data; } + // TODO: make it so you can get more than the first 100 tracks + // you can't since it's entirely undocumented + // and the "trivial" way simply throws a 400, which is awesome + async getPlaylist< + T extends SongAttributesExtensionTypes = [], + U extends RelationshipTypes = ["tracks"] + > ( + id: string, + extend: T = [] as never as T, + relationships: U = ["tracks"] as U + ): Promise> { + return (await this.http.get>(`/v1/catalog/${this.storefront}/playlists/${id}`, { + params: { + extend: extend.join(","), + include: relationships.join(",") + } + })).data; + } + async getSong< // TODO: possibly make this any, and use the addScopingParameters function? // would be a bit cleaner, almost everywhere, use above in `getAlbum` perchancibly + // and `getPlaylst`.... maybe just rewrite the whole thing at this point,, scoping parameters are my OPP T extends SongAttributesExtensionTypes = ["extendedAssetUrls"], U extends RelationshipTypes = ["albums"] > ( diff --git a/src/appleMusicApi/types/attributes.ts b/src/appleMusicApi/types/attributes.ts index b9ef22b..248b0ce 100644 --- a/src/appleMusicApi/types/attributes.ts +++ b/src/appleMusicApi/types/attributes.ts @@ -1,6 +1,7 @@ -import type { Artwork, EditorialNotes, PlayParameters, Preview } from "./extras.js"; +import type { Artwork, DescriptionAttribute, EditorialNotes, PlayParameters, Preview } from "./extras.js"; import type { AlbumAttributesExtensionMap, AlbumAttributesExtensionTypes, + PlaylistAttributesExtensionMap, PlaylistAttributesExtensionTypes, SongAttributesExtensionMap, SongAttributesExtensionTypes } from "./extensions.js"; @@ -27,6 +28,21 @@ export type AlbumAttributes< } & Pick +export type PlaylistAttributes< + T extends PlaylistAttributesExtensionTypes, +> = { + artwork?: Artwork + curatorName: string + description?: DescriptionAttribute, + isChart: boolean, + lastModifiedDate?: string + name: string + playlistType: string + playParams?: PlayParameters + url: string +} + & Pick + export type SongAttributes< T extends SongAttributesExtensionTypes, > = { diff --git a/src/appleMusicApi/types/extensions.ts b/src/appleMusicApi/types/extensions.ts index 6e2cb75..f1f553c 100644 --- a/src/appleMusicApi/types/extensions.ts +++ b/src/appleMusicApi/types/extensions.ts @@ -1,4 +1,4 @@ -export type AnyAttributesExtensionType = AlbumAttributesExtensionType | SongAttributesExtensionType; +export type AnyAttributesExtensionType = AlbumAttributesExtensionType | PlaylistAttributesExtensionType | SongAttributesExtensionType; export type AnyAttributesExtensionTypes = AnyAttributesExtensionType[]; export type AlbumAttributesExtensionType = keyof AlbumAttributesExtensionMap; @@ -8,6 +8,12 @@ export type AlbumAttributesExtensionMap = { audioVariants?: string[] } +export type PlaylistAttributesExtensionType = keyof PlaylistAttributesExtensionMap; +export type PlaylistAttributesExtensionTypes = PlaylistAttributesExtensionType[]; +export type PlaylistAttributesExtensionMap = { + trackTypes: string[] +} + export type SongAttributesExtensionType = keyof SongAttributesExtensionMap; export type SongAttributesExtensionTypes = SongAttributesExtensionType[]; export type SongAttributesExtensionMap = { diff --git a/src/appleMusicApi/types/extras.ts b/src/appleMusicApi/types/extras.ts index 7a6a37e..89e5818 100644 --- a/src/appleMusicApi/types/extras.ts +++ b/src/appleMusicApi/types/extras.ts @@ -1,3 +1,9 @@ +// https://developer.apple.com/documentation/applemusicapi/descriptionattribute +export interface DescriptionAttribute { + short?: string + standard: string +} + // https://developer.apple.com/documentation/applemusicapi/artwork export interface Artwork { bgColor?: string diff --git a/src/appleMusicApi/types/relationships.ts b/src/appleMusicApi/types/relationships.ts index 84d23a6..55229ca 100644 --- a/src/appleMusicApi/types/relationships.ts +++ b/src/appleMusicApi/types/relationships.ts @@ -1,8 +1,8 @@ // you will shit yourself if you don't read this: // required reading: https://developer.apple.com/documentation/applemusicapi/handling-resource-representation-and-relationships -import type { AlbumAttributes, SongAttributes } from "./attributes.js"; -import type { AlbumAttributesExtensionTypes, AnyAttributesExtensionTypes, SongAttributesExtensionTypes } from "./extensions.js"; +import type { AlbumAttributes, PlaylistAttributes, SongAttributes } from "./attributes.js"; +import type { AlbumAttributesExtensionTypes, AnyAttributesExtensionTypes, PlaylistAttributesExtensionTypes, SongAttributesExtensionTypes } from "./extensions.js"; // TODO: have something like this for every resource export type Relationship = { @@ -11,7 +11,7 @@ export type Relationship = { data: { // TODO: there is extra types here (id, type, etc) i just can't cba to add them lol // probably not important ! ahahahah - // seems to be the same basic "resource" pattern i'm starting to notice (id(?), href, type, meta, etc) + // seems to be the same basic "resource" pattern i'm starting to notice (id(?), href, type, meta (not included), etc) attributes: T }[] } @@ -20,5 +20,8 @@ export type RelationshipType = keyof Rela export type RelationshipTypes = RelationshipType[]; export type RelationshipTypeMap = { albums: AlbumAttributes>, - tracks: SongAttributes> // TODO: tracks can also be music videos, uh oh. + // TODO: from what i can tell, playlists can NOT be used as a relationship type? kept in case + playlists: PlaylistAttributes>, + // TODO: tracks can also be music videos, uh oh. + tracks: SongAttributes> } diff --git a/src/appleMusicApi/types/responses.ts b/src/appleMusicApi/types/responses.ts index 7b96ce1..1023d75 100644 --- a/src/appleMusicApi/types/responses.ts +++ b/src/appleMusicApi/types/responses.ts @@ -28,6 +28,27 @@ export interface GetAlbumResponse< }[] } +// https://developer.apple.com/documentation/applemusicapi/get-a-catalog-playlist +export interface GetPlaylistResponse< + T extends SongAttributesExtensionTypes, + U extends RelationshipTypes +> { + // https://developer.apple.com/documentation/applemusicapi/playlists + data: { + id: string + type: "playlists" + href: string + // https://developer.apple.com/documentation/applemusicapi/playlists/attributes-data.dictionary + attributes: SongAttributes + // https://developer.apple.com/documentation/applemusicapi/playlists/relationships-data.dictionary + relationships: { + [K in U[number]]: Relationship< + K extends RelationshipType ? RelationshipTypeMap[K] : never + > + } + }[] +} + // https://developer.apple.com/documentation/applemusicapi/get-a-catalog-song export interface GetSongResponse< T extends SongAttributesExtensionTypes, diff --git a/src/constants/storefrontMappings.ts b/src/constants/storefrontMappings.ts deleted file mode 100644 index 9563d4e..0000000 --- a/src/constants/storefrontMappings.ts +++ /dev/null @@ -1,654 +0,0 @@ -// thank u goat -// https://gist.github.com/BrychanOdlum/2208578ba151d1d7c4edeeda15b4e9b1 -export default [ - { - "name": "Algeria", - "code": "DZ", - "storefrontId": 143563 - }, - { - "name": "Angola", - "code": "AO", - "storefrontId": 143564 - }, - { - "name": "Anguilla", - "code": "AI", - "storefrontId": 143538 - }, - { - "name": "Antigua & Barbuda", - "code": "AG", - "storefrontId": 143540 - }, - { - "name": "Argentina", - "code": "AR", - "storefrontId": 143505 - }, - { - "name": "Armenia", - "code": "AM", - "storefrontId": 143524 - }, - { - "name": "Australia", - "code": "AU", - "storefrontId": 143460 - }, - { - "name": "Austria", - "code": "AT", - "storefrontId": 143445 - }, - { - "name": "Azerbaijan", - "code": "AZ", - "storefrontId": 143568 - }, - { - "name": "Bahrain", - "code": "BH", - "storefrontId": 143559 - }, - { - "name": "Bangladesh", - "code": "BD", - "storefrontId": 143490 - }, - { - "name": "Barbados", - "code": "BB", - "storefrontId": 143541 - }, - { - "name": "Belarus", - "code": "BY", - "storefrontId": 143565 - }, - { - "name": "Belgium", - "code": "BE", - "storefrontId": 143446 - }, - { - "name": "Belize", - "code": "BZ", - "storefrontId": 143555 - }, - { - "name": "Bermuda", - "code": "BM", - "storefrontId": 143542 - }, - { - "name": "Bolivia", - "code": "BO", - "storefrontId": 143556 - }, - { - "name": "Botswana", - "code": "BW", - "storefrontId": 143525 - }, - { - "name": "Brazil", - "code": "BR", - "storefrontId": 143503 - }, - { - "name": "British Virgin Islands", - "code": "VG", - "storefrontId": 143543 - }, - { - "name": "Brunei", - "code": "BN", - "storefrontId": 143560 - }, - { - "name": "Bulgaria", - "code": "BG", - "storefrontId": 143526 - }, - { - "name": "Canada", - "code": "CA", - "storefrontId": 143455 - }, - { - "name": "Cayman Islands", - "code": "KY", - "storefrontId": 143544 - }, - { - "name": "Chile", - "code": "CL", - "storefrontId": 143483 - }, - { - "name": "China", - "code": "CN", - "storefrontId": 143465 - }, - { - "name": "Colombia", - "code": "CO", - "storefrontId": 143501 - }, - { - "name": "Costa Rica", - "code": "CR", - "storefrontId": 143495 - }, - { - "name": "Cote D’Ivoire", - "code": "CI", - "storefrontId": 143527 - }, - { - "name": "Croatia", - "code": "HR", - "storefrontId": 143494 - }, - { - "name": "Cyprus", - "code": "CY", - "storefrontId": 143557 - }, - { - "name": "Czech Republic", - "code": "CZ", - "storefrontId": 143489 - }, - { - "name": "Denmark", - "code": "DK", - "storefrontId": 143458 - }, - { - "name": "Dominica", - "code": "DM", - "storefrontId": 143545 - }, - { - "name": "Dominican Rep.", - "code": "DO", - "storefrontId": 143508 - }, - { - "name": "Ecuador", - "code": "EC", - "storefrontId": 143509 - }, - { - "name": "Egypt", - "code": "EG", - "storefrontId": 143516 - }, - { - "name": "El Salvador", - "code": "SV", - "storefrontId": 143506 - }, - { - "name": "Estonia", - "code": "EE", - "storefrontId": 143518 - }, - { - "name": "Finland", - "code": "FI", - "storefrontId": 143447 - }, - { - "name": "France", - "code": "FR", - "storefrontId": 143442 - }, - { - "name": "Germany", - "code": "DE", - "storefrontId": 143443 - }, - { - "name": "Ghana", - "code": "GH", - "storefrontId": 143573 - }, - { - "name": "Greece", - "code": "GR", - "storefrontId": 143448 - }, - { - "name": "Grenada", - "code": "GD", - "storefrontId": 143546 - }, - { - "name": "Guatemala", - "code": "GT", - "storefrontId": 143504 - }, - { - "name": "Guyana", - "code": "GY", - "storefrontId": 143553 - }, - { - "name": "Honduras", - "code": "HN", - "storefrontId": 143510 - }, - { - "name": "Hong Kong", - "code": "HK", - "storefrontId": 143463 - }, - { - "name": "Hungary", - "code": "HU", - "storefrontId": 143482 - }, - { - "name": "Iceland", - "code": "IS", - "storefrontId": 143558 - }, - { - "name": "India", - "code": "IN", - "storefrontId": 143467 - }, - { - "name": "Indonesia", - "code": "ID", - "storefrontId": 143476 - }, - { - "name": "Ireland", - "code": "IE", - "storefrontId": 143449 - }, - { - "name": "Israel", - "code": "IL", - "storefrontId": 143491 - }, - { - "name": "Italy", - "code": "IT", - "storefrontId": 143450 - }, - { - "name": "Jamaica", - "code": "JM", - "storefrontId": 143511 - }, - { - "name": "Japan", - "code": "JP", - "storefrontId": 143462 - }, - { - "name": "Jordan", - "code": "JO", - "storefrontId": 143528 - }, - { - "name": "Kazakstan", - "code": "KZ", - "storefrontId": 143517 - }, - { - "name": "Kenya", - "code": "KE", - "storefrontId": 143529 - }, - { - "name": "Korea, Republic Of", - "code": "KR", - "storefrontId": 143466 - }, - { - "name": "Kuwait", - "code": "KW", - "storefrontId": 143493 - }, - { - "name": "Latvia", - "code": "LV", - "storefrontId": 143519 - }, - { - "name": "Lebanon", - "code": "LB", - "storefrontId": 143497 - }, - { - "name": "Liechtenstein", - "code": "LI", - "storefrontId": 143522 - }, - { - "name": "Lithuania", - "code": "LT", - "storefrontId": 143520 - }, - { - "name": "Luxembourg", - "code": "LU", - "storefrontId": 143451 - }, - { - "name": "Macau", - "code": "MO", - "storefrontId": 143515 - }, - { - "name": "Macedonia", - "code": "MK", - "storefrontId": 143530 - }, - { - "name": "Madagascar", - "code": "MG", - "storefrontId": 143531 - }, - { - "name": "Malaysia", - "code": "MY", - "storefrontId": 143473 - }, - { - "name": "Maldives", - "code": "MV", - "storefrontId": 143488 - }, - { - "name": "Mali", - "code": "ML", - "storefrontId": 143532 - }, - { - "name": "Malta", - "code": "MT", - "storefrontId": 143521 - }, - { - "name": "Mauritius", - "code": "MU", - "storefrontId": 143533 - }, - { - "name": "Mexico", - "code": "MX", - "storefrontId": 143468 - }, - { - "name": "Moldova, Republic Of", - "code": "MD", - "storefrontId": 143523 - }, - { - "name": "Montserrat", - "code": "MS", - "storefrontId": 143547 - }, - { - "name": "Nepal", - "code": "NP", - "storefrontId": 143484 - }, - { - "name": "Netherlands", - "code": "NL", - "storefrontId": 143452 - }, - { - "name": "New Zealand", - "code": "NZ", - "storefrontId": 143461 - }, - { - "name": "Nicaragua", - "code": "NI", - "storefrontId": 143512 - }, - { - "name": "Niger", - "code": "NE", - "storefrontId": 143534 - }, - { - "name": "Nigeria", - "code": "NG", - "storefrontId": 143561 - }, - { - "name": "Norway", - "code": "NO", - "storefrontId": 143457 - }, - { - "name": "Oman", - "code": "OM", - "storefrontId": 143562 - }, - { - "name": "Pakistan", - "code": "PK", - "storefrontId": 143477 - }, - { - "name": "Panama", - "code": "PA", - "storefrontId": 143485 - }, - { - "name": "Paraguay", - "code": "PY", - "storefrontId": 143513 - }, - { - "name": "Peru", - "code": "PE", - "storefrontId": 143507 - }, - { - "name": "Philippines", - "code": "PH", - "storefrontId": 143474 - }, - { - "name": "Poland", - "code": "PL", - "storefrontId": 143478 - }, - { - "name": "Portugal", - "code": "PT", - "storefrontId": 143453 - }, - { - "name": "Qatar", - "code": "QA", - "storefrontId": 143498 - }, - { - "name": "Romania", - "code": "RO", - "storefrontId": 143487 - }, - { - "name": "Russia", - "code": "RU", - "storefrontId": 143469 - }, - { - "name": "Saudi Arabia", - "code": "SA", - "storefrontId": 143479 - }, - { - "name": "Senegal", - "code": "SN", - "storefrontId": 143535 - }, - { - "name": "Serbia", - "code": "RS", - "storefrontId": 143500 - }, - { - "name": "Singapore", - "code": "SG", - "storefrontId": 143464 - }, - { - "name": "Slovakia", - "code": "SK", - "storefrontId": 143496 - }, - { - "name": "Slovenia", - "code": "SI", - "storefrontId": 143499 - }, - { - "name": "South Africa", - "code": "ZA", - "storefrontId": 143472 - }, - { - "name": "Spain", - "code": "ES", - "storefrontId": 143454 - }, - { - "name": "Sri Lanka", - "code": "LK", - "storefrontId": 143486 - }, - { - "name": "St. Kitts & Nevis", - "code": "KN", - "storefrontId": 143548 - }, - { - "name": "St. Lucia", - "code": "LC", - "storefrontId": 143549 - }, - { - "name": "St. Vincent & The Grenadines", - "code": "VC", - "storefrontId": 143550 - }, - { - "name": "Suriname", - "code": "SR", - "storefrontId": 143554 - }, - { - "name": "Sweden", - "code": "SE", - "storefrontId": 143456 - }, - { - "name": "Switzerland", - "code": "CH", - "storefrontId": 143459 - }, - { - "name": "Taiwan", - "code": "TW", - "storefrontId": 143470 - }, - { - "name": "Tanzania", - "code": "TZ", - "storefrontId": 143572 - }, - { - "name": "Thailand", - "code": "TH", - "storefrontId": 143475 - }, - { - "name": "The Bahamas", - "code": "BS", - "storefrontId": 143539 - }, - { - "name": "Trinidad & Tobago", - "code": "TT", - "storefrontId": 143551 - }, - { - "name": "Tunisia", - "code": "TN", - "storefrontId": 143536 - }, - { - "name": "Turkey", - "code": "TR", - "storefrontId": 143480 - }, - { - "name": "Turks & Caicos", - "code": "TC", - "storefrontId": 143552 - }, - { - "name": "Uganda", - "code": "UG", - "storefrontId": 143537 - }, - { - "name": "UK", - "code": "GB", - "storefrontId": 143444 - }, - { - "name": "Ukraine", - "code": "UA", - "storefrontId": 143492 - }, - { - "name": "United Arab Emirates", - "code": "AE", - "storefrontId": 143481 - }, - { - "name": "Uruguay", - "code": "UY", - "storefrontId": 143514 - }, - { - "name": "USA", - "code": "US", - "storefrontId": 143441 - }, - { - "name": "Uzbekistan", - "code": "UZ", - "storefrontId": 143566 - }, - { - "name": "Venezuela", - "code": "VE", - "storefrontId": 143502 - }, - { - "name": "Vietnam", - "code": "VN", - "storefrontId": 143471 - }, - { - "name": "Yemen", - "code": "YE", - "storefrontId": 143571 - } -]; diff --git a/src/web/endpoints/back/getPlaylistMetadata.ts b/src/web/endpoints/back/getPlaylistMetadata.ts new file mode 100644 index 0000000..f109291 --- /dev/null +++ b/src/web/endpoints/back/getPlaylistMetadata.ts @@ -0,0 +1,28 @@ +import { appleMusicApi } from "../../../appleMusicApi/index.js"; +import express from "express"; +import { validate } from "../../validate.js"; +import { z } from "zod"; + +const router = express.Router(); + +const schema = z.object({ + query: z.object({ + id: z.string() + }) +}); + +// see comments in `getTrackMetadata.ts` +// awawawawawa +router.get("/getPlaylistMetadata", async (req, res, next) => { + try { + const { id } = (await validate(req, schema)).query; + + const trackMetadata = await appleMusicApi.getPlaylist(id); + + res.json(trackMetadata); + } catch (err) { + next(err); + } +}); + +export default router; diff --git a/src/web/endpoints/index.ts b/src/web/endpoints/index.ts index 5e73ac7..cd23b9a 100644 --- a/src/web/endpoints/index.ts +++ b/src/web/endpoints/index.ts @@ -7,9 +7,11 @@ export const front = [ import backDownload from "./back/download.js"; import getAlbumMetadata from "./back/getAlbumMetadata.js"; +import getPlaylistMetadata from "./back/getPlaylistMetadata.js"; import getTrackMetadata from "./back/getTrackMetadata.js"; export const back = [ backDownload, getAlbumMetadata, + getPlaylistMetadata, getTrackMetadata ];