Skip to content

Playlist author thumbnail support - #255

Open
GDjkhp wants to merge 11 commits into
PerformanC:devfrom
GDjkhp:playlist-author-thumbnail-support
Open

GDjkhp wants to merge 11 commits into
PerformanC:devfrom
GDjkhp:playlist-author-thumbnail-support

Conversation

@GDjkhp

@GDjkhp GDjkhp commented Oct 21, 2026

Copy link
Copy Markdown
Contributor

No description provided.

@GDjkhp

GDjkhp commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor Author

im done with the changes. do note of the following:

tidal returns a creator id but it doesnt match the playlist creator's id

playlist:
https://tidal.com/playlist/19c07206-6fc3-4104-909b-9fbf8d24d22c
creator:
https://tidal.com/artist/59707726
const playlistData = await this.getJson(`playlists/${id}`)
{
  "uuid": "19c07206-6fc3-4104-909b-9fbf8d24d22c",
  "title": "Vol.7 - Rumbon in Vapor Street",
  "numberOfTracks": 31,
  "numberOfVideos": 0,
  "creator": {
    "id": 185753188
  },
  "description": "Raw rhythms. Brass on fire. Barrio soul. 🔥\n\nA journey through the golden era of Latin grooves, blending Cuban son, hard-hitting salsa, boogaloo and vintage street sounds. Featuring Ralph Robles, Cortijo y Su Combo, Monguito Santamaría, Joe Cuba and more.\n\nFrom old Havana to the streets of New York, timeless rhythms, bold horns and irresistible sabor.\n\nTurn it up. Feel the rumbón.\n\nCurated by Aranzi.",
  "duration": 7933,
  "lastUpdated": "2026-10-20T06:56:53.139+0000",
  "created": "2025-10-18T22:01:40.476+0000",
  "type": "USER",
  "publicPlaylist": true,
  "url": "http://www.tidal.com/playlist/19c07206-6fc3-4104-909b-9fbf8d24d22c",
  "image": "7ea17548-48b4-47bf-96cb-a6f4e08c49d9",
  "popularity": 0,
  "squareImage": "a178483d-e537-4cbf-86af-cbd6ceda237b",
  "customImageUrl": null,
  "promotedArtists": [],
  "lastItemAddedAt": "2025-10-18T23:09:53.945+0000"
}

i noticed while im doing playlist test runs, bandcamp parsing (tracks, albums, playlist, possibly artist too) are broken (im hitting the following errors)

playlist: Unsupported content type: text/html; charset=UTF-8
album: Too many redirects (5) for https://music.businesscasual.biz/album/cheesecake
track: Too many redirects (5) for https://music.businesscasual.biz/track/rat-river

after merging this, i will work on the following:

  • fix tidal and bandcamp
  • support more playlist sources
  • better handling of musixmatch on prod (maybe im going to turn this inside the discord bot code instead of baking the code to nodelink server as musixmatch now blocks vps, the good old "it works on my machine")
  • more accurate lrclib search (e.g. playing the album version of rasputin returns the lrc of the single version)

const meta =
current.author && current.artworkUrl
? { author: '', thumbnail: '' }
: await this._fetchPlaylistMeta(playlistId)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we extract the metadata from the existing browse response before fetching the playlist page? Android's browse response already includes owner text, the video count and a cover image. The handlers in common.ts currently discard those fields and return an empty pluginInfo.

Please fill those fields there and only scrape the page for anything still missing. That would avoid an extra request and another JSON parse when the original response already has everything we need.

if im not wrong, on Android you can get the owner text, video count and the playlist thumbnail (heroImage) on pageHeaderViewModel which by then, it will be inside the metadata

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is a good question. you see i've been trying to keep the least request as possible but we are extracting data to these two, Android.ts for normal youtube links, and Web_Remix.ts for youtube music, which are very inconsistent with their jsons, so i prioritized consistency and sacrificed 1 extra request, see images below

Android.ts -> resolve() -> playlistResponseRaw returns an author and thumbnail
image
image

Web_Remix.ts -> resolve() -> resRaw returns no author, no thumbnail
image
image

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hmm, but i meant reusing android's metadata when it's available, and keep the page request as a fallback (so it will apply for web_remix / missing fields), that alone would save one request when android already provides the data we want ig.

But if maintaining the one extraction path rn is simpler now and is working just fine, we can see that android optimization later then

current.url ?? `https://www.youtube.com/playlist?list=${playlistId}`,
artworkUrl: current.artworkUrl || meta.thumbnail,
author: current.author || meta.author,
totalTracks: current.totalTracks ?? playlist.tracks.length

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

playlist.tracks.length can be capped by maxPlaylistLength, so this can report 100 total tracks for a playlist that has 1,000. Please use the actual total from the playlist response, or leave totalTracks unset when it's unknown.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants