@ngxsplayer/ngx-smart-player-metadata-omdb 0.0.1-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { DefaultCacheStore } from '@ngxsp/core';
|
|
2
|
+
|
|
3
|
+
class OmdbProvider {
|
|
4
|
+
cfg;
|
|
5
|
+
cache;
|
|
6
|
+
id = 'omdb';
|
|
7
|
+
constructor(cfg, cache = new DefaultCacheStore()) {
|
|
8
|
+
this.cfg = cfg;
|
|
9
|
+
this.cache = cache;
|
|
10
|
+
}
|
|
11
|
+
async match(hint) {
|
|
12
|
+
if (hint.imdbId)
|
|
13
|
+
return [{ id: hint.imdbId, label: `imdb:${hint.imdbId}`, score: 1 }];
|
|
14
|
+
if (!hint.title)
|
|
15
|
+
return [];
|
|
16
|
+
const key = `meta:omdb:search:${hint.title}:${hint.year ?? ''}`;
|
|
17
|
+
const cached = await this.cache.get(key);
|
|
18
|
+
if (cached)
|
|
19
|
+
return cached;
|
|
20
|
+
const base = this.cfg.apiBaseUrl ?? 'https://www.omdbapi.com/';
|
|
21
|
+
const url = new URL(base);
|
|
22
|
+
url.searchParams.set('apikey', this.cfg.apiKey);
|
|
23
|
+
url.searchParams.set('s', hint.title);
|
|
24
|
+
if (hint.year)
|
|
25
|
+
url.searchParams.set('y', String(hint.year));
|
|
26
|
+
const res = await fetch(url.toString());
|
|
27
|
+
if (!res.ok)
|
|
28
|
+
return [];
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
const out = (data?.Search ?? []).slice(0, 8).map((r) => ({
|
|
31
|
+
id: String(r.imdbID),
|
|
32
|
+
label: `${r.Title} (${r.Year})`,
|
|
33
|
+
score: 1,
|
|
34
|
+
extra: r
|
|
35
|
+
}));
|
|
36
|
+
await this.cache.set(key, out, this.cfg.ttlMs ?? 24 * 60 * 60 * 1000);
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
async fetch(id) {
|
|
40
|
+
const key = `meta:omdb:item:${id}`;
|
|
41
|
+
const cached = await this.cache.get(key);
|
|
42
|
+
if (cached)
|
|
43
|
+
return cached;
|
|
44
|
+
const base = this.cfg.apiBaseUrl ?? 'https://www.omdbapi.com/';
|
|
45
|
+
const url = new URL(base);
|
|
46
|
+
url.searchParams.set('apikey', this.cfg.apiKey);
|
|
47
|
+
url.searchParams.set('i', id);
|
|
48
|
+
url.searchParams.set('plot', 'full');
|
|
49
|
+
const res = await fetch(url.toString());
|
|
50
|
+
if (!res.ok)
|
|
51
|
+
throw new Error(`OMDb fetch failed: ${res.status}`);
|
|
52
|
+
const m = await res.json();
|
|
53
|
+
const meta = {
|
|
54
|
+
title: m.Title,
|
|
55
|
+
description: m.Plot,
|
|
56
|
+
year: m.Year ? Number(String(m.Year).slice(0, 4)) : undefined,
|
|
57
|
+
genres: m.Genre ? String(m.Genre).split(',').map((x) => x.trim()) : undefined,
|
|
58
|
+
cast: m.Actors ? String(m.Actors).split(',').map((x) => x.trim()) : undefined,
|
|
59
|
+
posterUrl: m.Poster && m.Poster !== 'N/A' ? m.Poster : undefined,
|
|
60
|
+
extras: m
|
|
61
|
+
};
|
|
62
|
+
await this.cache.set(key, meta, this.cfg.ttlMs ?? 24 * 60 * 60 * 1000);
|
|
63
|
+
return meta;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Generated bundle index. Do not edit.
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
export { OmdbProvider };
|
|
72
|
+
//# sourceMappingURL=ngxsplayer-ngx-smart-player-metadata-omdb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngxsplayer-ngx-smart-player-metadata-omdb.mjs","sources":["../../../projects/ngx-smart-player-metadata-omdb/src/lib/omdb.provider.ts","../../../projects/ngx-smart-player-metadata-omdb/src/ngxsplayer-ngx-smart-player-metadata-omdb.ts"],"sourcesContent":["import { CacheStore, DefaultCacheStore } from '@ngxsp/core';\nimport { MetadataProvider, MetadataHint, MetadataMatch, VideoMetadata } from '@ngxsp/core';\n\nexport class OmdbProvider implements MetadataProvider {\n id = 'omdb';\n\n constructor(\n private cfg: { apiKey: string; apiBaseUrl?: string; ttlMs?: number },\n private cache: CacheStore = new DefaultCacheStore()\n ) {}\n\n async match(hint: MetadataHint): Promise<MetadataMatch[]> {\n if (hint.imdbId) return [{ id: hint.imdbId, label: `imdb:${hint.imdbId}`, score: 1 }];\n if (!hint.title) return [];\n\n const key = `meta:omdb:search:${hint.title}:${hint.year ?? ''}`;\n const cached = await this.cache.get<MetadataMatch[]>(key);\n if (cached) return cached;\n\n const base = this.cfg.apiBaseUrl ?? 'https://www.omdbapi.com/';\n const url = new URL(base);\n url.searchParams.set('apikey', this.cfg.apiKey);\n url.searchParams.set('s', hint.title);\n if (hint.year) url.searchParams.set('y', String(hint.year));\n\n const res = await fetch(url.toString());\n if (!res.ok) return [];\n const data = await res.json();\n\n const out: MetadataMatch[] = (data?.Search ?? []).slice(0, 8).map((r: any) => ({\n id: String(r.imdbID),\n label: `${r.Title} (${r.Year})`,\n score: 1,\n extra: r\n }));\n\n await this.cache.set(key, out, this.cfg.ttlMs ?? 24 * 60 * 60 * 1000);\n return out;\n }\n\n async fetch(id: string): Promise<VideoMetadata> {\n const key = `meta:omdb:item:${id}`;\n const cached = await this.cache.get<VideoMetadata>(key);\n if (cached) return cached;\n\n const base = this.cfg.apiBaseUrl ?? 'https://www.omdbapi.com/';\n const url = new URL(base);\n url.searchParams.set('apikey', this.cfg.apiKey);\n url.searchParams.set('i', id);\n url.searchParams.set('plot', 'full');\n\n const res = await fetch(url.toString());\n if (!res.ok) throw new Error(`OMDb fetch failed: ${res.status}`);\n const m = await res.json();\n\n const meta: VideoMetadata = {\n title: m.Title,\n description: m.Plot,\n year: m.Year ? Number(String(m.Year).slice(0, 4)) : undefined,\n genres: m.Genre ? String(m.Genre).split(',').map((x: string) => x.trim()) : undefined,\n cast: m.Actors ? String(m.Actors).split(',').map((x: string) => x.trim()) : undefined,\n posterUrl: m.Poster && m.Poster !== 'N/A' ? m.Poster : undefined,\n extras: m\n };\n\n await this.cache.set(key, meta, this.cfg.ttlMs ?? 24 * 60 * 60 * 1000);\n return meta;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { MetadataProvider, CacheStore, MetadataHint, MetadataMatch, VideoMetadata } from '@ngxsp/core';
|
|
2
|
+
|
|
3
|
+
declare class OmdbProvider implements MetadataProvider {
|
|
4
|
+
private cfg;
|
|
5
|
+
private cache;
|
|
6
|
+
id: string;
|
|
7
|
+
constructor(cfg: {
|
|
8
|
+
apiKey: string;
|
|
9
|
+
apiBaseUrl?: string;
|
|
10
|
+
ttlMs?: number;
|
|
11
|
+
}, cache?: CacheStore);
|
|
12
|
+
match(hint: MetadataHint): Promise<MetadataMatch[]>;
|
|
13
|
+
fetch(id: string): Promise<VideoMetadata>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { OmdbProvider };
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ngxsplayer/ngx-smart-player-metadata-omdb",
|
|
3
|
+
"version": "0.0.1-next.0",
|
|
4
|
+
"description": "OMDb metadata provider for ngx-smart-player.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"video",
|
|
8
|
+
"player",
|
|
9
|
+
"ngx-smart-player"
|
|
10
|
+
],
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"peerDependencies": {
|
|
13
|
+
"@angular/common": ">=16.0.0",
|
|
14
|
+
"@angular/core": ">=16.0.0",
|
|
15
|
+
"rxjs": ">=7.0.0",
|
|
16
|
+
"@ngxsplayer/ngx-smart-player": "0.0.1-next.0",
|
|
17
|
+
"@ngxsp/core": "0.0.1-next.0"
|
|
18
|
+
},
|
|
19
|
+
"sideEffects": false,
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"tslib": "^2.3.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependenciesMeta": {
|
|
24
|
+
"@ngxsp/core": {
|
|
25
|
+
"optional": false
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"module": "fesm2022/ngxsplayer-ngx-smart-player-metadata-omdb.mjs",
|
|
29
|
+
"typings": "index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
"./package.json": {
|
|
32
|
+
"default": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./index.d.ts",
|
|
36
|
+
"default": "./fesm2022/ngxsplayer-ngx-smart-player-metadata-omdb.mjs"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|