import {z} from 'zod' export type LogicalGrouping = 'And' | 'Or'; export type SongVoteRating = 'Nothing' | 'Dislike' | 'Like' | 'Favorite'; export type PVServices = 'Nothing' | 'NicoNicoDouga' | 'Youtube' | 'SoundCloud' | 'Vimeo' | 'Piapro' | 'Bilibili' | 'File' | 'LocalFile' | 'Creofuga' | 'Bandcamp'; export type AdvancedFilterType = 'Nothing' | 'ArtistType' | 'WebLink' | 'HasUserAccount' | 'RootVoicebank' | 'VoiceProvider' | 'HasStoreLink' | 'HasTracks' | 'NoCoverPicture' | 'HasAlbum' | 'HasOriginalMedia' | 'HasMedia' | 'HasMultipleVoicebanks' | 'HasPublishDate' | 'Lyrics' | 'LyricsContent'; export type AdvancedSearchFilterParams = {filterType?: AdvancedFilterType | undefined, negate?: boolean | undefined, param?: (string | null) | undefined}; export type RatedSongForUserSortRule = 'None' | 'Name' | 'AdditionDate' | 'PublishDate' | 'FavoritedTimes' | 'RatingScore' | 'RatingDate'; export type NameMatchMode = 'Auto' | 'Partial' | 'StartsWith' | 'Exact' | 'Words'; export type SongOptionalFields = 'None' | 'AdditionalNames' | 'Albums' | 'Artists' | 'Lyrics' | 'MainPicture' | 'Names' | 'PVs' | 'ReleaseEvent' | 'Tags' | 'ThumbUrl' | 'WebLinks' | 'Bpm' | 'CultureCodes'; export type ContentLanguagePreference = 'Default' | 'Japanese' | 'Romaji' | 'English'; export type GetApiApiUsersIdRatedSongsArgs = {id: number, query?: string | undefined, tagName?: string | undefined, 'tagId[]'?: Array | undefined, 'artistId[]'?: Array | undefined, childVoicebanks?: boolean | undefined, artistGrouping?: LogicalGrouping | undefined, rating?: SongVoteRating | undefined, songListId?: number | undefined, groupByRating?: boolean | undefined, pvServices?: PVServices | undefined, advancedFilters?: Array | undefined, start?: number | undefined, maxResults?: number | undefined, getTotalCount?: boolean | undefined, sort?: RatedSongForUserSortRule | undefined, nameMatchMode?: NameMatchMode | undefined, fields?: SongOptionalFields | undefined, lang?: ContentLanguagePreference | undefined}; export type GetApiApiUsersIdRatedSongsOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const discType = z.enum(["Unknown", "Album", "Single", "EP", "SplitAlbum", "Compilation", "Video", "Artbook", "Game", "Fanmade", "Instrumental", "Other", "Drama"]); export const optionalDateTimeContract = z.object({day: z.number().int().nullable().optional(), isEmpty: z.boolean().optional(), month: z.number().int().nullable().optional(), year: z.number().int().nullable().optional()}); export const artistType = z.enum(["Unknown", "Circle", "Label", "Producer", "Animator", "Illustrator", "Lyricist", "Vocaloid", "UTAU", "CeVIO", "OtherVoiceSynthesizer", "OtherVocalist", "OtherGroup", "OtherIndividual", "Utaite", "Band", "Vocalist", "Character", "SynthesizerV", "CoverArtist", "NEUTRINO", "VoiSona", "NewType", "Voiceroid", "Instrumentalist", "Designer", "VOICEVOX", "ACEVirtualSinger", "AIVOICE"]); export const entryStatus = z.enum(["Draft", "Finished", "Approved", "Locked"]); export const artistContract = z.object({additionalNames: z.string().nullable().optional(), artistType: artistType.optional(), deleted: z.boolean().optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), pictureMime: z.string().nullable().optional(), releaseDate: z.string().nullable().optional(), status: entryStatus.optional(), version: z.number().int().optional()}); export const artistEventRoles = z.enum(["Default", "Dancer", "DJ", "Instrumentalist", "Organizer", "Promoter", "VJ", "Vocalist", "VoiceManipulator", "OtherPerformer", "Other"]); export const artistForEventContract = z.object({artist: artistContract.optional(), effectiveRoles: artistEventRoles.optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), roles: artistEventRoles.optional()}); export const eventCategory = z.enum(["Unspecified", "AlbumRelease", "Anniversary", "Club", "Concert", "Contest", "Convention", "Other", "Festival"]); export const entryThumbForApiContract = z.object({mime: z.string().nullable().optional(), name: z.string().nullable().optional(), urlOriginal: z.string().nullable().optional(), urlSmallThumb: z.string().nullable().optional(), urlThumb: z.string().nullable().optional(), urlTinyThumb: z.string().nullable().optional()}); export const contentLanguageSelection = z.enum(["Unspecified", "Japanese", "Romaji", "English"]); export const localizedStringContract = z.object({language: contentLanguageSelection.optional(), value: z.string().nullable().optional()}); export const pVExtendedMetadata = z.object({json: z.string().nullable().optional()}); export const pVService = z.enum(["NicoNicoDouga", "Youtube", "SoundCloud", "Vimeo", "Piapro", "Bilibili", "File", "LocalFile", "Creofuga", "Bandcamp"]); export const pVType = z.enum(["Original", "Reprint", "Other"]); export const pVContract = z.object({author: z.string().nullable().optional(), createdBy: z.number().int().nullable().optional(), description: z.string().nullable().optional(), disabled: z.boolean().optional(), extendedMetadata: pVExtendedMetadata.optional(), id: z.number().int().optional(), length: z.number().int().optional(), name: z.string().nullable().optional(), publishDate: z.string().nullable().optional(), pvId: z.string().nullable().optional(), service: pVService.optional(), pvType: pVType.optional(), thumbUrl: z.string().nullable().optional(), url: z.string().nullable().optional()}); export const webLinkCategory = z.enum(["Official", "Commercial", "Reference", "Other"]); export const webLinkContract = z.object({category: webLinkCategory.optional(), description: z.string().nullable().optional(), descriptionOrUrl: z.string().nullable().optional(), disabled: z.boolean().optional(), id: z.number().int().optional(), url: z.string().nullable().optional()}); export const releaseEventSeriesContract = z.object({additionalNames: z.string().nullable().optional(), category: eventCategory.optional(), deleted: z.boolean().optional(), description: z.string().nullable().optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), pictureMime: z.string().nullable().optional(), status: entryStatus.optional(), urlSlug: z.string().nullable().optional(), version: z.number().int().optional(), webLinks: z.array(webLinkContract).nullable().optional()}); export const songListFeaturedCategory = z.enum(["Nothing", "Concerts", "VocaloidRanking", "Pools", "Other"]); export const songListBaseContract = z.object({featuredCategory: songListFeaturedCategory.optional(), id: z.number().int().optional(), name: z.string().nullable().optional()}); export const tagBaseContract = z.object({additionalNames: z.string().nullable().optional(), categoryName: z.string().nullable().optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), urlSlug: z.string().nullable().optional()}); export const tagUsageForApiContract = z.object({count: z.number().int().optional(), tag: tagBaseContract.optional()}); export const optionalGeoPointContract = z.object({formatted: z.string().nullable().optional(), hasValue: z.boolean().optional(), latitude: z.number().nullable().optional(), longitude: z.number().nullable().optional()}); export const venueContract = z.object({additionalNames: z.string().nullable().optional(), address: z.string().nullable().optional(), addressCountryCode: z.string().nullable().optional(), coordinates: optionalGeoPointContract.optional(), deleted: z.boolean().optional(), description: z.string().nullable().optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), status: entryStatus.optional(), version: z.number().int().optional(), webLinks: z.array(webLinkContract).nullable().optional()}); export const releaseEventContract = z.object({additionalNames: z.string().nullable().optional(), category: eventCategory.optional(), customName: z.boolean().optional(), date: z.string().nullable().optional(), deleted: z.boolean().optional(), description: z.string().nullable().optional(), endDate: z.string().nullable().optional(), hasVenueOrVenueName: z.boolean().optional(), id: z.number().int().optional(), inheritedCategory: eventCategory.optional(), name: z.string().nullable().optional(), pictureMime: z.string().nullable().optional(), series: releaseEventSeriesContract.optional(), songList: songListBaseContract.optional(), status: entryStatus.optional(), urlSlug: z.string().nullable().optional(), venue: venueContract.optional(), venueName: z.string().nullable().optional(), version: z.number().int().optional()}); export const webLinkForApiContract = z.object({category: webLinkCategory.optional(), description: z.string().nullable().optional(), descriptionOrUrl: z.string().nullable().optional(), disabled: z.boolean().optional(), id: z.number().int().optional(), url: z.string().nullable().optional()}); export const venueForApiContract = z.object({additionalNames: z.string().nullable().optional(), address: z.string().nullable().optional(), addressCountryCode: z.string().nullable().optional(), coordinates: optionalGeoPointContract.optional(), deleted: z.boolean().optional(), description: z.string().nullable().optional(), events: z.array(releaseEventContract).nullable().optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), names: z.array(localizedStringContract).nullable().optional(), status: entryStatus.optional(), version: z.number().int().optional(), webLinks: z.array(webLinkForApiContract).nullable().optional()}); export const releaseEventForApiContract = z.object({additionalNames: z.string().nullable().optional(), artists: z.array(artistForEventContract).nullable().optional(), category: eventCategory.optional(), date: z.string().nullable().optional(), description: z.string().nullable().optional(), endDate: z.string().nullable().optional(), id: z.number().int().optional(), mainPicture: entryThumbForApiContract.optional(), name: z.string().nullable().optional(), names: z.array(localizedStringContract).nullable().optional(), pvs: z.array(pVContract).nullable().optional(), series: releaseEventSeriesContract.optional(), seriesId: z.number().int().nullable().optional(), seriesNumber: z.number().int().optional(), seriesSuffix: z.string().nullable().optional(), songList: songListBaseContract.optional(), status: entryStatus.optional(), tags: z.array(tagUsageForApiContract).nullable().optional(), urlSlug: z.string().nullable().optional(), venue: venueForApiContract.optional(), venueName: z.string().nullable().optional(), version: z.number().int().optional(), webLinks: z.array(webLinkForApiContract).nullable().optional()}); export const albumContract = z.object({additionalNames: z.string().nullable().optional(), artistString: z.string().nullable().optional(), coverPictureMime: z.string().nullable().optional(), createDate: z.string().optional(), deleted: z.boolean().optional(), discType: discType.optional(), id: z.number().int().optional(), name: z.string().nullable().optional(), ratingAverage: z.number().optional(), ratingCount: z.number().int().optional(), releaseDate: optionalDateTimeContract.optional(), releaseEvent: releaseEventForApiContract.optional(), status: entryStatus.optional(), version: z.number().int().optional()}); export const artistCategories = z.enum(["Nothing", "Vocalist", "Producer", "Animator", "Label", "Circle", "Other", "Band", "Illustrator", "Subject"]); export const artistRoles = z.enum(["Default", "Animator", "Arranger", "Composer", "Distributor", "Illustrator", "Instrumentalist", "Lyricist", "Mastering", "Publisher", "Vocalist", "VoiceManipulator", "Other", "Mixer", "Chorus", "Encoder", "VocalDataProvider", "RecordingEngineer"]); export const artistForSongContract = z.object({artist: artistContract.optional(), categories: artistCategories.optional(), effectiveRoles: artistRoles.optional(), id: z.number().int().optional(), isCustomName: z.boolean().optional(), isSupport: z.boolean().optional(), name: z.string().nullable().optional(), roles: artistRoles.optional()}); export const translationType = z.enum(["Original", "Romanized", "Translation"]); export const lyricsForSongContract = z.object({cultureCodes: z.array(z.string()).nullable().optional(), id: z.number().int().optional(), source: z.string().nullable().optional(), translationType: translationType.optional(), url: z.string().nullable().optional(), value: z.string().nullable().optional()}); export const pVServices = z.enum(["Nothing", "NicoNicoDouga", "Youtube", "SoundCloud", "Vimeo", "Piapro", "Bilibili", "File", "LocalFile", "Creofuga", "Bandcamp"]); export const songType = z.enum(["Unspecified", "Original", "Remaster", "Remix", "Cover", "Arrangement", "Instrumental", "Mashup", "MusicPV", "DramaPV", "Live", "Illustration", "Other", "Rearrangement", "ShortVersion"]); export const songForApiContract = z.object({additionalNames: z.string().nullable().optional(), albums: z.array(albumContract).nullable().optional(), artists: z.array(artistForSongContract).nullable().optional(), artistString: z.string().nullable().optional(), createDate: z.string().optional(), defaultName: z.string().nullable().optional(), defaultNameLanguage: contentLanguageSelection.optional(), deleted: z.boolean().optional(), favoritedTimes: z.number().int().optional(), id: z.number().int().optional(), lengthSeconds: z.number().int().optional(), lyrics: z.array(lyricsForSongContract).nullable().optional(), mainPicture: entryThumbForApiContract.optional(), maxMilliBpm: z.number().int().nullable().optional(), mergedTo: z.number().int().optional(), minMilliBpm: z.number().int().nullable().optional(), name: z.string().nullable().optional(), names: z.array(localizedStringContract).nullable().optional(), originalVersionId: z.number().int().optional(), publishDate: z.string().nullable().optional(), pvs: z.array(pVContract).nullable().optional(), pvServices: pVServices.optional(), ratingScore: z.number().int().optional(), releaseEvent: releaseEventForApiContract.optional(), releaseEvents: z.array(releaseEventForApiContract).nullable().optional(), songType: songType.optional(), status: entryStatus.optional(), tags: z.array(tagUsageForApiContract).nullable().optional(), thumbUrl: z.string().nullable().optional(), version: z.number().int().optional(), webLinks: z.array(webLinkForApiContract).nullable().optional(), cultureCodes: z.array(z.string()).nullable().optional()}); export const userGroupId = z.enum(["Nothing", "Limited", "Regular", "Trusted", "Moderator", "Admin"]); export const userLanguageProficiency = z.enum(["Nothing", "Basics", "Intermediate", "Advanced", "Native"]); export const userKnownLanguageContract = z.object({cultureCode: z.string().nullable().optional(), proficiency: userLanguageProficiency.optional()}); export const oldUsernameContract = z.object({date: z.string().optional(), oldName: z.string().nullable().optional()}); export const userForApiContract = z.object({active: z.boolean().optional(), groupId: userGroupId.optional(), knownLanguages: z.array(userKnownLanguageContract).nullable().optional(), mainPicture: entryThumbForApiContract.optional(), memberSince: z.string().optional(), oldUsernames: z.array(oldUsernameContract).nullable().optional(), verifiedArtist: z.boolean().optional(), id: z.number().int().optional(), name: z.string().nullable().optional()}); export const songVoteRating = z.enum(["Nothing", "Dislike", "Like", "Favorite"]); export const ratedSongForUserForApiContract = z.object({date: z.string().optional(), song: songForApiContract.optional(), user: userForApiContract.optional(), rating: songVoteRating.optional()}); export const ratedSongForUserForApiContractPartialFindResult = z.object({items: z.array(ratedSongForUserForApiContract).nullable().optional(), term: z.string().nullable().optional(), totalCount: z.number().int().optional()}); 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 /api/users/{id}/ratedSongs */ export const getApiApiUsersIdRatedSongs = async (args: GetApiApiUsersIdRatedSongsArgs, options: GetApiApiUsersIdRatedSongsOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.query != null) query.append("query", String(args.query)) if (args.tagName != null) query.append("tagName", String(args.tagName)) for (const item of args['tagId[]'] ?? []) query.append("tagId[]", String(item)) for (const item of args['artistId[]'] ?? []) query.append("artistId[]", String(item)) if (args.childVoicebanks != null) query.append("childVoicebanks", String(args.childVoicebanks)) if (args.artistGrouping != null) query.append("artistGrouping", String(args.artistGrouping)) if (args.rating != null) query.append("rating", String(args.rating)) if (args.songListId != null) query.append("songListId", String(args.songListId)) if (args.groupByRating != null) query.append("groupByRating", String(args.groupByRating)) if (args.pvServices != null) query.append("pvServices", String(args.pvServices)) for (const item of args.advancedFilters ?? []) query.append("advancedFilters", String(item)) if (args.start != null) query.append("start", String(args.start)) if (args.maxResults != null) query.append("maxResults", String(args.maxResults)) if (args.getTotalCount != null) query.append("getTotalCount", String(args.getTotalCount)) if (args.sort != null) query.append("sort", String(args.sort)) if (args.nameMatchMode != null) query.append("nameMatchMode", String(args.nameMatchMode)) if (args.fields != null) query.append("fields", String(args.fields)) if (args.lang != null) query.append("lang", String(args.lang)) const url = `${baseUrl.replace(/\/+$/, '')}/api/users/${encodeURIComponent(String(args.id))}/ratedSongs${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(ratedSongForUserForApiContractPartialFindResult, await res.json()) };