feat(genius): load song metadata, lyrics, and artwork
ci / ts / ts (packages + web) (push) Canceled after 1m0s
ci / api / api (push) Successful in 46s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 56s
ci / db / db (push) Successful in 1m32s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m27s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m31s
ci / ts / ts (packages + web) (push) Canceled after 1m0s
ci / api / api (push) Successful in 46s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 56s
ci / db / db (push) Successful in 1m32s
ci / mobile / mobile (Metro-бандл Android) (push) Successful in 1m27s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m31s
Search hits omit album covers and artist images. The worker now reads the full song and artist, stores the description, and leaves Genius image URLs unchanged on mobile. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
fb20258489
commit
73ad61e7a5
34 files changed
+2214
-303
No files matched your search
@@ -4,6 +4,40 @@
|
||||
*/
|
||||
|
||||
export interface paths {
|
||||
"/api/v1/admin/genius": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
get: operations["getGeniusStats"];
|
||||
put?: never;
|
||||
post: operations["controlGenius"];
|
||||
delete?: never;
|
||||
options?: never;
|
||||
head?: never;
|
||||
patch?: never;
|
||||
trace?: never;
|
||||
};
|
||||
"/api/v1/tracks/{id}/genius": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path: {
|
||||
id: components["parameters"]["EntityId"];
|
||||
};
|
||||
cookie?: never;
|
||||
};
|
||||
get: operations["getTrackGenius"];
|
||||
put?: never;
|
||||
post?: never;
|
||||
delete?: never;
|
||||
options?: never;
|
||||
head?: never;
|
||||
patch?: never;
|
||||
trace?: never;
|
||||
};
|
||||
"/healthz": {
|
||||
parameters: {
|
||||
query?: never;
|
||||
@@ -2068,7 +2102,40 @@ export interface components {
|
||||
/** @description Аудиопризнаки (после анализа) — для анимации волны и выравнивания громкости */
|
||||
features: components["schemas"]["TrackFeatures"] | null;
|
||||
};
|
||||
GeniusStats: {
|
||||
configured: boolean;
|
||||
paused: boolean;
|
||||
running: boolean;
|
||||
total: number;
|
||||
pending: number;
|
||||
matched: number;
|
||||
lyrics: number;
|
||||
annotations: number;
|
||||
images: number;
|
||||
unmatched: number;
|
||||
errors: number;
|
||||
last_error: string;
|
||||
/** Format: date-time */
|
||||
cooldown_until: string;
|
||||
};
|
||||
GeniusContent: {
|
||||
status: string;
|
||||
lyrics: string;
|
||||
source_url: string;
|
||||
song_image_url: string;
|
||||
artist_image_url: string;
|
||||
description: string;
|
||||
annotations: components["schemas"]["GeniusAnnotation"][];
|
||||
};
|
||||
GeniusAnnotation: {
|
||||
fragment: string;
|
||||
text: string;
|
||||
url: string;
|
||||
verified: boolean;
|
||||
authors: string;
|
||||
};
|
||||
Artist: {
|
||||
image_url?: string;
|
||||
/** Format: uuid */
|
||||
id: string;
|
||||
name: string;
|
||||
@@ -2380,6 +2447,75 @@ export interface components {
|
||||
}
|
||||
export type $defs = Record<string, never>;
|
||||
export interface operations {
|
||||
getGeniusStats: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody?: never;
|
||||
responses: {
|
||||
/** @description Persistent enrichment statistics (admin only) */
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["GeniusStats"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
controlGenius: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path?: never;
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody: {
|
||||
content: {
|
||||
"application/json": {
|
||||
/** @enum {string} */
|
||||
action: "start" | "pause" | "retry";
|
||||
};
|
||||
};
|
||||
};
|
||||
responses: {
|
||||
/** @description Updated statistics */
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["GeniusStats"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
getTrackGenius: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
header?: never;
|
||||
path: {
|
||||
id: components["parameters"]["EntityId"];
|
||||
};
|
||||
cookie?: never;
|
||||
};
|
||||
requestBody?: never;
|
||||
responses: {
|
||||
/** @description Cached lyrics and annotations; never makes an upstream request */
|
||||
200: {
|
||||
headers: {
|
||||
[name: string]: unknown;
|
||||
};
|
||||
content: {
|
||||
"application/json": components["schemas"]["GeniusContent"];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
getHealthz: {
|
||||
parameters: {
|
||||
query?: never;
|
||||
|
||||
Reference in new issue
Block a user