Merge pull request #9 from Puffycheeses/issue-2-Fetching_detailed_metadata_on_singles_and_individual_songs_fails

Issue 2 fetching detailed metadata on singles and individual songs fails
This commit is contained in:
Noah
2021-08-22 17:23:22 +10:00
committed by GitHub
5 changed files with 58 additions and 39 deletions
+1 -1
View File
@@ -8,7 +8,7 @@ Automatically translate streaming service links.
## Platform Support
This bot supports every platform the [song.link](song.link) platform supports as it takes advantage of its API.
This bot supports every platform the [song.link](https://song.link) platform supports as it takes advantage of its API.
Currently, it detects the following URL Schemes:
+1
View File
@@ -8,6 +8,7 @@ export enum LoggerLayers {
client = "client",
songLink = "songLink",
embedGenerator = "embedGenerator",
deezerMetadata = "deezerMetadata",
slashCommands = "slashCommands"
}
+1 -1
View File
@@ -72,7 +72,7 @@ const nonDeezerMockSongData: MockSonglinkResponse = {
describe("getDetailedMetadata", () => {
test("Should fetch detailed metadata for a song", async () => {
expect(await getDetailedMetadata(mockSongData as SonglinkResponse))
.toHaveProperty("artistName", "Neutral Milk Hotel");
.toHaveProperty("releaseYear", "2005-09-06");
});
test("Should fetch detailed metadata for an album", async () => {
expect(await getDetailedMetadata(mockAlbumData as SonglinkResponse))
+3 -37
View File
@@ -1,13 +1,13 @@
import { getLinks } from "songlink-api";
import * as deezerApi from "deezer-api-ts";
import { SonglinkPlatform } from "songlink-api/lib/types/Platform";
import { SonglinkResponse } from "songlink-api/lib/types/Response";
import { LoggerLayers } from "../config";
import { createLayeredLogger } from "../utils/logger";
import { getDeezerMetadata } from "./metadata/deezer";
const logger = createLayeredLogger(LoggerLayers.songLink);
interface MetaData {
export interface MetaData {
title?: string;
artistName?: string;
artwork?: string;
@@ -40,41 +40,7 @@ export const getIdFromEntity = (entity: string): string => {
export const getDetailedMetadata = async (data: SonglinkResponse): Promise<MetaData> => {
if (data.linksByPlatform.deezer) {
try {
logger.info("Fetching metadata from Deezer");
const entityId = getIdFromEntity(data.linksByPlatform.deezer.entityUniqueId);
let metaData;
if (data.linksByPlatform.deezer.entityUniqueId.includes("SONG")) {
const songMetaData = await deezerApi.getTrack(parseInt(entityId));
metaData = {
title: songMetaData.title,
artist: songMetaData.artist,
artwork: songMetaData.album?.cover || ""
};
} else {
metaData = await deezerApi.getAlbum(parseInt(entityId));
}
if (!metaData.title) {
logger.warn("Attempted to fetch metadata from deezer but received empty response");
return;
}
logger.info(`Successfully fetched metadata for ${metaData.title}`);
return {
title: metaData.title,
artistName: metaData.artist.name,
artwork: metaData.cover,
genres: metaData.genres?.data.map(genre => genre.name),
releaseYear: metaData.release_date
};
} catch (e) {
logger.error("Unable to fetch metadata from Deezer:", e);
}
return await getDeezerMetadata(data);
} else {
logger.warn("Requested metaData but it is not on any supported streaming services");
}
+52
View File
@@ -0,0 +1,52 @@
import * as deezerApi from "deezer-api-ts";
import { SonglinkResponse } from "songlink-api/lib/types/Response";
import { LoggerLayers } from "../../config";
import { createLayeredLogger } from "../../utils/logger";
import { getIdFromEntity, MetaData } from "../getSongLink";
const logger = createLayeredLogger(LoggerLayers.deezerMetadata);
export const getDeezerMetadata = async (data: SonglinkResponse): Promise<MetaData> => {
try {
logger.info("Fetching metadata from Deezer");
const entityId = getIdFromEntity(data.linksByPlatform.deezer.entityUniqueId);
let metaData;
if (data.linksByPlatform.deezer.entityUniqueId.includes("SONG")) {
const songMetaData = await deezerApi.getTrack(parseInt(entityId));
let albumMetadata;
if (songMetaData.album.id) {
albumMetadata = await deezerApi.getAlbum(songMetaData.album.id);
}
metaData = {
title: songMetaData.title,
artist: songMetaData.artist,
artwork: songMetaData.album?.cover || "",
genres: albumMetadata?.genres || undefined,
release_date: albumMetadata?.release_date || undefined
};
} else {
metaData = await deezerApi.getAlbum(parseInt(entityId));
}
if (!metaData.title) {
logger.warn("Attempted to fetch metadata from deezer but received empty response");
return;
}
logger.info(`Successfully fetched metadata for ${metaData.title}`);
return {
title: metaData.title,
artistName: metaData.artist.name,
artwork: metaData.cover,
genres: metaData.genres?.data.map(genre => genre.name),
releaseYear: metaData.release_date
};
} catch (e) {
logger.error("Unable to fetch metadata from Deezer:", e);
}
};