@freqhole/api-client 0.3.10 → 0.3.12

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@freqhole/api-client",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -99,7 +99,7 @@ export class CharnelLocalTransport implements Transport {
99
99
  constructor(_baseUrl: string) {
100
100
  // baseUrl no longer needed - all requests go through IPC.
101
101
  // (used to also kick off an embedded http loopback server probe
102
- // here; that server has been removed in favor of the rodio backend.)
102
+ // here; that server has been removed in favor of the libmpv backend.)
103
103
  }
104
104
 
105
105
  /**
@@ -429,7 +429,7 @@ export class CharnelLocalTransport implements Transport {
429
429
  * 1. cached object URL (db-stored blobs)
430
430
  * 2. tauri asset:// (via `convertFileSrc`), for any blob with a local path
431
431
  *
432
- * note: when the rodio audio backend is enabled (charnel + opt-in)
432
+ * note: when the libmpv audio backend is enabled (charnel + opt-in)
433
433
  * playback bypasses html `<audio>` entirely and reads files via
434
434
  * filesystem path — this method is unused for that path.
435
435
  */
@@ -219,8 +219,9 @@ export const routes = {
219
219
  stream_blob: { method: 'GET', path: '/api/blobs/{id}', req: null, resp: null, auth: { type: 'authenticated' } as const },
220
220
  suggestions: { method: 'POST', path: '/api/music/suggestions', req: s.SuggestionsRequestSchema, resp: s.SuggestionsResponseSchema, auth: { type: 'authenticated' } as const },
221
221
  sync_album: { method: 'POST', path: '/api/sync/album', req: s.SyncAlbumRequestSchema, resp: s.SyncAlbumResponseSchema, auth: { type: 'role', role: 'member' } as const },
222
+ sync_job_notify: { method: 'POST', path: '/api/sync/job-notify', req: s.SyncJobNotifySchema, resp: z.boolean(), auth: { type: 'public' } as const },
222
223
  sync_playlist: { method: 'POST', path: '/api/sync/playlist', req: s.SyncPlaylistRequestSchema, resp: s.SyncPlaylistResponseSchema, auth: { type: 'role', role: 'member' } as const },
223
- sync_song_by_blake3: { method: 'POST', path: '/api/sync/song-by-blake3', req: s.SyncSongByBlake3RequestSchema, resp: s.SyncSongByBlake3ResponseSchema, auth: { type: 'role', role: 'member' } as const },
224
+ sync_song_by_blake3: { method: 'POST', path: '/api/sync/song-by-blake3', req: s.SyncSongByBlake3RequestSchema, resp: s.SyncJobQueuedResponseSchema, auth: { type: 'role', role: 'member' } as const },
224
225
  synced_sha256s: { method: 'GET', path: '/api/sync/sha256s', req: null, resp: z.string().array(), auth: { type: 'role', role: 'member' } as const },
225
226
  top_albums: { method: 'POST', path: '/api/analytics/top-albums', req: s.TopAlbumsRequestSchema, resp: s.TopAlbumSchema.array(), auth: { type: 'authenticated' } as const },
226
227
  top_artists: { method: 'POST', path: '/api/analytics/top-artists', req: s.TopArtistsRequestSchema, resp: s.TopArtistSchema.array(), auth: { type: 'authenticated' } as const },
@@ -270,7 +271,7 @@ export const routes = {
270
271
  query_videos: { method: 'POST', path: '/api/video/videos/query', req: s.QueryVideosRequestSchema, resp: s.VideosQueryResultSchema, auth: { type: 'authenticated' } as const },
271
272
  recently_added_videos: { method: 'POST', path: '/api/video/relations/recently-added-videos', req: s.RecentlyAddedVideosRequestSchema, resp: s.RecentlyAddedVideosResponseSchema, auth: { type: 'authenticated' } as const },
272
273
  reprocess_video: { method: 'POST', path: '/api/video/videos/reprocess', req: s.ReprocessVideoRequestSchema, resp: s.ReprocessVideoResultSchema, auth: { type: 'role', role: 'admin' } as const },
273
- sync_video_by_blake3: { method: 'POST', path: '/api/sync/video-by-blake3', req: s.SyncVideoByBlake3RequestSchema, resp: s.SyncVideoByBlake3ResponseSchema, auth: { type: 'role', role: 'member' } as const },
274
+ sync_video_by_blake3: { method: 'POST', path: '/api/sync/video-by-blake3', req: s.SyncVideoByBlake3RequestSchema, resp: s.SyncJobQueuedResponseSchema, auth: { type: 'role', role: 'member' } as const },
274
275
  unassigned_videos: { method: 'POST', path: '/api/video/relations/unassigned-videos', req: s.UnassignedVideosRequestSchema, resp: s.UnassignedVideosResponseSchema, auth: { type: 'authenticated' } as const },
275
276
  update_video_season: { method: 'POST', path: '/api/video/seasons/update', req: s.UpdateVideoSeasonRequestSchema, resp: s.VideoSeasonSchema, auth: { type: 'role', role: 'admin' } as const },
276
277
  update_video_series: { method: 'POST', path: '/api/video/series/update', req: s.UpdateVideoSeriesRequestSchema, resp: s.VideoSeriesSchema, auth: { type: 'role', role: 'admin' } as const },
@@ -1462,7 +1462,7 @@ export const CreateArtistRequestSchema = z.object({
1462
1462
  export type CreateArtistRequest = z.infer<typeof CreateArtistRequestSchema>;
1463
1463
 
1464
1464
  export const CreateJobRequestSchema = z.object({
1465
- job_type: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
1465
+ job_type: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
1466
1466
  session_id: z.string().nullish(),
1467
1467
  parameters: z.any(),
1468
1468
  max_retries: z.number().nullish(),
@@ -1927,7 +1927,7 @@ export const ErrorDetailSchema = z.object({
1927
1927
  export type ErrorDetail = z.infer<typeof ErrorDetailSchema>;
1928
1928
 
1929
1929
  export const EventFilterSchema = z.object({
1930
- kinds: z.array(z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')])).nullish(),
1930
+ kinds: z.array(z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')])).nullish(),
1931
1931
  job_ids: z.array(z.string()).nullish(),
1932
1932
  session_ids: z.array(z.string()).nullish(),
1933
1933
  entity_refs: z.array(z.union([z.object({
@@ -3182,7 +3182,7 @@ export const JobEventSchema = z.union([z.object({
3182
3182
  session_id: z.string(),
3183
3183
  complete: z.number(),
3184
3184
  total: z.number(),
3185
- topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3185
+ topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3186
3186
  entity_ref: z.union([z.object({
3187
3187
  kind: z.literal('album'),
3188
3188
  id: z.string()
@@ -3198,7 +3198,7 @@ export const JobEventSchema = z.union([z.object({
3198
3198
  job_id: z.string(),
3199
3199
  from: z.union([z.literal('pending'), z.literal('running'), z.literal('completed'), z.literal('failed'), z.literal('cancelled')]).nullish(),
3200
3200
  to: z.union([z.literal('pending'), z.literal('running'), z.literal('completed'), z.literal('failed'), z.literal('cancelled')]),
3201
- topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3201
+ topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3202
3202
  entity_ref: z.union([z.object({
3203
3203
  kind: z.literal('album'),
3204
3204
  id: z.string()
@@ -3213,7 +3213,7 @@ export const JobEventSchema = z.union([z.object({
3213
3213
  job_id: z.string(),
3214
3214
  error_type: z.string(),
3215
3215
  message: z.string(),
3216
- topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3216
+ topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3217
3217
  entity_ref: z.union([z.object({
3218
3218
  kind: z.literal('album'),
3219
3219
  id: z.string()
@@ -3228,7 +3228,7 @@ export const JobEventSchema = z.union([z.object({
3228
3228
  job_id: z.string(),
3229
3229
  stage: z.string(),
3230
3230
  message: z.string().nullish(),
3231
- topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3231
+ topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3232
3232
  entity_ref: z.union([z.object({
3233
3233
  kind: z.literal('album'),
3234
3234
  id: z.string()
@@ -3236,11 +3236,12 @@ export const JobEventSchema = z.union([z.object({
3236
3236
  kind: z.literal('artist'),
3237
3237
  id: z.string()
3238
3238
  })]).nullish(),
3239
- created_by: z.string().nullish()
3239
+ created_by: z.string().nullish(),
3240
+ details: z.any().nullish()
3240
3241
  }), z.object({
3241
3242
  kind: z.literal('completed'),
3242
3243
  session_id: z.string(),
3243
- topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3244
+ topic: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3244
3245
  entity_ref: z.union([z.object({
3245
3246
  kind: z.literal('album'),
3246
3247
  id: z.string()
@@ -3278,7 +3279,7 @@ export type JobResponse = z.infer<typeof JobResponseSchema>;
3278
3279
  export const JobStateSnapshotSchema = z.object({
3279
3280
  job_id: z.string(),
3280
3281
  session_id: z.string().nullish(),
3281
- job_type: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment')]),
3282
+ job_type: z.union([z.literal('ScanDirectory'), z.literal('RescanDirectories'), z.literal('ProcessFile'), z.literal('ProcessDirectory'), z.literal('FetchMedia'), z.literal('PreCheckFetch'), z.literal('ConvertWebp'), z.literal('ImportMusic'), z.literal('ImportVideo'), z.literal('TranscodeVideo'), z.literal('MbAlbumSearch'), z.literal('MbAlbumDetail'), z.literal('LastFmAlbumDetail'), z.literal('LastFmArtistDetail'), z.literal('AudioDbAlbumDetail'), z.literal('AudioDbArtistDetail'), z.literal('AlbumEnrichmentPipeline'), z.literal('AutoApplyAlbumEnrichment'), z.literal('SyncSongByBlake3'), z.literal('SyncVideoByBlake3')]),
3282
3283
  status: z.union([z.literal('pending'), z.literal('running'), z.literal('completed'), z.literal('failed'), z.literal('cancelled')]),
3283
3284
  entity_ref: z.union([z.object({
3284
3285
  kind: z.literal('album'),
@@ -4658,7 +4659,7 @@ export const PlaybackSessionTypeSchema = z.union([z.literal("song"), z.literal("
4658
4659
  export type PlaybackSessionType = z.infer<typeof PlaybackSessionTypeSchema>;
4659
4660
 
4660
4661
  export const PlayerCommandSchema = z.union([
4661
- z.object({ kind: z.literal("load"), paths: z.array(z.string()) }),
4662
+ z.object({ kind: z.literal("load"), paths: z.array(z.string()), start_ms: z.number().nullish(), start_paused: z.boolean() }),
4662
4663
  z.object({ kind: z.literal("enqueue"), paths: z.array(z.string()) }),
4663
4664
  z.object({ kind: z.literal("play") }),
4664
4665
  z.object({ kind: z.literal("pause") }),
@@ -6079,14 +6080,6 @@ export const RequeryOverrideSchema = z.object({
6079
6080
  });
6080
6081
  export type RequeryOverride = z.infer<typeof RequeryOverrideSchema>;
6081
6082
 
6082
- export const RestartPolicySchema = z.object({
6083
- max_restarts: z.number(),
6084
- window_ms: z.number(),
6085
- initial_backoff_ms: z.number(),
6086
- max_backoff_ms: z.number()
6087
- });
6088
- export type RestartPolicy = z.infer<typeof RestartPolicySchema>;
6089
-
6090
6083
  export const RevokeOwnInviteRequestSchema = z.object({
6091
6084
  code: z.string()
6092
6085
  });
@@ -7015,9 +7008,8 @@ export const SyncAlbumRequestSchema = z.object({
7015
7008
  mb_release_id: z.string().nullish(),
7016
7009
  mb_release_group_id: z.string().nullish(),
7017
7010
  tags: z.array(z.string()),
7018
- images_base64: z.array(z.object({
7019
- content_sha256: z.string(),
7020
- data_base64: z.string().nullish(),
7011
+ images: z.array(z.object({
7012
+ blake3: z.string(),
7021
7013
  mime_type: z.string(),
7022
7014
  is_primary: z.boolean(),
7023
7015
  blob_type: z.string().nullish()
@@ -7032,28 +7024,52 @@ export const SyncAlbumResponseSchema = z.object({
7032
7024
  artist_id: z.string(),
7033
7025
  existing: z.boolean(),
7034
7026
  images_linked: z.number(),
7035
- missing_image_sha256s: z.array(z.string())
7027
+ missing_image_blake3s: z.array(z.string())
7036
7028
  });
7037
7029
  export type SyncAlbumResponse = z.infer<typeof SyncAlbumResponseSchema>;
7038
7030
 
7039
7031
  export const SyncImageRefSchema = z.object({
7040
- content_sha256: z.string(),
7041
- data_base64: z.string().nullish(),
7032
+ blake3: z.string(),
7042
7033
  mime_type: z.string(),
7043
7034
  is_primary: z.boolean(),
7044
7035
  blob_type: z.string().nullish()
7045
7036
  });
7046
7037
  export type SyncImageRef = z.infer<typeof SyncImageRefSchema>;
7047
7038
 
7039
+ export const SyncJobNotifySchema = z.object({
7040
+ job_id: z.string(),
7041
+ domain: z.string(),
7042
+ blake3: z.string(),
7043
+ title: z.string(),
7044
+ success: z.boolean(),
7045
+ error: z.string().nullish()
7046
+ });
7047
+ export type SyncJobNotify = z.infer<typeof SyncJobNotifySchema>;
7048
+
7049
+ export const SyncJobQueuedResponseSchema = z.object({
7050
+ job_id: z.string(),
7051
+ artist_id: z.string().nullish()
7052
+ });
7053
+ export type SyncJobQueuedResponse = z.infer<typeof SyncJobQueuedResponseSchema>;
7054
+
7055
+ export const SyncPlaylistMemberSchema = z.object({
7056
+ kind: z.string(),
7057
+ blake3: z.string()
7058
+ });
7059
+ export type SyncPlaylistMember = z.infer<typeof SyncPlaylistMemberSchema>;
7060
+
7048
7061
  export const SyncPlaylistRequestSchema = z.object({
7049
7062
  source_remote_id: z.string().nullish(),
7063
+ source_node_id: z.string().nullish(),
7050
7064
  remote_playlist_id: z.string(),
7051
7065
  title: z.string(),
7052
7066
  description: z.string().nullish(),
7053
- song_blake3s: z.array(z.string()),
7067
+ members: z.array(z.object({
7068
+ kind: z.string(),
7069
+ blake3: z.string()
7070
+ })),
7054
7071
  images: z.array(z.object({
7055
- content_sha256: z.string(),
7056
- data_base64: z.string().nullish(),
7072
+ blake3: z.string(),
7057
7073
  mime_type: z.string(),
7058
7074
  is_primary: z.boolean(),
7059
7075
  blob_type: z.string().nullish()
@@ -7064,17 +7080,18 @@ export type SyncPlaylistRequest = z.infer<typeof SyncPlaylistRequestSchema>;
7064
7080
 
7065
7081
  export const SyncPlaylistResponseSchema = z.object({
7066
7082
  playlist_id: z.string(),
7067
- songs_added: z.number(),
7068
- missing_song_blake3s: z.array(z.string()),
7083
+ members_added: z.number(),
7084
+ missing_member_blake3s: z.array(z.string()),
7069
7085
  song_stubs_created: z.number(),
7070
7086
  images_linked: z.number(),
7071
- missing_image_sha256s: z.array(z.string())
7087
+ missing_image_blake3s: z.array(z.string())
7072
7088
  });
7073
7089
  export type SyncPlaylistResponse = z.infer<typeof SyncPlaylistResponseSchema>;
7074
7090
 
7075
7091
  export const SyncSongByBlake3RequestSchema = z.object({
7076
7092
  blake3: z.string(),
7077
7093
  sha256: z.string(),
7094
+ node_id: z.string().nullish(),
7078
7095
  size: z.number().nullish(),
7079
7096
  filename: z.string(),
7080
7097
  source_node_id: z.string(),
@@ -7093,15 +7110,13 @@ export const SyncSongByBlake3RequestSchema = z.object({
7093
7110
  metadata: z.string().nullish(),
7094
7111
  genre_name: z.string().nullish(),
7095
7112
  song_images: z.array(z.object({
7096
- content_sha256: z.string(),
7097
- data_base64: z.string().nullish(),
7113
+ blake3: z.string(),
7098
7114
  mime_type: z.string(),
7099
7115
  is_primary: z.boolean(),
7100
7116
  blob_type: z.string().nullish()
7101
7117
  })),
7102
7118
  album_images: z.array(z.object({
7103
- content_sha256: z.string(),
7104
- data_base64: z.string().nullish(),
7119
+ blake3: z.string(),
7105
7120
  mime_type: z.string(),
7106
7121
  is_primary: z.boolean(),
7107
7122
  blob_type: z.string().nullish()
@@ -7113,17 +7128,19 @@ export type SyncSongByBlake3Request = z.infer<typeof SyncSongByBlake3RequestSche
7113
7128
  export const SyncSongByBlake3ResponseSchema = z.object({
7114
7129
  song_id: z.string(),
7115
7130
  media_blob_id: z.string(),
7131
+ artist_id: z.string(),
7116
7132
  file_path: z.string(),
7117
7133
  sha256: z.string(),
7118
7134
  blake3: z.string(),
7119
7135
  existing: z.boolean(),
7120
7136
  images_linked: z.number(),
7121
- missing_image_sha256s: z.array(z.string())
7137
+ missing_image_blake3s: z.array(z.string())
7122
7138
  });
7123
7139
  export type SyncSongByBlake3Response = z.infer<typeof SyncSongByBlake3ResponseSchema>;
7124
7140
 
7125
7141
  export const SyncVideoByBlake3RequestSchema = z.object({
7126
7142
  blake3: z.string(),
7143
+ node_id: z.string().nullish(),
7127
7144
  sha256: z.string().nullish(),
7128
7145
  size: z.number().nullish(),
7129
7146
  filename: z.string(),
@@ -7142,22 +7159,19 @@ export const SyncVideoByBlake3RequestSchema = z.object({
7142
7159
  season_title: z.string().nullish(),
7143
7160
  parent_blake3: z.string().nullish(),
7144
7161
  video_images: z.array(z.object({
7145
- content_sha256: z.string(),
7146
- data_base64: z.string().nullish(),
7162
+ blake3: z.string(),
7147
7163
  mime_type: z.string(),
7148
7164
  is_primary: z.boolean(),
7149
7165
  blob_type: z.string().nullish()
7150
7166
  })),
7151
7167
  series_images: z.array(z.object({
7152
- content_sha256: z.string(),
7153
- data_base64: z.string().nullish(),
7168
+ blake3: z.string(),
7154
7169
  mime_type: z.string(),
7155
7170
  is_primary: z.boolean(),
7156
7171
  blob_type: z.string().nullish()
7157
7172
  })),
7158
7173
  season_images: z.array(z.object({
7159
- content_sha256: z.string(),
7160
- data_base64: z.string().nullish(),
7174
+ blake3: z.string(),
7161
7175
  mime_type: z.string(),
7162
7176
  is_primary: z.boolean(),
7163
7177
  blob_type: z.string().nullish()
@@ -7174,7 +7188,7 @@ export const SyncVideoByBlake3ResponseSchema = z.object({
7174
7188
  season_id: z.string().nullish(),
7175
7189
  existing: z.boolean(),
7176
7190
  images_linked: z.number(),
7177
- missing_image_sha256s: z.array(z.string())
7191
+ missing_image_blake3s: z.array(z.string())
7178
7192
  });
7179
7193
  export type SyncVideoByBlake3Response = z.infer<typeof SyncVideoByBlake3ResponseSchema>;
7180
7194