@nuclearplayer/plugin-sdk 2.3.0 → 2.4.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.
- package/README.md +7 -1
- package/dist/index.d.ts +163 -3
- package/dist/index.js +493 -423
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -108,13 +108,19 @@ The `api` object passed to lifecycle hooks provides access to these domain APIs:
|
|
|
108
108
|
|-----|-------------|
|
|
109
109
|
| `api.Settings` | Define, read, and persist plugin settings |
|
|
110
110
|
| `api.Queue` | Read and manipulate the playback queue |
|
|
111
|
+
| `api.Playback` | Control audio transport: play, pause, stop, seek |
|
|
112
|
+
| `api.Events` | Subscribe to player lifecycle events (e.g. track finished) |
|
|
111
113
|
| `api.Favorites` | Manage the user's favorite tracks |
|
|
114
|
+
| `api.Playlists` | Create, update, and delete playlists |
|
|
112
115
|
| `api.Providers` | Register and unregister providers |
|
|
113
116
|
| `api.Streaming` | Resolve audio stream URLs for tracks |
|
|
114
117
|
| `api.Metadata` | Search and fetch artist/album/track details |
|
|
115
118
|
| `api.Dashboard` | Fetch dashboard content (top tracks, new releases, etc.) |
|
|
119
|
+
| `api.Http` | Make HTTP requests from plugins and bypass CORS |
|
|
120
|
+
| `api.Logger` | Structured logging |
|
|
121
|
+
| `api.Ytdlp` | yt-dlp integration |
|
|
116
122
|
|
|
117
|
-
See the [full documentation](https://docs.nuclearplayer.com
|
|
123
|
+
See the [full documentation](https://docs.nuclearplayer.com) for detailed guides on each API.
|
|
118
124
|
|
|
119
125
|
## Permissions
|
|
120
126
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
|
|
3
4
|
export declare type Album = {
|
|
@@ -96,6 +97,27 @@ export declare type BooleanWidget = {
|
|
|
96
97
|
type: 'toggle';
|
|
97
98
|
};
|
|
98
99
|
|
|
100
|
+
export declare type CustomSettingDefinition = {
|
|
101
|
+
id: string;
|
|
102
|
+
title: string;
|
|
103
|
+
description?: string;
|
|
104
|
+
category: SettingCategory;
|
|
105
|
+
kind: 'custom';
|
|
106
|
+
widgetId: string;
|
|
107
|
+
default?: SettingValue;
|
|
108
|
+
hidden?: boolean;
|
|
109
|
+
source?: SettingSource;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
export declare type CustomWidgetComponent<API = unknown> = FC<CustomWidgetProps<API>>;
|
|
113
|
+
|
|
114
|
+
export declare type CustomWidgetProps<API = unknown> = {
|
|
115
|
+
value: SettingValue | undefined;
|
|
116
|
+
setValue: (value: SettingValue) => void;
|
|
117
|
+
definition: CustomSettingDefinition;
|
|
118
|
+
api: API;
|
|
119
|
+
};
|
|
120
|
+
|
|
99
121
|
export declare class DashboardAPI {
|
|
100
122
|
#private;
|
|
101
123
|
constructor(host?: DashboardHost);
|
|
@@ -150,6 +172,17 @@ export declare type EnumWidget = {
|
|
|
150
172
|
type: 'radio';
|
|
151
173
|
};
|
|
152
174
|
|
|
175
|
+
export declare class EventsAPI {
|
|
176
|
+
#private;
|
|
177
|
+
constructor(host?: EventsHost);
|
|
178
|
+
on<E extends keyof PluginEventMap>(event: E, listener: PluginEventListener<E>): () => void;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export declare type EventsHost = {
|
|
182
|
+
on<E extends keyof PluginEventMap>(event: E, listener: PluginEventListener<E>): () => void;
|
|
183
|
+
emit<E extends keyof PluginEventMap>(event: E, payload: PluginEventMap[E]): void;
|
|
184
|
+
};
|
|
185
|
+
|
|
153
186
|
export declare type FavoriteEntry<T> = {
|
|
154
187
|
ref: T;
|
|
155
188
|
addedAtIso: string;
|
|
@@ -220,6 +253,95 @@ export declare type HttpResponseData = {
|
|
|
220
253
|
body: string;
|
|
221
254
|
};
|
|
222
255
|
|
|
256
|
+
export declare type JsonSerializable = string | number | boolean | null | JsonSerializable[] | {
|
|
257
|
+
[key: string]: JsonSerializable;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
export declare const legacyConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
261
|
+
playlists: z.ZodArray<z.ZodUnknown, "many">;
|
|
262
|
+
}, "strip", z.ZodTypeAny, {
|
|
263
|
+
playlists: unknown[];
|
|
264
|
+
}, {
|
|
265
|
+
playlists: unknown[];
|
|
266
|
+
}>, {
|
|
267
|
+
playlists: unknown[];
|
|
268
|
+
}, {
|
|
269
|
+
playlists: unknown[];
|
|
270
|
+
}>;
|
|
271
|
+
|
|
272
|
+
export declare type LegacyPlaylist = z.infer<typeof legacyPlaylistSchema>;
|
|
273
|
+
|
|
274
|
+
export declare const legacyPlaylistSchema: z.ZodObject<{
|
|
275
|
+
name: z.ZodString;
|
|
276
|
+
tracks: z.ZodArray<z.ZodObject<{
|
|
277
|
+
uuid: z.ZodOptional<z.ZodString>;
|
|
278
|
+
artist: z.ZodOptional<z.ZodString>;
|
|
279
|
+
name: z.ZodOptional<z.ZodString>;
|
|
280
|
+
album: z.ZodOptional<z.ZodString>;
|
|
281
|
+
thumbnail: z.ZodOptional<z.ZodString>;
|
|
282
|
+
duration: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodNumber, z.ZodEffects<z.ZodString, number, string>]>, number, string | number>>;
|
|
283
|
+
}, "strip", z.ZodTypeAny, {
|
|
284
|
+
thumbnail?: string | undefined;
|
|
285
|
+
name?: string | undefined;
|
|
286
|
+
uuid?: string | undefined;
|
|
287
|
+
artist?: string | undefined;
|
|
288
|
+
album?: string | undefined;
|
|
289
|
+
duration?: number | undefined;
|
|
290
|
+
}, {
|
|
291
|
+
thumbnail?: string | undefined;
|
|
292
|
+
name?: string | undefined;
|
|
293
|
+
uuid?: string | undefined;
|
|
294
|
+
artist?: string | undefined;
|
|
295
|
+
album?: string | undefined;
|
|
296
|
+
duration?: string | number | undefined;
|
|
297
|
+
}>, "many">;
|
|
298
|
+
}, "strip", z.ZodTypeAny, {
|
|
299
|
+
name: string;
|
|
300
|
+
tracks: {
|
|
301
|
+
thumbnail?: string | undefined;
|
|
302
|
+
name?: string | undefined;
|
|
303
|
+
uuid?: string | undefined;
|
|
304
|
+
artist?: string | undefined;
|
|
305
|
+
album?: string | undefined;
|
|
306
|
+
duration?: number | undefined;
|
|
307
|
+
}[];
|
|
308
|
+
}, {
|
|
309
|
+
name: string;
|
|
310
|
+
tracks: {
|
|
311
|
+
thumbnail?: string | undefined;
|
|
312
|
+
name?: string | undefined;
|
|
313
|
+
uuid?: string | undefined;
|
|
314
|
+
artist?: string | undefined;
|
|
315
|
+
album?: string | undefined;
|
|
316
|
+
duration?: string | number | undefined;
|
|
317
|
+
}[];
|
|
318
|
+
}>;
|
|
319
|
+
|
|
320
|
+
export declare type LegacyTrack = z.infer<typeof legacyTrackSchema>;
|
|
321
|
+
|
|
322
|
+
export declare const legacyTrackSchema: z.ZodObject<{
|
|
323
|
+
uuid: z.ZodOptional<z.ZodString>;
|
|
324
|
+
artist: z.ZodOptional<z.ZodString>;
|
|
325
|
+
name: z.ZodOptional<z.ZodString>;
|
|
326
|
+
album: z.ZodOptional<z.ZodString>;
|
|
327
|
+
thumbnail: z.ZodOptional<z.ZodString>;
|
|
328
|
+
duration: z.ZodOptional<z.ZodEffects<z.ZodUnion<[z.ZodNumber, z.ZodEffects<z.ZodString, number, string>]>, number, string | number>>;
|
|
329
|
+
}, "strip", z.ZodTypeAny, {
|
|
330
|
+
thumbnail?: string | undefined;
|
|
331
|
+
name?: string | undefined;
|
|
332
|
+
uuid?: string | undefined;
|
|
333
|
+
artist?: string | undefined;
|
|
334
|
+
album?: string | undefined;
|
|
335
|
+
duration?: number | undefined;
|
|
336
|
+
}, {
|
|
337
|
+
thumbnail?: string | undefined;
|
|
338
|
+
name?: string | undefined;
|
|
339
|
+
uuid?: string | undefined;
|
|
340
|
+
artist?: string | undefined;
|
|
341
|
+
album?: string | undefined;
|
|
342
|
+
duration?: string | number | undefined;
|
|
343
|
+
}>;
|
|
344
|
+
|
|
223
345
|
export declare type LoadedPlugin = {
|
|
224
346
|
metadata: PluginMetadata;
|
|
225
347
|
instance: NuclearPlugin;
|
|
@@ -313,6 +435,8 @@ export declare class NuclearAPI {
|
|
|
313
435
|
readonly Dashboard: DashboardAPI;
|
|
314
436
|
readonly Playback: PlaybackAPI;
|
|
315
437
|
readonly Playlists: PlaylistsAPI;
|
|
438
|
+
readonly Events: EventsAPI;
|
|
439
|
+
readonly Shell: ShellAPI;
|
|
316
440
|
constructor(opts?: {
|
|
317
441
|
settingsHost?: SettingsHost;
|
|
318
442
|
providersHost?: ProvidersHost;
|
|
@@ -326,6 +450,10 @@ export declare class NuclearAPI {
|
|
|
326
450
|
dashboardHost?: DashboardHost;
|
|
327
451
|
playbackHost?: PlaybackHost;
|
|
328
452
|
playlistsHost?: PlaylistsHost;
|
|
453
|
+
eventsHost?: EventsHost;
|
|
454
|
+
shellHost?: ShellHost;
|
|
455
|
+
widgetRegistry?: WidgetRegistry;
|
|
456
|
+
pluginId?: string;
|
|
329
457
|
});
|
|
330
458
|
}
|
|
331
459
|
|
|
@@ -929,6 +1057,7 @@ export declare const playlistExportSchema: z.ZodObject<{
|
|
|
929
1057
|
export declare type PlaylistIndexEntry = Pick<Playlist, 'id' | 'name' | 'createdAtIso' | 'lastModifiedIso' | 'isReadOnly' | 'artwork'> & {
|
|
930
1058
|
itemCount: number;
|
|
931
1059
|
totalDurationMs: number;
|
|
1060
|
+
thumbnails: string[];
|
|
932
1061
|
};
|
|
933
1062
|
|
|
934
1063
|
export declare const playlistIndexEntrySchema: z.ZodObject<{
|
|
@@ -1004,6 +1133,7 @@ export declare const playlistIndexEntrySchema: z.ZodObject<{
|
|
|
1004
1133
|
}>>;
|
|
1005
1134
|
itemCount: z.ZodNumber;
|
|
1006
1135
|
totalDurationMs: z.ZodNumber;
|
|
1136
|
+
thumbnails: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
1007
1137
|
}, "strip", z.ZodTypeAny, {
|
|
1008
1138
|
id: string;
|
|
1009
1139
|
name: string;
|
|
@@ -1012,6 +1142,7 @@ export declare const playlistIndexEntrySchema: z.ZodObject<{
|
|
|
1012
1142
|
isReadOnly: boolean;
|
|
1013
1143
|
itemCount: number;
|
|
1014
1144
|
totalDurationMs: number;
|
|
1145
|
+
thumbnails: string[];
|
|
1015
1146
|
artwork?: {
|
|
1016
1147
|
items: {
|
|
1017
1148
|
url: string;
|
|
@@ -1046,6 +1177,7 @@ export declare const playlistIndexEntrySchema: z.ZodObject<{
|
|
|
1046
1177
|
} | undefined;
|
|
1047
1178
|
}[];
|
|
1048
1179
|
} | undefined;
|
|
1180
|
+
thumbnails?: string[] | undefined;
|
|
1049
1181
|
}>;
|
|
1050
1182
|
|
|
1051
1183
|
export declare const playlistIndexSchema: z.ZodArray<z.ZodObject<{
|
|
@@ -1121,6 +1253,7 @@ export declare const playlistIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
1121
1253
|
}>>;
|
|
1122
1254
|
itemCount: z.ZodNumber;
|
|
1123
1255
|
totalDurationMs: z.ZodNumber;
|
|
1256
|
+
thumbnails: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
|
|
1124
1257
|
}, "strip", z.ZodTypeAny, {
|
|
1125
1258
|
id: string;
|
|
1126
1259
|
name: string;
|
|
@@ -1129,6 +1262,7 @@ export declare const playlistIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
1129
1262
|
isReadOnly: boolean;
|
|
1130
1263
|
itemCount: number;
|
|
1131
1264
|
totalDurationMs: number;
|
|
1265
|
+
thumbnails: string[];
|
|
1132
1266
|
artwork?: {
|
|
1133
1267
|
items: {
|
|
1134
1268
|
url: string;
|
|
@@ -1163,6 +1297,7 @@ export declare const playlistIndexSchema: z.ZodArray<z.ZodObject<{
|
|
|
1163
1297
|
} | undefined;
|
|
1164
1298
|
}[];
|
|
1165
1299
|
} | undefined;
|
|
1300
|
+
thumbnails?: string[] | undefined;
|
|
1166
1301
|
}>, "many">;
|
|
1167
1302
|
|
|
1168
1303
|
export declare type PlaylistItem<T extends Track = Track> = {
|
|
@@ -1608,6 +1743,13 @@ export declare type PlaylistsHost = {
|
|
|
1608
1743
|
|
|
1609
1744
|
export declare type PlaylistsListener = (index: PlaylistIndexEntry[]) => void;
|
|
1610
1745
|
|
|
1746
|
+
export declare type PluginEventListener<E extends keyof PluginEventMap> = (payload: PluginEventMap[E]) => void | Promise<void>;
|
|
1747
|
+
|
|
1748
|
+
export declare type PluginEventMap = {
|
|
1749
|
+
trackFinished: Track;
|
|
1750
|
+
trackStarted: Track;
|
|
1751
|
+
};
|
|
1752
|
+
|
|
1611
1753
|
export declare type PluginIcon = {
|
|
1612
1754
|
type: 'link';
|
|
1613
1755
|
link: string;
|
|
@@ -1760,15 +1902,17 @@ export declare type SearchResults = {
|
|
|
1760
1902
|
|
|
1761
1903
|
export declare type SettingCategory = string;
|
|
1762
1904
|
|
|
1763
|
-
export declare type SettingDefinition = BooleanSettingDefinition | NumberSettingDefinition | StringSettingDefinition | EnumSettingDefinition;
|
|
1905
|
+
export declare type SettingDefinition = BooleanSettingDefinition | NumberSettingDefinition | StringSettingDefinition | EnumSettingDefinition | CustomSettingDefinition;
|
|
1764
1906
|
|
|
1765
1907
|
declare class Settings {
|
|
1766
1908
|
#private;
|
|
1767
|
-
constructor(host?: SettingsHost);
|
|
1909
|
+
constructor(host?: SettingsHost, widgetRegistry?: WidgetRegistry, pluginId?: string);
|
|
1768
1910
|
register(defs: SettingDefinition[]): Promise<SettingsRegistrationResult>;
|
|
1769
1911
|
get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>;
|
|
1770
1912
|
set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>;
|
|
1771
1913
|
subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void;
|
|
1914
|
+
registerWidget(widgetId: string, component: CustomWidgetComponent): void;
|
|
1915
|
+
unregisterWidget(widgetId: string): void;
|
|
1772
1916
|
}
|
|
1773
1917
|
|
|
1774
1918
|
export declare type SettingsHost = {
|
|
@@ -1794,7 +1938,17 @@ export declare type SettingsRegistrationResult = {
|
|
|
1794
1938
|
registered: string[];
|
|
1795
1939
|
};
|
|
1796
1940
|
|
|
1797
|
-
export declare type SettingValue =
|
|
1941
|
+
export declare type SettingValue = JsonSerializable | undefined;
|
|
1942
|
+
|
|
1943
|
+
export declare class ShellAPI {
|
|
1944
|
+
#private;
|
|
1945
|
+
constructor(host?: ShellHost);
|
|
1946
|
+
openExternal(url: string): Promise<void>;
|
|
1947
|
+
}
|
|
1948
|
+
|
|
1949
|
+
export declare type ShellHost = {
|
|
1950
|
+
openExternal(url: string): Promise<void>;
|
|
1951
|
+
};
|
|
1798
1952
|
|
|
1799
1953
|
export declare type Stream = {
|
|
1800
1954
|
url: string;
|
|
@@ -1901,6 +2055,12 @@ export declare type TrackRef = {
|
|
|
1901
2055
|
|
|
1902
2056
|
export declare const useSetting: <T extends SettingValue = SettingValue>(host: SettingsHost | undefined, id: string) => readonly [T | undefined, (nextValue: T) => void];
|
|
1903
2057
|
|
|
2058
|
+
export declare type WidgetRegistry = {
|
|
2059
|
+
register(pluginId: string, widgetId: string, component: CustomWidgetComponent): void;
|
|
2060
|
+
unregister(pluginId: string, widgetId: string): void;
|
|
2061
|
+
get(pluginId: string, widgetId: string): CustomWidgetComponent | undefined;
|
|
2062
|
+
};
|
|
2063
|
+
|
|
1904
2064
|
export declare class YtdlpAPI {
|
|
1905
2065
|
private host?;
|
|
1906
2066
|
constructor(host?: YtdlpHost);
|