diff --git a/apps/web/src/types/generated/.openapi-generator/FILES b/apps/web/src/types/generated/.openapi-generator/FILES index ab4dae3f4..40071b5fe 100644 --- a/apps/web/src/types/generated/.openapi-generator/FILES +++ b/apps/web/src/types/generated/.openapi-generator/FILES @@ -33,9 +33,17 @@ docs/CommentsIdPut200ResponseAllOfData.md docs/CommentsIdRepliesGet200Response.md docs/CommentsIdRepliesGet200ResponseAllOfData.md docs/DashboardApi.md +docs/InternalCoreTrackBatchDeleteRequest.md +docs/InternalCoreTrackBatchUpdateRequest.md docs/InternalCoreTrackCompleteChunkedUploadRequest.md +docs/InternalCoreTrackCreateShareRequest.md docs/InternalCoreTrackInitiateChunkedUploadRequest.md +docs/InternalCoreTrackRecordPlayRequest.md +docs/InternalCoreTrackStreamCallbackRequest.md +docs/InternalCoreTrackUpdateLyricsRequest.md +docs/InternalCoreTrackUpdateTrackRequest.md docs/InternalHandlersAPIResponse.md +docs/InternalHandlersAddCollaboratorRequest.md docs/InternalHandlersCreateCommentRequest.md docs/InternalHandlersCreateOrderRequest.md docs/InternalHandlersCreateOrderRequestItemsInner.md @@ -47,12 +55,16 @@ docs/InternalHandlersDashboardStats.md docs/InternalHandlersDeleteAccountRequest.md docs/InternalHandlersDisableTwoFactorRequest.md docs/InternalHandlersFrontendLogRequest.md +docs/InternalHandlersImportPlaylistRequest.md +docs/InternalHandlersImportPlaylistRequestPlaylist.md +docs/InternalHandlersImportPlaylistRequestTracksInner.md docs/InternalHandlersLibraryPreview.md docs/InternalHandlersRecentActivity.md docs/InternalHandlersReorderTracksRequest.md docs/InternalHandlersSetupTwoFactorResponse.md docs/InternalHandlersStreamTokenResponse.md docs/InternalHandlersTrackPreview.md +docs/InternalHandlersUpdateCollaboratorPermissionRequest.md docs/InternalHandlersUpdateCommentRequest.md docs/InternalHandlersUpdatePlaylistRequest.md docs/InternalHandlersUpdateProductRequest.md @@ -65,16 +77,44 @@ docs/MarketplaceApi.md docs/PlaylistApi.md docs/PlaylistsGet200Response.md docs/PlaylistsGet200ResponseAllOfData.md +docs/PlaylistsIdCollaboratorsGet200Response.md +docs/PlaylistsIdCollaboratorsGet200ResponseAllOfData.md +docs/PlaylistsIdCollaboratorsPost200Response.md +docs/PlaylistsIdCollaboratorsPost200ResponseAllOfData.md +docs/PlaylistsIdSharePost200Response.md +docs/PlaylistsIdSharePost200ResponseAllOfData.md docs/PlaylistsIdTracksPostRequest.md docs/PlaylistsPost201Response.md docs/PlaylistsPost201ResponseAllOfData.md +docs/PlaylistsRecommendationsGet200Response.md +docs/PlaylistsRecommendationsGet200ResponseAllOfData.md docs/TrackApi.md +docs/TracksBatchDeletePost200Response.md +docs/TracksBatchDeletePost200ResponseAllOfData.md +docs/TracksBatchUpdatePost200Response.md +docs/TracksBatchUpdatePost200ResponseAllOfData.md docs/TracksChunkPost200Response.md docs/TracksChunkPost200ResponseAllOfData.md docs/TracksCompletePost201Response.md docs/TracksCompletePost201ResponseAllOfData.md +docs/TracksGet200Response.md +docs/TracksGet200ResponseAllOfData.md docs/TracksIdCommentsGet200Response.md docs/TracksIdCommentsGet200ResponseAllOfData.md +docs/TracksIdDelete200Response.md +docs/TracksIdHistoryGet200Response.md +docs/TracksIdHistoryGet200ResponseAllOfData.md +docs/TracksIdLikePost200Response.md +docs/TracksIdLikesGet200Response.md +docs/TracksIdLikesGet200ResponseAllOfData.md +docs/TracksIdLyricsGet200Response.md +docs/TracksIdLyricsGet200ResponseAllOfData.md +docs/TracksIdPlayPost200Response.md +docs/TracksIdPlayPost200ResponseAllOfData.md +docs/TracksIdRepostGet200Response.md +docs/TracksIdRepostGet200ResponseAllOfData.md +docs/TracksIdSharePost200Response.md +docs/TracksIdStatsGet200Response.md docs/TracksIdStatusGet200Response.md docs/TracksIdStatusGet200ResponseAllOfData.md docs/TracksInitiatePost200Response.md @@ -83,14 +123,26 @@ docs/TracksPost201Response.md docs/TracksPost201ResponseAllOfData.md docs/TracksQuotaIdGet200Response.md docs/TracksQuotaIdGet200ResponseAllOfData.md +docs/TracksRecommendationsGet200Response.md +docs/TracksRecommendationsGet200ResponseAllOfData.md docs/TracksResumeUploadIdGet200Response.md docs/TracksResumeUploadIdGet200ResponseAllOfData.md +docs/TracksSharedTokenGet200Response.md +docs/TracksSharedTokenGet200ResponseAllOfData.md +docs/TracksSuggestedTagsGet200Response.md +docs/TracksSuggestedTagsGet200ResponseAllOfData.md docs/UserApi.md docs/UsersApi.md docs/UsersGet200Response.md docs/UsersGet200ResponseAllOfData.md docs/UsersIdGet200Response.md docs/UsersIdGet200ResponseAllOfData.md +docs/UsersIdLikesGet200Response.md +docs/UsersIdLikesGet200ResponseAllOfData.md +docs/UsersSearchGet200Response.md +docs/UsersSearchGet200ResponseAllOfData.md +docs/UsersSuggestionsGet200Response.md +docs/UsersSuggestionsGet200ResponseAllOfData.md docs/ValidationApi.md docs/VezaBackendApiInternalCoreMarketplaceLicenseType.md docs/VezaBackendApiInternalCoreMarketplaceOrder.md @@ -109,6 +161,7 @@ docs/VezaBackendApiInternalDtoResendVerificationRequest.md docs/VezaBackendApiInternalDtoTokenResponse.md docs/VezaBackendApiInternalDtoUserResponse.md docs/VezaBackendApiInternalDtoValidationError.md +docs/VezaBackendApiInternalHandlersAPIResponse.md docs/VezaBackendApiInternalModelsPlaylist.md docs/VezaBackendApiInternalModelsPlaylistCollaborator.md docs/VezaBackendApiInternalModelsPlaylistPermission.md diff --git a/apps/web/src/types/generated/api.ts b/apps/web/src/types/generated/api.ts index fd076fc51..1504e8459 100644 --- a/apps/web/src/types/generated/api.ts +++ b/apps/web/src/types/generated/api.ts @@ -124,25 +124,100 @@ export interface CommentsIdRepliesGet200ResponseAllOfData { 'pagination'?: object; 'replies'?: Array; } +export interface InternalCoreTrackBatchDeleteRequest { + 'track_ids': Array; +} +export interface InternalCoreTrackBatchUpdateRequest { + 'track_ids': Array; + 'updates': { [key: string]: any; }; +} export interface InternalCoreTrackCompleteChunkedUploadRequest { 'upload_id': string; } +export interface InternalCoreTrackCreateShareRequest { + 'expires_at'?: string; + 'permissions': InternalCoreTrackCreateShareRequestPermissionsEnum; +} + +export const InternalCoreTrackCreateShareRequestPermissionsEnum = { + Read: 'read', + Write: 'write', + Admin: 'admin' +} as const; + +export type InternalCoreTrackCreateShareRequestPermissionsEnum = typeof InternalCoreTrackCreateShareRequestPermissionsEnum[keyof typeof InternalCoreTrackCreateShareRequestPermissionsEnum]; + export interface InternalCoreTrackInitiateChunkedUploadRequest { 'filename': string; 'total_chunks': number; 'total_size': number; } +export interface InternalCoreTrackRecordPlayRequest { + 'play_time'?: number; +} +export interface InternalCoreTrackStreamCallbackRequest { + 'error'?: string; + 'manifest_url'?: string; + 'status': InternalCoreTrackStreamCallbackRequestStatusEnum; +} + +export const InternalCoreTrackStreamCallbackRequestStatusEnum = { + Completed: 'completed', + Failed: 'failed', + Processing: 'processing' +} as const; + +export type InternalCoreTrackStreamCallbackRequestStatusEnum = typeof InternalCoreTrackStreamCallbackRequestStatusEnum[keyof typeof InternalCoreTrackStreamCallbackRequestStatusEnum]; + +export interface InternalCoreTrackUpdateLyricsRequest { + 'content'?: string; +} +export interface InternalCoreTrackUpdateTrackRequest { + 'album'?: string; + 'artist'?: string; + 'bpm'?: number; + /** + * legacy, single + */ + 'genre'?: string; + /** + * v0.10.1: max 3, taxonomy slugs + */ + 'genres'?: Array; + 'is_public'?: boolean; + 'musical_key'?: string; + /** + * v0.10.1: max 10, 30 chars each + */ + 'tags'?: Array; + 'title'?: string; + 'year'?: number; +} export interface InternalHandlersAPIResponse { 'data'?: object; 'error'?: object; 'success'?: boolean; } +export interface InternalHandlersAddCollaboratorRequest { + 'permission': InternalHandlersAddCollaboratorRequestPermissionEnum; + 'user_id': string; +} + +export const InternalHandlersAddCollaboratorRequestPermissionEnum = { + Read: 'read', + Write: 'write', + Admin: 'admin' +} as const; + +export type InternalHandlersAddCollaboratorRequestPermissionEnum = typeof InternalHandlersAddCollaboratorRequestPermissionEnum[keyof typeof InternalHandlersAddCollaboratorRequestPermissionEnum]; + export interface InternalHandlersCreateCommentRequest { 'content': string; - /** - * Changed to *uuid.UUID - */ 'parent_id'?: string; + /** + * Position in seconds (0 = top-level, no specific time) + */ + 'timestamp'?: number; } export interface InternalHandlersCreateOrderRequest { 'items': Array; @@ -234,6 +309,10 @@ export interface InternalHandlersDashboardStats { } export interface InternalHandlersDeleteAccountRequest { 'confirm_text': string; + /** + * If true, public tracks remain (attributed to deleted account) + */ + 'keep_public_tracks'?: boolean; 'password': string; 'reason'?: string; } @@ -247,6 +326,18 @@ export interface InternalHandlersFrontendLogRequest { 'message'?: string; 'timestamp'?: string; } +export interface InternalHandlersImportPlaylistRequest { + 'playlist'?: InternalHandlersImportPlaylistRequestPlaylist; + 'tracks'?: Array; +} +export interface InternalHandlersImportPlaylistRequestPlaylist { + 'description'?: string; + 'is_public'?: boolean; + 'title'?: string; +} +export interface InternalHandlersImportPlaylistRequestTracksInner { + 'id'?: string; +} export interface InternalHandlersLibraryPreview { 'has_more'?: boolean; 'items'?: Array; @@ -289,6 +380,18 @@ export interface InternalHandlersTrackPreview { 'play_count'?: number; 'title'?: string; } +export interface InternalHandlersUpdateCollaboratorPermissionRequest { + 'permission': InternalHandlersUpdateCollaboratorPermissionRequestPermissionEnum; +} + +export const InternalHandlersUpdateCollaboratorPermissionRequestPermissionEnum = { + Read: 'read', + Write: 'write', + Admin: 'admin' +} as const; + +export type InternalHandlersUpdateCollaboratorPermissionRequestPermissionEnum = typeof InternalHandlersUpdateCollaboratorPermissionRequestPermissionEnum[keyof typeof InternalHandlersUpdateCollaboratorPermissionRequestPermissionEnum]; + export interface InternalHandlersUpdateCommentRequest { 'content': string; } @@ -383,6 +486,30 @@ export interface PlaylistsGet200ResponseAllOfData { 'pagination'?: object; 'playlists'?: Array; } +export interface PlaylistsIdCollaboratorsGet200Response { + 'data'?: PlaylistsIdCollaboratorsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface PlaylistsIdCollaboratorsGet200ResponseAllOfData { + 'collaborators'?: Array; +} +export interface PlaylistsIdCollaboratorsPost200Response { + 'data'?: PlaylistsIdCollaboratorsPost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface PlaylistsIdCollaboratorsPost200ResponseAllOfData { + 'collaborator'?: object; +} +export interface PlaylistsIdSharePost200Response { + 'data'?: PlaylistsIdSharePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface PlaylistsIdSharePost200ResponseAllOfData { + 'share'?: object; +} export interface PlaylistsIdTracksPostRequest { 'track_id'?: string; } @@ -394,6 +521,32 @@ export interface PlaylistsPost201Response { export interface PlaylistsPost201ResponseAllOfData { 'playlist'?: VezaBackendApiInternalModelsPlaylist; } +export interface PlaylistsRecommendationsGet200Response { + 'data'?: PlaylistsRecommendationsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface PlaylistsRecommendationsGet200ResponseAllOfData { + 'playlists'?: Array; +} +export interface TracksBatchDeletePost200Response { + 'data'?: TracksBatchDeletePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksBatchDeletePost200ResponseAllOfData { + 'deleted'?: Array; + 'failed'?: Array; +} +export interface TracksBatchUpdatePost200Response { + 'data'?: TracksBatchUpdatePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksBatchUpdatePost200ResponseAllOfData { + 'failed'?: Array; + 'updated'?: Array; +} export interface TracksChunkPost200Response { 'data'?: TracksChunkPost200ResponseAllOfData; 'error'?: object; @@ -415,6 +568,15 @@ export interface TracksCompletePost201ResponseAllOfData { 'message'?: string; 'track'?: VezaBackendApiInternalModelsTrack; } +export interface TracksGet200Response { + 'data'?: TracksGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksGet200ResponseAllOfData { + 'pagination'?: object; + 'tracks'?: Array; +} export interface TracksIdCommentsGet200Response { 'data'?: TracksIdCommentsGet200ResponseAllOfData; 'error'?: object; @@ -424,6 +586,71 @@ export interface TracksIdCommentsGet200ResponseAllOfData { 'comments'?: Array; 'pagination'?: object; } +export interface TracksIdDelete200Response { + 'data'?: Auth2faDisablePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdHistoryGet200Response { + 'data'?: TracksIdHistoryGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdHistoryGet200ResponseAllOfData { + 'history'?: Array; + 'limit'?: number; + 'offset'?: number; + 'total'?: number; +} +export interface TracksIdLikePost200Response { + 'data'?: Auth2faDisablePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdLikesGet200Response { + 'data'?: TracksIdLikesGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdLikesGet200ResponseAllOfData { + 'count'?: number; + 'is_liked'?: boolean; +} +export interface TracksIdLyricsGet200Response { + 'data'?: TracksIdLyricsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdLyricsGet200ResponseAllOfData { + 'lyrics'?: object; +} +export interface TracksIdPlayPost200Response { + 'data'?: TracksIdPlayPost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdPlayPost200ResponseAllOfData { + 'id'?: string; + 'message'?: string; +} +export interface TracksIdRepostGet200Response { + 'data'?: TracksIdRepostGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdRepostGet200ResponseAllOfData { + 'is_reposted'?: boolean; +} +export interface TracksIdSharePost200Response { + 'data'?: PlaylistsIdSharePost200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksIdStatsGet200Response { + 'data'?: AuditStatsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} export interface TracksIdStatusGet200Response { 'data'?: TracksIdStatusGet200ResponseAllOfData; 'error'?: object; @@ -457,6 +684,14 @@ export interface TracksQuotaIdGet200Response { export interface TracksQuotaIdGet200ResponseAllOfData { 'quota'?: object; } +export interface TracksRecommendationsGet200Response { + 'data'?: TracksRecommendationsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksRecommendationsGet200ResponseAllOfData { + 'tracks'?: Array; +} export interface TracksResumeUploadIdGet200Response { 'data'?: TracksResumeUploadIdGet200ResponseAllOfData; 'error'?: object; @@ -466,6 +701,23 @@ export interface TracksResumeUploadIdGet200ResponseAllOfData { 'chunks_received'?: number; 'upload_id'?: string; } +export interface TracksSharedTokenGet200Response { + 'data'?: TracksSharedTokenGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksSharedTokenGet200ResponseAllOfData { + 'share'?: object; + 'track'?: VezaBackendApiInternalModelsTrack; +} +export interface TracksSuggestedTagsGet200Response { + 'data'?: TracksSuggestedTagsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface TracksSuggestedTagsGet200ResponseAllOfData { + 'tags'?: Array; +} export interface UsersGet200Response { 'data'?: UsersGet200ResponseAllOfData; 'error'?: object; @@ -483,6 +735,34 @@ export interface UsersIdGet200Response { export interface UsersIdGet200ResponseAllOfData { 'profile'?: object; } +export interface UsersIdLikesGet200Response { + 'data'?: UsersIdLikesGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface UsersIdLikesGet200ResponseAllOfData { + 'limit'?: number; + 'offset'?: number; + 'total'?: number; + 'tracks'?: Array; +} +export interface UsersSearchGet200Response { + 'data'?: UsersSearchGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface UsersSearchGet200ResponseAllOfData { + 'pagination'?: object; + 'users'?: Array; +} +export interface UsersSuggestionsGet200Response { + 'data'?: UsersSuggestionsGet200ResponseAllOfData; + 'error'?: object; + 'success'?: boolean; +} +export interface UsersSuggestionsGet200ResponseAllOfData { + 'users'?: Array; +} export const VezaBackendApiInternalCoreMarketplaceLicenseType = { LicenseBasic: 'basic', @@ -510,6 +790,10 @@ export interface VezaBackendApiInternalCoreMarketplaceOrder { */ 'payment_status'?: string; 'promo_code_id'?: string; + /** + * v0.12.0: 14-day refund deadline + */ + 'refund_deadline'?: string; /** * pending, completed, failed, refunded */ @@ -644,6 +928,11 @@ export interface VezaBackendApiInternalDtoValidationError { 'message'?: string; 'value'?: string; } +export interface VezaBackendApiInternalHandlersAPIResponse { + 'data'?: object; + 'error'?: object; + 'success'?: boolean; +} export interface VezaBackendApiInternalModelsPlaylist { 'collaborators'?: Array; 'cover_url'?: string; @@ -651,6 +940,14 @@ export interface VezaBackendApiInternalModelsPlaylist { 'description'?: string; 'follower_count'?: number; 'id'?: string; + /** + * v0.10.4 F136 + */ + 'is_default_favorites'?: boolean; + /** + * v0.10.4 F141 + */ + 'is_editorial'?: boolean; 'is_public'?: boolean; 'title'?: string; 'track_count'?: number; @@ -719,9 +1016,7 @@ export interface VezaBackendApiInternalModelsTrack { 'genre'?: string; 'id'?: string; 'is_public'?: boolean; - 'like_count'?: number; 'musical_key'?: string; - 'play_count'?: number; /** * Hz */ @@ -776,6 +1071,14 @@ export interface VezaBackendApiInternalModelsUser { * Virtual field for input */ 'password'?: string; + /** + * F016: Password expiration tracking + */ + 'password_changed_at'?: string; + /** + * v1.0.6: set the first time a user self-promotes to `role=\'creator\'` via POST /api/v1/users/me/upgrade-creator. NULL for users who never took that path (still \'user\', or promoted by an admin out-of-band). + */ + 'promoted_to_creator_at'?: string; 'role'?: string; 'slug'?: string; 'social_links'?: string; @@ -3758,6 +4061,39 @@ export class MarketplaceApi extends BaseAPI implements MarketplaceApiInterface { */ export const PlaylistApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + * @summary Get Favoris playlist + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsFavorisGet: async (options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/playlists/favoris`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get a paginated list of playlists * @summary Get Playlists @@ -3806,6 +4142,209 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, + /** + * Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + * @summary Get playlist statistics + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdAnalyticsGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdAnalyticsGet', 'id', id) + const localVarPath = `/playlists/{id}/analytics` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns the collaborators of a playlist with their permission level. + * @summary List playlist collaborators + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdCollaboratorsGet', 'id', id) + const localVarPath = `/playlists/{id}/collaborators` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Invite a user as collaborator. Only the owner (or admin) can add. + * @summary Add playlist collaborator + * @param {string} id Playlist UUID + * @param {InternalHandlersAddCollaboratorRequest} request Collaborator + permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsPost: async (id: string, request: InternalHandlersAddCollaboratorRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdCollaboratorsPost', 'id', id) + // verify required parameter 'request' is not null or undefined + assertParamExists('playlistsIdCollaboratorsPost', 'request', request) + const localVarPath = `/playlists/{id}/collaborators` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Revoke a collaborator\'s access. Only the owner (or admin) can remove. + * @summary Remove playlist collaborator + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdDelete: async (id: string, userId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdCollaboratorsUserIdDelete', 'id', id) + // verify required parameter 'userId' is not null or undefined + assertParamExists('playlistsIdCollaboratorsUserIdDelete', 'userId', userId) + const localVarPath = `/playlists/{id}/collaborators/{userId}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + * @summary Update collaborator permission + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {InternalHandlersUpdateCollaboratorPermissionRequest} request New permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdPut: async (id: string, userId: string, request: InternalHandlersUpdateCollaboratorPermissionRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdCollaboratorsUserIdPut', 'id', id) + // verify required parameter 'userId' is not null or undefined + assertParamExists('playlistsIdCollaboratorsUserIdPut', 'userId', userId) + // verify required parameter 'request' is not null or undefined + assertParamExists('playlistsIdCollaboratorsUserIdPut', 'request', request) + const localVarPath = `/playlists/{id}/collaborators/{userId}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"userId"}}`, encodeURIComponent(String(userId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Permanently delete a playlist * @summary Delete Playlist @@ -3843,6 +4382,43 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, + /** + * Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + * @summary Duplicate playlist + * @param {string} id Source playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdDuplicatePost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdDuplicatePost', 'id', id) + const localVarPath = `/playlists/{id}/duplicate` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get detailed information about a playlist * @summary Get Playlist by ID @@ -3922,6 +4498,43 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, + /** + * Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + * @summary Create playlist share link + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdSharePost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('playlistsIdSharePost', 'id', id) + const localVarPath = `/playlists/{id}/share` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Add a track to the playlist * @summary Add Track to Playlist @@ -4047,6 +4660,44 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat options: localVarRequestOptions, }; }, + /** + * Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + * @summary Import playlist + * @param {InternalHandlersImportPlaylistRequest} request Playlist + tracks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsImportPost: async (request: InternalHandlersImportPlaylistRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'request' is not null or undefined + assertParamExists('playlistsImportPost', 'request', request) + const localVarPath = `/playlists/import`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Create a new playlist * @summary Create Playlist @@ -4080,6 +4731,123 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + * @summary Get playlist recommendations + * @param {number} [limit] Max items (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsRecommendationsGet: async (limit?: number, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/playlists/recommendations`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Full-text search on public playlists (title + description). Paginated. + * @summary Search playlists + * @param {string} [q] Full-text query + * @param {number} [page] Page number + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSearchGet: async (q?: string, page?: number, limit?: number, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/playlists/search`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (q !== undefined) { + localVarQueryParameter['q'] = q; + } + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + * @summary Get playlist by share token + * @param {string} token Share token + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSharedTokenGet: async (token: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'token' is not null or undefined + assertParamExists('playlistsSharedTokenGet', 'token', token) + const localVarPath = `/playlists/shared/{token}` + .replace(`{${"token"}}`, encodeURIComponent(String(token))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -4094,6 +4862,18 @@ export const PlaylistApiAxiosParamCreator = function (configuration?: Configurat export const PlaylistApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = PlaylistApiAxiosParamCreator(configuration) return { + /** + * Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + * @summary Get Favoris playlist + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsFavorisGet(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsFavorisGet(options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsFavorisGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get a paginated list of playlists * @summary Get Playlists @@ -4109,6 +4889,75 @@ export const PlaylistApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + * @summary Get playlist statistics + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdAnalyticsGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdAnalyticsGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdAnalyticsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns the collaborators of a playlist with their permission level. + * @summary List playlist collaborators + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdCollaboratorsGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdCollaboratorsGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdCollaboratorsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Invite a user as collaborator. Only the owner (or admin) can add. + * @summary Add playlist collaborator + * @param {string} id Playlist UUID + * @param {InternalHandlersAddCollaboratorRequest} request Collaborator + permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdCollaboratorsPost(id: string, request: InternalHandlersAddCollaboratorRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdCollaboratorsPost(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdCollaboratorsPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Revoke a collaborator\'s access. Only the owner (or admin) can remove. + * @summary Remove playlist collaborator + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdCollaboratorsUserIdDelete(id: string, userId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdCollaboratorsUserIdDelete(id, userId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdCollaboratorsUserIdDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + * @summary Update collaborator permission + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {InternalHandlersUpdateCollaboratorPermissionRequest} request New permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdCollaboratorsUserIdPut(id: string, userId: string, request: InternalHandlersUpdateCollaboratorPermissionRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdCollaboratorsUserIdPut(id, userId, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdCollaboratorsUserIdPut']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Permanently delete a playlist * @summary Delete Playlist @@ -4122,6 +4971,19 @@ export const PlaylistApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdDelete']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + * @summary Duplicate playlist + * @param {string} id Source playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdDuplicatePost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdDuplicatePost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdDuplicatePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get detailed information about a playlist * @summary Get Playlist by ID @@ -4149,6 +5011,19 @@ export const PlaylistApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdPut']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + * @summary Create playlist share link + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsIdSharePost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsIdSharePost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdSharePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Add a track to the playlist * @summary Add Track to Playlist @@ -4191,6 +5066,19 @@ export const PlaylistApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsIdTracksTrackIdDelete']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + * @summary Import playlist + * @param {InternalHandlersImportPlaylistRequest} request Playlist + tracks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsImportPost(request: InternalHandlersImportPlaylistRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsImportPost(request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsImportPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Create a new playlist * @summary Create Playlist @@ -4204,6 +5092,47 @@ export const PlaylistApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsPost']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + * @summary Get playlist recommendations + * @param {number} [limit] Max items (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsRecommendationsGet(limit?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsRecommendationsGet(limit, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsRecommendationsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Full-text search on public playlists (title + description). Paginated. + * @summary Search playlists + * @param {string} [q] Full-text query + * @param {number} [page] Page number + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsSearchGet(q, page, limit, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsSearchGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + * @summary Get playlist by share token + * @param {string} token Share token + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async playlistsSharedTokenGet(token: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.playlistsSharedTokenGet(token, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['PlaylistApi.playlistsSharedTokenGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, } }; @@ -4213,6 +5142,15 @@ export const PlaylistApiFp = function(configuration?: Configuration) { export const PlaylistApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = PlaylistApiFp(configuration) return { + /** + * Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + * @summary Get Favoris playlist + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsFavorisGet(options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsFavorisGet(options).then((request) => request(axios, basePath)); + }, /** * Get a paginated list of playlists * @summary Get Playlists @@ -4225,6 +5163,60 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP playlistsGet(page?: number, limit?: number, userId?: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.playlistsGet(page, limit, userId, options).then((request) => request(axios, basePath)); }, + /** + * Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + * @summary Get playlist statistics + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdAnalyticsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdAnalyticsGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Returns the collaborators of a playlist with their permission level. + * @summary List playlist collaborators + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdCollaboratorsGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Invite a user as collaborator. Only the owner (or admin) can add. + * @summary Add playlist collaborator + * @param {string} id Playlist UUID + * @param {InternalHandlersAddCollaboratorRequest} request Collaborator + permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsPost(id: string, request: InternalHandlersAddCollaboratorRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdCollaboratorsPost(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Revoke a collaborator\'s access. Only the owner (or admin) can remove. + * @summary Remove playlist collaborator + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdDelete(id: string, userId: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdCollaboratorsUserIdDelete(id, userId, options).then((request) => request(axios, basePath)); + }, + /** + * Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + * @summary Update collaborator permission + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {InternalHandlersUpdateCollaboratorPermissionRequest} request New permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdPut(id: string, userId: string, request: InternalHandlersUpdateCollaboratorPermissionRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdCollaboratorsUserIdPut(id, userId, request, options).then((request) => request(axios, basePath)); + }, /** * Permanently delete a playlist * @summary Delete Playlist @@ -4235,6 +5227,16 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP playlistsIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.playlistsIdDelete(id, options).then((request) => request(axios, basePath)); }, + /** + * Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + * @summary Duplicate playlist + * @param {string} id Source playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdDuplicatePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdDuplicatePost(id, options).then((request) => request(axios, basePath)); + }, /** * Get detailed information about a playlist * @summary Get Playlist by ID @@ -4256,6 +5258,16 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP playlistsIdPut(id: string, playlist: InternalHandlersUpdatePlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.playlistsIdPut(id, playlist, options).then((request) => request(axios, basePath)); }, + /** + * Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + * @summary Create playlist share link + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdSharePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsIdSharePost(id, options).then((request) => request(axios, basePath)); + }, /** * Add a track to the playlist * @summary Add Track to Playlist @@ -4289,6 +5301,16 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP playlistsIdTracksTrackIdDelete(id: string, trackId: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.playlistsIdTracksTrackIdDelete(id, trackId, options).then((request) => request(axios, basePath)); }, + /** + * Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + * @summary Import playlist + * @param {InternalHandlersImportPlaylistRequest} request Playlist + tracks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsImportPost(request: InternalHandlersImportPlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsImportPost(request, options).then((request) => request(axios, basePath)); + }, /** * Create a new playlist * @summary Create Playlist @@ -4299,6 +5321,38 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP playlistsPost(request: InternalHandlersCreatePlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.playlistsPost(request, options).then((request) => request(axios, basePath)); }, + /** + * Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + * @summary Get playlist recommendations + * @param {number} [limit] Max items (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsRecommendationsGet(limit?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsRecommendationsGet(limit, options).then((request) => request(axios, basePath)); + }, + /** + * Full-text search on public playlists (title + description). Paginated. + * @summary Search playlists + * @param {string} [q] Full-text query + * @param {number} [page] Page number + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsSearchGet(q, page, limit, options).then((request) => request(axios, basePath)); + }, + /** + * Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + * @summary Get playlist by share token + * @param {string} token Share token + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSharedTokenGet(token: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.playlistsSharedTokenGet(token, options).then((request) => request(axios, basePath)); + }, }; }; @@ -4306,6 +5360,14 @@ export const PlaylistApiFactory = function (configuration?: Configuration, baseP * PlaylistApi - interface */ export interface PlaylistApiInterface { + /** + * Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + * @summary Get Favoris playlist + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsFavorisGet(options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get a paginated list of playlists * @summary Get Playlists @@ -4317,6 +5379,55 @@ export interface PlaylistApiInterface { */ playlistsGet(page?: number, limit?: number, userId?: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + * @summary Get playlist statistics + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdAnalyticsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns the collaborators of a playlist with their permission level. + * @summary List playlist collaborators + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Invite a user as collaborator. Only the owner (or admin) can add. + * @summary Add playlist collaborator + * @param {string} id Playlist UUID + * @param {InternalHandlersAddCollaboratorRequest} request Collaborator + permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsPost(id: string, request: InternalHandlersAddCollaboratorRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Revoke a collaborator\'s access. Only the owner (or admin) can remove. + * @summary Remove playlist collaborator + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdDelete(id: string, userId: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + * @summary Update collaborator permission + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {InternalHandlersUpdateCollaboratorPermissionRequest} request New permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdCollaboratorsUserIdPut(id: string, userId: string, request: InternalHandlersUpdateCollaboratorPermissionRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Permanently delete a playlist * @summary Delete Playlist @@ -4326,6 +5437,15 @@ export interface PlaylistApiInterface { */ playlistsIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + * @summary Duplicate playlist + * @param {string} id Source playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdDuplicatePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get detailed information about a playlist * @summary Get Playlist by ID @@ -4345,6 +5465,15 @@ export interface PlaylistApiInterface { */ playlistsIdPut(id: string, playlist: InternalHandlersUpdatePlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + * @summary Create playlist share link + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsIdSharePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Add a track to the playlist * @summary Add Track to Playlist @@ -4375,6 +5504,15 @@ export interface PlaylistApiInterface { */ playlistsIdTracksTrackIdDelete(id: string, trackId: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + * @summary Import playlist + * @param {InternalHandlersImportPlaylistRequest} request Playlist + tracks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsImportPost(request: InternalHandlersImportPlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Create a new playlist * @summary Create Playlist @@ -4384,12 +5522,51 @@ export interface PlaylistApiInterface { */ playlistsPost(request: InternalHandlersCreatePlaylistRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + * @summary Get playlist recommendations + * @param {number} [limit] Max items (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsRecommendationsGet(limit?: number, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Full-text search on public playlists (title + description). Paginated. + * @summary Search playlists + * @param {string} [q] Full-text query + * @param {number} [page] Page number + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + * @summary Get playlist by share token + * @param {string} token Share token + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + playlistsSharedTokenGet(token: string, options?: RawAxiosRequestConfig): AxiosPromise; + } /** * PlaylistApi - object-oriented interface */ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { + /** + * Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + * @summary Get Favoris playlist + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsFavorisGet(options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsFavorisGet(options).then((request) => request(this.axios, this.basePath)); + } + /** * Get a paginated list of playlists * @summary Get Playlists @@ -4403,6 +5580,65 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { return PlaylistApiFp(this.configuration).playlistsGet(page, limit, userId, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + * @summary Get playlist statistics + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdAnalyticsGet(id: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdAnalyticsGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns the collaborators of a playlist with their permission level. + * @summary List playlist collaborators + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdCollaboratorsGet(id: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdCollaboratorsGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Invite a user as collaborator. Only the owner (or admin) can add. + * @summary Add playlist collaborator + * @param {string} id Playlist UUID + * @param {InternalHandlersAddCollaboratorRequest} request Collaborator + permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdCollaboratorsPost(id: string, request: InternalHandlersAddCollaboratorRequest, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdCollaboratorsPost(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Revoke a collaborator\'s access. Only the owner (or admin) can remove. + * @summary Remove playlist collaborator + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdCollaboratorsUserIdDelete(id: string, userId: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdCollaboratorsUserIdDelete(id, userId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + * @summary Update collaborator permission + * @param {string} id Playlist UUID + * @param {string} userId Collaborator user UUID + * @param {InternalHandlersUpdateCollaboratorPermissionRequest} request New permission + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdCollaboratorsUserIdPut(id: string, userId: string, request: InternalHandlersUpdateCollaboratorPermissionRequest, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdCollaboratorsUserIdPut(id, userId, request, options).then((request) => request(this.axios, this.basePath)); + } + /** * Permanently delete a playlist * @summary Delete Playlist @@ -4414,6 +5650,17 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { return PlaylistApiFp(this.configuration).playlistsIdDelete(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + * @summary Duplicate playlist + * @param {string} id Source playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdDuplicatePost(id: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdDuplicatePost(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Get detailed information about a playlist * @summary Get Playlist by ID @@ -4437,6 +5684,17 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { return PlaylistApiFp(this.configuration).playlistsIdPut(id, playlist, options).then((request) => request(this.axios, this.basePath)); } + /** + * Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + * @summary Create playlist share link + * @param {string} id Playlist UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsIdSharePost(id: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsIdSharePost(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Add a track to the playlist * @summary Add Track to Playlist @@ -4473,6 +5731,17 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { return PlaylistApiFp(this.configuration).playlistsIdTracksTrackIdDelete(id, trackId, options).then((request) => request(this.axios, this.basePath)); } + /** + * Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + * @summary Import playlist + * @param {InternalHandlersImportPlaylistRequest} request Playlist + tracks + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsImportPost(request: InternalHandlersImportPlaylistRequest, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsImportPost(request, options).then((request) => request(this.axios, this.basePath)); + } + /** * Create a new playlist * @summary Create Playlist @@ -4483,6 +5752,41 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { public playlistsPost(request: InternalHandlersCreatePlaylistRequest, options?: RawAxiosRequestConfig) { return PlaylistApiFp(this.configuration).playlistsPost(request, options).then((request) => request(this.axios, this.basePath)); } + + /** + * Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + * @summary Get playlist recommendations + * @param {number} [limit] Max items (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsRecommendationsGet(limit?: number, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsRecommendationsGet(limit, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Full-text search on public playlists (title + description). Paginated. + * @summary Search playlists + * @param {string} [q] Full-text query + * @param {number} [page] Page number + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsSearchGet(q, page, limit, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + * @summary Get playlist by share token + * @param {string} token Share token + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public playlistsSharedTokenGet(token: string, options?: RawAxiosRequestConfig) { + return PlaylistApiFp(this.configuration).playlistsSharedTokenGet(token, options).then((request) => request(this.axios, this.basePath)); + } } @@ -4492,6 +5796,121 @@ export class PlaylistApi extends BaseAPI implements PlaylistApiInterface { */ export const TrackApiAxiosParamCreator = function (configuration?: Configuration) { return { + /** + * Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + * @summary Stream server callback + * @param {string} id Track UUID + * @param {InternalCoreTrackStreamCallbackRequest} request Callback payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + internalTracksIdStreamReadyPost: async (id: string, request: InternalCoreTrackStreamCallbackRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('internalTracksIdStreamReadyPost', 'id', id) + // verify required parameter 'request' is not null or undefined + assertParamExists('internalTracksIdStreamReadyPost', 'request', request) + const localVarPath = `/internal/tracks/{id}/stream-ready` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + * @summary Batch delete tracks + * @param {InternalCoreTrackBatchDeleteRequest} request List of track UUIDs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchDeletePost: async (request: InternalCoreTrackBatchDeleteRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'request' is not null or undefined + assertParamExists('tracksBatchDeletePost', 'request', request) + const localVarPath = `/tracks/batch/delete`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + * @summary Batch update tracks + * @param {InternalCoreTrackBatchUpdateRequest} request Track UUIDs + shared updates map + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchUpdatePost: async (request: InternalCoreTrackBatchUpdateRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'request' is not null or undefined + assertParamExists('tracksBatchUpdatePost', 'request', request) + const localVarPath = `/tracks/batch/update`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Upload a single chunk of a file * @summary Upload Chunk @@ -4608,6 +6027,678 @@ export const TrackApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + * @summary List tracks + * @param {string} [cursor] Opaque pagination cursor (overrides page) + * @param {number} [page] Page number, 1-based (ignored if cursor set) + * @param {number} [limit] Items per page (max 100) + * @param {string} [userId] Filter by creator UUID + * @param {string} [genre] Filter by genre + * @param {string} [format] Filter by audio format (mp3, flac, wav, ogg, m4a, aac) + * @param {string} [sortBy] Sort column (created_at, play_count, title) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksGet: async (cursor?: string, page?: number, limit?: number, userId?: string, genre?: string, format?: string, sortBy?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/tracks`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (cursor !== undefined) { + localVarQueryParameter['cursor'] = cursor; + } + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (userId !== undefined) { + localVarQueryParameter['user_id'] = userId; + } + + if (genre !== undefined) { + localVarQueryParameter['genre'] = genre; + } + + if (format !== undefined) { + localVarQueryParameter['format'] = format; + } + + if (sortBy !== undefined) { + localVarQueryParameter['sort_by'] = sortBy; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + * @summary Delete track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdDelete', 'id', id) + const localVarPath = `/tracks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + * @summary Download a track + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication for a limited time + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDownloadGet: async (id: string, shareToken?: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdDownloadGet', 'id', id) + const localVarPath = `/tracks/{id}/download` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (shareToken !== undefined) { + localVarQueryParameter['share_token'] = shareToken; + } + + localVarHeaderParameter['Accept'] = 'application/octet-stream'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + * @summary Get track by ID + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdGet', 'id', id) + const localVarPath = `/tracks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Paginated audit log of modifications (metadata updates, version changes) for a track. + * @summary Get track history + * @param {string} id Track UUID + * @param {number} [limit] Items per page + * @param {number} [offset] Offset + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdHistoryGet: async (id: string, limit?: number, offset?: number, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdHistoryGet', 'id', id) + const localVarPath = `/tracks/{id}/history` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (offset !== undefined) { + localVarQueryParameter['offset'] = offset; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Remove the authenticated user\'s like on the track (idempotent). + * @summary Unlike a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikeDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdLikeDelete', 'id', id) + const localVarPath = `/tracks/{id}/like` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + * @summary Like a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikePost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdLikePost', 'id', id) + const localVarPath = `/tracks/{id}/like` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + * @summary Get track like status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikesGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdLikesGet', 'id', id) + const localVarPath = `/tracks/{id}/likes` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns the current lyrics for a track, or null if no lyrics exist. + * @summary Get track lyrics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdLyricsGet', 'id', id) + const localVarPath = `/tracks/{id}/lyrics` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Replace the lyrics of a track. Caller must own the track or be admin. + * @summary Create or update track lyrics + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateLyricsRequest} request Lyrics payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsPut: async (id: string, request: InternalCoreTrackUpdateLyricsRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdLyricsPut', 'id', id) + // verify required parameter 'request' is not null or undefined + assertParamExists('tracksIdLyricsPut', 'request', request) + const localVarPath = `/tracks/{id}/lyrics` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + * @summary Record play event + * @param {string} id Track UUID + * @param {InternalCoreTrackRecordPlayRequest} [request] Playback metadata (optional) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPlayPost: async (id: string, request?: InternalCoreTrackRecordPlayRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdPlayPost', 'id', id) + const localVarPath = `/tracks/{id}/play` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Update the metadata of an existing track. Caller must own the track or be admin. + * @summary Update track metadata + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateTrackRequest} request Updated metadata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPut: async (id: string, request: InternalCoreTrackUpdateTrackRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdPut', 'id', id) + // verify required parameter 'request' is not null or undefined + assertParamExists('tracksIdPut', 'request', request) + const localVarPath = `/tracks/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'PUT', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Remove the authenticated user\'s repost of the track (idempotent). + * @summary Remove track repost + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdRepostDelete', 'id', id) + const localVarPath = `/tracks/{id}/repost` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + * @summary Get repost status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdRepostGet', 'id', id) + const localVarPath = `/tracks/{id}/repost` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + * @summary Repost a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostPost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdRepostPost', 'id', id) + const localVarPath = `/tracks/{id}/repost` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Generate a tokenized share link for a track with given permission level and optional expiry. + * @summary Create share link + * @param {string} id Track UUID + * @param {InternalCoreTrackCreateShareRequest} request Share parameters + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdSharePost: async (id: string, request: InternalCoreTrackCreateShareRequest, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdSharePost', 'id', id) + // verify required parameter 'request' is not null or undefined + assertParamExists('tracksIdSharePost', 'request', request) + const localVarPath = `/tracks/{id}/share` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Content-Type'] = 'application/json'; + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + localVarRequestOptions.data = serializeDataIfNeeded(request, localVarRequestOptions, configuration) + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Aggregated track stats: views, likes, comments, play time, downloads, average duration. + * @summary Get track statistics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStatsGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdStatsGet', 'id', id) + const localVarPath = `/tracks/{id}/stats` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get the processing status of an uploaded track * @summary Get Upload Status @@ -4645,6 +6736,120 @@ export const TrackApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + * @summary Stream a track (raw audio + Range) + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStreamGet: async (id: string, shareToken?: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdStreamGet', 'id', id) + const localVarPath = `/tracks/{id}/stream` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (shareToken !== undefined) { + localVarQueryParameter['share_token'] = shareToken; + } + + localVarHeaderParameter['Accept'] = 'audio/*'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Rollback a track to a previous version. Only the track owner can restore. + * @summary Restore track version + * @param {string} id Track UUID + * @param {string} versionId Version UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdVersionsVersionIdRestorePost: async (id: string, versionId: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdVersionsVersionIdRestorePost', 'id', id) + // verify required parameter 'versionId' is not null or undefined + assertParamExists('tracksIdVersionsVersionIdRestorePost', 'versionId', versionId) + const localVarPath = `/tracks/{id}/versions/{versionId}/restore` + .replace(`{${"id"}}`, encodeURIComponent(String(id))) + .replace(`{${"versionId"}}`, encodeURIComponent(String(versionId))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + * @summary Get track waveform + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdWaveformGet: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksIdWaveformGet', 'id', id) + const localVarPath = `/tracks/{id}/waveform` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Start a new chunked upload session * @summary Initiate Chunked Upload @@ -4763,6 +6968,49 @@ export const TrackApiAxiosParamCreator = function (configuration?: Configuration options: localVarRequestOptions, }; }, + /** + * Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + * @summary Get track recommendations + * @param {number} [limit] Max items (max 100) + * @param {string} [seedTrackId] Start from this track\'s similarity neighbours + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksRecommendationsGet: async (limit?: number, seedTrackId?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/tracks/recommendations`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (seedTrackId !== undefined) { + localVarQueryParameter['seed_track_id'] = seedTrackId; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get state of an interrupted upload * @summary Resume Upload @@ -4795,6 +7043,222 @@ export const TrackApiAxiosParamCreator = function (configuration?: Configuration let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + * @summary Advanced track search + * @param {string} [q] Full-text query (title/artist/album) + * @param {string} [tags] Comma-separated tag list + * @param {string} [tagMode] Tag combinator (OR / AND) + * @param {number} [minDuration] Minimum duration (seconds) + * @param {number} [maxDuration] Maximum duration (seconds) + * @param {number} [minBpm] Minimum BPM + * @param {number} [maxBpm] Maximum BPM + * @param {string} [genre] Genre filter + * @param {string} [format] Audio format filter + * @param {string} [musicalKey] Musical key filter + * @param {string} [minDate] Created-after (RFC3339) + * @param {string} [maxDate] Created-before (RFC3339) + * @param {number} [page] Page (1-based) + * @param {number} [limit] Items per page (max 100) + * @param {string} [sortBy] Sort column + * @param {string} [sortOrder] asc / desc + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSearchGet: async (q?: string, tags?: string, tagMode?: string, minDuration?: number, maxDuration?: number, minBpm?: number, maxBpm?: number, genre?: string, format?: string, musicalKey?: string, minDate?: string, maxDate?: string, page?: number, limit?: number, sortBy?: string, sortOrder?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/tracks/search`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (q !== undefined) { + localVarQueryParameter['q'] = q; + } + + if (tags !== undefined) { + localVarQueryParameter['tags'] = tags; + } + + if (tagMode !== undefined) { + localVarQueryParameter['tag_mode'] = tagMode; + } + + if (minDuration !== undefined) { + localVarQueryParameter['min_duration'] = minDuration; + } + + if (maxDuration !== undefined) { + localVarQueryParameter['max_duration'] = maxDuration; + } + + if (minBpm !== undefined) { + localVarQueryParameter['min_bpm'] = minBpm; + } + + if (maxBpm !== undefined) { + localVarQueryParameter['max_bpm'] = maxBpm; + } + + if (genre !== undefined) { + localVarQueryParameter['genre'] = genre; + } + + if (format !== undefined) { + localVarQueryParameter['format'] = format; + } + + if (musicalKey !== undefined) { + localVarQueryParameter['musical_key'] = musicalKey; + } + + if (minDate !== undefined) { + localVarQueryParameter['min_date'] = minDate; + } + + if (maxDate !== undefined) { + localVarQueryParameter['max_date'] = maxDate; + } + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (sortBy !== undefined) { + localVarQueryParameter['sort_by'] = sortBy; + } + + if (sortOrder !== undefined) { + localVarQueryParameter['sort_order'] = sortOrder; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Permanently disable a share token. Only the share issuer (or admin) can revoke. + * @summary Revoke share link + * @param {string} id Share UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksShareIdDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('tracksShareIdDelete', 'id', id) + const localVarPath = `/tracks/share/{id}` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + * @summary Get track by share token + * @param {string} token Opaque share token issued by CreateShare + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSharedTokenGet: async (token: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'token' is not null or undefined + assertParamExists('tracksSharedTokenGet', 'token', token) + const localVarPath = `/tracks/shared/{token}` + .replace(`{${"token"}}`, encodeURIComponent(String(token))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + * @summary Get suggested tags + * @param {string} [genre] Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSuggestedTagsGet: async (genre?: string, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/tracks/suggested-tags`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (genre !== undefined) { + localVarQueryParameter['genre'] = genre; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -4809,6 +7273,46 @@ export const TrackApiAxiosParamCreator = function (configuration?: Configuration export const TrackApiFp = function(configuration?: Configuration) { const localVarAxiosParamCreator = TrackApiAxiosParamCreator(configuration) return { + /** + * Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + * @summary Stream server callback + * @param {string} id Track UUID + * @param {InternalCoreTrackStreamCallbackRequest} request Callback payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async internalTracksIdStreamReadyPost(id: string, request: InternalCoreTrackStreamCallbackRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.internalTracksIdStreamReadyPost(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.internalTracksIdStreamReadyPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + * @summary Batch delete tracks + * @param {InternalCoreTrackBatchDeleteRequest} request List of track UUIDs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksBatchDeletePost(request: InternalCoreTrackBatchDeleteRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksBatchDeletePost(request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksBatchDeletePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + * @summary Batch update tracks + * @param {InternalCoreTrackBatchUpdateRequest} request Track UUIDs + shared updates map + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksBatchUpdatePost(request: InternalCoreTrackBatchUpdateRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksBatchUpdatePost(request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksBatchUpdatePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Upload a single chunk of a file * @summary Upload Chunk @@ -4840,6 +7344,240 @@ export const TrackApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksCompletePost']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + * @summary List tracks + * @param {string} [cursor] Opaque pagination cursor (overrides page) + * @param {number} [page] Page number, 1-based (ignored if cursor set) + * @param {number} [limit] Items per page (max 100) + * @param {string} [userId] Filter by creator UUID + * @param {string} [genre] Filter by genre + * @param {string} [format] Filter by audio format (mp3, flac, wav, ogg, m4a, aac) + * @param {string} [sortBy] Sort column (created_at, play_count, title) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksGet(cursor?: string, page?: number, limit?: number, userId?: string, genre?: string, format?: string, sortBy?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksGet(cursor, page, limit, userId, genre, format, sortBy, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + * @summary Delete track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + * @summary Download a track + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication for a limited time + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdDownloadGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdDownloadGet(id, shareToken, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdDownloadGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + * @summary Get track by ID + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Paginated audit log of modifications (metadata updates, version changes) for a track. + * @summary Get track history + * @param {string} id Track UUID + * @param {number} [limit] Items per page + * @param {number} [offset] Offset + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdHistoryGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdHistoryGet(id, limit, offset, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdHistoryGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Remove the authenticated user\'s like on the track (idempotent). + * @summary Unlike a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdLikeDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdLikeDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdLikeDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + * @summary Like a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdLikePost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdLikePost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdLikePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + * @summary Get track like status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdLikesGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdLikesGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdLikesGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns the current lyrics for a track, or null if no lyrics exist. + * @summary Get track lyrics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdLyricsGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdLyricsGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdLyricsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Replace the lyrics of a track. Caller must own the track or be admin. + * @summary Create or update track lyrics + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateLyricsRequest} request Lyrics payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdLyricsPut(id: string, request: InternalCoreTrackUpdateLyricsRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdLyricsPut(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdLyricsPut']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + * @summary Record play event + * @param {string} id Track UUID + * @param {InternalCoreTrackRecordPlayRequest} [request] Playback metadata (optional) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdPlayPost(id: string, request?: InternalCoreTrackRecordPlayRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdPlayPost(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdPlayPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Update the metadata of an existing track. Caller must own the track or be admin. + * @summary Update track metadata + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateTrackRequest} request Updated metadata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdPut(id: string, request: InternalCoreTrackUpdateTrackRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdPut(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdPut']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Remove the authenticated user\'s repost of the track (idempotent). + * @summary Remove track repost + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdRepostDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdRepostDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdRepostDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + * @summary Get repost status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdRepostGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdRepostGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdRepostGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + * @summary Repost a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdRepostPost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdRepostPost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdRepostPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Generate a tokenized share link for a track with given permission level and optional expiry. + * @summary Create share link + * @param {string} id Track UUID + * @param {InternalCoreTrackCreateShareRequest} request Share parameters + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdSharePost(id: string, request: InternalCoreTrackCreateShareRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdSharePost(id, request, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdSharePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Aggregated track stats: views, likes, comments, play time, downloads, average duration. + * @summary Get track statistics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdStatsGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdStatsGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdStatsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get the processing status of an uploaded track * @summary Get Upload Status @@ -4853,6 +7591,47 @@ export const TrackApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdStatusGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + * @summary Stream a track (raw audio + Range) + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdStreamGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdStreamGet(id, shareToken, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdStreamGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Rollback a track to a previous version. Only the track owner can restore. + * @summary Restore track version + * @param {string} id Track UUID + * @param {string} versionId Version UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdVersionsVersionIdRestorePost(id: string, versionId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdVersionsVersionIdRestorePost(id, versionId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdVersionsVersionIdRestorePost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + * @summary Get track waveform + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksIdWaveformGet(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksIdWaveformGet(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksIdWaveformGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Start a new chunked upload session * @summary Initiate Chunked Upload @@ -4892,6 +7671,20 @@ export const TrackApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksQuotaIdGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + * @summary Get track recommendations + * @param {number} [limit] Max items (max 100) + * @param {string} [seedTrackId] Start from this track\'s similarity neighbours + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksRecommendationsGet(limit?: number, seedTrackId?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksRecommendationsGet(limit, seedTrackId, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksRecommendationsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get state of an interrupted upload * @summary Resume Upload @@ -4905,6 +7698,73 @@ export const TrackApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksResumeUploadIdGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + * @summary Advanced track search + * @param {string} [q] Full-text query (title/artist/album) + * @param {string} [tags] Comma-separated tag list + * @param {string} [tagMode] Tag combinator (OR / AND) + * @param {number} [minDuration] Minimum duration (seconds) + * @param {number} [maxDuration] Maximum duration (seconds) + * @param {number} [minBpm] Minimum BPM + * @param {number} [maxBpm] Maximum BPM + * @param {string} [genre] Genre filter + * @param {string} [format] Audio format filter + * @param {string} [musicalKey] Musical key filter + * @param {string} [minDate] Created-after (RFC3339) + * @param {string} [maxDate] Created-before (RFC3339) + * @param {number} [page] Page (1-based) + * @param {number} [limit] Items per page (max 100) + * @param {string} [sortBy] Sort column + * @param {string} [sortOrder] asc / desc + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksSearchGet(q?: string, tags?: string, tagMode?: string, minDuration?: number, maxDuration?: number, minBpm?: number, maxBpm?: number, genre?: string, format?: string, musicalKey?: string, minDate?: string, maxDate?: string, page?: number, limit?: number, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksSearchGet(q, tags, tagMode, minDuration, maxDuration, minBpm, maxBpm, genre, format, musicalKey, minDate, maxDate, page, limit, sortBy, sortOrder, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksSearchGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Permanently disable a share token. Only the share issuer (or admin) can revoke. + * @summary Revoke share link + * @param {string} id Share UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksShareIdDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksShareIdDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksShareIdDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + * @summary Get track by share token + * @param {string} token Opaque share token issued by CreateShare + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksSharedTokenGet(token: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksSharedTokenGet(token, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksSharedTokenGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + * @summary Get suggested tags + * @param {string} [genre] Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async tracksSuggestedTagsGet(genre?: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.tracksSuggestedTagsGet(genre, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['TrackApi.tracksSuggestedTagsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, } }; @@ -4914,6 +7774,37 @@ export const TrackApiFp = function(configuration?: Configuration) { export const TrackApiFactory = function (configuration?: Configuration, basePath?: string, axios?: AxiosInstance) { const localVarFp = TrackApiFp(configuration) return { + /** + * Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + * @summary Stream server callback + * @param {string} id Track UUID + * @param {InternalCoreTrackStreamCallbackRequest} request Callback payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + internalTracksIdStreamReadyPost(id: string, request: InternalCoreTrackStreamCallbackRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.internalTracksIdStreamReadyPost(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + * @summary Batch delete tracks + * @param {InternalCoreTrackBatchDeleteRequest} request List of track UUIDs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchDeletePost(request: InternalCoreTrackBatchDeleteRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksBatchDeletePost(request, options).then((request) => request(axios, basePath)); + }, + /** + * Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + * @summary Batch update tracks + * @param {InternalCoreTrackBatchUpdateRequest} request Track UUIDs + shared updates map + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchUpdatePost(request: InternalCoreTrackBatchUpdateRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksBatchUpdatePost(request, options).then((request) => request(axios, basePath)); + }, /** * Upload a single chunk of a file * @summary Upload Chunk @@ -4939,6 +7830,189 @@ export const TrackApiFactory = function (configuration?: Configuration, basePath tracksCompletePost(request: InternalCoreTrackCompleteChunkedUploadRequest, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.tracksCompletePost(request, options).then((request) => request(axios, basePath)); }, + /** + * List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + * @summary List tracks + * @param {string} [cursor] Opaque pagination cursor (overrides page) + * @param {number} [page] Page number, 1-based (ignored if cursor set) + * @param {number} [limit] Items per page (max 100) + * @param {string} [userId] Filter by creator UUID + * @param {string} [genre] Filter by genre + * @param {string} [format] Filter by audio format (mp3, flac, wav, ogg, m4a, aac) + * @param {string} [sortBy] Sort column (created_at, play_count, title) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksGet(cursor?: string, page?: number, limit?: number, userId?: string, genre?: string, format?: string, sortBy?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksGet(cursor, page, limit, userId, genre, format, sortBy, options).then((request) => request(axios, basePath)); + }, + /** + * Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + * @summary Delete track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + * @summary Download a track + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication for a limited time + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDownloadGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdDownloadGet(id, shareToken, options).then((request) => request(axios, basePath)); + }, + /** + * Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + * @summary Get track by ID + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Paginated audit log of modifications (metadata updates, version changes) for a track. + * @summary Get track history + * @param {string} id Track UUID + * @param {number} [limit] Items per page + * @param {number} [offset] Offset + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdHistoryGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdHistoryGet(id, limit, offset, options).then((request) => request(axios, basePath)); + }, + /** + * Remove the authenticated user\'s like on the track (idempotent). + * @summary Unlike a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikeDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdLikeDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + * @summary Like a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdLikePost(id, options).then((request) => request(axios, basePath)); + }, + /** + * Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + * @summary Get track like status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikesGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdLikesGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Returns the current lyrics for a track, or null if no lyrics exist. + * @summary Get track lyrics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdLyricsGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Replace the lyrics of a track. Caller must own the track or be admin. + * @summary Create or update track lyrics + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateLyricsRequest} request Lyrics payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsPut(id: string, request: InternalCoreTrackUpdateLyricsRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdLyricsPut(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + * @summary Record play event + * @param {string} id Track UUID + * @param {InternalCoreTrackRecordPlayRequest} [request] Playback metadata (optional) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPlayPost(id: string, request?: InternalCoreTrackRecordPlayRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdPlayPost(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Update the metadata of an existing track. Caller must own the track or be admin. + * @summary Update track metadata + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateTrackRequest} request Updated metadata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPut(id: string, request: InternalCoreTrackUpdateTrackRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdPut(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Remove the authenticated user\'s repost of the track (idempotent). + * @summary Remove track repost + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdRepostDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + * @summary Get repost status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdRepostGet(id, options).then((request) => request(axios, basePath)); + }, + /** + * Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + * @summary Repost a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdRepostPost(id, options).then((request) => request(axios, basePath)); + }, + /** + * Generate a tokenized share link for a track with given permission level and optional expiry. + * @summary Create share link + * @param {string} id Track UUID + * @param {InternalCoreTrackCreateShareRequest} request Share parameters + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdSharePost(id: string, request: InternalCoreTrackCreateShareRequest, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdSharePost(id, request, options).then((request) => request(axios, basePath)); + }, + /** + * Aggregated track stats: views, likes, comments, play time, downloads, average duration. + * @summary Get track statistics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStatsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdStatsGet(id, options).then((request) => request(axios, basePath)); + }, /** * Get the processing status of an uploaded track * @summary Get Upload Status @@ -4949,6 +8023,38 @@ export const TrackApiFactory = function (configuration?: Configuration, basePath tracksIdStatusGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.tracksIdStatusGet(id, options).then((request) => request(axios, basePath)); }, + /** + * Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + * @summary Stream a track (raw audio + Range) + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStreamGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdStreamGet(id, shareToken, options).then((request) => request(axios, basePath)); + }, + /** + * Rollback a track to a previous version. Only the track owner can restore. + * @summary Restore track version + * @param {string} id Track UUID + * @param {string} versionId Version UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdVersionsVersionIdRestorePost(id: string, versionId: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdVersionsVersionIdRestorePost(id, versionId, options).then((request) => request(axios, basePath)); + }, + /** + * Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + * @summary Get track waveform + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdWaveformGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksIdWaveformGet(id, options).then((request) => request(axios, basePath)); + }, /** * Start a new chunked upload session * @summary Initiate Chunked Upload @@ -4979,6 +8085,17 @@ export const TrackApiFactory = function (configuration?: Configuration, basePath tracksQuotaIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.tracksQuotaIdGet(id, options).then((request) => request(axios, basePath)); }, + /** + * Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + * @summary Get track recommendations + * @param {number} [limit] Max items (max 100) + * @param {string} [seedTrackId] Start from this track\'s similarity neighbours + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksRecommendationsGet(limit?: number, seedTrackId?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksRecommendationsGet(limit, seedTrackId, options).then((request) => request(axios, basePath)); + }, /** * Get state of an interrupted upload * @summary Resume Upload @@ -4989,6 +8106,61 @@ export const TrackApiFactory = function (configuration?: Configuration, basePath tracksResumeUploadIdGet(uploadId: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.tracksResumeUploadIdGet(uploadId, options).then((request) => request(axios, basePath)); }, + /** + * Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + * @summary Advanced track search + * @param {string} [q] Full-text query (title/artist/album) + * @param {string} [tags] Comma-separated tag list + * @param {string} [tagMode] Tag combinator (OR / AND) + * @param {number} [minDuration] Minimum duration (seconds) + * @param {number} [maxDuration] Maximum duration (seconds) + * @param {number} [minBpm] Minimum BPM + * @param {number} [maxBpm] Maximum BPM + * @param {string} [genre] Genre filter + * @param {string} [format] Audio format filter + * @param {string} [musicalKey] Musical key filter + * @param {string} [minDate] Created-after (RFC3339) + * @param {string} [maxDate] Created-before (RFC3339) + * @param {number} [page] Page (1-based) + * @param {number} [limit] Items per page (max 100) + * @param {string} [sortBy] Sort column + * @param {string} [sortOrder] asc / desc + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSearchGet(q?: string, tags?: string, tagMode?: string, minDuration?: number, maxDuration?: number, minBpm?: number, maxBpm?: number, genre?: string, format?: string, musicalKey?: string, minDate?: string, maxDate?: string, page?: number, limit?: number, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksSearchGet(q, tags, tagMode, minDuration, maxDuration, minBpm, maxBpm, genre, format, musicalKey, minDate, maxDate, page, limit, sortBy, sortOrder, options).then((request) => request(axios, basePath)); + }, + /** + * Permanently disable a share token. Only the share issuer (or admin) can revoke. + * @summary Revoke share link + * @param {string} id Share UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksShareIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksShareIdDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + * @summary Get track by share token + * @param {string} token Opaque share token issued by CreateShare + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSharedTokenGet(token: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksSharedTokenGet(token, options).then((request) => request(axios, basePath)); + }, + /** + * Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + * @summary Get suggested tags + * @param {string} [genre] Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSuggestedTagsGet(genre?: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.tracksSuggestedTagsGet(genre, options).then((request) => request(axios, basePath)); + }, }; }; @@ -4996,6 +8168,34 @@ export const TrackApiFactory = function (configuration?: Configuration, basePath * TrackApi - interface */ export interface TrackApiInterface { + /** + * Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + * @summary Stream server callback + * @param {string} id Track UUID + * @param {InternalCoreTrackStreamCallbackRequest} request Callback payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + internalTracksIdStreamReadyPost(id: string, request: InternalCoreTrackStreamCallbackRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + * @summary Batch delete tracks + * @param {InternalCoreTrackBatchDeleteRequest} request List of track UUIDs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchDeletePost(request: InternalCoreTrackBatchDeleteRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + * @summary Batch update tracks + * @param {InternalCoreTrackBatchUpdateRequest} request Track UUIDs + shared updates map + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksBatchUpdatePost(request: InternalCoreTrackBatchUpdateRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Upload a single chunk of a file * @summary Upload Chunk @@ -5019,6 +8219,172 @@ export interface TrackApiInterface { */ tracksCompletePost(request: InternalCoreTrackCompleteChunkedUploadRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + * @summary List tracks + * @param {string} [cursor] Opaque pagination cursor (overrides page) + * @param {number} [page] Page number, 1-based (ignored if cursor set) + * @param {number} [limit] Items per page (max 100) + * @param {string} [userId] Filter by creator UUID + * @param {string} [genre] Filter by genre + * @param {string} [format] Filter by audio format (mp3, flac, wav, ogg, m4a, aac) + * @param {string} [sortBy] Sort column (created_at, play_count, title) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksGet(cursor?: string, page?: number, limit?: number, userId?: string, genre?: string, format?: string, sortBy?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + * @summary Delete track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + * @summary Download a track + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication for a limited time + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdDownloadGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + * @summary Get track by ID + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Paginated audit log of modifications (metadata updates, version changes) for a track. + * @summary Get track history + * @param {string} id Track UUID + * @param {number} [limit] Items per page + * @param {number} [offset] Offset + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdHistoryGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Remove the authenticated user\'s like on the track (idempotent). + * @summary Unlike a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikeDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + * @summary Like a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikePost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + * @summary Get track like status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLikesGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns the current lyrics for a track, or null if no lyrics exist. + * @summary Get track lyrics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Replace the lyrics of a track. Caller must own the track or be admin. + * @summary Create or update track lyrics + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateLyricsRequest} request Lyrics payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdLyricsPut(id: string, request: InternalCoreTrackUpdateLyricsRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + * @summary Record play event + * @param {string} id Track UUID + * @param {InternalCoreTrackRecordPlayRequest} [request] Playback metadata (optional) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPlayPost(id: string, request?: InternalCoreTrackRecordPlayRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Update the metadata of an existing track. Caller must own the track or be admin. + * @summary Update track metadata + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateTrackRequest} request Updated metadata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdPut(id: string, request: InternalCoreTrackUpdateTrackRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Remove the authenticated user\'s repost of the track (idempotent). + * @summary Remove track repost + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + * @summary Get repost status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + * @summary Repost a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdRepostPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Generate a tokenized share link for a track with given permission level and optional expiry. + * @summary Create share link + * @param {string} id Track UUID + * @param {InternalCoreTrackCreateShareRequest} request Share parameters + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdSharePost(id: string, request: InternalCoreTrackCreateShareRequest, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Aggregated track stats: views, likes, comments, play time, downloads, average duration. + * @summary Get track statistics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStatsGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get the processing status of an uploaded track * @summary Get Upload Status @@ -5028,6 +8394,35 @@ export interface TrackApiInterface { */ tracksIdStatusGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + * @summary Stream a track (raw audio + Range) + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdStreamGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Rollback a track to a previous version. Only the track owner can restore. + * @summary Restore track version + * @param {string} id Track UUID + * @param {string} versionId Version UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdVersionsVersionIdRestorePost(id: string, versionId: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + * @summary Get track waveform + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksIdWaveformGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Start a new chunked upload session * @summary Initiate Chunked Upload @@ -5055,6 +8450,16 @@ export interface TrackApiInterface { */ tracksQuotaIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + * @summary Get track recommendations + * @param {number} [limit] Max items (max 100) + * @param {string} [seedTrackId] Start from this track\'s similarity neighbours + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksRecommendationsGet(limit?: number, seedTrackId?: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get state of an interrupted upload * @summary Resume Upload @@ -5064,12 +8469,97 @@ export interface TrackApiInterface { */ tracksResumeUploadIdGet(uploadId: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + * @summary Advanced track search + * @param {string} [q] Full-text query (title/artist/album) + * @param {string} [tags] Comma-separated tag list + * @param {string} [tagMode] Tag combinator (OR / AND) + * @param {number} [minDuration] Minimum duration (seconds) + * @param {number} [maxDuration] Maximum duration (seconds) + * @param {number} [minBpm] Minimum BPM + * @param {number} [maxBpm] Maximum BPM + * @param {string} [genre] Genre filter + * @param {string} [format] Audio format filter + * @param {string} [musicalKey] Musical key filter + * @param {string} [minDate] Created-after (RFC3339) + * @param {string} [maxDate] Created-before (RFC3339) + * @param {number} [page] Page (1-based) + * @param {number} [limit] Items per page (max 100) + * @param {string} [sortBy] Sort column + * @param {string} [sortOrder] asc / desc + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSearchGet(q?: string, tags?: string, tagMode?: string, minDuration?: number, maxDuration?: number, minBpm?: number, maxBpm?: number, genre?: string, format?: string, musicalKey?: string, minDate?: string, maxDate?: string, page?: number, limit?: number, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Permanently disable a share token. Only the share issuer (or admin) can revoke. + * @summary Revoke share link + * @param {string} id Share UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksShareIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + * @summary Get track by share token + * @param {string} token Opaque share token issued by CreateShare + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSharedTokenGet(token: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + * @summary Get suggested tags + * @param {string} [genre] Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + tracksSuggestedTagsGet(genre?: string, options?: RawAxiosRequestConfig): AxiosPromise; + } /** * TrackApi - object-oriented interface */ export class TrackApi extends BaseAPI implements TrackApiInterface { + /** + * Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + * @summary Stream server callback + * @param {string} id Track UUID + * @param {InternalCoreTrackStreamCallbackRequest} request Callback payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public internalTracksIdStreamReadyPost(id: string, request: InternalCoreTrackStreamCallbackRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).internalTracksIdStreamReadyPost(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + * @summary Batch delete tracks + * @param {InternalCoreTrackBatchDeleteRequest} request List of track UUIDs + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksBatchDeletePost(request: InternalCoreTrackBatchDeleteRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksBatchDeletePost(request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + * @summary Batch update tracks + * @param {InternalCoreTrackBatchUpdateRequest} request Track UUIDs + shared updates map + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksBatchUpdatePost(request: InternalCoreTrackBatchUpdateRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksBatchUpdatePost(request, options).then((request) => request(this.axios, this.basePath)); + } + /** * Upload a single chunk of a file * @summary Upload Chunk @@ -5097,6 +8587,206 @@ export class TrackApi extends BaseAPI implements TrackApiInterface { return TrackApiFp(this.configuration).tracksCompletePost(request, options).then((request) => request(this.axios, this.basePath)); } + /** + * List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + * @summary List tracks + * @param {string} [cursor] Opaque pagination cursor (overrides page) + * @param {number} [page] Page number, 1-based (ignored if cursor set) + * @param {number} [limit] Items per page (max 100) + * @param {string} [userId] Filter by creator UUID + * @param {string} [genre] Filter by genre + * @param {string} [format] Filter by audio format (mp3, flac, wav, ogg, m4a, aac) + * @param {string} [sortBy] Sort column (created_at, play_count, title) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksGet(cursor?: string, page?: number, limit?: number, userId?: string, genre?: string, format?: string, sortBy?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksGet(cursor, page, limit, userId, genre, format, sortBy, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + * @summary Delete track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdDelete(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + * @summary Download a track + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication for a limited time + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdDownloadGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdDownloadGet(id, shareToken, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + * @summary Get track by ID + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Paginated audit log of modifications (metadata updates, version changes) for a track. + * @summary Get track history + * @param {string} id Track UUID + * @param {number} [limit] Items per page + * @param {number} [offset] Offset + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdHistoryGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdHistoryGet(id, limit, offset, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Remove the authenticated user\'s like on the track (idempotent). + * @summary Unlike a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdLikeDelete(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdLikeDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + * @summary Like a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdLikePost(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdLikePost(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + * @summary Get track like status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdLikesGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdLikesGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns the current lyrics for a track, or null if no lyrics exist. + * @summary Get track lyrics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdLyricsGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdLyricsGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Replace the lyrics of a track. Caller must own the track or be admin. + * @summary Create or update track lyrics + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateLyricsRequest} request Lyrics payload + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdLyricsPut(id: string, request: InternalCoreTrackUpdateLyricsRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdLyricsPut(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + * @summary Record play event + * @param {string} id Track UUID + * @param {InternalCoreTrackRecordPlayRequest} [request] Playback metadata (optional) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdPlayPost(id: string, request?: InternalCoreTrackRecordPlayRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdPlayPost(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Update the metadata of an existing track. Caller must own the track or be admin. + * @summary Update track metadata + * @param {string} id Track UUID + * @param {InternalCoreTrackUpdateTrackRequest} request Updated metadata + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdPut(id: string, request: InternalCoreTrackUpdateTrackRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdPut(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Remove the authenticated user\'s repost of the track (idempotent). + * @summary Remove track repost + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdRepostDelete(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdRepostDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + * @summary Get repost status + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdRepostGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdRepostGet(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + * @summary Repost a track + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdRepostPost(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdRepostPost(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Generate a tokenized share link for a track with given permission level and optional expiry. + * @summary Create share link + * @param {string} id Track UUID + * @param {InternalCoreTrackCreateShareRequest} request Share parameters + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdSharePost(id: string, request: InternalCoreTrackCreateShareRequest, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdSharePost(id, request, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Aggregated track stats: views, likes, comments, play time, downloads, average duration. + * @summary Get track statistics + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdStatsGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdStatsGet(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Get the processing status of an uploaded track * @summary Get Upload Status @@ -5108,6 +8798,41 @@ export class TrackApi extends BaseAPI implements TrackApiInterface { return TrackApiFp(this.configuration).tracksIdStatusGet(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + * @summary Stream a track (raw audio + Range) + * @param {string} id Track UUID + * @param {string} [shareToken] Grants access without authentication + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdStreamGet(id: string, shareToken?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdStreamGet(id, shareToken, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Rollback a track to a previous version. Only the track owner can restore. + * @summary Restore track version + * @param {string} id Track UUID + * @param {string} versionId Version UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdVersionsVersionIdRestorePost(id: string, versionId: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdVersionsVersionIdRestorePost(id, versionId, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + * @summary Get track waveform + * @param {string} id Track UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksIdWaveformGet(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksIdWaveformGet(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Start a new chunked upload session * @summary Initiate Chunked Upload @@ -5141,6 +8866,18 @@ export class TrackApi extends BaseAPI implements TrackApiInterface { return TrackApiFp(this.configuration).tracksQuotaIdGet(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + * @summary Get track recommendations + * @param {number} [limit] Max items (max 100) + * @param {string} [seedTrackId] Start from this track\'s similarity neighbours + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksRecommendationsGet(limit?: number, seedTrackId?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksRecommendationsGet(limit, seedTrackId, options).then((request) => request(this.axios, this.basePath)); + } + /** * Get state of an interrupted upload * @summary Resume Upload @@ -5151,6 +8888,65 @@ export class TrackApi extends BaseAPI implements TrackApiInterface { public tracksResumeUploadIdGet(uploadId: string, options?: RawAxiosRequestConfig) { return TrackApiFp(this.configuration).tracksResumeUploadIdGet(uploadId, options).then((request) => request(this.axios, this.basePath)); } + + /** + * Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + * @summary Advanced track search + * @param {string} [q] Full-text query (title/artist/album) + * @param {string} [tags] Comma-separated tag list + * @param {string} [tagMode] Tag combinator (OR / AND) + * @param {number} [minDuration] Minimum duration (seconds) + * @param {number} [maxDuration] Maximum duration (seconds) + * @param {number} [minBpm] Minimum BPM + * @param {number} [maxBpm] Maximum BPM + * @param {string} [genre] Genre filter + * @param {string} [format] Audio format filter + * @param {string} [musicalKey] Musical key filter + * @param {string} [minDate] Created-after (RFC3339) + * @param {string} [maxDate] Created-before (RFC3339) + * @param {number} [page] Page (1-based) + * @param {number} [limit] Items per page (max 100) + * @param {string} [sortBy] Sort column + * @param {string} [sortOrder] asc / desc + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksSearchGet(q?: string, tags?: string, tagMode?: string, minDuration?: number, maxDuration?: number, minBpm?: number, maxBpm?: number, genre?: string, format?: string, musicalKey?: string, minDate?: string, maxDate?: string, page?: number, limit?: number, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksSearchGet(q, tags, tagMode, minDuration, maxDuration, minBpm, maxBpm, genre, format, musicalKey, minDate, maxDate, page, limit, sortBy, sortOrder, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Permanently disable a share token. Only the share issuer (or admin) can revoke. + * @summary Revoke share link + * @param {string} id Share UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksShareIdDelete(id: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksShareIdDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + * @summary Get track by share token + * @param {string} token Opaque share token issued by CreateShare + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksSharedTokenGet(token: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksSharedTokenGet(token, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + * @summary Get suggested tags + * @param {string} [genre] Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public tracksSuggestedTagsGet(genre?: string, options?: RawAxiosRequestConfig) { + return TrackApiFp(this.configuration).tracksSuggestedTagsGet(genre, options).then((request) => request(this.axios, this.basePath)); + } } @@ -5264,6 +9060,80 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * Authenticated user unblocks target user (idempotent). + * @summary Unblock user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdBlockDelete', 'id', id) + const localVarPath = `/users/{id}/block` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + * @summary Block user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockPost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdBlockPost', 'id', id) + const localVarPath = `/users/{id}/block` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get profile completion percentage and missing fields * @summary Get Profile Completion @@ -5335,6 +9205,80 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * Authenticated user stops following target user (idempotent). + * @summary Unfollow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowDelete: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdFollowDelete', 'id', id) + const localVarPath = `/users/{id}/follow` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + * @summary Follow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowPost: async (id: string, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdFollowPost', 'id', id) + const localVarPath = `/users/{id}/follow` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Get public profile information for a user * @summary Get Profile by ID @@ -5369,6 +9313,53 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) options: localVarRequestOptions, }; }, + /** + * Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + * @summary List tracks liked by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdLikesGet: async (id: string, limit?: number, offset?: number, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdLikesGet', 'id', id) + const localVarPath = `/users/{id}/likes` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (offset !== undefined) { + localVarQueryParameter['offset'] = offset; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * Update user profile details * @summary Update Profile @@ -5406,6 +9397,133 @@ export const UserApiAxiosParamCreator = function (configuration?: Configuration) localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.data = serializeDataIfNeeded(profile, localVarRequestOptions, configuration) + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + * @summary List tracks reposted by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdRepostsGet: async (id: string, limit?: number, offset?: number, options: RawAxiosRequestConfig = {}): Promise => { + // verify required parameter 'id' is not null or undefined + assertParamExists('usersIdRepostsGet', 'id', id) + const localVarPath = `/users/{id}/reposts` + .replace(`{${"id"}}`, encodeURIComponent(String(id))); + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + if (offset !== undefined) { + localVarQueryParameter['offset'] = offset; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Full-text search on users (username, display_name). Paginated. Public. + * @summary Search users + * @param {string} [q] Full-text query + * @param {number} [page] Page + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSearchGet: async (q?: string, page?: number, limit?: number, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/users/search`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + if (q !== undefined) { + localVarQueryParameter['q'] = q; + } + + if (page !== undefined) { + localVarQueryParameter['page'] = page; + } + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + + return { + url: toPathString(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + * @summary Get follow suggestions + * @param {number} [limit] Max items (max 50) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSuggestionsGet: async (limit?: number, options: RawAxiosRequestConfig = {}): Promise => { + const localVarPath = `/users/suggestions`; + // use dummy base URL string because the URL constructor only accepts absolute URLs. + const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); + let baseOptions; + if (configuration) { + baseOptions = configuration.baseOptions; + } + + const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options}; + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + // authentication BearerAuth required + await setApiKeyToObject(localVarHeaderParameter, "Authorization", configuration) + + if (limit !== undefined) { + localVarQueryParameter['limit'] = limit; + } + + localVarHeaderParameter['Accept'] = 'application/json'; + + setSearchParams(localVarUrlObj, localVarQueryParameter); + let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; + localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; + return { url: toPathString(localVarUrlObj), options: localVarRequestOptions, @@ -5453,6 +9571,32 @@ export const UserApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['UserApi.usersGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Authenticated user unblocks target user (idempotent). + * @summary Unblock user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdBlockDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdBlockDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdBlockDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + * @summary Block user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdBlockPost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdBlockPost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdBlockPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get profile completion percentage and missing fields * @summary Get Profile Completion @@ -5479,6 +9623,32 @@ export const UserApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdDelete']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Authenticated user stops following target user (idempotent). + * @summary Unfollow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdFollowDelete(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdFollowDelete(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdFollowDelete']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + * @summary Follow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdFollowPost(id: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdFollowPost(id, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdFollowPost']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Get public profile information for a user * @summary Get Profile by ID @@ -5492,6 +9662,21 @@ export const UserApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdGet']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + * @summary List tracks liked by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdLikesGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdLikesGet(id, limit, offset, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdLikesGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, /** * Update user profile details * @summary Update Profile @@ -5506,6 +9691,49 @@ export const UserApiFp = function(configuration?: Configuration) { const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdPut']?.[localVarOperationServerIndex]?.url; return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); }, + /** + * Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + * @summary List tracks reposted by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersIdRepostsGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersIdRepostsGet(id, limit, offset, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersIdRepostsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Full-text search on users (username, display_name). Paginated. Public. + * @summary Search users + * @param {string} [q] Full-text query + * @param {number} [page] Page + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersSearchGet(q, page, limit, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersSearchGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, + /** + * Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + * @summary Get follow suggestions + * @param {number} [limit] Max items (max 50) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + async usersSuggestionsGet(limit?: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise> { + const localVarAxiosArgs = await localVarAxiosParamCreator.usersSuggestionsGet(limit, options); + const localVarOperationServerIndex = configuration?.serverIndex ?? 0; + const localVarOperationServerBasePath = operationServerMap['UserApi.usersSuggestionsGet']?.[localVarOperationServerIndex]?.url; + return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath); + }, } }; @@ -5542,6 +9770,26 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? usersGet(page?: number, limit?: number, role?: string, isActive?: boolean, isVerified?: boolean, search?: string, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.usersGet(page, limit, role, isActive, isVerified, search, sortBy, sortOrder, options).then((request) => request(axios, basePath)); }, + /** + * Authenticated user unblocks target user (idempotent). + * @summary Unblock user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdBlockDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + * @summary Block user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdBlockPost(id, options).then((request) => request(axios, basePath)); + }, /** * Get profile completion percentage and missing fields * @summary Get Profile Completion @@ -5562,6 +9810,26 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? usersIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.usersIdDelete(id, options).then((request) => request(axios, basePath)); }, + /** + * Authenticated user stops following target user (idempotent). + * @summary Unfollow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdFollowDelete(id, options).then((request) => request(axios, basePath)); + }, + /** + * Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + * @summary Follow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdFollowPost(id, options).then((request) => request(axios, basePath)); + }, /** * Get public profile information for a user * @summary Get Profile by ID @@ -5572,6 +9840,18 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? usersIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.usersIdGet(id, options).then((request) => request(axios, basePath)); }, + /** + * Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + * @summary List tracks liked by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdLikesGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdLikesGet(id, limit, offset, options).then((request) => request(axios, basePath)); + }, /** * Update user profile details * @summary Update Profile @@ -5583,6 +9863,40 @@ export const UserApiFactory = function (configuration?: Configuration, basePath? usersIdPut(id: string, profile: InternalHandlersUpdateProfileRequest, options?: RawAxiosRequestConfig): AxiosPromise { return localVarFp.usersIdPut(id, profile, options).then((request) => request(axios, basePath)); }, + /** + * Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + * @summary List tracks reposted by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdRepostsGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersIdRepostsGet(id, limit, offset, options).then((request) => request(axios, basePath)); + }, + /** + * Full-text search on users (username, display_name). Paginated. Public. + * @summary Search users + * @param {string} [q] Full-text query + * @param {number} [page] Page + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersSearchGet(q, page, limit, options).then((request) => request(axios, basePath)); + }, + /** + * Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + * @summary Get follow suggestions + * @param {number} [limit] Max items (max 50) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSuggestionsGet(limit?: number, options?: RawAxiosRequestConfig): AxiosPromise { + return localVarFp.usersSuggestionsGet(limit, options).then((request) => request(axios, basePath)); + }, }; }; @@ -5615,6 +9929,24 @@ export interface UserApiInterface { */ usersGet(page?: number, limit?: number, role?: string, isActive?: boolean, isVerified?: boolean, search?: string, sortBy?: string, sortOrder?: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Authenticated user unblocks target user (idempotent). + * @summary Unblock user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + * @summary Block user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdBlockPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get profile completion percentage and missing fields * @summary Get Profile Completion @@ -5633,6 +9965,24 @@ export interface UserApiInterface { */ usersIdDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Authenticated user stops following target user (idempotent). + * @summary Unfollow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowDelete(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + * @summary Follow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdFollowPost(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Get public profile information for a user * @summary Get Profile by ID @@ -5642,6 +9992,17 @@ export interface UserApiInterface { */ usersIdGet(id: string, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + * @summary List tracks liked by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdLikesGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise; + /** * Update user profile details * @summary Update Profile @@ -5652,6 +10013,37 @@ export interface UserApiInterface { */ usersIdPut(id: string, profile: InternalHandlersUpdateProfileRequest, options?: RawAxiosRequestConfig): AxiosPromise; + /** + * Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + * @summary List tracks reposted by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersIdRepostsGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Full-text search on users (username, display_name). Paginated. Public. + * @summary Search users + * @param {string} [q] Full-text query + * @param {number} [page] Page + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig): AxiosPromise; + + /** + * Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + * @summary Get follow suggestions + * @param {number} [limit] Max items (max 50) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + usersSuggestionsGet(limit?: number, options?: RawAxiosRequestConfig): AxiosPromise; + } /** @@ -5687,6 +10079,28 @@ export class UserApi extends BaseAPI implements UserApiInterface { return UserApiFp(this.configuration).usersGet(page, limit, role, isActive, isVerified, search, sortBy, sortOrder, options).then((request) => request(this.axios, this.basePath)); } + /** + * Authenticated user unblocks target user (idempotent). + * @summary Unblock user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdBlockDelete(id: string, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdBlockDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + * @summary Block user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdBlockPost(id: string, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdBlockPost(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Get profile completion percentage and missing fields * @summary Get Profile Completion @@ -5709,6 +10123,28 @@ export class UserApi extends BaseAPI implements UserApiInterface { return UserApiFp(this.configuration).usersIdDelete(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * Authenticated user stops following target user (idempotent). + * @summary Unfollow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdFollowDelete(id: string, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdFollowDelete(id, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + * @summary Follow user + * @param {string} id Target user UUID + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdFollowPost(id: string, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdFollowPost(id, options).then((request) => request(this.axios, this.basePath)); + } + /** * Get public profile information for a user * @summary Get Profile by ID @@ -5720,6 +10156,19 @@ export class UserApi extends BaseAPI implements UserApiInterface { return UserApiFp(this.configuration).usersIdGet(id, options).then((request) => request(this.axios, this.basePath)); } + /** + * Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + * @summary List tracks liked by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdLikesGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdLikesGet(id, limit, offset, options).then((request) => request(this.axios, this.basePath)); + } + /** * Update user profile details * @summary Update Profile @@ -5731,6 +10180,43 @@ export class UserApi extends BaseAPI implements UserApiInterface { public usersIdPut(id: string, profile: InternalHandlersUpdateProfileRequest, options?: RawAxiosRequestConfig) { return UserApiFp(this.configuration).usersIdPut(id, profile, options).then((request) => request(this.axios, this.basePath)); } + + /** + * Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + * @summary List tracks reposted by a user + * @param {string} id User UUID + * @param {number} [limit] Items per page (max 100) + * @param {number} [offset] Offset for pagination + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersIdRepostsGet(id: string, limit?: number, offset?: number, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersIdRepostsGet(id, limit, offset, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Full-text search on users (username, display_name). Paginated. Public. + * @summary Search users + * @param {string} [q] Full-text query + * @param {number} [page] Page + * @param {number} [limit] Items per page (max 100) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersSearchGet(q?: string, page?: number, limit?: number, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersSearchGet(q, page, limit, options).then((request) => request(this.axios, this.basePath)); + } + + /** + * Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + * @summary Get follow suggestions + * @param {number} [limit] Max items (max 50) + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + public usersSuggestionsGet(limit?: number, options?: RawAxiosRequestConfig) { + return UserApiFp(this.configuration).usersSuggestionsGet(limit, options).then((request) => request(this.axios, this.basePath)); + } } diff --git a/apps/web/src/types/generated/base.ts b/apps/web/src/types/generated/base.ts index 8aa0226be..07089f2c7 100644 --- a/apps/web/src/types/generated/base.ts +++ b/apps/web/src/types/generated/base.ts @@ -19,7 +19,7 @@ import type { Configuration } from './configuration'; import type { AxiosPromise, AxiosInstance, RawAxiosRequestConfig } from 'axios'; import globalAxios from 'axios'; -export const BASE_PATH = "http://localhost:8080/api/v1".replace(/\/+$/, ""); +export const BASE_PATH = "http://localhost:18080/api/v1".replace(/\/+$/, ""); export const COLLECTION_FORMATS = { csv: ",", diff --git a/apps/web/src/types/generated/docs/AuditApi.md b/apps/web/src/types/generated/docs/AuditApi.md index e2f3d4a6d..4b313ca69 100644 --- a/apps/web/src/types/generated/docs/AuditApi.md +++ b/apps/web/src/types/generated/docs/AuditApi.md @@ -1,6 +1,6 @@ # AuditApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/AuthApi.md b/apps/web/src/types/generated/docs/AuthApi.md index 4c6975e7b..2a03f00c6 100644 --- a/apps/web/src/types/generated/docs/AuthApi.md +++ b/apps/web/src/types/generated/docs/AuthApi.md @@ -1,6 +1,6 @@ # AuthApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/ChatApi.md b/apps/web/src/types/generated/docs/ChatApi.md index cf8201426..5fd6b7873 100644 --- a/apps/web/src/types/generated/docs/ChatApi.md +++ b/apps/web/src/types/generated/docs/ChatApi.md @@ -1,6 +1,6 @@ # ChatApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/CommentApi.md b/apps/web/src/types/generated/docs/CommentApi.md index 97f64d7b7..ce468b49a 100644 --- a/apps/web/src/types/generated/docs/CommentApi.md +++ b/apps/web/src/types/generated/docs/CommentApi.md @@ -1,6 +1,6 @@ # CommentApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/DashboardApi.md b/apps/web/src/types/generated/docs/DashboardApi.md index aefe38e43..ef60d06f9 100644 --- a/apps/web/src/types/generated/docs/DashboardApi.md +++ b/apps/web/src/types/generated/docs/DashboardApi.md @@ -1,6 +1,6 @@ # DashboardApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackBatchUpdateRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackBatchUpdateRequest.md new file mode 100644 index 000000000..ad8b2bef3 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalCoreTrackBatchUpdateRequest.md @@ -0,0 +1,22 @@ +# InternalCoreTrackBatchUpdateRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**track_ids** | **Array<string>** | | [default to undefined] +**updates** | **{ [key: string]: any; }** | | [default to undefined] + +## Example + +```typescript +import { InternalCoreTrackBatchUpdateRequest } from './api'; + +const instance: InternalCoreTrackBatchUpdateRequest = { + track_ids, + updates, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackCreateShareRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackCreateShareRequest.md new file mode 100644 index 000000000..9850661db --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalCoreTrackCreateShareRequest.md @@ -0,0 +1,22 @@ +# InternalCoreTrackCreateShareRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**expires_at** | **string** | | [optional] [default to undefined] +**permissions** | **string** | | [default to undefined] + +## Example + +```typescript +import { InternalCoreTrackCreateShareRequest } from './api'; + +const instance: InternalCoreTrackCreateShareRequest = { + expires_at, + permissions, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackRecordPlayRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackRecordPlayRequest.md new file mode 100644 index 000000000..e47eb86e4 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalCoreTrackRecordPlayRequest.md @@ -0,0 +1,20 @@ +# InternalCoreTrackRecordPlayRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**play_time** | **number** | | [optional] [default to undefined] + +## Example + +```typescript +import { InternalCoreTrackRecordPlayRequest } from './api'; + +const instance: InternalCoreTrackRecordPlayRequest = { + play_time, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackStreamCallbackRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackStreamCallbackRequest.md new file mode 100644 index 000000000..ac508513a --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalCoreTrackStreamCallbackRequest.md @@ -0,0 +1,24 @@ +# InternalCoreTrackStreamCallbackRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**error** | **string** | | [optional] [default to undefined] +**manifest_url** | **string** | | [optional] [default to undefined] +**status** | **string** | | [default to undefined] + +## Example + +```typescript +import { InternalCoreTrackStreamCallbackRequest } from './api'; + +const instance: InternalCoreTrackStreamCallbackRequest = { + error, + manifest_url, + status, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackUpdateLyricsRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackUpdateLyricsRequest.md new file mode 100644 index 000000000..5b809fcb4 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalCoreTrackUpdateLyricsRequest.md @@ -0,0 +1,20 @@ +# InternalCoreTrackUpdateLyricsRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**content** | **string** | | [optional] [default to undefined] + +## Example + +```typescript +import { InternalCoreTrackUpdateLyricsRequest } from './api'; + +const instance: InternalCoreTrackUpdateLyricsRequest = { + content, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalCoreTrackUpdateTrackRequest.md b/apps/web/src/types/generated/docs/InternalCoreTrackUpdateTrackRequest.md index aa7b477a9..6f227d719 100644 --- a/apps/web/src/types/generated/docs/InternalCoreTrackUpdateTrackRequest.md +++ b/apps/web/src/types/generated/docs/InternalCoreTrackUpdateTrackRequest.md @@ -7,8 +7,12 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **album** | **string** | | [optional] [default to undefined] **artist** | **string** | | [optional] [default to undefined] -**genre** | **string** | | [optional] [default to undefined] +**bpm** | **number** | | [optional] [default to undefined] +**genre** | **string** | legacy, single | [optional] [default to undefined] +**genres** | **Array<string>** | v0.10.1: max 3, taxonomy slugs | [optional] [default to undefined] **is_public** | **boolean** | | [optional] [default to undefined] +**musical_key** | **string** | | [optional] [default to undefined] +**tags** | **Array<string>** | v0.10.1: max 10, 30 chars each | [optional] [default to undefined] **title** | **string** | | [optional] [default to undefined] **year** | **number** | | [optional] [default to undefined] @@ -20,8 +24,12 @@ import { InternalCoreTrackUpdateTrackRequest } from './api'; const instance: InternalCoreTrackUpdateTrackRequest = { album, artist, + bpm, genre, + genres, is_public, + musical_key, + tags, title, year, }; diff --git a/apps/web/src/types/generated/docs/InternalHandlersAddCollaboratorRequest.md b/apps/web/src/types/generated/docs/InternalHandlersAddCollaboratorRequest.md new file mode 100644 index 000000000..36cf8c2b8 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalHandlersAddCollaboratorRequest.md @@ -0,0 +1,22 @@ +# InternalHandlersAddCollaboratorRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permission** | **string** | | [default to undefined] +**user_id** | **string** | | [default to undefined] + +## Example + +```typescript +import { InternalHandlersAddCollaboratorRequest } from './api'; + +const instance: InternalHandlersAddCollaboratorRequest = { + permission, + user_id, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalHandlersCreateCommentRequest.md b/apps/web/src/types/generated/docs/InternalHandlersCreateCommentRequest.md index 51894ce69..2279c20a8 100644 --- a/apps/web/src/types/generated/docs/InternalHandlersCreateCommentRequest.md +++ b/apps/web/src/types/generated/docs/InternalHandlersCreateCommentRequest.md @@ -6,7 +6,8 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **content** | **string** | | [default to undefined] -**parent_id** | **string** | Changed to *uuid.UUID | [optional] [default to undefined] +**parent_id** | **string** | | [optional] [default to undefined] +**timestamp** | **number** | Position in seconds (0 = top-level, no specific time) | [optional] [default to undefined] ## Example @@ -16,6 +17,7 @@ import { InternalHandlersCreateCommentRequest } from './api'; const instance: InternalHandlersCreateCommentRequest = { content, parent_id, + timestamp, }; ``` diff --git a/apps/web/src/types/generated/docs/InternalHandlersDeleteAccountRequest.md b/apps/web/src/types/generated/docs/InternalHandlersDeleteAccountRequest.md index c57cc9a3d..b73776364 100644 --- a/apps/web/src/types/generated/docs/InternalHandlersDeleteAccountRequest.md +++ b/apps/web/src/types/generated/docs/InternalHandlersDeleteAccountRequest.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **confirm_text** | **string** | | [default to undefined] +**keep_public_tracks** | **boolean** | If true, public tracks remain (attributed to deleted account) | [optional] [default to undefined] **password** | **string** | | [default to undefined] **reason** | **string** | | [optional] [default to undefined] @@ -16,6 +17,7 @@ import { InternalHandlersDeleteAccountRequest } from './api'; const instance: InternalHandlersDeleteAccountRequest = { confirm_text, + keep_public_tracks, password, reason, }; diff --git a/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequest.md b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequest.md new file mode 100644 index 000000000..bed4a82f5 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequest.md @@ -0,0 +1,22 @@ +# InternalHandlersImportPlaylistRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**playlist** | [**InternalHandlersImportPlaylistRequestPlaylist**](InternalHandlersImportPlaylistRequestPlaylist.md) | | [optional] [default to undefined] +**tracks** | [**Array<InternalHandlersImportPlaylistRequestTracksInner>**](InternalHandlersImportPlaylistRequestTracksInner.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { InternalHandlersImportPlaylistRequest } from './api'; + +const instance: InternalHandlersImportPlaylistRequest = { + playlist, + tracks, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestPlaylist.md b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestPlaylist.md new file mode 100644 index 000000000..c34b74e6d --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestPlaylist.md @@ -0,0 +1,24 @@ +# InternalHandlersImportPlaylistRequestPlaylist + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**description** | **string** | | [optional] [default to undefined] +**is_public** | **boolean** | | [optional] [default to undefined] +**title** | **string** | | [optional] [default to undefined] + +## Example + +```typescript +import { InternalHandlersImportPlaylistRequestPlaylist } from './api'; + +const instance: InternalHandlersImportPlaylistRequestPlaylist = { + description, + is_public, + title, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestTracksInner.md b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestTracksInner.md new file mode 100644 index 000000000..fec5381b7 --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalHandlersImportPlaylistRequestTracksInner.md @@ -0,0 +1,20 @@ +# InternalHandlersImportPlaylistRequestTracksInner + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **string** | | [optional] [default to undefined] + +## Example + +```typescript +import { InternalHandlersImportPlaylistRequestTracksInner } from './api'; + +const instance: InternalHandlersImportPlaylistRequestTracksInner = { + id, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/InternalHandlersUpdateCollaboratorPermissionRequest.md b/apps/web/src/types/generated/docs/InternalHandlersUpdateCollaboratorPermissionRequest.md new file mode 100644 index 000000000..272ee4bab --- /dev/null +++ b/apps/web/src/types/generated/docs/InternalHandlersUpdateCollaboratorPermissionRequest.md @@ -0,0 +1,20 @@ +# InternalHandlersUpdateCollaboratorPermissionRequest + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**permission** | **string** | | [default to undefined] + +## Example + +```typescript +import { InternalHandlersUpdateCollaboratorPermissionRequest } from './api'; + +const instance: InternalHandlersUpdateCollaboratorPermissionRequest = { + permission, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/LoggingApi.md b/apps/web/src/types/generated/docs/LoggingApi.md index 055359d05..6807b4638 100644 --- a/apps/web/src/types/generated/docs/LoggingApi.md +++ b/apps/web/src/types/generated/docs/LoggingApi.md @@ -1,6 +1,6 @@ # LoggingApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/MarketplaceApi.md b/apps/web/src/types/generated/docs/MarketplaceApi.md index 14ac0a48d..7eab58dee 100644 --- a/apps/web/src/types/generated/docs/MarketplaceApi.md +++ b/apps/web/src/types/generated/docs/MarketplaceApi.md @@ -1,6 +1,6 @@ # MarketplaceApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/PlaylistApi.md b/apps/web/src/types/generated/docs/PlaylistApi.md index 248a491f3..598066f63 100644 --- a/apps/web/src/types/generated/docs/PlaylistApi.md +++ b/apps/web/src/types/generated/docs/PlaylistApi.md @@ -1,17 +1,75 @@ # PlaylistApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| +|[**playlistsFavorisGet**](#playlistsfavorisget) | **GET** /playlists/favoris | Get Favoris playlist| |[**playlistsGet**](#playlistsget) | **GET** /playlists | Get Playlists| +|[**playlistsIdAnalyticsGet**](#playlistsidanalyticsget) | **GET** /playlists/{id}/analytics | Get playlist statistics| +|[**playlistsIdCollaboratorsGet**](#playlistsidcollaboratorsget) | **GET** /playlists/{id}/collaborators | List playlist collaborators| +|[**playlistsIdCollaboratorsPost**](#playlistsidcollaboratorspost) | **POST** /playlists/{id}/collaborators | Add playlist collaborator| +|[**playlistsIdCollaboratorsUserIdDelete**](#playlistsidcollaboratorsuseriddelete) | **DELETE** /playlists/{id}/collaborators/{userId} | Remove playlist collaborator| +|[**playlistsIdCollaboratorsUserIdPut**](#playlistsidcollaboratorsuseridput) | **PUT** /playlists/{id}/collaborators/{userId} | Update collaborator permission| |[**playlistsIdDelete**](#playlistsiddelete) | **DELETE** /playlists/{id} | Delete Playlist| +|[**playlistsIdDuplicatePost**](#playlistsidduplicatepost) | **POST** /playlists/{id}/duplicate | Duplicate playlist| |[**playlistsIdGet**](#playlistsidget) | **GET** /playlists/{id} | Get Playlist by ID| |[**playlistsIdPut**](#playlistsidput) | **PUT** /playlists/{id} | Update Playlist| +|[**playlistsIdSharePost**](#playlistsidsharepost) | **POST** /playlists/{id}/share | Create playlist share link| |[**playlistsIdTracksPost**](#playlistsidtrackspost) | **POST** /playlists/{id}/tracks | Add Track to Playlist| |[**playlistsIdTracksReorderPut**](#playlistsidtracksreorderput) | **PUT** /playlists/{id}/tracks/reorder | Reorder Tracks| |[**playlistsIdTracksTrackIdDelete**](#playlistsidtrackstrackiddelete) | **DELETE** /playlists/{id}/tracks/{trackId} | Remove Track from Playlist| +|[**playlistsImportPost**](#playlistsimportpost) | **POST** /playlists/import | Import playlist| |[**playlistsPost**](#playlistspost) | **POST** /playlists | Create Playlist| +|[**playlistsRecommendationsGet**](#playlistsrecommendationsget) | **GET** /playlists/recommendations | Get playlist recommendations| +|[**playlistsSearchGet**](#playlistssearchget) | **GET** /playlists/search | Search playlists| +|[**playlistsSharedTokenGet**](#playlistssharedtokenget) | **GET** /playlists/shared/{token} | Get playlist by share token| + +# **playlistsFavorisGet** +> PlaylistsPost201Response playlistsFavorisGet() + +Returns the authenticated user\'s \"Favoris\" playlist. Auto-created on first call. Used by the like-as-save pattern. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +const { status, data } = await apiInstance.playlistsFavorisGet(); +``` + +### Parameters +This endpoint does not have any parameters. + + +### Return type + +**PlaylistsPost201Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **playlistsGet** > PlaylistsGet200Response playlistsGet() @@ -71,6 +129,299 @@ const { status, data } = await apiInstance.playlistsGet( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **playlistsIdAnalyticsGet** +> AuditStatsGet200Response playlistsIdAnalyticsGet() + +Returns aggregated stats for a playlist (plays, follows, tracks count, etc.). Visible to the owner, collaborators and admins. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) + +const { status, data } = await apiInstance.playlistsIdAnalyticsGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Playlist UUID | defaults to undefined| + + +### Return type + +**AuditStatsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**403** | Forbidden | - | +|**404** | Playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsIdCollaboratorsGet** +> PlaylistsIdCollaboratorsGet200Response playlistsIdCollaboratorsGet() + +Returns the collaborators of a playlist with their permission level. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) + +const { status, data } = await apiInstance.playlistsIdCollaboratorsGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Playlist UUID | defaults to undefined| + + +### Return type + +**PlaylistsIdCollaboratorsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**404** | Playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsIdCollaboratorsPost** +> PlaylistsIdCollaboratorsPost200Response playlistsIdCollaboratorsPost(request) + +Invite a user as collaborator. Only the owner (or admin) can add. + +### Example + +```typescript +import { + PlaylistApi, + Configuration, + InternalHandlersAddCollaboratorRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) +let request: InternalHandlersAddCollaboratorRequest; //Collaborator + permission + +const { status, data } = await apiInstance.playlistsIdCollaboratorsPost( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalHandlersAddCollaboratorRequest**| Collaborator + permission | | +| **id** | [**string**] | Playlist UUID | defaults to undefined| + + +### Return type + +**PlaylistsIdCollaboratorsPost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsIdCollaboratorsUserIdDelete** +> Auth2faDisablePost200Response playlistsIdCollaboratorsUserIdDelete() + +Revoke a collaborator\'s access. Only the owner (or admin) can remove. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) +let userId: string; //Collaborator user UUID (default to undefined) + +const { status, data } = await apiInstance.playlistsIdCollaboratorsUserIdDelete( + id, + userId +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Playlist UUID | defaults to undefined| +| **userId** | [**string**] | Collaborator user UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Playlist or collaborator not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsIdCollaboratorsUserIdPut** +> PlaylistsIdCollaboratorsPost200Response playlistsIdCollaboratorsUserIdPut(request) + +Change a collaborator\'s permission level (read / write / admin). Only the owner can update. + +### Example + +```typescript +import { + PlaylistApi, + Configuration, + InternalHandlersUpdateCollaboratorPermissionRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) +let userId: string; //Collaborator user UUID (default to undefined) +let request: InternalHandlersUpdateCollaboratorPermissionRequest; //New permission + +const { status, data } = await apiInstance.playlistsIdCollaboratorsUserIdPut( + id, + userId, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalHandlersUpdateCollaboratorPermissionRequest**| New permission | | +| **id** | [**string**] | Playlist UUID | defaults to undefined| +| **userId** | [**string**] | Collaborator user UUID | defaults to undefined| + + +### Return type + +**PlaylistsIdCollaboratorsPost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Playlist or collaborator not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **playlistsIdDelete** > Auth2faDisablePost200Response playlistsIdDelete() @@ -125,6 +476,62 @@ const { status, data } = await apiInstance.playlistsIdDelete( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **playlistsIdDuplicatePost** +> PlaylistsPost201Response playlistsIdDuplicatePost() + +Copy a playlist\'s track list into a new playlist owned by the authenticated user. Cover/description copied; original unchanged. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Source playlist UUID (default to undefined) + +const { status, data } = await apiInstance.playlistsIdDuplicatePost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Source playlist UUID | defaults to undefined| + + +### Return type + +**PlaylistsPost201Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**201** | Created | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**403** | Source not visible | - | +|**404** | Source playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **playlistsIdGet** > PlaylistsPost201Response playlistsIdGet() @@ -237,6 +644,62 @@ const { status, data } = await apiInstance.playlistsIdPut( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **playlistsIdSharePost** +> PlaylistsIdSharePost200Response playlistsIdSharePost() + +Generate a tokenised link to share a playlist (read-only). Only owner / admin can issue. No body required. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let id: string; //Playlist UUID (default to undefined) + +const { status, data } = await apiInstance.playlistsIdSharePost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Playlist UUID | defaults to undefined| + + +### Return type + +**PlaylistsIdSharePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **playlistsIdTracksPost** > Auth2faDisablePost200Response playlistsIdTracksPost(trackId) @@ -405,6 +868,61 @@ const { status, data } = await apiInstance.playlistsIdTracksTrackIdDelete( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **playlistsImportPost** +> PlaylistsPost201Response playlistsImportPost(request) + +Create a playlist from a JSON payload (title, description, is_public, ordered track IDs). Useful for bulk seed / migration. + +### Example + +```typescript +import { + PlaylistApi, + Configuration, + InternalHandlersImportPlaylistRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let request: InternalHandlersImportPlaylistRequest; //Playlist + tracks + +const { status, data } = await apiInstance.playlistsImportPost( + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalHandlersImportPlaylistRequest**| Playlist + tracks | | + + +### Return type + +**PlaylistsPost201Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**201** | Created | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **playlistsPost** > PlaylistsPost201Response playlistsPost(request) @@ -460,3 +978,170 @@ const { status, data } = await apiInstance.playlistsPost( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **playlistsRecommendationsGet** +> PlaylistsRecommendationsGet200Response playlistsRecommendationsGet() + +Suggested playlists for the authenticated user. Chronological / declarative discovery — no behavioural ranking (CLAUDE.md rule 7). + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let limit: number; //Max items (max 100) (optional) (default to 20) + +const { status, data } = await apiInstance.playlistsRecommendationsGet( + limit +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **limit** | [**number**] | Max items (max 100) | (optional) defaults to 20| + + +### Return type + +**PlaylistsRecommendationsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsSearchGet** +> PlaylistsGet200Response playlistsSearchGet() + +Full-text search on public playlists (title + description). Paginated. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let q: string; //Full-text query (optional) (default to undefined) +let page: number; //Page number (optional) (default to 1) +let limit: number; //Items per page (max 100) (optional) (default to 20) + +const { status, data } = await apiInstance.playlistsSearchGet( + q, + page, + limit +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **q** | [**string**] | Full-text query | (optional) defaults to undefined| +| **page** | [**number**] | Page number | (optional) defaults to 1| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| + + +### Return type + +**PlaylistsGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **playlistsSharedTokenGet** +> PlaylistsPost201Response playlistsSharedTokenGet() + +Public endpoint resolving a share token. Allows unauthenticated access to the playlist snapshot + tracks. + +### Example + +```typescript +import { + PlaylistApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new PlaylistApi(configuration); + +let token: string; //Share token (default to undefined) + +const { status, data } = await apiInstance.playlistsSharedTokenGet( + token +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **token** | [**string**] | Share token | defaults to undefined| + + +### Return type + +**PlaylistsPost201Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Missing token | - | +|**403** | Share expired | - | +|**404** | Share or playlist not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200Response.md b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200Response.md new file mode 100644 index 000000000..6acc5bcc5 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200Response.md @@ -0,0 +1,24 @@ +# PlaylistsIdCollaboratorsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**PlaylistsIdCollaboratorsGet200ResponseAllOfData**](PlaylistsIdCollaboratorsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdCollaboratorsGet200Response } from './api'; + +const instance: PlaylistsIdCollaboratorsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200ResponseAllOfData.md new file mode 100644 index 000000000..ed1351674 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# PlaylistsIdCollaboratorsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**collaborators** | **Array<object>** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdCollaboratorsGet200ResponseAllOfData } from './api'; + +const instance: PlaylistsIdCollaboratorsGet200ResponseAllOfData = { + collaborators, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200Response.md b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200Response.md new file mode 100644 index 000000000..92f11e43d --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200Response.md @@ -0,0 +1,24 @@ +# PlaylistsIdCollaboratorsPost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**PlaylistsIdCollaboratorsPost200ResponseAllOfData**](PlaylistsIdCollaboratorsPost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdCollaboratorsPost200Response } from './api'; + +const instance: PlaylistsIdCollaboratorsPost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200ResponseAllOfData.md b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200ResponseAllOfData.md new file mode 100644 index 000000000..e7eaaa7ba --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdCollaboratorsPost200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# PlaylistsIdCollaboratorsPost200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**collaborator** | **object** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdCollaboratorsPost200ResponseAllOfData } from './api'; + +const instance: PlaylistsIdCollaboratorsPost200ResponseAllOfData = { + collaborator, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsIdSharePost200Response.md b/apps/web/src/types/generated/docs/PlaylistsIdSharePost200Response.md new file mode 100644 index 000000000..11bf25066 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdSharePost200Response.md @@ -0,0 +1,24 @@ +# PlaylistsIdSharePost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**PlaylistsIdSharePost200ResponseAllOfData**](PlaylistsIdSharePost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdSharePost200Response } from './api'; + +const instance: PlaylistsIdSharePost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsIdSharePost200ResponseAllOfData.md b/apps/web/src/types/generated/docs/PlaylistsIdSharePost200ResponseAllOfData.md new file mode 100644 index 000000000..7f6d5a858 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsIdSharePost200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# PlaylistsIdSharePost200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**share** | **object** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsIdSharePost200ResponseAllOfData } from './api'; + +const instance: PlaylistsIdSharePost200ResponseAllOfData = { + share, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200Response.md b/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200Response.md new file mode 100644 index 000000000..46a72ce78 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200Response.md @@ -0,0 +1,24 @@ +# PlaylistsRecommendationsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**PlaylistsRecommendationsGet200ResponseAllOfData**](PlaylistsRecommendationsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsRecommendationsGet200Response } from './api'; + +const instance: PlaylistsRecommendationsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200ResponseAllOfData.md new file mode 100644 index 000000000..2ce61cfb8 --- /dev/null +++ b/apps/web/src/types/generated/docs/PlaylistsRecommendationsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# PlaylistsRecommendationsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**playlists** | [**Array<VezaBackendApiInternalModelsPlaylist>**](VezaBackendApiInternalModelsPlaylist.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { PlaylistsRecommendationsGet200ResponseAllOfData } from './api'; + +const instance: PlaylistsRecommendationsGet200ResponseAllOfData = { + playlists, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TrackApi.md b/apps/web/src/types/generated/docs/TrackApi.md index 8a6613f83..d8349e1f5 100644 --- a/apps/web/src/types/generated/docs/TrackApi.md +++ b/apps/web/src/types/generated/docs/TrackApi.md @@ -1,16 +1,211 @@ # TrackApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| +|[**internalTracksIdStreamReadyPost**](#internaltracksidstreamreadypost) | **POST** /internal/tracks/{id}/stream-ready | Stream server callback| +|[**tracksBatchDeletePost**](#tracksbatchdeletepost) | **POST** /tracks/batch/delete | Batch delete tracks| +|[**tracksBatchUpdatePost**](#tracksbatchupdatepost) | **POST** /tracks/batch/update | Batch update tracks| |[**tracksChunkPost**](#trackschunkpost) | **POST** /tracks/chunk | Upload Chunk| |[**tracksCompletePost**](#trackscompletepost) | **POST** /tracks/complete | Complete Chunked Upload| +|[**tracksGet**](#tracksget) | **GET** /tracks | List tracks| +|[**tracksIdDelete**](#tracksiddelete) | **DELETE** /tracks/{id} | Delete track| +|[**tracksIdDownloadGet**](#tracksiddownloadget) | **GET** /tracks/{id}/download | Download a track| +|[**tracksIdGet**](#tracksidget) | **GET** /tracks/{id} | Get track by ID| +|[**tracksIdHistoryGet**](#tracksidhistoryget) | **GET** /tracks/{id}/history | Get track history| +|[**tracksIdLikeDelete**](#tracksidlikedelete) | **DELETE** /tracks/{id}/like | Unlike a track| +|[**tracksIdLikePost**](#tracksidlikepost) | **POST** /tracks/{id}/like | Like a track| +|[**tracksIdLikesGet**](#tracksidlikesget) | **GET** /tracks/{id}/likes | Get track like status| +|[**tracksIdLyricsGet**](#tracksidlyricsget) | **GET** /tracks/{id}/lyrics | Get track lyrics| +|[**tracksIdLyricsPut**](#tracksidlyricsput) | **PUT** /tracks/{id}/lyrics | Create or update track lyrics| +|[**tracksIdPlayPost**](#tracksidplaypost) | **POST** /tracks/{id}/play | Record play event| +|[**tracksIdPut**](#tracksidput) | **PUT** /tracks/{id} | Update track metadata| +|[**tracksIdRepostDelete**](#tracksidrepostdelete) | **DELETE** /tracks/{id}/repost | Remove track repost| +|[**tracksIdRepostGet**](#tracksidrepostget) | **GET** /tracks/{id}/repost | Get repost status| +|[**tracksIdRepostPost**](#tracksidrepostpost) | **POST** /tracks/{id}/repost | Repost a track| +|[**tracksIdSharePost**](#tracksidsharepost) | **POST** /tracks/{id}/share | Create share link| +|[**tracksIdStatsGet**](#tracksidstatsget) | **GET** /tracks/{id}/stats | Get track statistics| |[**tracksIdStatusGet**](#tracksidstatusget) | **GET** /tracks/{id}/status | Get Upload Status| +|[**tracksIdStreamGet**](#tracksidstreamget) | **GET** /tracks/{id}/stream | Stream a track (raw audio + Range)| +|[**tracksIdVersionsVersionIdRestorePost**](#tracksidversionsversionidrestorepost) | **POST** /tracks/{id}/versions/{versionId}/restore | Restore track version| +|[**tracksIdWaveformGet**](#tracksidwaveformget) | **GET** /tracks/{id}/waveform | Get track waveform| |[**tracksInitiatePost**](#tracksinitiatepost) | **POST** /tracks/initiate | Initiate Chunked Upload| |[**tracksPost**](#trackspost) | **POST** /tracks | Upload Track| |[**tracksQuotaIdGet**](#tracksquotaidget) | **GET** /tracks/quota/{id} | Get Upload Quota| +|[**tracksRecommendationsGet**](#tracksrecommendationsget) | **GET** /tracks/recommendations | Get track recommendations| |[**tracksResumeUploadIdGet**](#tracksresumeuploadidget) | **GET** /tracks/resume/{uploadId} | Resume Upload| +|[**tracksSearchGet**](#trackssearchget) | **GET** /tracks/search | Advanced track search| +|[**tracksShareIdDelete**](#tracksshareiddelete) | **DELETE** /tracks/share/{id} | Revoke share link| +|[**tracksSharedTokenGet**](#trackssharedtokenget) | **GET** /tracks/shared/{token} | Get track by share token| +|[**tracksSuggestedTagsGet**](#trackssuggestedtagsget) | **GET** /tracks/suggested-tags | Get suggested tags| + +# **internalTracksIdStreamReadyPost** +> Auth2faDisablePost200ResponseAllOfData internalTracksIdStreamReadyPost(request) + +Internal endpoint called by the Rust stream server when HLS transcoding completes or fails. Updates the track\'s stream_status and stream_manifest_url. Requires internal API key (not user-facing). + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackStreamCallbackRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let request: InternalCoreTrackStreamCallbackRequest; //Callback payload + +const { status, data } = await apiInstance.internalTracksIdStreamReadyPost( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackStreamCallbackRequest**| Callback payload | | +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200ResponseAllOfData** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / invalid id | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksBatchDeletePost** +> TracksBatchDeletePost200Response tracksBatchDeletePost(request) + +Soft-delete up to N tracks in one request. Per-track ownership checked (admin can delete others). + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackBatchDeleteRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let request: InternalCoreTrackBatchDeleteRequest; //List of track UUIDs + +const { status, data } = await apiInstance.tracksBatchDeletePost( + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackBatchDeleteRequest**| List of track UUIDs | | + + +### Return type + +**TracksBatchDeletePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / batch size exceeded | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksBatchUpdatePost** +> TracksBatchUpdatePost200Response tracksBatchUpdatePost(request) + +Apply a partial metadata update to up to N tracks in one request. Per-track ownership checked. + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackBatchUpdateRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let request: InternalCoreTrackBatchUpdateRequest; //Track UUIDs + shared updates map + +const { status, data } = await apiInstance.tracksBatchUpdatePost( + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackBatchUpdateRequest**| Track UUIDs + shared updates map | | + + +### Return type + +**TracksBatchUpdatePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / batch size exceeded | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **tracksChunkPost** > TracksChunkPost200Response tracksChunkPost() @@ -134,6 +329,978 @@ const { status, data } = await apiInstance.tracksCompletePost( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **tracksGet** +> TracksGet200Response tracksGet() + +List tracks with pagination, filters, sort. Cursor-based when ?cursor provided, otherwise page/limit offset. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let cursor: string; //Opaque pagination cursor (overrides page) (optional) (default to undefined) +let page: number; //Page number, 1-based (ignored if cursor set) (optional) (default to 1) +let limit: number; //Items per page (max 100) (optional) (default to 20) +let userId: string; //Filter by creator UUID (optional) (default to undefined) +let genre: string; //Filter by genre (optional) (default to undefined) +let format: string; //Filter by audio format (mp3, flac, wav, ogg, m4a, aac) (optional) (default to undefined) +let sortBy: string; //Sort column (created_at, play_count, title) (optional) (default to 'created_at') + +const { status, data } = await apiInstance.tracksGet( + cursor, + page, + limit, + userId, + genre, + format, + sortBy +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **cursor** | [**string**] | Opaque pagination cursor (overrides page) | (optional) defaults to undefined| +| **page** | [**number**] | Page number, 1-based (ignored if cursor set) | (optional) defaults to 1| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| +| **userId** | [**string**] | Filter by creator UUID | (optional) defaults to undefined| +| **genre** | [**string**] | Filter by genre | (optional) defaults to undefined| +| **format** | [**string**] | Filter by audio format (mp3, flac, wav, ogg, m4a, aac) | (optional) defaults to undefined| +| **sortBy** | [**string**] | Sort column (created_at, play_count, title) | (optional) defaults to 'created_at'| + + +### Return type + +**TracksGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid query params | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdDelete** +> TracksIdDelete200Response tracksIdDelete() + +Soft-delete a track (sets deleted_at). Caller must own the track or be admin. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdDelete200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**403** | Not owner / no admin | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdDownloadGet** +> File tracksIdDownloadGet() + +Serve the original audio file. For S3-backed tracks returns a 302 redirect to a signed URL (TTL 30min). For local-backed tracks streams the file with Range support. Public tracks or share_token access; paid tracks require a license. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let shareToken: string; //Grants access without authentication for a limited time (optional) (default to undefined) + +const { status, data } = await apiInstance.tracksIdDownloadGet( + id, + shareToken +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| +| **shareToken** | [**string**] | Grants access without authentication for a limited time | (optional) defaults to undefined| + + +### Return type + +**File** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/octet-stream + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**302** | Location header points to signed S3 URL (s3-backed tracks) | - | +|**400** | Invalid track id | - | +|**403** | No permission / license required | - | +|**404** | Track or file not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdGet** +> TracksPost201Response tracksIdGet() + +Retrieve a single track. Private play_count / like_count are omitted for non-owners (v0.10.3 F202). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksPost201Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdHistoryGet** +> TracksIdHistoryGet200Response tracksIdHistoryGet() + +Paginated audit log of modifications (metadata updates, version changes) for a track. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let limit: number; //Items per page (optional) (default to 50) +let offset: number; //Offset (optional) (default to 0) + +const { status, data } = await apiInstance.tracksIdHistoryGet( + id, + limit, + offset +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| +| **limit** | [**number**] | Items per page | (optional) defaults to 50| +| **offset** | [**number**] | Offset | (optional) defaults to 0| + + +### Return type + +**TracksIdHistoryGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdLikeDelete** +> TracksIdLikePost200Response tracksIdLikeDelete() + +Remove the authenticated user\'s like on the track (idempotent). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdLikeDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdLikePost** +> TracksIdLikePost200Response tracksIdLikePost() + +Record a like from the authenticated user. Creates a grouped notification for the creator (F554). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdLikePost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdLikesGet** +> TracksIdLikesGet200Response tracksIdLikesGet() + +Returns whether the current user has liked the track. The total like count is returned ONLY to the creator or an admin (privacy per ORIGIN_UI_UX_SYSTEM §13). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdLikesGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLikesGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | count is omitted for non-owners | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdLyricsGet** +> TracksIdLyricsGet200Response tracksIdLyricsGet() + +Returns the current lyrics for a track, or null if no lyrics exist. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdLyricsGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLyricsGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | lyrics may be null | - | +|**400** | Invalid track id | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdLyricsPut** +> TracksIdLyricsGet200Response tracksIdLyricsPut(request) + +Replace the lyrics of a track. Caller must own the track or be admin. + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackUpdateLyricsRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let request: InternalCoreTrackUpdateLyricsRequest; //Lyrics payload + +const { status, data } = await apiInstance.tracksIdLyricsPut( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackUpdateLyricsRequest**| Lyrics payload | | +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLyricsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / invalid id | - | +|**401** | Unauthorized | - | +|**403** | Not owner / no admin | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdPlayPost** +> TracksIdPlayPost200Response tracksIdPlayPost() + +Persist a playback event with optional play_time so the creator\'s analytics dashboard tracks listening behaviour. + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackRecordPlayRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let request: InternalCoreTrackRecordPlayRequest; //Playback metadata (optional) (optional) + +const { status, data } = await apiInstance.tracksIdPlayPost( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackRecordPlayRequest**| Playback metadata (optional) | | +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdPlayPost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id / body | - | +|**401** | Unauthorized | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdPut** +> TracksPost201Response tracksIdPut(request) + +Update the metadata of an existing track. Caller must own the track or be admin. + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackUpdateTrackRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let request: InternalCoreTrackUpdateTrackRequest; //Updated metadata + +const { status, data } = await apiInstance.tracksIdPut( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackUpdateTrackRequest**| Updated metadata | | +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksPost201Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / invalid id | - | +|**401** | Unauthorized | - | +|**403** | Not owner / no admin | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdRepostDelete** +> TracksIdLikePost200Response tracksIdRepostDelete() + +Remove the authenticated user\'s repost of the track (idempotent). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdRepostDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdRepostGet** +> TracksIdRepostGet200Response tracksIdRepostGet() + +Returns whether the current user has reposted the track. Public (optional auth); unauthenticated callers get is_reposted=false. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdRepostGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdRepostGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdRepostPost** +> TracksIdLikePost200Response tracksIdRepostPost() + +Add a track to the authenticated user\'s profile as a repost. Notifies the creator (F204) unless self-repost. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdRepostPost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**401** | Unauthorized | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdSharePost** +> TracksIdSharePost200Response tracksIdSharePost(request) + +Generate a tokenized share link for a track with given permission level and optional expiry. + +### Example + +```typescript +import { + TrackApi, + Configuration, + InternalCoreTrackCreateShareRequest +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let request: InternalCoreTrackCreateShareRequest; //Share parameters + +const { status, data } = await apiInstance.tracksIdSharePost( + id, + request +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **request** | **InternalCoreTrackCreateShareRequest**| Share parameters | | +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdSharePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdStatsGet** +> TracksIdStatsGet200Response tracksIdStatsGet() + +Aggregated track stats: views, likes, comments, play time, downloads, average duration. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdStatsGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**TracksIdStatsGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid track id | - | +|**404** | Track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **tracksIdStatusGet** > TracksIdStatusGet200Response tracksIdStatusGet() @@ -188,6 +1355,178 @@ const { status, data } = await apiInstance.tracksIdStatusGet( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **tracksIdStreamGet** +> File tracksIdStreamGet() + +Default playback path. S3-backed tracks return a 302 redirect to a signed URL (TTL 15min). Local-backed tracks are streamed via http.ServeContent with Range support. Always available, unlike /hls/_* which is gated by HLSEnabled. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let shareToken: string; //Grants access without authentication (optional) (default to undefined) + +const { status, data } = await apiInstance.tracksIdStreamGet( + id, + shareToken +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| +| **shareToken** | [**string**] | Grants access without authentication | (optional) defaults to undefined| + + +### Return type + +**File** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: audio/* + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**302** | Location header points to signed S3 URL (s3-backed tracks) | - | +|**400** | Invalid track id | - | +|**403** | No permission | - | +|**404** | Track or file not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdVersionsVersionIdRestorePost** +> TracksIdLikePost200Response tracksIdVersionsVersionIdRestorePost() + +Rollback a track to a previous version. Only the track owner can restore. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) +let versionId: string; //Version UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdVersionsVersionIdRestorePost( + id, + versionId +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| +| **versionId** | [**string**] | Version UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**403** | Not owner | - | +|**404** | Track or version not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksIdWaveformGet** +> object tracksIdWaveformGet() + +Returns a JSON peaks array used by the client to draw the audio waveform preview. 404 if waveform extraction is not complete yet. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Track UUID (default to undefined) + +const { status, data } = await apiInstance.tracksIdWaveformGet( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Track UUID | defaults to undefined| + + +### Return type + +**object** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | Waveform peaks JSON (tool-specific shape) | - | +|**400** | Invalid track id | - | +|**404** | Waveform not generated / track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **tracksInitiatePost** > TracksInitiatePost200Response tracksInitiatePost(request) @@ -350,6 +1689,61 @@ const { status, data } = await apiInstance.tracksQuotaIdGet( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **tracksRecommendationsGet** +> TracksRecommendationsGet200Response tracksRecommendationsGet() + +Personalized tracks for D2 autoplay. If seed_track_id is given, returns tracks similar to that seed. Otherwise, uses the caller\'s history (chronological, no behavioural ranking — CLAUDE.md rule 7). + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let limit: number; //Max items (max 100) (optional) (default to 20) +let seedTrackId: string; //Start from this track\'s similarity neighbours (optional) (default to undefined) + +const { status, data } = await apiInstance.tracksRecommendationsGet( + limit, + seedTrackId +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **limit** | [**number**] | Max items (max 100) | (optional) defaults to 20| +| **seedTrackId** | [**string**] | Start from this track\'s similarity neighbours | (optional) defaults to undefined| + + +### Return type + +**TracksRecommendationsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **tracksResumeUploadIdGet** > TracksResumeUploadIdGet200Response tracksResumeUploadIdGet() @@ -402,3 +1796,262 @@ const { status, data } = await apiInstance.tracksResumeUploadIdGet( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **tracksSearchGet** +> TracksGet200Response tracksSearchGet() + +Full-text + faceted search on tracks (genre, BPM, duration, tags, musical key, dates). Sort-by and order configurable. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let q: string; //Full-text query (title/artist/album) (optional) (default to undefined) +let tags: string; //Comma-separated tag list (optional) (default to undefined) +let tagMode: string; //Tag combinator (OR / AND) (optional) (default to 'OR') +let minDuration: number; //Minimum duration (seconds) (optional) (default to undefined) +let maxDuration: number; //Maximum duration (seconds) (optional) (default to undefined) +let minBpm: number; //Minimum BPM (optional) (default to undefined) +let maxBpm: number; //Maximum BPM (optional) (default to undefined) +let genre: string; //Genre filter (optional) (default to undefined) +let format: string; //Audio format filter (optional) (default to undefined) +let musicalKey: string; //Musical key filter (optional) (default to undefined) +let minDate: string; //Created-after (RFC3339) (optional) (default to undefined) +let maxDate: string; //Created-before (RFC3339) (optional) (default to undefined) +let page: number; //Page (1-based) (optional) (default to 1) +let limit: number; //Items per page (max 100) (optional) (default to 20) +let sortBy: string; //Sort column (optional) (default to 'created_at') +let sortOrder: string; //asc / desc (optional) (default to 'desc') + +const { status, data } = await apiInstance.tracksSearchGet( + q, + tags, + tagMode, + minDuration, + maxDuration, + minBpm, + maxBpm, + genre, + format, + musicalKey, + minDate, + maxDate, + page, + limit, + sortBy, + sortOrder +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **q** | [**string**] | Full-text query (title/artist/album) | (optional) defaults to undefined| +| **tags** | [**string**] | Comma-separated tag list | (optional) defaults to undefined| +| **tagMode** | [**string**] | Tag combinator (OR / AND) | (optional) defaults to 'OR'| +| **minDuration** | [**number**] | Minimum duration (seconds) | (optional) defaults to undefined| +| **maxDuration** | [**number**] | Maximum duration (seconds) | (optional) defaults to undefined| +| **minBpm** | [**number**] | Minimum BPM | (optional) defaults to undefined| +| **maxBpm** | [**number**] | Maximum BPM | (optional) defaults to undefined| +| **genre** | [**string**] | Genre filter | (optional) defaults to undefined| +| **format** | [**string**] | Audio format filter | (optional) defaults to undefined| +| **musicalKey** | [**string**] | Musical key filter | (optional) defaults to undefined| +| **minDate** | [**string**] | Created-after (RFC3339) | (optional) defaults to undefined| +| **maxDate** | [**string**] | Created-before (RFC3339) | (optional) defaults to undefined| +| **page** | [**number**] | Page (1-based) | (optional) defaults to 1| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| +| **sortBy** | [**string**] | Sort column | (optional) defaults to 'created_at'| +| **sortOrder** | [**string**] | asc / desc | (optional) defaults to 'desc'| + + +### Return type + +**TracksGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksShareIdDelete** +> TracksIdLikePost200Response tracksShareIdDelete() + +Permanently disable a share token. Only the share issuer (or admin) can revoke. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let id: string; //Share UUID (default to undefined) + +const { status, data } = await apiInstance.tracksShareIdDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Share UUID | defaults to undefined| + + +### Return type + +**TracksIdLikePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**403** | Not issuer | - | +|**404** | Share not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksSharedTokenGet** +> TracksSharedTokenGet200Response tracksSharedTokenGet() + +Public endpoint that resolves a share token and returns the track + share metadata. No auth required; the token IS the auth. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let token: string; //Opaque share token issued by CreateShare (default to undefined) + +const { status, data } = await apiInstance.tracksSharedTokenGet( + token +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **token** | [**string**] | Opaque share token issued by CreateShare | defaults to undefined| + + +### Return type + +**TracksSharedTokenGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Missing token | - | +|**403** | Share link expired | - | +|**404** | Share or track not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **tracksSuggestedTagsGet** +> TracksSuggestedTagsGet200Response tracksSuggestedTagsGet() + +Returns a static tag suggestion list for a genre — useful for upload autocomplete and filter chips. + +### Example + +```typescript +import { + TrackApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new TrackApi(configuration); + +let genre: string; //Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) (optional) (default to 'default') + +const { status, data } = await apiInstance.tracksSuggestedTagsGet( + genre +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **genre** | [**string**] | Genre slug (pop, rock, electronic, hip-hop, jazz, classical, ambient, default) | (optional) defaults to 'default'| + + +### Return type + +**TracksSuggestedTagsGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/apps/web/src/types/generated/docs/TracksBatchDeletePost200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksBatchDeletePost200ResponseAllOfData.md index 4fafeedc4..3ce7fd775 100644 --- a/apps/web/src/types/generated/docs/TracksBatchDeletePost200ResponseAllOfData.md +++ b/apps/web/src/types/generated/docs/TracksBatchDeletePost200ResponseAllOfData.md @@ -6,7 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **deleted** | **Array<string>** | | [optional] [default to undefined] -**failed** | **object** | | [optional] [default to undefined] +**failed** | **Array<object>** | | [optional] [default to undefined] ## Example diff --git a/apps/web/src/types/generated/docs/TracksBatchUpdatePost200Response.md b/apps/web/src/types/generated/docs/TracksBatchUpdatePost200Response.md new file mode 100644 index 000000000..bad4d13c3 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksBatchUpdatePost200Response.md @@ -0,0 +1,24 @@ +# TracksBatchUpdatePost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksBatchUpdatePost200ResponseAllOfData**](TracksBatchUpdatePost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksBatchUpdatePost200Response } from './api'; + +const instance: TracksBatchUpdatePost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksBatchUpdatePost200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksBatchUpdatePost200ResponseAllOfData.md new file mode 100644 index 000000000..040a04412 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksBatchUpdatePost200ResponseAllOfData.md @@ -0,0 +1,22 @@ +# TracksBatchUpdatePost200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**failed** | **Array<object>** | | [optional] [default to undefined] +**updated** | **Array<string>** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksBatchUpdatePost200ResponseAllOfData } from './api'; + +const instance: TracksBatchUpdatePost200ResponseAllOfData = { + failed, + updated, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdDelete200Response.md b/apps/web/src/types/generated/docs/TracksIdDelete200Response.md index 261757568..7c6763e16 100644 --- a/apps/web/src/types/generated/docs/TracksIdDelete200Response.md +++ b/apps/web/src/types/generated/docs/TracksIdDelete200Response.md @@ -5,7 +5,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**data** | [**AnalyticsEventsPost200ResponseAllOfData**](AnalyticsEventsPost200ResponseAllOfData.md) | | [optional] [default to undefined] +**data** | [**Auth2faDisablePost200ResponseAllOfData**](Auth2faDisablePost200ResponseAllOfData.md) | | [optional] [default to undefined] **error** | **object** | | [optional] [default to undefined] **success** | **boolean** | | [optional] [default to undefined] diff --git a/apps/web/src/types/generated/docs/TracksIdHistoryGet200Response.md b/apps/web/src/types/generated/docs/TracksIdHistoryGet200Response.md new file mode 100644 index 000000000..87f2c15e4 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdHistoryGet200Response.md @@ -0,0 +1,24 @@ +# TracksIdHistoryGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksIdHistoryGet200ResponseAllOfData**](TracksIdHistoryGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdHistoryGet200Response } from './api'; + +const instance: TracksIdHistoryGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdHistoryGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksIdHistoryGet200ResponseAllOfData.md new file mode 100644 index 000000000..0cb7d1510 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdHistoryGet200ResponseAllOfData.md @@ -0,0 +1,26 @@ +# TracksIdHistoryGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**history** | **Array<object>** | | [optional] [default to undefined] +**limit** | **number** | | [optional] [default to undefined] +**offset** | **number** | | [optional] [default to undefined] +**total** | **number** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdHistoryGet200ResponseAllOfData } from './api'; + +const instance: TracksIdHistoryGet200ResponseAllOfData = { + history, + limit, + offset, + total, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdLikePost200Response.md b/apps/web/src/types/generated/docs/TracksIdLikePost200Response.md new file mode 100644 index 000000000..101ae7b94 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdLikePost200Response.md @@ -0,0 +1,24 @@ +# TracksIdLikePost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**Auth2faDisablePost200ResponseAllOfData**](Auth2faDisablePost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdLikePost200Response } from './api'; + +const instance: TracksIdLikePost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdLikesGet200Response.md b/apps/web/src/types/generated/docs/TracksIdLikesGet200Response.md new file mode 100644 index 000000000..e0876e9dd --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdLikesGet200Response.md @@ -0,0 +1,24 @@ +# TracksIdLikesGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksIdLikesGet200ResponseAllOfData**](TracksIdLikesGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdLikesGet200Response } from './api'; + +const instance: TracksIdLikesGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdLikesGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksIdLikesGet200ResponseAllOfData.md new file mode 100644 index 000000000..af32f4d17 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdLikesGet200ResponseAllOfData.md @@ -0,0 +1,22 @@ +# TracksIdLikesGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**count** | **number** | | [optional] [default to undefined] +**is_liked** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdLikesGet200ResponseAllOfData } from './api'; + +const instance: TracksIdLikesGet200ResponseAllOfData = { + count, + is_liked, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdLyricsGet200Response.md b/apps/web/src/types/generated/docs/TracksIdLyricsGet200Response.md new file mode 100644 index 000000000..548c76ad2 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdLyricsGet200Response.md @@ -0,0 +1,24 @@ +# TracksIdLyricsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksIdLyricsGet200ResponseAllOfData**](TracksIdLyricsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdLyricsGet200Response } from './api'; + +const instance: TracksIdLyricsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdLyricsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksIdLyricsGet200ResponseAllOfData.md new file mode 100644 index 000000000..d99b8eda3 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdLyricsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# TracksIdLyricsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**lyrics** | **object** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdLyricsGet200ResponseAllOfData } from './api'; + +const instance: TracksIdLyricsGet200ResponseAllOfData = { + lyrics, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdPlayPost200Response.md b/apps/web/src/types/generated/docs/TracksIdPlayPost200Response.md new file mode 100644 index 000000000..e71e71974 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdPlayPost200Response.md @@ -0,0 +1,24 @@ +# TracksIdPlayPost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksIdPlayPost200ResponseAllOfData**](TracksIdPlayPost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdPlayPost200Response } from './api'; + +const instance: TracksIdPlayPost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdPlayPost200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksIdPlayPost200ResponseAllOfData.md new file mode 100644 index 000000000..c7bcb5593 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdPlayPost200ResponseAllOfData.md @@ -0,0 +1,22 @@ +# TracksIdPlayPost200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**id** | **string** | | [optional] [default to undefined] +**message** | **string** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdPlayPost200ResponseAllOfData } from './api'; + +const instance: TracksIdPlayPost200ResponseAllOfData = { + id, + message, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdRepostGet200Response.md b/apps/web/src/types/generated/docs/TracksIdRepostGet200Response.md new file mode 100644 index 000000000..d1e0d43e1 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdRepostGet200Response.md @@ -0,0 +1,24 @@ +# TracksIdRepostGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksIdRepostGet200ResponseAllOfData**](TracksIdRepostGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdRepostGet200Response } from './api'; + +const instance: TracksIdRepostGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdRepostGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksIdRepostGet200ResponseAllOfData.md new file mode 100644 index 000000000..1594aa01d --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdRepostGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# TracksIdRepostGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**is_reposted** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdRepostGet200ResponseAllOfData } from './api'; + +const instance: TracksIdRepostGet200ResponseAllOfData = { + is_reposted, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdSharePost200Response.md b/apps/web/src/types/generated/docs/TracksIdSharePost200Response.md new file mode 100644 index 000000000..378735040 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdSharePost200Response.md @@ -0,0 +1,24 @@ +# TracksIdSharePost200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**PlaylistsIdSharePost200ResponseAllOfData**](PlaylistsIdSharePost200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdSharePost200Response } from './api'; + +const instance: TracksIdSharePost200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksIdStatsGet200Response.md b/apps/web/src/types/generated/docs/TracksIdStatsGet200Response.md new file mode 100644 index 000000000..55d28e62b --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksIdStatsGet200Response.md @@ -0,0 +1,24 @@ +# TracksIdStatsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**AuditStatsGet200ResponseAllOfData**](AuditStatsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksIdStatsGet200Response } from './api'; + +const instance: TracksIdStatsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksRecommendationsGet200Response.md b/apps/web/src/types/generated/docs/TracksRecommendationsGet200Response.md new file mode 100644 index 000000000..675e43aaf --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksRecommendationsGet200Response.md @@ -0,0 +1,24 @@ +# TracksRecommendationsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksRecommendationsGet200ResponseAllOfData**](TracksRecommendationsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksRecommendationsGet200Response } from './api'; + +const instance: TracksRecommendationsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksRecommendationsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksRecommendationsGet200ResponseAllOfData.md new file mode 100644 index 000000000..068c11b31 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksRecommendationsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# TracksRecommendationsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tracks** | [**Array<VezaBackendApiInternalModelsTrack>**](VezaBackendApiInternalModelsTrack.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksRecommendationsGet200ResponseAllOfData } from './api'; + +const instance: TracksRecommendationsGet200ResponseAllOfData = { + tracks, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksSharedTokenGet200Response.md b/apps/web/src/types/generated/docs/TracksSharedTokenGet200Response.md new file mode 100644 index 000000000..a52244346 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksSharedTokenGet200Response.md @@ -0,0 +1,24 @@ +# TracksSharedTokenGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksSharedTokenGet200ResponseAllOfData**](TracksSharedTokenGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksSharedTokenGet200Response } from './api'; + +const instance: TracksSharedTokenGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksSharedTokenGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksSharedTokenGet200ResponseAllOfData.md new file mode 100644 index 000000000..8165eca02 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksSharedTokenGet200ResponseAllOfData.md @@ -0,0 +1,22 @@ +# TracksSharedTokenGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**share** | **object** | | [optional] [default to undefined] +**track** | [**VezaBackendApiInternalModelsTrack**](VezaBackendApiInternalModelsTrack.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksSharedTokenGet200ResponseAllOfData } from './api'; + +const instance: TracksSharedTokenGet200ResponseAllOfData = { + share, + track, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200Response.md b/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200Response.md new file mode 100644 index 000000000..fa307120a --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200Response.md @@ -0,0 +1,24 @@ +# TracksSuggestedTagsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**TracksSuggestedTagsGet200ResponseAllOfData**](TracksSuggestedTagsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksSuggestedTagsGet200Response } from './api'; + +const instance: TracksSuggestedTagsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200ResponseAllOfData.md new file mode 100644 index 000000000..335d07a84 --- /dev/null +++ b/apps/web/src/types/generated/docs/TracksSuggestedTagsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# TracksSuggestedTagsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**tags** | **Array<string>** | | [optional] [default to undefined] + +## Example + +```typescript +import { TracksSuggestedTagsGet200ResponseAllOfData } from './api'; + +const instance: TracksSuggestedTagsGet200ResponseAllOfData = { + tags, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UserApi.md b/apps/web/src/types/generated/docs/UserApi.md index f4c338e8e..58f392918 100644 --- a/apps/web/src/types/generated/docs/UserApi.md +++ b/apps/web/src/types/generated/docs/UserApi.md @@ -1,15 +1,23 @@ # UserApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| |[**usersByUsernameUsernameGet**](#usersbyusernameusernameget) | **GET** /users/by-username/{username} | Get Profile by Username| |[**usersGet**](#usersget) | **GET** /users | List Users| +|[**usersIdBlockDelete**](#usersidblockdelete) | **DELETE** /users/{id}/block | Unblock user| +|[**usersIdBlockPost**](#usersidblockpost) | **POST** /users/{id}/block | Block user| |[**usersIdCompletionGet**](#usersidcompletionget) | **GET** /users/{id}/completion | Get Profile Completion| |[**usersIdDelete**](#usersiddelete) | **DELETE** /users/{id} | Delete user| +|[**usersIdFollowDelete**](#usersidfollowdelete) | **DELETE** /users/{id}/follow | Unfollow user| +|[**usersIdFollowPost**](#usersidfollowpost) | **POST** /users/{id}/follow | Follow user| |[**usersIdGet**](#usersidget) | **GET** /users/{id} | Get Profile by ID| +|[**usersIdLikesGet**](#usersidlikesget) | **GET** /users/{id}/likes | List tracks liked by a user| |[**usersIdPut**](#usersidput) | **PUT** /users/{id} | Update Profile| +|[**usersIdRepostsGet**](#usersidrepostsget) | **GET** /users/{id}/reposts | List tracks reposted by a user| +|[**usersSearchGet**](#userssearchget) | **GET** /users/search | Search users| +|[**usersSuggestionsGet**](#userssuggestionsget) | **GET** /users/suggestions | Get follow suggestions| # **usersByUsernameUsernameGet** > UsersIdGet200Response usersByUsernameUsernameGet() @@ -137,6 +145,114 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **usersIdBlockDelete** +> Auth2faDisablePost200Response usersIdBlockDelete() + +Authenticated user unblocks target user (idempotent). + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //Target user UUID (default to undefined) + +const { status, data } = await apiInstance.usersIdBlockDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Target user UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **usersIdBlockPost** +> Auth2faDisablePost200Response usersIdBlockPost() + +Authenticated user blocks target user (hides their content, prevents follows). Cannot self-block. + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //Target user UUID (default to undefined) + +const { status, data } = await apiInstance.usersIdBlockPost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Target user UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation / self-block | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **usersIdCompletionGet** > AuthMeGet200Response usersIdCompletionGet() @@ -246,6 +362,115 @@ const { status, data } = await apiInstance.usersIdDelete( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **usersIdFollowDelete** +> Auth2faDisablePost200Response usersIdFollowDelete() + +Authenticated user stops following target user (idempotent). + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //Target user UUID (default to undefined) + +const { status, data } = await apiInstance.usersIdFollowDelete( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Target user UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **usersIdFollowPost** +> Auth2faDisablePost200Response usersIdFollowPost() + +Authenticated user follows target user. Creates a notification (F554 grouped) for the target. + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //Target user UUID (default to undefined) + +const { status, data } = await apiInstance.usersIdFollowPost( + id +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | Target user UUID | defaults to undefined| + + +### Return type + +**Auth2faDisablePost200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Invalid id | - | +|**401** | Unauthorized | - | +|**404** | User not found | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **usersIdGet** > UsersIdGet200Response usersIdGet() @@ -299,6 +524,66 @@ No authorization required [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **usersIdLikesGet** +> UsersIdLikesGet200Response usersIdLikesGet() + +Returns paginated tracks the given user has liked. Used for profile \"Likes\" tab. + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //User UUID (default to undefined) +let limit: number; //Items per page (max 100) (optional) (default to 20) +let offset: number; //Offset for pagination (optional) (default to 0) + +const { status, data } = await apiInstance.usersIdLikesGet( + id, + limit, + offset +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | User UUID | defaults to undefined| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| +| **offset** | [**number**] | Offset for pagination | (optional) defaults to 0| + + +### Return type + +**UsersIdLikesGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + # **usersIdPut** > UsersIdGet200Response usersIdPut(profile) @@ -357,3 +642,174 @@ const { status, data } = await apiInstance.usersIdPut( [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) +# **usersIdRepostsGet** +> UsersIdLikesGet200Response usersIdRepostsGet() + +Returns paginated tracks the user has reposted. Used for profile \"Reposts\" tab. + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let id: string; //User UUID (default to undefined) +let limit: number; //Items per page (max 100) (optional) (default to 20) +let offset: number; //Offset for pagination (optional) (default to 0) + +const { status, data } = await apiInstance.usersIdRepostsGet( + id, + limit, + offset +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **id** | [**string**] | User UUID | defaults to undefined| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| +| **offset** | [**number**] | Offset for pagination | (optional) defaults to 0| + + +### Return type + +**UsersIdLikesGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **usersSearchGet** +> UsersSearchGet200Response usersSearchGet() + +Full-text search on users (username, display_name). Paginated. Public. + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let q: string; //Full-text query (optional) (default to undefined) +let page: number; //Page (optional) (default to 1) +let limit: number; //Items per page (max 100) (optional) (default to 20) + +const { status, data } = await apiInstance.usersSearchGet( + q, + page, + limit +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **q** | [**string**] | Full-text query | (optional) defaults to undefined| +| **page** | [**number**] | Page | (optional) defaults to 1| +| **limit** | [**number**] | Items per page (max 100) | (optional) defaults to 20| + + +### Return type + +**UsersSearchGet200Response** + +### Authorization + +No authorization required + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**400** | Validation (bounds) | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **usersSuggestionsGet** +> UsersSuggestionsGet200Response usersSuggestionsGet() + +Returns suggested users to follow for the authenticated user. Declarative discovery — no behavioural scoring (CLAUDE.md rule 7). + +### Example + +```typescript +import { + UserApi, + Configuration +} from './api'; + +const configuration = new Configuration(); +const apiInstance = new UserApi(configuration); + +let limit: number; //Max items (max 50) (optional) (default to 10) + +const { status, data } = await apiInstance.usersSuggestionsGet( + limit +); +``` + +### Parameters + +|Name | Type | Description | Notes| +|------------- | ------------- | ------------- | -------------| +| **limit** | [**number**] | Max items (max 50) | (optional) defaults to 10| + + +### Return type + +**UsersSuggestionsGet200Response** + +### Authorization + +[BearerAuth](../README.md#BearerAuth) + +### HTTP request headers + + - **Content-Type**: Not defined + - **Accept**: application/json + + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +|**200** | OK | - | +|**401** | Unauthorized | - | +|**500** | Internal Error | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + diff --git a/apps/web/src/types/generated/docs/UsersApi.md b/apps/web/src/types/generated/docs/UsersApi.md index af70543fb..8f5c7c564 100644 --- a/apps/web/src/types/generated/docs/UsersApi.md +++ b/apps/web/src/types/generated/docs/UsersApi.md @@ -1,6 +1,6 @@ # UsersApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/UsersIdLikesGet200Response.md b/apps/web/src/types/generated/docs/UsersIdLikesGet200Response.md new file mode 100644 index 000000000..a95c12e29 --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersIdLikesGet200Response.md @@ -0,0 +1,24 @@ +# UsersIdLikesGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**UsersIdLikesGet200ResponseAllOfData**](UsersIdLikesGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersIdLikesGet200Response } from './api'; + +const instance: UsersIdLikesGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UsersIdLikesGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/UsersIdLikesGet200ResponseAllOfData.md new file mode 100644 index 000000000..aab450dbb --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersIdLikesGet200ResponseAllOfData.md @@ -0,0 +1,26 @@ +# UsersIdLikesGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**limit** | **number** | | [optional] [default to undefined] +**offset** | **number** | | [optional] [default to undefined] +**total** | **number** | | [optional] [default to undefined] +**tracks** | [**Array<VezaBackendApiInternalModelsTrack>**](VezaBackendApiInternalModelsTrack.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersIdLikesGet200ResponseAllOfData } from './api'; + +const instance: UsersIdLikesGet200ResponseAllOfData = { + limit, + offset, + total, + tracks, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UsersSearchGet200Response.md b/apps/web/src/types/generated/docs/UsersSearchGet200Response.md new file mode 100644 index 000000000..6110a2c91 --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersSearchGet200Response.md @@ -0,0 +1,24 @@ +# UsersSearchGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**UsersSearchGet200ResponseAllOfData**](UsersSearchGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersSearchGet200Response } from './api'; + +const instance: UsersSearchGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UsersSearchGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/UsersSearchGet200ResponseAllOfData.md new file mode 100644 index 000000000..0eeb32cb8 --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersSearchGet200ResponseAllOfData.md @@ -0,0 +1,22 @@ +# UsersSearchGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**pagination** | **object** | | [optional] [default to undefined] +**users** | [**Array<VezaBackendApiInternalModelsUser>**](VezaBackendApiInternalModelsUser.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersSearchGet200ResponseAllOfData } from './api'; + +const instance: UsersSearchGet200ResponseAllOfData = { + pagination, + users, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UsersSuggestionsGet200Response.md b/apps/web/src/types/generated/docs/UsersSuggestionsGet200Response.md new file mode 100644 index 000000000..e05a895a5 --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersSuggestionsGet200Response.md @@ -0,0 +1,24 @@ +# UsersSuggestionsGet200Response + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | [**UsersSuggestionsGet200ResponseAllOfData**](UsersSuggestionsGet200ResponseAllOfData.md) | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersSuggestionsGet200Response } from './api'; + +const instance: UsersSuggestionsGet200Response = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/UsersSuggestionsGet200ResponseAllOfData.md b/apps/web/src/types/generated/docs/UsersSuggestionsGet200ResponseAllOfData.md new file mode 100644 index 000000000..de338c7ce --- /dev/null +++ b/apps/web/src/types/generated/docs/UsersSuggestionsGet200ResponseAllOfData.md @@ -0,0 +1,20 @@ +# UsersSuggestionsGet200ResponseAllOfData + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**users** | [**Array<VezaBackendApiInternalModelsUser>**](VezaBackendApiInternalModelsUser.md) | | [optional] [default to undefined] + +## Example + +```typescript +import { UsersSuggestionsGet200ResponseAllOfData } from './api'; + +const instance: UsersSuggestionsGet200ResponseAllOfData = { + users, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/ValidationApi.md b/apps/web/src/types/generated/docs/ValidationApi.md index b5efd4ff4..32c7472f9 100644 --- a/apps/web/src/types/generated/docs/ValidationApi.md +++ b/apps/web/src/types/generated/docs/ValidationApi.md @@ -1,6 +1,6 @@ # ValidationApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/docs/VezaBackendApiInternalCoreMarketplaceOrder.md b/apps/web/src/types/generated/docs/VezaBackendApiInternalCoreMarketplaceOrder.md index cd3a49a6b..8e8eb06e2 100644 --- a/apps/web/src/types/generated/docs/VezaBackendApiInternalCoreMarketplaceOrder.md +++ b/apps/web/src/types/generated/docs/VezaBackendApiInternalCoreMarketplaceOrder.md @@ -15,6 +15,7 @@ Name | Type | Description | Notes **payment_intent** | **string** | Legacy / Stripe PaymentIntent ID | [optional] [default to undefined] **payment_status** | **string** | Hyperswitch payment status | [optional] [default to undefined] **promo_code_id** | **string** | | [optional] [default to undefined] +**refund_deadline** | **string** | v0.12.0: 14-day refund deadline | [optional] [default to undefined] **status** | **string** | pending, completed, failed, refunded | [optional] [default to undefined] **total_amount** | **number** | | [optional] [default to undefined] **updated_at** | **string** | | [optional] [default to undefined] @@ -35,6 +36,7 @@ const instance: VezaBackendApiInternalCoreMarketplaceOrder = { payment_intent, payment_status, promo_code_id, + refund_deadline, status, total_amount, updated_at, diff --git a/apps/web/src/types/generated/docs/VezaBackendApiInternalHandlersAPIResponse.md b/apps/web/src/types/generated/docs/VezaBackendApiInternalHandlersAPIResponse.md new file mode 100644 index 000000000..ca91934af --- /dev/null +++ b/apps/web/src/types/generated/docs/VezaBackendApiInternalHandlersAPIResponse.md @@ -0,0 +1,24 @@ +# VezaBackendApiInternalHandlersAPIResponse + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**data** | **object** | | [optional] [default to undefined] +**error** | **object** | | [optional] [default to undefined] +**success** | **boolean** | | [optional] [default to undefined] + +## Example + +```typescript +import { VezaBackendApiInternalHandlersAPIResponse } from './api'; + +const instance: VezaBackendApiInternalHandlersAPIResponse = { + data, + error, + success, +}; +``` + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsPlaylist.md b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsPlaylist.md index de9f1a0bb..66cc8daec 100644 --- a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsPlaylist.md +++ b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsPlaylist.md @@ -11,6 +11,8 @@ Name | Type | Description | Notes **description** | **string** | | [optional] [default to undefined] **follower_count** | **number** | | [optional] [default to undefined] **id** | **string** | | [optional] [default to undefined] +**is_default_favorites** | **boolean** | v0.10.4 F136 | [optional] [default to undefined] +**is_editorial** | **boolean** | v0.10.4 F141 | [optional] [default to undefined] **is_public** | **boolean** | | [optional] [default to undefined] **title** | **string** | | [optional] [default to undefined] **track_count** | **number** | | [optional] [default to undefined] @@ -30,6 +32,8 @@ const instance: VezaBackendApiInternalModelsPlaylist = { description, follower_count, id, + is_default_favorites, + is_editorial, is_public, title, track_count, diff --git a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsTrack.md b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsTrack.md index 01686ef0d..9ab57f296 100644 --- a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsTrack.md +++ b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsTrack.md @@ -20,9 +20,7 @@ Name | Type | Description | Notes **genre** | **string** | | [optional] [default to undefined] **id** | **string** | | [optional] [default to undefined] **is_public** | **boolean** | | [optional] [default to undefined] -**like_count** | **number** | | [optional] [default to undefined] **musical_key** | **string** | | [optional] [default to undefined] -**play_count** | **number** | | [optional] [default to undefined] **sample_rate** | **number** | Hz | [optional] [default to undefined] **status** | [**VezaBackendApiInternalModelsTrackStatus**](VezaBackendApiInternalModelsTrackStatus.md) | | [optional] [default to undefined] **status_message** | **string** | | [optional] [default to undefined] @@ -56,9 +54,7 @@ const instance: VezaBackendApiInternalModelsTrack = { genre, id, is_public, - like_count, musical_key, - play_count, sample_rate, status, status_message, diff --git a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsUser.md b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsUser.md index d74128c74..2b815f250 100644 --- a/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsUser.md +++ b/apps/web/src/types/generated/docs/VezaBackendApiInternalModelsUser.md @@ -24,6 +24,8 @@ Name | Type | Description | Notes **location** | **string** | | [optional] [default to undefined] **login_count** | **number** | | [optional] [default to undefined] **password** | **string** | Virtual field for input | [optional] [default to undefined] +**password_changed_at** | **string** | F016: Password expiration tracking | [optional] [default to undefined] +**promoted_to_creator_at** | **string** | v1.0.6: set the first time a user self-promotes to `role=\'creator\'` via POST /api/v1/users/me/upgrade-creator. NULL for users who never took that path (still \'user\', or promoted by an admin out-of-band). | [optional] [default to undefined] **role** | **string** | | [optional] [default to undefined] **slug** | **string** | | [optional] [default to undefined] **social_links** | **string** | | [optional] [default to undefined] @@ -57,6 +59,8 @@ const instance: VezaBackendApiInternalModelsUser = { location, login_count, password, + password_changed_at, + promoted_to_creator_at, role, slug, social_links, diff --git a/apps/web/src/types/generated/docs/WebhookApi.md b/apps/web/src/types/generated/docs/WebhookApi.md index 43eb9e9ab..0e4171f89 100644 --- a/apps/web/src/types/generated/docs/WebhookApi.md +++ b/apps/web/src/types/generated/docs/WebhookApi.md @@ -1,6 +1,6 @@ # WebhookApi -All URIs are relative to *http://localhost:8080/api/v1* +All URIs are relative to *http://localhost:18080/api/v1* |Method | HTTP request | Description| |------------- | ------------- | -------------| diff --git a/apps/web/src/types/generated/index.ts b/apps/web/src/types/generated/index.ts index 289d5eb79..246cd9497 100644 --- a/apps/web/src/types/generated/index.ts +++ b/apps/web/src/types/generated/index.ts @@ -1,5 +1,6 @@ // Auto-generated types from OpenAPI specification // Do not edit this file manually - it will be overwritten +// DEPRECATED v1.0.8 P3 — migrate consumers to src/services/generated/ (orval). export * from './api'; export * from './base';