Skip to content

feat(vibe): Add Naver VIBE provider#209

Open
Lioncat6 wants to merge 7 commits intokellnerd:mainfrom
Lioncat6:vibe
Open

feat(vibe): Add Naver VIBE provider#209
Lioncat6 wants to merge 7 commits intokellnerd:mainfrom
Lioncat6:vibe

Conversation

@Lioncat6
Copy link
Copy Markdown

@Lioncat6 Lioncat6 commented Apr 5, 2026

Got bored and decided to implement VIBE as well...

Might want to take a look at here in particular: https://github.com/kellnerd/harmony/compare/main...Lioncat6:harmony:vibe?expand=1#diff-994ea9806a6ec65de9b9322a6997658f145c4b9a0fc8e88570a249f0a6f34970R145-R258

Closes #208

@Lioncat6
Copy link
Copy Markdown
Author

Lioncat6 commented Apr 5, 2026

Some albums with a lot of featuring artists for testing:
https://vibe.naver.com/album/10304443
https://vibe.naver.com/album/638616
https://vibe.naver.com/album/3034414

@kellnerd kellnerd added feature New feature or request provider Metadata provider labels Apr 5, 2026
Copy link
Copy Markdown
Owner

@kellnerd kellnerd left a comment

Choose a reason for hiding this comment

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

Wow, that was fast...

Originally I wanted to continue working on my Discogs provider today, then I decided to give you some quick initial feedback first, but in the end I found a few more things 😅

}

override getLinkTypesForEntity(): LinkType[] {
return ['paid streaming', 'paid download'];
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

Is this correct, do they have downloads?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Yup, though I need to add validation for which tracks do, since all tracks marked as 'overseas' don't

})
}

private async getTrackArtists(rawTrack: NaverTrack): Promise<ArtistCreditName[]> {
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

It's hard to follow what is happening here... I would like to see some test cases for this function to see what it is supposed to do and if it can be written in a more obvious way. For example, I also have the feeling that we don't have to distinguish between participants and artists in the end and can have one function which converts artists with optional join phrases but I don't feel confident to try without having test coverage.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Where all other providers (minus Apple and tidal apparently) would provide all participating main track credits, Naver does not and instead moves featuring artists exclusively to the /credits endpoint for tracks

See: https://harmony.pulsewidth.org.uk/release?url=&gtin=0692788693392&region=&musicbrainz=&deezer=&itunes=&spotify=&tidal= for the album on other services

The album tracks fetch here: album/34923420/tracks.json omits the featuring artists, so they have to be fetched with track/96143271/credits.json (track/96143271.json returns the same thing as the album tracks fetch). But /credits also returns all artist roles, including non-participating roles which can be seen here

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

I should probably make a helper function to generate the join phrases for the artists, since vibe does distinguish between featuring artists and main artists, unlike most other providers

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

What the logic is currently doing:

  1. Check if the track title has an indicator of featuring artists to attempt to save on extra calls; Can be removed if unreliable if (!trackFeatVariations.some((fv) => rawTrack.trackTitle.toLocaleLowerCase().includes(fv))) {
  2. Fetch track credits const trackCredits = await this.getRawTrackCredits(rawTrack.trackId);
  3. Filter out featuring artists const featuringArtists = roles.filter((role) => role.roleName === '피쳐링').flatMap((role) => role.participantList);
  4. Store the ids of the featuring artists const featuringIds = featuringArtists.map((artist) => artist.id);
  5. Combine and de duplicate all artists typescript const uniqueArtists = Array.from(new Map(allArtists.map((artist) => [artist.id, artist])).values());
  6. Use a forEach loop to check the positions of the nearby artists to generate the joinPhrases & map to convertRawParticipant
  7. Return credits

I want to make a helper function that replaces the job of step 6

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

Labels

feature New feature or request provider Metadata provider

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Naver VIBE

2 participants