Fix track search for ytmusic
Track search recently changed (see linked commit), this makes the same
changes here so that the track search works again.
e1af1c2653
This commit is contained in:
parent
2ff1c61510
commit
c11c581e1f
2 changed files with 43 additions and 14 deletions
|
@ -114,25 +114,35 @@ function parse_result_content(contents, type) {
|
|||
}
|
||||
|
||||
async function lookupTrack(id) {
|
||||
let endpoint = "https://www.youtube.com/get_video_info"
|
||||
const { body } = await request.get(endpoint).query({ video_id: id, hl: "en", el: "detailpage" })
|
||||
let request_body = {'video_id': id, ...standard_body }
|
||||
|
||||
if (body.player_response === undefined) {
|
||||
throw new Error();
|
||||
const { body } = await request.post("https://music.youtube.com/youtubei/v1/player")
|
||||
.set(standard_headers)
|
||||
.query(standard_params)
|
||||
.send(request_body)
|
||||
let song_meta = body.videoDetails
|
||||
|
||||
let description = body.microformat.microformatDataRenderer.description.split(' · ')
|
||||
let possible_album_name = description[description.length - 1].split("℗")[0]
|
||||
if (!description[description.length - 1].includes("℗")) {
|
||||
possible_album_name = "";
|
||||
}
|
||||
let player_response = JSON.parse(body.player_response)
|
||||
let song_meta = player_response.videoDetails
|
||||
|
||||
let description = song_meta.shortDescription.split("\n\n")
|
||||
let album_name = description[2]
|
||||
let artists = description[1].split(' · ').slice(1)
|
||||
let tags = body.microformat.microformatDataRenderer.tags
|
||||
let album_name = ""
|
||||
for (const tag of tags) {
|
||||
if(possible_album_name.includes(tag)){
|
||||
album_name = tag;
|
||||
}
|
||||
}
|
||||
let artists = song_meta.author
|
||||
artists = artists.replace(" - Topic", "")
|
||||
|
||||
const artwork = {
|
||||
small: song_meta.thumbnail.thumbnails[0].url,
|
||||
large: song_meta.thumbnail.thumbnails[song_meta.thumbnail.thumbnails.length-1].url,
|
||||
};
|
||||
|
||||
return Promise.resolve({
|
||||
let track_info = {
|
||||
service: 'ytmusic',
|
||||
type: 'track',
|
||||
id: song_meta.videoId,
|
||||
|
@ -141,12 +151,14 @@ async function lookupTrack(id) {
|
|||
purchaseUrl: null,
|
||||
artwork,
|
||||
artist: {
|
||||
name: artists.join(", "),
|
||||
name: artists,
|
||||
},
|
||||
album: {
|
||||
name: album_name,
|
||||
},
|
||||
});
|
||||
}
|
||||
debug(track_info)
|
||||
return Promise.resolve(track_info);
|
||||
}
|
||||
|
||||
async function lookupAlbum(id) {
|
||||
|
|
|
@ -10,8 +10,25 @@ describe('ytmusic', function(){
|
|||
|
||||
it('should find track by ID', async function (){
|
||||
const result = await ytmusic.lookupId('9zrYXvUXiQk', 'track');
|
||||
result.name.should.equal('One Vision (Remastered 2011)');
|
||||
result.name.should.equal('One Vision');
|
||||
result.artist.name.should.equal('Queen');
|
||||
result.album.name.should.equal('A Kind Of Magic')
|
||||
});
|
||||
it('should find track by ID', async function (){
|
||||
const result = await ytmusic.lookupId('rAzfNuU1f8E', 'track');
|
||||
result.name.should.equal('Erre (Live)');
|
||||
result.artist.name.should.equal('Boogarins');
|
||||
// The copyright notice is too long and is the only place where the album name is.
|
||||
result.album.name.should.equal('')
|
||||
});
|
||||
it('should find track by ID', async function (){
|
||||
const result = await ytmusic.lookupId('Wst0la_TgTY', 'track');
|
||||
result.name.should.equal('Às Vezes Bate Uma Saudade');
|
||||
// XXX: This is very odd. Sometimes, google will return the first artist "Rodrigo Alarcon", sometimes "Rodrigo Alarcon, Ana Muller & Mariana Froes" and sometimes
|
||||
// "Rodrigo Alarcon, Ana Muller, Mariana Froes". Same API call, same everything. Go figure.
|
||||
// result.artist.name.should.equal('Rodrigo Alarcon, Ana Muller, Mariana Froes');
|
||||
result.artist.name.should.startWith('Rodrigo Alarcon');
|
||||
result.album.name.should.equal('Taquetá Vol.1')
|
||||
});
|
||||
});
|
||||
describe('search', () => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue