import {z} from 'zod' export type GetApiApiV1MusicReleaseIdArgs = {tracks?: boolean | undefined, genres?: boolean | undefined, artists?: boolean | undefined, thumbnails?: boolean | undefined}; export type GetApiApiV1MusicReleaseIdOptions = {baseUrl: string, LocalUserJWT?: string | undefined, fetch?: typeof fetch | undefined}; export const roleAssignment = z.object({id: z.number(), user: z.lazy(() => user), role: z.string(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const user: z.ZodType = z.object({userId: z.string(), cardinalId: z.string().optional(), cachedCloudUser: z.object({subscription: z.enum(["free", "early_adopter", "starter", "pro", "ultimate"]).optional()}), cachedCloudUserAt: z.string().optional(), enabled: z.boolean().optional(), role: z.string(), designation: z.string().optional(), activityStatus: z.string().optional(), activityStatusUpdatedAt: z.string().optional(), roles: z.array(roleAssignment), username: z.string().optional(), password: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const run = z.object({runId: z.string(), file: z.array(z.lazy(() => file)).optional(), status: z.string(), completedAt: z.string(), type: z.string(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoMetadata = z.object({photo: z.lazy(() => photo), metadataType: z.string().optional(), metadataFormat: z.string().optional(), metaKey: z.string(), metaValue: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoThumbnail = z.object({thumbnailId: z.string(), absolutePath: z.string().nullable(), relativeSrc: z.string().nullable(), size: z.string(), format: z.string(), width: z.number(), height: z.number(), bytes: z.number(), photo: z.lazy(() => photo), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoVariation = z.object({variationId: z.string(), absolutePath: z.string().nullable(), relativeSrc: z.string().nullable(), format: z.string(), bytes: z.number(), photo: z.lazy(() => photo), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoAlbumMetadata = z.object({photoAlbum: z.lazy(() => photoAlbum), metaKey: z.string(), metaValue: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoAlbum: z.ZodType = z.object({user: user.optional(), photoAlbumId: z.string(), name: z.string(), entries: z.array(z.lazy(() => photoAlbumEntry)), metadata: z.array(photoAlbumMetadata), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photoAlbumEntry: z.ZodType = z.object({photoAlbumEntryId: z.string(), photo: z.lazy(() => photo), photoAlbum: photoAlbum, featured: z.boolean(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const photo: z.ZodType = z.object({photoId: z.string(), file: z.lazy(() => file), metadata: z.array(photoMetadata), thumbnail: z.array(photoThumbnail), variations: z.array(photoVariation), photoAlbumEntries: z.array(photoAlbumEntry), timestamp: z.number(), takenAt: z.string(), takenOnDay: z.string(), modifiedAt: z.string(), width: z.number(), height: z.number(), orientation: z.string(), deviceMake: z.string(), deviceModel: z.string(), gpsLat: z.number(), gpsLng: z.number(), gpsLatRef: z.string(), gpsLngRef: z.string(), gpsAltitude: z.string(), gpsTime: z.string(), gpsDate: z.string(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const job = z.object({jobId: z.string(), user: user.optional(), run: run, type: z.enum(["album_art_thumbnails", "photo_variations", "photo_thumbnails", "generate_waveforms"]), status: z.enum(["draft", "preparing", "in_queue", "running", "paused", "canceled", "completed", "errored"]), parameters: z.object({}).optional(), tasks: z.array(z.lazy(() => jobTask)).optional(), completedTasks: z.number(), remainingTasks: z.number(), totalTasks: z.number(), completedAt: z.string(), errorMessage: z.string(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const jobTask: z.ZodType = z.object({jobTaskId: z.string(), job: job.optional(), file: z.lazy(() => file.optional()), type: z.enum(["create_album_artwork_thumbnail", "create_photo_thumbnail", "heic_to_jpeg", "generate_track_waveform"]), target: z.string(), status: z.enum(["draft", "in_queue", "running", "paused", "canceled", "completed", "errored"]), completedAt: z.string(), errorMessage: z.string(), results: z.object({}).optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const file: z.ZodType = z.object({user: user, run: run, musicTrack: z.array(z.lazy(() => musicTrack)).optional(), photo: photo.optional(), fileId: z.string(), jobTasks: z.array(jobTask), absolutePath: z.string(), relativePath: z.string(), mimeType: z.string().optional(), extension: z.string(), app: z.string(), mediaType: z.string(), size: z.number(), mtime: z.string().optional(), lastSeen: z.string(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicArtistMetadata = z.object({musicTrack: z.lazy(() => musicArtist), metadataType: z.object({}).optional(), metadataFormat: z.object({}).optional(), metaKey: z.string(), metaValue: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicArtist: z.ZodType = z.object({tracks: z.array(z.lazy(() => musicTrack)).optional(), releases: z.array(z.lazy(() => musicRelease)).optional(), musicArtistId: z.string(), name: z.string().optional(), sortName: z.string().optional(), metadata: z.array(musicArtistMetadata).optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicTrackMetadata = z.object({track: z.lazy(() => musicTrack), metadataType: z.object({}).optional(), metadataFormat: z.object({}).optional(), metaKey: z.string(), metaValue: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const library = z.object({id: z.number(), libraryId: z.string(), name: z.string(), paths: z.array(z.string()), user: user, playbackQueues: z.array(z.lazy(() => playbackQueue)), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const playbackQueue: z.ZodType = z.object({queueId: z.string(), user: user, type: z.object({}), dynamicType: z.object({}), seedMediaType: z.object({}).optional(), seedMediaId: z.string().optional(), libraries: z.array(library), items: z.array(z.lazy(() => playbackQueueItem)).optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const playbackQueueItem: z.ZodType = z.object({queueItemId: z.string(), queue: playbackQueue, history: z.lazy(() => musicHistory.optional()), mediaType: z.string(), mediaId: z.string(), position: z.number(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicHistory: z.ZodType = z.object({playbackEntryId: z.string(), progress: z.number(), track: z.lazy(() => musicTrack), queueItem: playbackQueueItem.optional(), user: user, id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicTrackWaveform = z.object({track: z.lazy(() => musicTrack), version: z.number(), binCount: z.number(), data: z.object({}), integratedLufs: z.number().optional(), truePeakDb: z.number().optional(), silenceLeadIn: z.number().optional(), silenceLeadOut: z.number().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicTrack: z.ZodType = z.object({file: file, artists: z.array(musicArtist), release: z.lazy(() => musicRelease), musicTrackId: z.string(), title: z.string().optional(), sortTitle: z.string().optional(), trackNumber: z.number().optional(), discNumber: z.number().optional(), duration: z.number().optional(), bitrate: z.number().optional(), metadata: z.array(musicTrackMetadata).optional(), history: z.array(musicHistory).optional(), waveform: musicTrackWaveform.optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicGenre = z.object({releases: z.array(z.lazy(() => musicRelease)).optional(), musicGenreId: z.string(), name: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicReleaseMetadata = z.object({release: z.lazy(() => musicRelease), metadataType: z.object({}).optional(), metadataFormat: z.object({}).optional(), metaKey: z.string(), metaValue: z.string().optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicReleaseThumbnail = z.object({thumbnailId: z.string(), absolutePath: z.string().nullable(), relativeSrc: z.string().nullable(), size: z.string(), format: z.string(), width: z.number(), height: z.number(), bytes: z.number(), release: z.lazy(() => musicRelease), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const musicRelease: z.ZodType = z.object({tracks: z.array(musicTrack).optional(), artist: musicArtist.optional(), artists: z.array(musicArtist).optional(), genres: z.array(musicGenre).optional(), musicReleaseId: z.string(), title: z.string().optional(), sortTitle: z.string().optional(), releaseType: z.enum(["album", "ep", "single", "compilation", "soundtrack", "live", "remix", "dj-mix", "broadcast", "demo"]).optional(), metadata: z.array(musicReleaseMetadata).optional(), thumbnails: z.array(musicReleaseThumbnail).optional(), id: z.number(), createdAt: z.string(), updatedAt: z.string(), deletedAt: z.string()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * 🛡️ Get a single music release. * * GET /api/v1/music/release/{id} */ export const getApiApiV1MusicReleaseId = async (args: GetApiApiV1MusicReleaseIdArgs, options: GetApiApiV1MusicReleaseIdOptions) => { const {baseUrl, fetch: fetchFn = fetch, LocalUserJWT} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.tracks != null) query.append("tracks", String(args.tracks)) if (args.genres != null) query.append("genres", String(args.genres)) if (args.artists != null) query.append("artists", String(args.artists)) if (args.thumbnails != null) query.append("thumbnails", String(args.thumbnails)) if (LocalUserJWT !== undefined) headers.set('authorization', `Bearer ${LocalUserJWT}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v1/music/release/${encodeURIComponent(String(args.id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(musicRelease, await res.json()) };