Fix youtube links not being parsed for song info
This commit is contained in:
parent
971c846dd1
commit
42d91a097f
@ -84,19 +84,12 @@ export class TimelineReader {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async getSongInfo(url: string, remainingTries = 6): Promise<SongInfo | null> {
|
private static async getSongInfo(url: URL, remainingTries = 6): Promise<SongInfo | null> {
|
||||||
if (remainingTries === 0) {
|
if (remainingTries === 0) {
|
||||||
log.error('No tries remaining. Lookup failed!');
|
log.error('No tries remaining. Lookup failed!');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
let hostname: string;
|
if (url.hostname === 'songwhip.com') {
|
||||||
try {
|
|
||||||
hostname = new URL(url).hostname;
|
|
||||||
} catch (e) {
|
|
||||||
log.error(`Could not construct URL ${url}`, e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (hostname === 'songwhip.com') {
|
|
||||||
// song.link doesn't support songwhip links and songwhip themselves will provide metadata if you pass in a
|
// song.link doesn't support songwhip links and songwhip themselves will provide metadata if you pass in a
|
||||||
// Apple Music/Spotify/etc link, but won't when provided with their own link, so no way to extract song info
|
// Apple Music/Spotify/etc link, but won't when provided with their own link, so no way to extract song info
|
||||||
// except maybe scraping their HTML
|
// except maybe scraping their HTML
|
||||||
@ -104,7 +97,7 @@ export class TimelineReader {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const odesliParams = new URLSearchParams();
|
const odesliParams = new URLSearchParams();
|
||||||
odesliParams.append('url', url);
|
odesliParams.append('url', url.toString());
|
||||||
odesliParams.append('userCountry', 'DE');
|
odesliParams.append('userCountry', 'DE');
|
||||||
odesliParams.append('songIfSingle', 'true');
|
odesliParams.append('songIfSingle', 'true');
|
||||||
if (ODESLI_API_KEY && ODESLI_API_KEY !== 'CHANGE_ME') {
|
if (ODESLI_API_KEY && ODESLI_API_KEY !== 'CHANGE_ME') {
|
||||||
@ -123,7 +116,7 @@ export class TimelineReader {
|
|||||||
...info,
|
...info,
|
||||||
pageUrl: odesliInfo.pageUrl,
|
pageUrl: odesliInfo.pageUrl,
|
||||||
youtubeUrl: odesliInfo.linksByPlatform[platform]?.url,
|
youtubeUrl: odesliInfo.linksByPlatform[platform]?.url,
|
||||||
postedUrl: url
|
postedUrl: url.toString()
|
||||||
} as SongInfo;
|
} as SongInfo;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@ -189,21 +182,39 @@ export class TimelineReader {
|
|||||||
// Looks like we're stuck with regex for now instead of using preview cards.
|
// Looks like we're stuck with regex for now instead of using preview cards.
|
||||||
// Might as well use it to find URLs. Could also use this for YouTube: If Odesli finds something, it's a song,
|
// Might as well use it to find URLs. Could also use this for YouTube: If Odesli finds something, it's a song,
|
||||||
// if not, ignore it. No need to consult the YT API and give those links a special handling
|
// if not, ignore it. No need to consult the YT API and give those links a special handling
|
||||||
const musicUrls: string[] = [];
|
const musicUrls: URL[] = [];
|
||||||
const musicUrl = await TimelineReader.getUrlFromPreviewCard(post);
|
const musicUrl = await TimelineReader.getUrlFromPreviewCard(post);
|
||||||
if (musicUrl) {
|
if (musicUrl) {
|
||||||
musicUrls.push(musicUrl);
|
try {
|
||||||
|
musicUrls.push(new URL(musicUrl));
|
||||||
|
} catch (e) {
|
||||||
|
log.error(
|
||||||
|
'URL received from preview card does not seem to be a valid URL',
|
||||||
|
musicUrl,
|
||||||
|
e
|
||||||
|
);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
const urlMatches = post.content.matchAll(URL_REGEX);
|
const urlMatches = post.content.matchAll(URL_REGEX);
|
||||||
for (const match of urlMatches) {
|
for (const match of urlMatches) {
|
||||||
if (match === undefined || match.groups === undefined) {
|
if (match === undefined || match.groups === undefined) {
|
||||||
|
console.warn(
|
||||||
|
'Match listed in allMatches, but either it or its groups are undefined',
|
||||||
|
match
|
||||||
|
);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
const urlMatch = match.groups.postUrl.toString();
|
const urlMatch = match.groups.postUrl.toString();
|
||||||
const musicUrl = urls.find((u) => urlMatch.includes(u));
|
let url: URL;
|
||||||
if (musicUrl) {
|
try {
|
||||||
musicUrls.push(urlMatch);
|
url = new URL(urlMatch);
|
||||||
|
} catch (e) {
|
||||||
|
log.error('URL found via Regex does not seem to be a valud url', urlMatch, e);
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check *all* found url and let odesli determine if it is music or not
|
||||||
|
musicUrls.push(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user