mirror of
https://github.com/zkldi/Tachi.git
synced 2026-10-01 03:18:06 +03:00
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:
+1
-1
@@ -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:
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ export enum LoggerLayers {
|
||||
client = "client",
|
||||
songLink = "songLink",
|
||||
embedGenerator = "embedGenerator",
|
||||
deezerMetadata = "deezerMetadata",
|
||||
slashCommands = "slashCommands"
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user