From 35e80849dacf6ed6b3b5814176308417ed0f3a5f Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Mon, 21 Oct 2024 18:28:27 +0200 Subject: [PATCH 01/10] Add logic in Player to handle issue when media services are reset - add new logging for this issue in PlayerLoggable - add new func mediaServicesWereReset PlayerListener and updated in NotificationsHandler so client of the sdk can perform necessary configurations and changes - add a new monitor AudioSessionMediaServicesWereResetMonitor to handle when media services are reset and lost - add a new func resetPlayerAndSetUpAudioSessionAfterMediaServiceWereReset which is called from when media services were reset - add logic to handle this new media error in AVQueuePlayerWrapper and AVQueuePlayerWrapperLegacy --- Sources/Player/Common/Data/AudioCodec.swift | 2 +- .../Common/Errors/PlayerInternalError.swift | 1 + .../Common/Event/NotificationsHandler.swift | 6 ++ .../Player/Common/Event/PlayerListener.swift | 5 ++ .../Common/Logging/PlayerLoggable.swift | 19 ++++++- .../PlaybackEngine/PlayerListenerMock.swift | 2 + .../AVQueuePlayer/AVQueuePlayerWrapper.swift | 27 +++++++-- .../Legacy/AVQueuePlayerWrapperLegacy.swift | 27 +++++++-- ...SessionMediaServicesWereResetMonitor.swift | 57 +++++++++++++++++++ .../Internal/Errors/ErrorConstants.swift | 4 ++ .../Player/PlaybackEngine/PlayerEngine.swift | 15 ++++- 11 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift create mode 100644 Sources/Player/PlaybackEngine/Internal/Errors/ErrorConstants.swift diff --git a/Sources/Player/Common/Data/AudioCodec.swift b/Sources/Player/Common/Data/AudioCodec.swift index 76ecdfb6..21b0c5fb 100644 --- a/Sources/Player/Common/Data/AudioCodec.swift +++ b/Sources/Player/Common/Data/AudioCodec.swift @@ -80,7 +80,7 @@ public enum AudioCodec: Equatable, Codable { /// - Parameter mode: The AudioMode value public init?(from quality: AudioQuality?, mode: AudioMode?) { guard let quality else { - PlayerWorld.logger?.log(loggable: PlayerLoggable.audioCodecInitWithNilQuality) + PlayerWorld.logger?.log(loggable: PlayerLoggable.audioCodecInitWithNilQuality(audioMode: mode?.rawValue ?? "nil")) return nil } switch quality { diff --git a/Sources/Player/Common/Errors/PlayerInternalError.swift b/Sources/Player/Common/Errors/PlayerInternalError.swift index bfb62945..7e88fda6 100644 --- a/Sources/Player/Common/Errors/PlayerInternalError.swift +++ b/Sources/Player/Common/Errors/PlayerInternalError.swift @@ -21,6 +21,7 @@ public struct PlayerInternalError: Error, CustomStringConvertible, Equatable { case authError case unknown case playerLoaderError + case mediaServicesWereReset } let errorId: ErrorId diff --git a/Sources/Player/Common/Event/NotificationsHandler.swift b/Sources/Player/Common/Event/NotificationsHandler.swift index 56cf1978..17fa0dc1 100644 --- a/Sources/Player/Common/Event/NotificationsHandler.swift +++ b/Sources/Player/Common/Event/NotificationsHandler.swift @@ -96,4 +96,10 @@ final class NotificationsHandler { self.offlineEngineListener?.allOfflinedMediaProductsDeleted() } } + + func mediaServicesWereReset() { + queue.async { + self.listener.mediaServicesWereReset() + } + } } diff --git a/Sources/Player/Common/Event/PlayerListener.swift b/Sources/Player/Common/Event/PlayerListener.swift index fbb323c1..5b9b32aa 100644 --- a/Sources/Player/Common/Event/PlayerListener.swift +++ b/Sources/Player/Common/Event/PlayerListener.swift @@ -18,6 +18,11 @@ public protocol PlayerListener: AnyObject { func djSessionEnded(with reason: DJSessionEndReason) func djSessionTransitioned(to transition: DJSessionTransition) + + /// Called when the media services were reset. A chance for the client of the player to respond appropriately to mediaServicesWereResetNotification. More info about this issue: + /// https://developer.apple.com/documentation/avfaudio/avaudiosession/1616540-mediaserviceswereresetnotificati + /// - Important: This is a good time to set up the audio session again. + func mediaServicesWereReset() } // MARK: - Optional methods diff --git a/Sources/Player/Common/Logging/PlayerLoggable.swift b/Sources/Player/Common/Logging/PlayerLoggable.swift index 581edde0..330ff76f 100644 --- a/Sources/Player/Common/Logging/PlayerLoggable.swift +++ b/Sources/Player/Common/Logging/PlayerLoggable.swift @@ -162,7 +162,7 @@ enum PlayerLoggable: TidalLoggable { case audioCodecInitWithEmpty case audioCodecInitWithUnknown(codec: String) - case audioCodecInitWithNilQuality + case audioCodecInitWithNilQuality(audioMode: String) case audioCodecInitWithLowQualityAndNilMode case audioCodecInitWithLowQualityAndUnsupportedMode(mode: String) @@ -188,6 +188,11 @@ enum PlayerLoggable: TidalLoggable { case changeMonitorHandleNotificationDefaultReason(reason: String) case changeMonitorUpdateVolumeWithoutRequiredData + // MARK: AudioSessionMediaServicesWereResetMonitor + + case handleMediaServicesWereLost + case handleMediaServicesWereReset + // MARK: AssetPlaybackMetadata case assetPlaybackMetadataInitWithoutRateAndDepthData @@ -434,6 +439,12 @@ extension PlayerLoggable { case .changeMonitorUpdateVolumeWithoutRequiredData: "AudioSessionRouteChangeMonitor-updateVolumeWithoutRequiredData" + // AudioSessionMediaServicesWereResetMonitor + case .handleMediaServicesWereLost: + "AudioSessionMediaServicesWereResetMonitor-handleMediaServicesWereLost" + case .handleMediaServicesWereReset: + "AudioSessionMediaServicesWereResetMonitor-handleMediaServicesWereReset" + // AssetPlaybackMetadata case .assetPlaybackMetadataInitWithoutRateAndDepthData: "AssetPlaybackMetadata-initWithoutRateAndDepthData" @@ -507,6 +518,8 @@ extension PlayerLoggable { metadata[Constants.metadataFormatFlagsKey] = "\(String(describing: formatFlags))" case let .changeMonitorHandleNotificationDefaultReason(reason): metadata[Constants.metadataRouteChangeReasonKey] = "\(String(describing: reason))" + case let .audioCodecInitWithNilQuality(mode): + metadata[Constants.metadataAudioModeKey] = "\(String(describing: mode))" case .streamingNotifyGetCredentialFailed, .streamingConnectOfflineMode, .streamingConnectNoToken, @@ -530,6 +543,8 @@ extension PlayerLoggable { .interruptionMonitorHandleNotificationUnknownType, .changeMonitorHandleNotificationWithoutRequiredData, .changeMonitorUpdateVolumeWithoutRequiredData, + .handleMediaServicesWereReset, + .handleMediaServicesWereLost, .eventSenderInitEventsDirectoryFailed, .eventSenderInitOfflinePlaysDirectoryFailed, .eventSenderInitializeDirectoryNoURLPath, @@ -628,6 +643,8 @@ extension PlayerLoggable { .changeMonitorHandleNotificationWithoutRequiredData, .changeMonitorHandleNotificationDefaultReason, .changeMonitorUpdateVolumeWithoutRequiredData, + .handleMediaServicesWereLost, + .handleMediaServicesWereReset, .eventSenderInitEventsDirectoryFailed, .eventSenderInitOfflinePlaysDirectoryFailed, .eventSenderInitializeDirectoryNoURLPath, diff --git a/Sources/Player/Mocks/PlaybackEngine/PlayerListenerMock.swift b/Sources/Player/Mocks/PlaybackEngine/PlayerListenerMock.swift index 2658fecb..7c6daa90 100644 --- a/Sources/Player/Mocks/PlaybackEngine/PlayerListenerMock.swift +++ b/Sources/Player/Mocks/PlaybackEngine/PlayerListenerMock.swift @@ -32,4 +32,6 @@ public final class PlayerListenerMock: PlayerListener { public func djSessionEnded(with reason: DJSessionEndReason) {} public func djSessionTransitioned(to transition: DJSessionTransition) {} + + public func mediaServicesWereReset() {} } diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift index 156018b4..a4e1e538 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift @@ -688,13 +688,28 @@ private extension AVQueuePlayerWrapper { } static func mediaError(_ error: Error, with description: String) -> PlayerInternalError? { - (error as? AVError).map { - PlayerInternalError( + let nserror = error as NSError + + // If it's the error related to the media services being reset, we create a specific internal error instead of a generic one. + // This is because the media services being reset is a recoverable error that should be handled differently. + if nserror.domain == ErrorConstants.avfoundationErrorDomain, + nserror.code == ErrorConstants.averrorMediaServicesWereResetErrorCode + { + return PlayerInternalError( errorId: .PERetryable, - errorType: .avPlayerAvError, - code: $0.code.rawValue, - description: description - ) + errorType: .mediaServicesWereReset, + code: nserror.code, + description: description + ) + } else { + return (error as? AVError).map { + PlayerInternalError( + errorId: .PERetryable, + errorType: .avPlayerAvError, + code: $0.code.rawValue, + description: description + ) + } } } diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift index 653c5886..cf89c68e 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift @@ -590,13 +590,28 @@ private extension AVQueuePlayerWrapperLegacy { } static func mediaError(_ error: Error, with description: String) -> PlayerInternalError? { - (error as? AVError).map { - PlayerInternalError( + let nserror = error as NSError + + // If it's the error related to the media services being reset, we create a specific internal error instead of a generic one. + // This is because the media services being reset is a recoverable error that should be handled differently. + if nserror.domain == ErrorConstants.avfoundationErrorDomain, + nserror.code == ErrorConstants.averrorMediaServicesWereResetErrorCode + { + return PlayerInternalError( errorId: .PERetryable, - errorType: .avPlayerAvError, - code: $0.code.rawValue, - description: description - ) + errorType: .mediaServicesWereReset, + code: nserror.code, + description: description + ) + } else { + return (error as? AVError).map { + PlayerInternalError( + errorId: .PERetryable, + errorType: .avPlayerAvError, + code: $0.code.rawValue, + description: description + ) + } } } diff --git a/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift new file mode 100644 index 00000000..d59a69a8 --- /dev/null +++ b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift @@ -0,0 +1,57 @@ +#if !os(macOS) + import AVFoundation + import Foundation + +// swiftlint:disable:next type_name +final class AudioSessionMediaServicesWereResetMonitor { + private weak var playerEngine: PlayerEngine? + private weak var audioSession: AVAudioSession? + + init(playerEngine: PlayerEngine) { + self.playerEngine = playerEngine + audioSession = AVAudioSession.sharedInstance() + + NotificationCenter.default.addObserver( + self, + selector: #selector(handleMediaServicesWereLost), + name: AVAudioSession.mediaServicesWereLostNotification, + object: audioSession + ) + NotificationCenter.default.addObserver( + self, + selector: #selector(handleMediaServicesWereReset), + name: AVAudioSession.mediaServicesWereResetNotification, + object: audioSession + ) + } + + deinit { + NotificationCenter.default.removeObserver( + self, + name: AVAudioSession.mediaServicesWereLostNotification, + object: audioSession + ) + + NotificationCenter.default.removeObserver( + self, + name: AVAudioSession.mediaServicesWereResetNotification, + object: audioSession + ) + } +} + +private extension AudioSessionMediaServicesWereResetMonitor { + + @objc + func handleMediaServicesWereLost(notification: Notification) { + PlayerWorld.logger?.log(loggable: PlayerLoggable.handleMediaServicesWereReset) + } + + @objc + func handleMediaServicesWereReset(notification: Notification) { + PlayerWorld.logger?.log(loggable: PlayerLoggable.handleMediaServicesWereReset) + + self.playerEngine?.resetPlayerAndSetUpAudioSessionAfterMediaServiceWereReset() + } +} +#endif diff --git a/Sources/Player/PlaybackEngine/Internal/Errors/ErrorConstants.swift b/Sources/Player/PlaybackEngine/Internal/Errors/ErrorConstants.swift new file mode 100644 index 00000000..d26a778e --- /dev/null +++ b/Sources/Player/PlaybackEngine/Internal/Errors/ErrorConstants.swift @@ -0,0 +1,4 @@ +enum ErrorConstants { + static let avfoundationErrorDomain = "AVFoundationErrorDomain" + static let averrorMediaServicesWereResetErrorCode = -11819 +} diff --git a/Sources/Player/PlaybackEngine/PlayerEngine.swift b/Sources/Player/PlaybackEngine/PlayerEngine.swift index 695e8ddb..67dfd2a8 100644 --- a/Sources/Player/PlaybackEngine/PlayerEngine.swift +++ b/Sources/Player/PlaybackEngine/PlayerEngine.swift @@ -96,6 +96,7 @@ final class PlayerEngine { #if !os(macOS) private var audioSessionInterruptionMonitor: AudioSessionInterruptionMonitor! private var audioSessionRouteChangeMonitor: AudioSessionRouteChangeMonitor! + private var audioSessionMediaServicesWereResetMonitor: AudioSessionMediaServicesWereResetMonitor! #endif init( @@ -139,6 +140,7 @@ final class PlayerEngine { #if !os(macOS) audioSessionInterruptionMonitor = AudioSessionInterruptionMonitor(self) audioSessionRouteChangeMonitor = AudioSessionRouteChangeMonitor(self, configuration: configuration) + audioSessionMediaServicesWereResetMonitor = AudioSessionMediaServicesWereResetMonitor(playerEngine: self) #endif } @@ -265,7 +267,7 @@ final class PlayerEngine { } /// The Player SDK creates new PlayerEngine instances when starting a new explicit playback. - /// This means it discards the previous isntance, which won't be reused. + /// This means it discards the previous instance, which won't be reused. /// Which allows us to optimize how we clean up as it won't be reused (no need to queue up the clean operation) func unload() { cancellAllNetworkRequests() @@ -282,7 +284,7 @@ final class PlayerEngine { /// The Player SDK creates new PlayerEngine instances when starting a new explicit playback. /// In theory, this should allows us to never need to reuse an instance. /// But that requires a bit more changes, so until then, when the client calls reset, - /// we still need to call reset to the active instance. which cleans up syncronously to avoid thread issues. + /// we still need to call reset to the active instance. which cleans up synchronously to avoid thread issues. func reset() { // Unload and nullify the current item so that it immediately stops playing. currentItem?.unloadFromPlayer() @@ -344,6 +346,15 @@ final class PlayerEngine { func currentPlayer() -> GenericMediaPlayer? { currentItem?.asset?.player } + + func resetPlayerAndSetUpAudioSessionAfterMediaServiceWereReset() { + // When media services are reset, we must reset the player. + self.reset() + + // Then we should also set it up again the audio session as done initially. Since this is done outside the SDK, we delegate it + // to the notification handler to do it. + notificationsHandler?.mediaServicesWereReset() + } } // MARK: PlayerItemMonitor From ce66229b4b6aa003161af795403b94fb52a04f27 Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Tue, 22 Oct 2024 20:35:01 +0200 Subject: [PATCH 02/10] fix logging --- .../AudioSessionMediaServicesWereResetMonitor.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift index d59a69a8..d2cbaf5e 100644 --- a/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift +++ b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift @@ -44,7 +44,7 @@ private extension AudioSessionMediaServicesWereResetMonitor { @objc func handleMediaServicesWereLost(notification: Notification) { - PlayerWorld.logger?.log(loggable: PlayerLoggable.handleMediaServicesWereReset) + PlayerWorld.logger?.log(loggable: PlayerLoggable.handleMediaServicesWereLost) } @objc From 41254151ea20181ffa6ef38a130e9be4324250ed Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Tue, 22 Oct 2024 20:38:37 +0200 Subject: [PATCH 03/10] fix test app --- TestApps/Player/PlayerTestApp/PlayerViewModel.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/TestApps/Player/PlayerTestApp/PlayerViewModel.swift b/TestApps/Player/PlayerTestApp/PlayerViewModel.swift index f91844f9..bf84c176 100644 --- a/TestApps/Player/PlayerTestApp/PlayerViewModel.swift +++ b/TestApps/Player/PlayerTestApp/PlayerViewModel.swift @@ -87,6 +87,13 @@ extension PlayerViewModel: PlayerListener { self.error = CustomError.playerError(code: error.errorCode) showAlert = true } + + func mediaServicesWereReset() { + // We must set up again the audio session for the correct behavior after media services are reset. + let audioSession = AVAudioSession.sharedInstance() + try? audioSession.setCategory(.playback, mode: .default, policy: .longFormAudio) + try audioSession.setActive(true) + } } // MARK: - CustomError From e425e7cfa9a20415861698defd356632c77988ff Mon Sep 17 00:00:00 2001 From: Evgenii Kononenko Date: Wed, 23 Oct 2024 17:37:36 +0200 Subject: [PATCH 04/10] remove old Catalogue module --- Package.swift | 16 - Sources/Catalogue/Catalogue.swift | 9 - .../Generated/Models/AlbumAttributes.swift | 102 - .../Generated/Models/AlbumDataDocument.swift | 41 - .../Generated/Models/AlbumRelationship.swift | 118 - .../Models/AlbumRelationshipResource.swift | 52 - .../Models/AlbumRelationshipsDocument.swift | 42 - .../Generated/Models/AlbumResource.swift | 51 - .../Generated/Models/AlbumsDataDocument.swift | 42 - .../Generated/Models/ArtistAttributes.swift | 48 - .../Generated/Models/ArtistDataDocument.swift | 41 - .../Generated/Models/ArtistRelationship.swift | 118 - .../Models/ArtistRelationshipResource.swift | 52 - .../Models/ArtistRelationshipsDocument.swift | 42 - .../Generated/Models/ArtistResource.swift | 51 - .../Models/ArtistsDataDocument.swift | 42 - .../Models/AvailableAlbumRelationships.swift | 45 - .../AvailableAlbumRelationshipsItems.swift | 36 - ...ableAlbumRelationshipsItemsDataInner.swift | 42 - ...AlbumRelationshipsItemsDataInnerMeta.swift | 38 - .../Models/AvailableArtistRelationships.swift | 45 - .../Models/AvailableTrackRelationships.swift | 45 - .../Models/AvailableVideoRelationships.swift | 41 - .../Generated/Models/ErrorDocument.swift | 37 - .../Generated/Models/ErrorObject.swift | 52 - .../Generated/Models/ErrorObjectSource.swift | 44 - .../Generated/Models/ExternalLink.swift | 37 - .../Generated/Models/ExternalLinkMeta.swift | 46 - .../Generated/Models/ImageLink.swift | 37 - .../Generated/Models/ImageLinkMeta.swift | 39 - .../Catalogue/Generated/Models/Links.swift | 39 - .../Generated/Models/ProviderAttributes.swift | 33 - .../Models/ProviderDataDocument.swift | 41 - .../Models/ProviderRelationshipResource.swift | 53 - .../Generated/Models/ProviderResource.swift | 52 - .../Models/ProvidersDataDocument.swift | 42 - .../Generated/Models/Relationship.swift | 38 - .../Generated/Models/ResourceIdentifier.swift | 38 - .../Models/ResourceRelationship.swift | 37 - .../Generated/Models/TrackAttributes.swift | 82 - .../Generated/Models/TrackDataDocument.swift | 41 - .../Generated/Models/TrackRelationship.swift | 118 - .../Models/TrackRelationshipResource.swift | 52 - .../Models/TrackRelationshipsDocument.swift | 42 - .../Generated/Models/TrackResource.swift | 51 - .../Generated/Models/TracksDataDocument.swift | 42 - .../Generated/Models/VideoAttributes.swift | 89 - .../Generated/Models/VideoDataDocument.swift | 41 - .../Generated/Models/VideoLink.swift | 37 - .../Generated/Models/VideoLinkMeta.swift | 39 - .../Generated/Models/VideoRelationship.swift | 108 - .../Models/VideoRelationshipResource.swift | 52 - .../Models/VideoRelationshipsDocument.swift | 42 - .../Generated/Models/VideoResource.swift | 51 - .../Generated/Models/VideosDataDocument.swift | 42 - Sources/Catalogue/README.md | 22 - .../Catalogue/openapi/catalogue_openapi.json | 11847 ---------------- Sources/Catalogue/openapi/openapi-config.yml | 3 - 58 files changed, 14625 deletions(-) delete mode 100644 Sources/Catalogue/Catalogue.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumAttributes.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumRelationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumRelationshipResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumRelationshipsDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/AlbumsDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistAttributes.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistRelationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistRelationshipResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistRelationshipsDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/ArtistsDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableAlbumRelationships.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItems.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInner.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInnerMeta.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableArtistRelationships.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableTrackRelationships.swift delete mode 100644 Sources/Catalogue/Generated/Models/AvailableVideoRelationships.swift delete mode 100644 Sources/Catalogue/Generated/Models/ErrorDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/ErrorObject.swift delete mode 100644 Sources/Catalogue/Generated/Models/ErrorObjectSource.swift delete mode 100644 Sources/Catalogue/Generated/Models/ExternalLink.swift delete mode 100644 Sources/Catalogue/Generated/Models/ExternalLinkMeta.swift delete mode 100644 Sources/Catalogue/Generated/Models/ImageLink.swift delete mode 100644 Sources/Catalogue/Generated/Models/ImageLinkMeta.swift delete mode 100644 Sources/Catalogue/Generated/Models/Links.swift delete mode 100644 Sources/Catalogue/Generated/Models/ProviderAttributes.swift delete mode 100644 Sources/Catalogue/Generated/Models/ProviderDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/ProviderRelationshipResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/ProviderResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/ProvidersDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/Relationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/ResourceIdentifier.swift delete mode 100644 Sources/Catalogue/Generated/Models/ResourceRelationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackAttributes.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackRelationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackRelationshipResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackRelationshipsDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/TrackResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/TracksDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoAttributes.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoDataDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoLink.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoLinkMeta.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoRelationship.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoRelationshipResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoRelationshipsDocument.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideoResource.swift delete mode 100644 Sources/Catalogue/Generated/Models/VideosDataDocument.swift delete mode 100644 Sources/Catalogue/README.md delete mode 100644 Sources/Catalogue/openapi/catalogue_openapi.json delete mode 100644 Sources/Catalogue/openapi/openapi-config.yml diff --git a/Package.swift b/Package.swift index 0491d170..47b140b4 100644 --- a/Package.swift +++ b/Package.swift @@ -61,15 +61,6 @@ let package = Package( .template, ] ), - .target( - name: "Catalogue", - dependencies: [ - .AnyCodable, - ], - plugins: [ - .plugin(name: "SwiftLint", package: "SwiftLintPlugin"), - ] - ), .target( name: "TidalAPI", dependencies: [ @@ -80,12 +71,6 @@ let package = Package( .plugin(name: "SwiftLint", package: "SwiftLintPlugin"), ] ), - .testTarget( - name: "CatalogueTests", - dependencies: [ - .catalogue, - ] - ), .target( name: "Common", dependencies: [ @@ -176,7 +161,6 @@ extension Target.Dependency { /// Local static let template = byName(name: "Template") static let eventProducer = byName(name: "EventProducer") - static let catalogue = byName(name: "Catalogue") static let tidalAPI = byName(name: "TidalAPI") static let common = byName(name: "Common") static let auth = byName(name: "Auth") diff --git a/Sources/Catalogue/Catalogue.swift b/Sources/Catalogue/Catalogue.swift deleted file mode 100644 index 4af5441b..00000000 --- a/Sources/Catalogue/Catalogue.swift +++ /dev/null @@ -1,9 +0,0 @@ -public struct Catalogue { - public let text = "Hello, World!" - - public init() {} - - func sayHello() -> String { - text - } -} diff --git a/Sources/Catalogue/Generated/Models/AlbumAttributes.swift b/Sources/Catalogue/Generated/Models/AlbumAttributes.swift deleted file mode 100644 index b4450cb0..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumAttributes.swift +++ /dev/null @@ -1,102 +0,0 @@ -// -// AlbumAttributes.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AlbumAttributes: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Original title */ - public var title: String - /** Barcode id (EAN-13 or UPC-A) */ - public var barcodeId: String - /** Number of volumes */ - public var numberOfVolumes: Int - /** Number of album items */ - public var numberOfItems: Int - /** Duration (ISO-8601) */ - public var duration: String - /** Indicates whether an album consist of any explicit content */ - public var explicit: Bool - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Copyright information */ - public var copyright: String? - /** Album popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines an album availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Represents available links to, and metadata about, an album cover images */ - public var imageLinks: [ImageLink]? - /** Represents available links to, and metadata about, an album cover videos */ - public var videoLinks: [VideoLink]? - /** Represents available links to something that is related to an album resource, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - - public init(title: String, barcodeId: String, numberOfVolumes: Int, numberOfItems: Int, duration: String, explicit: Bool, releaseDate: Date? = nil, copyright: String? = nil, popularity: Double, availability: [Availability]? = nil, mediaTags: [String], imageLinks: [ImageLink]? = nil, videoLinks: [VideoLink]? = nil, externalLinks: [ExternalLink]? = nil) { - self.title = title - self.barcodeId = barcodeId - self.numberOfVolumes = numberOfVolumes - self.numberOfItems = numberOfItems - self.duration = duration - self.explicit = explicit - self.releaseDate = releaseDate - self.copyright = copyright - self.popularity = popularity - self.availability = availability - self.mediaTags = mediaTags - self.imageLinks = imageLinks - self.videoLinks = videoLinks - self.externalLinks = externalLinks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case barcodeId - case numberOfVolumes - case numberOfItems - case duration - case explicit - case releaseDate - case copyright - case popularity - case availability - case mediaTags - case imageLinks - case videoLinks - case externalLinks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encode(barcodeId, forKey: .barcodeId) - try container.encode(numberOfVolumes, forKey: .numberOfVolumes) - try container.encode(numberOfItems, forKey: .numberOfItems) - try container.encode(duration, forKey: .duration) - try container.encode(explicit, forKey: .explicit) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(videoLinks, forKey: .videoLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumDataDocument.swift b/Sources/Catalogue/Generated/Models/AlbumDataDocument.swift deleted file mode 100644 index a415079b..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumDataDocument.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// AlbumDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AlbumDataDocument: Codable, Hashable { - - public var data: AlbumResource - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [AlbumRelationshipResource]? - - public init(data: AlbumResource, links: Links? = nil, included: [AlbumRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumRelationship.swift b/Sources/Catalogue/Generated/Models/AlbumRelationship.swift deleted file mode 100644 index f12de10d..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumRelationship.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// AlbumRelationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** attributes object representing some of the resource's data */ -public struct AlbumRelationship: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Provider name. Conditionally visible. */ - public var name: String - /** Album popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Represents available links to, and metadata about, an album cover images */ - public var imageLinks: [ImageLink]? - /** Represents available links to something that is related to an album resource, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - /** Original title */ - public var title: String - /** Version of the album's item; complements title */ - public var version: String? - /** ISRC code */ - public var isrc: String - /** Duration (ISO-8601) */ - public var duration: String - /** Copyright information */ - public var copyright: String? - /** Indicates whether an album consist of any explicit content */ - public var explicit: Bool - /** Defines an album availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Barcode id (EAN-13 or UPC-A) */ - public var barcodeId: String - /** Number of volumes */ - public var numberOfVolumes: Int - /** Number of album items */ - public var numberOfItems: Int - /** Represents available links to, and metadata about, an album cover videos */ - public var videoLinks: [VideoLink]? - - public init(name: String, popularity: Double, imageLinks: [ImageLink]? = nil, externalLinks: [ExternalLink]? = nil, title: String, version: String? = nil, isrc: String, duration: String, copyright: String? = nil, explicit: Bool, availability: [Availability]? = nil, mediaTags: [String], releaseDate: Date? = nil, barcodeId: String, numberOfVolumes: Int, numberOfItems: Int, videoLinks: [VideoLink]? = nil) { - self.name = name - self.popularity = popularity - self.imageLinks = imageLinks - self.externalLinks = externalLinks - self.title = title - self.version = version - self.isrc = isrc - self.duration = duration - self.copyright = copyright - self.explicit = explicit - self.availability = availability - self.mediaTags = mediaTags - self.releaseDate = releaseDate - self.barcodeId = barcodeId - self.numberOfVolumes = numberOfVolumes - self.numberOfItems = numberOfItems - self.videoLinks = videoLinks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case name - case popularity - case imageLinks - case externalLinks - case title - case version - case isrc - case duration - case copyright - case explicit - case availability - case mediaTags - case releaseDate - case barcodeId - case numberOfVolumes - case numberOfItems - case videoLinks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(name, forKey: .name) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - try container.encode(title, forKey: .title) - try container.encodeIfPresent(version, forKey: .version) - try container.encode(isrc, forKey: .isrc) - try container.encode(duration, forKey: .duration) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(explicit, forKey: .explicit) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encode(barcodeId, forKey: .barcodeId) - try container.encode(numberOfVolumes, forKey: .numberOfVolumes) - try container.encode(numberOfItems, forKey: .numberOfItems) - try container.encodeIfPresent(videoLinks, forKey: .videoLinks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumRelationshipResource.swift b/Sources/Catalogue/Generated/Models/AlbumRelationshipResource.swift deleted file mode 100644 index b39c7f6e..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumRelationshipResource.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// AlbumRelationshipResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** array of resource objects that are related to the primary data and/or each other */ -public struct AlbumRelationshipResource: Codable, Hashable { - - public var attributes: AlbumRelationship? - /** relationships object describing relationships between the resource and other resources */ - public var relationships: [String: Relationship]? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: AlbumRelationship? = nil, relationships: [String: Relationship]? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumRelationshipsDocument.swift b/Sources/Catalogue/Generated/Models/AlbumRelationshipsDocument.swift deleted file mode 100644 index 2c258a87..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumRelationshipsDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// AlbumRelationshipsDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AlbumRelationshipsDocument: Codable, Hashable { - - /** document's primary data, consist of resource linkage objects */ - public var data: [ResourceIdentifier] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [AlbumRelationshipResource]? - - public init(data: [ResourceIdentifier], links: Links? = nil, included: [AlbumRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumResource.swift b/Sources/Catalogue/Generated/Models/AlbumResource.swift deleted file mode 100644 index 173b8ffb..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumResource.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// AlbumResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** document's primary data */ -public struct AlbumResource: Codable, Hashable { - - public var attributes: AlbumAttributes? - public var relationships: AvailableAlbumRelationships? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: AlbumAttributes? = nil, relationships: AvailableAlbumRelationships? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AlbumsDataDocument.swift b/Sources/Catalogue/Generated/Models/AlbumsDataDocument.swift deleted file mode 100644 index 9393e13c..00000000 --- a/Sources/Catalogue/Generated/Models/AlbumsDataDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// AlbumsDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AlbumsDataDocument: Codable, Hashable { - - /** document's primary data */ - public var data: [AlbumResource] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [AlbumRelationshipResource]? - - public init(data: [AlbumResource], links: Links? = nil, included: [AlbumRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistAttributes.swift b/Sources/Catalogue/Generated/Models/ArtistAttributes.swift deleted file mode 100644 index d19ff69c..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistAttributes.swift +++ /dev/null @@ -1,48 +0,0 @@ -// -// ArtistAttributes.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ArtistAttributes: Codable, Hashable { - - /** Artist name */ - public var name: String - /** Artist popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Represents available links to, and metadata about, an artist images */ - public var imageLinks: [ImageLink]? - /** Represents available links to something that is related to an artist resource, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - - public init(name: String, popularity: Double, imageLinks: [ImageLink]? = nil, externalLinks: [ExternalLink]? = nil) { - self.name = name - self.popularity = popularity - self.imageLinks = imageLinks - self.externalLinks = externalLinks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case name - case popularity - case imageLinks - case externalLinks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(name, forKey: .name) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistDataDocument.swift b/Sources/Catalogue/Generated/Models/ArtistDataDocument.swift deleted file mode 100644 index a725758e..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistDataDocument.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// ArtistDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ArtistDataDocument: Codable, Hashable { - - public var data: ArtistResource - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [ArtistRelationshipResource]? - - public init(data: ArtistResource, links: Links? = nil, included: [ArtistRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistRelationship.swift b/Sources/Catalogue/Generated/Models/ArtistRelationship.swift deleted file mode 100644 index 734280aa..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistRelationship.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// ArtistRelationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** attributes object representing some of the resource's data */ -public struct ArtistRelationship: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Album item's title */ - public var title: String - /** Barcode id (EAN-13 or UPC-A) */ - public var barcodeId: String - /** Number of volumes */ - public var numberOfVolumes: Int - /** Number of album items */ - public var numberOfItems: Int - /** Duration expressed in accordance with ISO 8601 */ - public var duration: String - /** Indicates whether a catalog item consist of any explicit content */ - public var explicit: Bool - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Copyright information */ - public var copyright: String? - /** Artist popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines a catalog item availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Represents available links to, and metadata about, an artist images */ - public var imageLinks: [ImageLink]? - /** Represents available links to, and metadata about, an album cover videos */ - public var videoLinks: [VideoLink]? - /** Represents available links to something that is related to an artist resource, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - /** Version of the album's item; complements title */ - public var version: String? - /** ISRC code */ - public var isrc: String - /** Artist name */ - public var name: String - - public init(title: String, barcodeId: String, numberOfVolumes: Int, numberOfItems: Int, duration: String, explicit: Bool, releaseDate: Date? = nil, copyright: String? = nil, popularity: Double, availability: [Availability]? = nil, mediaTags: [String], imageLinks: [ImageLink]? = nil, videoLinks: [VideoLink]? = nil, externalLinks: [ExternalLink]? = nil, version: String? = nil, isrc: String, name: String) { - self.title = title - self.barcodeId = barcodeId - self.numberOfVolumes = numberOfVolumes - self.numberOfItems = numberOfItems - self.duration = duration - self.explicit = explicit - self.releaseDate = releaseDate - self.copyright = copyright - self.popularity = popularity - self.availability = availability - self.mediaTags = mediaTags - self.imageLinks = imageLinks - self.videoLinks = videoLinks - self.externalLinks = externalLinks - self.version = version - self.isrc = isrc - self.name = name - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case barcodeId - case numberOfVolumes - case numberOfItems - case duration - case explicit - case releaseDate - case copyright - case popularity - case availability - case mediaTags - case imageLinks - case videoLinks - case externalLinks - case version - case isrc - case name - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encode(barcodeId, forKey: .barcodeId) - try container.encode(numberOfVolumes, forKey: .numberOfVolumes) - try container.encode(numberOfItems, forKey: .numberOfItems) - try container.encode(duration, forKey: .duration) - try container.encode(explicit, forKey: .explicit) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(videoLinks, forKey: .videoLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - try container.encodeIfPresent(version, forKey: .version) - try container.encode(isrc, forKey: .isrc) - try container.encode(name, forKey: .name) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistRelationshipResource.swift b/Sources/Catalogue/Generated/Models/ArtistRelationshipResource.swift deleted file mode 100644 index fedb4ce0..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistRelationshipResource.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// ArtistRelationshipResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** array of resource objects that are related to the primary data and/or each other */ -public struct ArtistRelationshipResource: Codable, Hashable { - - public var attributes: ArtistRelationship? - /** relationships object describing relationships between the resource and other resources */ - public var relationships: [String: Relationship]? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: ArtistRelationship? = nil, relationships: [String: Relationship]? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistRelationshipsDocument.swift b/Sources/Catalogue/Generated/Models/ArtistRelationshipsDocument.swift deleted file mode 100644 index 6d4946f6..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistRelationshipsDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// ArtistRelationshipsDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ArtistRelationshipsDocument: Codable, Hashable { - - /** document's primary data, consist of resource linkage objects */ - public var data: [ResourceIdentifier] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [ArtistRelationshipResource]? - - public init(data: [ResourceIdentifier], links: Links? = nil, included: [ArtistRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistResource.swift b/Sources/Catalogue/Generated/Models/ArtistResource.swift deleted file mode 100644 index bf7bdafe..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistResource.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// ArtistResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** document's primary data */ -public struct ArtistResource: Codable, Hashable { - - public var attributes: ArtistAttributes? - public var relationships: AvailableArtistRelationships? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: ArtistAttributes? = nil, relationships: AvailableArtistRelationships? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ArtistsDataDocument.swift b/Sources/Catalogue/Generated/Models/ArtistsDataDocument.swift deleted file mode 100644 index 56bfa0ad..00000000 --- a/Sources/Catalogue/Generated/Models/ArtistsDataDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// ArtistsDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ArtistsDataDocument: Codable, Hashable { - - /** document's primary data */ - public var data: [ArtistResource] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [ArtistRelationshipResource]? - - public init(data: [ArtistResource], links: Links? = nil, included: [ArtistRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationships.swift b/Sources/Catalogue/Generated/Models/AvailableAlbumRelationships.swift deleted file mode 100644 index 023a8f15..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationships.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// AvailableAlbumRelationships.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** Available album relationships */ -public struct AvailableAlbumRelationships: Codable, Hashable { - - public var artists: ResourceRelationship? - public var similarAlbums: ResourceRelationship? - public var items: AvailableAlbumRelationshipsItems? - public var providers: ResourceRelationship? - - public init(artists: ResourceRelationship? = nil, similarAlbums: ResourceRelationship? = nil, items: AvailableAlbumRelationshipsItems? = nil, providers: ResourceRelationship? = nil) { - self.artists = artists - self.similarAlbums = similarAlbums - self.items = items - self.providers = providers - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case artists - case similarAlbums - case items - case providers - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(artists, forKey: .artists) - try container.encodeIfPresent(similarAlbums, forKey: .similarAlbums) - try container.encodeIfPresent(items, forKey: .items) - try container.encodeIfPresent(providers, forKey: .providers) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItems.swift b/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItems.swift deleted file mode 100644 index 1653f441..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItems.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AvailableAlbumRelationshipsItems.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AvailableAlbumRelationshipsItems: Codable, Hashable { - - public var data: [AvailableAlbumRelationshipsItemsDataInner]? - public var links: Links? - - public init(data: [AvailableAlbumRelationshipsItemsDataInner]? = nil, links: Links? = nil) { - self.data = data - self.links = links - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInner.swift b/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInner.swift deleted file mode 100644 index 6eece680..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInner.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// AvailableAlbumRelationshipsItemsDataInner.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AvailableAlbumRelationshipsItemsDataInner: Codable, Hashable { - - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - public var meta: AvailableAlbumRelationshipsItemsDataInnerMeta? - - public init(id: String, type: String, meta: AvailableAlbumRelationshipsItemsDataInnerMeta? = nil) { - self.id = id - self.type = type - self.meta = meta - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case id - case type - case meta - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - try container.encodeIfPresent(meta, forKey: .meta) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInnerMeta.swift b/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInnerMeta.swift deleted file mode 100644 index 7262b51c..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableAlbumRelationshipsItemsDataInnerMeta.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// AvailableAlbumRelationshipsItemsDataInnerMeta.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct AvailableAlbumRelationshipsItemsDataInnerMeta: Codable, Hashable { - - /** volume number */ - public var volumeNumber: Int - /** track number */ - public var trackNumber: Int - - public init(volumeNumber: Int, trackNumber: Int) { - self.volumeNumber = volumeNumber - self.trackNumber = trackNumber - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case volumeNumber - case trackNumber - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(volumeNumber, forKey: .volumeNumber) - try container.encode(trackNumber, forKey: .trackNumber) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableArtistRelationships.swift b/Sources/Catalogue/Generated/Models/AvailableArtistRelationships.swift deleted file mode 100644 index fbd30269..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableArtistRelationships.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// AvailableArtistRelationships.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** Available artist relationships */ -public struct AvailableArtistRelationships: Codable, Hashable { - - public var similarArtists: ResourceRelationship? - public var albums: ResourceRelationship? - public var videos: ResourceRelationship? - public var tracks: ResourceRelationship? - - public init(similarArtists: ResourceRelationship? = nil, albums: ResourceRelationship? = nil, videos: ResourceRelationship? = nil, tracks: ResourceRelationship? = nil) { - self.similarArtists = similarArtists - self.albums = albums - self.videos = videos - self.tracks = tracks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case similarArtists - case albums - case videos - case tracks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(similarArtists, forKey: .similarArtists) - try container.encodeIfPresent(albums, forKey: .albums) - try container.encodeIfPresent(videos, forKey: .videos) - try container.encodeIfPresent(tracks, forKey: .tracks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableTrackRelationships.swift b/Sources/Catalogue/Generated/Models/AvailableTrackRelationships.swift deleted file mode 100644 index da4e5230..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableTrackRelationships.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// AvailableTrackRelationships.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** Available track relationships */ -public struct AvailableTrackRelationships: Codable, Hashable { - - public var albums: ResourceRelationship? - public var artists: ResourceRelationship? - public var similarTracks: ResourceRelationship? - public var providers: ResourceRelationship? - - public init(albums: ResourceRelationship? = nil, artists: ResourceRelationship? = nil, similarTracks: ResourceRelationship? = nil, providers: ResourceRelationship? = nil) { - self.albums = albums - self.artists = artists - self.similarTracks = similarTracks - self.providers = providers - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case albums - case artists - case similarTracks - case providers - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(albums, forKey: .albums) - try container.encodeIfPresent(artists, forKey: .artists) - try container.encodeIfPresent(similarTracks, forKey: .similarTracks) - try container.encodeIfPresent(providers, forKey: .providers) - } -} - diff --git a/Sources/Catalogue/Generated/Models/AvailableVideoRelationships.swift b/Sources/Catalogue/Generated/Models/AvailableVideoRelationships.swift deleted file mode 100644 index db12b8a1..00000000 --- a/Sources/Catalogue/Generated/Models/AvailableVideoRelationships.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// AvailableVideoRelationships.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** Available video relationships */ -public struct AvailableVideoRelationships: Codable, Hashable { - - public var albums: ResourceRelationship? - public var artists: ResourceRelationship? - public var providers: ResourceRelationship? - - public init(albums: ResourceRelationship? = nil, artists: ResourceRelationship? = nil, providers: ResourceRelationship? = nil) { - self.albums = albums - self.artists = artists - self.providers = providers - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case albums - case artists - case providers - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(albums, forKey: .albums) - try container.encodeIfPresent(artists, forKey: .artists) - try container.encodeIfPresent(providers, forKey: .providers) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ErrorDocument.swift b/Sources/Catalogue/Generated/Models/ErrorDocument.swift deleted file mode 100644 index ad084622..00000000 --- a/Sources/Catalogue/Generated/Models/ErrorDocument.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ErrorDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ErrorDocument: Codable, Hashable { - - /** array of error objects */ - public var errors: [ErrorObject]? - public var links: Links? - - public init(errors: [ErrorObject]? = nil, links: Links? = nil) { - self.errors = errors - self.links = links - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case errors - case links - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(errors, forKey: .errors) - try container.encodeIfPresent(links, forKey: .links) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ErrorObject.swift b/Sources/Catalogue/Generated/Models/ErrorObject.swift deleted file mode 100644 index bce8d5c9..00000000 --- a/Sources/Catalogue/Generated/Models/ErrorObject.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// ErrorObject.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ErrorObject: Codable, Hashable { - - /** unique identifier for this particular occurrence of the problem */ - public var id: String? - /** HTTP status code applicable to this problem */ - public var status: String? - /** application-specific error code */ - public var code: String? - /** human-readable explanation specific to this occurrence of the problem */ - public var detail: String? - public var source: ErrorObjectSource? - - public init(id: String? = nil, status: String? = nil, code: String? = nil, detail: String? = nil, source: ErrorObjectSource? = nil) { - self.id = id - self.status = status - self.code = code - self.detail = detail - self.source = source - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case id - case status - case code - case detail - case source - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(id, forKey: .id) - try container.encodeIfPresent(status, forKey: .status) - try container.encodeIfPresent(code, forKey: .code) - try container.encodeIfPresent(detail, forKey: .detail) - try container.encodeIfPresent(source, forKey: .source) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ErrorObjectSource.swift b/Sources/Catalogue/Generated/Models/ErrorObjectSource.swift deleted file mode 100644 index d820ffb9..00000000 --- a/Sources/Catalogue/Generated/Models/ErrorObjectSource.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// ErrorObjectSource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** object containing references to the primary source of the error */ -public struct ErrorObjectSource: Codable, Hashable { - - /** a JSON Pointer [RFC6901] to the value in the request document that caused the error */ - public var pointer: String? - /** string indicating which URI query parameter caused the error. */ - public var parameter: String? - /** string indicating the name of a single request header which caused the error */ - public var header: String? - - public init(pointer: String? = nil, parameter: String? = nil, header: String? = nil) { - self.pointer = pointer - self.parameter = parameter - self.header = header - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case pointer - case parameter - case header - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(pointer, forKey: .pointer) - try container.encodeIfPresent(parameter, forKey: .parameter) - try container.encodeIfPresent(header, forKey: .header) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ExternalLink.swift b/Sources/Catalogue/Generated/Models/ExternalLink.swift deleted file mode 100644 index 4c51d4fd..00000000 --- a/Sources/Catalogue/Generated/Models/ExternalLink.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ExternalLink.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ExternalLink: Codable, Hashable { - - /** link to something that is related to a resource */ - public var href: String - public var meta: ExternalLinkMeta - - public init(href: String, meta: ExternalLinkMeta) { - self.href = href - self.meta = meta - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case href - case meta - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(href, forKey: .href) - try container.encode(meta, forKey: .meta) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ExternalLinkMeta.swift b/Sources/Catalogue/Generated/Models/ExternalLinkMeta.swift deleted file mode 100644 index f9f6af4c..00000000 --- a/Sources/Catalogue/Generated/Models/ExternalLinkMeta.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// ExternalLinkMeta.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** metadata about an external link */ -public struct ExternalLinkMeta: Codable, Hashable { - - public enum ModelType: String, Codable, CaseIterable { - case tidalSharing = "TIDAL_SHARING" - case tidalAutoplayAndroid = "TIDAL_AUTOPLAY_ANDROID" - case tidalAutoplayIos = "TIDAL_AUTOPLAY_IOS" - case tidalAutoplayWeb = "TIDAL_AUTOPLAY_WEB" - case twitter = "TWITTER" - case facebook = "FACEBOOK" - case instagram = "INSTAGRAM" - case tiktok = "TIKTOK" - case snapchat = "SNAPCHAT" - case homepage = "HOMEPAGE" - } - /** external link type */ - public var type: ModelType - - public init(type: ModelType) { - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ImageLink.swift b/Sources/Catalogue/Generated/Models/ImageLink.swift deleted file mode 100644 index 126e0a88..00000000 --- a/Sources/Catalogue/Generated/Models/ImageLink.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ImageLink.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ImageLink: Codable, Hashable { - - /** link to an image */ - public var href: String - public var meta: ImageLinkMeta - - public init(href: String, meta: ImageLinkMeta) { - self.href = href - self.meta = meta - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case href - case meta - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(href, forKey: .href) - try container.encode(meta, forKey: .meta) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ImageLinkMeta.swift b/Sources/Catalogue/Generated/Models/ImageLinkMeta.swift deleted file mode 100644 index 9c332211..00000000 --- a/Sources/Catalogue/Generated/Models/ImageLinkMeta.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// ImageLinkMeta.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** metadata about an image */ -public struct ImageLinkMeta: Codable, Hashable { - - /** image width (in pixels) */ - public var width: Int - /** image height (in pixels) */ - public var height: Int - - public init(width: Int, height: Int) { - self.width = width - self.height = height - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case width - case height - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(width, forKey: .width) - try container.encode(height, forKey: .height) - } -} - diff --git a/Sources/Catalogue/Generated/Models/Links.swift b/Sources/Catalogue/Generated/Models/Links.swift deleted file mode 100644 index 704242cc..00000000 --- a/Sources/Catalogue/Generated/Models/Links.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// Links.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** links object */ -public struct Links: Codable, Hashable { - - /** the link that generated the current response document */ - public var _self: String - /** the next page of data (pagination) */ - public var next: String? - - public init(_self: String, next: String? = nil) { - self._self = _self - self.next = next - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case _self = "self" - case next - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(_self, forKey: ._self) - try container.encodeIfPresent(next, forKey: .next) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ProviderAttributes.swift b/Sources/Catalogue/Generated/Models/ProviderAttributes.swift deleted file mode 100644 index 0faab7c3..00000000 --- a/Sources/Catalogue/Generated/Models/ProviderAttributes.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// ProviderAttributes.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ProviderAttributes: Codable, Hashable { - - /** Provider name. Conditionally visible. */ - public var name: String - - public init(name: String) { - self.name = name - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case name - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(name, forKey: .name) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ProviderDataDocument.swift b/Sources/Catalogue/Generated/Models/ProviderDataDocument.swift deleted file mode 100644 index df2723d5..00000000 --- a/Sources/Catalogue/Generated/Models/ProviderDataDocument.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// ProviderDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ProviderDataDocument: Codable, Hashable { - - public var data: ProviderResource - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [ProviderRelationshipResource]? - - public init(data: ProviderResource, links: Links? = nil, included: [ProviderRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ProviderRelationshipResource.swift b/Sources/Catalogue/Generated/Models/ProviderRelationshipResource.swift deleted file mode 100644 index 94fc7dbc..00000000 --- a/Sources/Catalogue/Generated/Models/ProviderRelationshipResource.swift +++ /dev/null @@ -1,53 +0,0 @@ -// -// ProviderRelationshipResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** array of resource objects that are related to the primary data and/or each other */ -public struct ProviderRelationshipResource: Codable, Hashable { - - /** attributes object representing some of the resource's data */ - public var attributes: AnyCodable? - /** relationships object describing relationships between the resource and other resources */ - public var relationships: [String: Relationship]? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: AnyCodable? = nil, relationships: [String: Relationship]? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ProviderResource.swift b/Sources/Catalogue/Generated/Models/ProviderResource.swift deleted file mode 100644 index 3df298fe..00000000 --- a/Sources/Catalogue/Generated/Models/ProviderResource.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// ProviderResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** document's primary data */ -public struct ProviderResource: Codable, Hashable { - - public var attributes: ProviderAttributes? - /** Available provider relationships */ - public var relationships: AnyCodable? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: ProviderAttributes? = nil, relationships: AnyCodable? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ProvidersDataDocument.swift b/Sources/Catalogue/Generated/Models/ProvidersDataDocument.swift deleted file mode 100644 index 8e3dca1d..00000000 --- a/Sources/Catalogue/Generated/Models/ProvidersDataDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// ProvidersDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ProvidersDataDocument: Codable, Hashable { - - /** document's primary data */ - public var data: [ProviderResource] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [ProviderRelationshipResource]? - - public init(data: [ProviderResource], links: Links? = nil, included: [ProviderRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/Relationship.swift b/Sources/Catalogue/Generated/Models/Relationship.swift deleted file mode 100644 index 88f82402..00000000 --- a/Sources/Catalogue/Generated/Models/Relationship.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// Relationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** relationships object describing relationships between the resource and other resources */ -public struct Relationship: Codable, Hashable { - - /** resource linkage */ - public var data: [ResourceIdentifier]? - public var links: Links? - - public init(data: [ResourceIdentifier]? = nil, links: Links? = nil) { - self.data = data - self.links = links - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ResourceIdentifier.swift b/Sources/Catalogue/Generated/Models/ResourceIdentifier.swift deleted file mode 100644 index 273abc6e..00000000 --- a/Sources/Catalogue/Generated/Models/ResourceIdentifier.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// ResourceIdentifier.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ResourceIdentifier: Codable, Hashable { - - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(id: String, type: String) { - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/ResourceRelationship.swift b/Sources/Catalogue/Generated/Models/ResourceRelationship.swift deleted file mode 100644 index 73d558ec..00000000 --- a/Sources/Catalogue/Generated/Models/ResourceRelationship.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// ResourceRelationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct ResourceRelationship: Codable, Hashable { - - /** resource linkage */ - public var data: [ResourceIdentifier]? - public var links: Links? - - public init(data: [ResourceIdentifier]? = nil, links: Links? = nil) { - self.data = data - self.links = links - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackAttributes.swift b/Sources/Catalogue/Generated/Models/TrackAttributes.swift deleted file mode 100644 index e5a9b054..00000000 --- a/Sources/Catalogue/Generated/Models/TrackAttributes.swift +++ /dev/null @@ -1,82 +0,0 @@ -// -// TrackAttributes.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct TrackAttributes: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Album item's title */ - public var title: String - /** Version of the album's item; complements title */ - public var version: String? - /** ISRC code */ - public var isrc: String - /** Duration expressed in accordance with ISO 8601 */ - public var duration: String - /** Copyright information */ - public var copyright: String? - /** Indicates whether a catalog item consist of any explicit content */ - public var explicit: Bool - /** Track or video popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines a catalog item availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Represents available links to something that is related to a catalog item, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - - public init(title: String, version: String? = nil, isrc: String, duration: String, copyright: String? = nil, explicit: Bool, popularity: Double, availability: [Availability]? = nil, mediaTags: [String], externalLinks: [ExternalLink]? = nil) { - self.title = title - self.version = version - self.isrc = isrc - self.duration = duration - self.copyright = copyright - self.explicit = explicit - self.popularity = popularity - self.availability = availability - self.mediaTags = mediaTags - self.externalLinks = externalLinks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case version - case isrc - case duration - case copyright - case explicit - case popularity - case availability - case mediaTags - case externalLinks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encodeIfPresent(version, forKey: .version) - try container.encode(isrc, forKey: .isrc) - try container.encode(duration, forKey: .duration) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(explicit, forKey: .explicit) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackDataDocument.swift b/Sources/Catalogue/Generated/Models/TrackDataDocument.swift deleted file mode 100644 index 5ca24fa9..00000000 --- a/Sources/Catalogue/Generated/Models/TrackDataDocument.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// TrackDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct TrackDataDocument: Codable, Hashable { - - public var data: TrackResource - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [TrackRelationshipResource]? - - public init(data: TrackResource, links: Links? = nil, included: [TrackRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackRelationship.swift b/Sources/Catalogue/Generated/Models/TrackRelationship.swift deleted file mode 100644 index 6e616c37..00000000 --- a/Sources/Catalogue/Generated/Models/TrackRelationship.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// TrackRelationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** attributes object representing some of the resource's data */ -public struct TrackRelationship: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Album item's title */ - public var title: String - /** Barcode id (EAN-13 or UPC-A) */ - public var barcodeId: String - /** Number of volumes */ - public var numberOfVolumes: Int - /** Number of album items */ - public var numberOfItems: Int - /** Duration expressed in accordance with ISO 8601 */ - public var duration: String - /** Indicates whether a catalog item consist of any explicit content */ - public var explicit: Bool - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Copyright information */ - public var copyright: String? - /** Track or video popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines a catalog item availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Represents available links to, and metadata about, an artist images */ - public var imageLinks: [ImageLink]? - /** Represents available links to, and metadata about, an album cover videos */ - public var videoLinks: [VideoLink]? - /** Represents available links to something that is related to a catalog item, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - /** Provider name. Conditionally visible. */ - public var name: String - /** Version of the album's item; complements title */ - public var version: String? - /** ISRC code */ - public var isrc: String - - public init(title: String, barcodeId: String, numberOfVolumes: Int, numberOfItems: Int, duration: String, explicit: Bool, releaseDate: Date? = nil, copyright: String? = nil, popularity: Double, availability: [Availability]? = nil, mediaTags: [String], imageLinks: [ImageLink]? = nil, videoLinks: [VideoLink]? = nil, externalLinks: [ExternalLink]? = nil, name: String, version: String? = nil, isrc: String) { - self.title = title - self.barcodeId = barcodeId - self.numberOfVolumes = numberOfVolumes - self.numberOfItems = numberOfItems - self.duration = duration - self.explicit = explicit - self.releaseDate = releaseDate - self.copyright = copyright - self.popularity = popularity - self.availability = availability - self.mediaTags = mediaTags - self.imageLinks = imageLinks - self.videoLinks = videoLinks - self.externalLinks = externalLinks - self.name = name - self.version = version - self.isrc = isrc - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case barcodeId - case numberOfVolumes - case numberOfItems - case duration - case explicit - case releaseDate - case copyright - case popularity - case availability - case mediaTags - case imageLinks - case videoLinks - case externalLinks - case name - case version - case isrc - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encode(barcodeId, forKey: .barcodeId) - try container.encode(numberOfVolumes, forKey: .numberOfVolumes) - try container.encode(numberOfItems, forKey: .numberOfItems) - try container.encode(duration, forKey: .duration) - try container.encode(explicit, forKey: .explicit) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(videoLinks, forKey: .videoLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - try container.encode(name, forKey: .name) - try container.encodeIfPresent(version, forKey: .version) - try container.encode(isrc, forKey: .isrc) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackRelationshipResource.swift b/Sources/Catalogue/Generated/Models/TrackRelationshipResource.swift deleted file mode 100644 index 2617c843..00000000 --- a/Sources/Catalogue/Generated/Models/TrackRelationshipResource.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// TrackRelationshipResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** array of resource objects that are related to the primary data and/or each other */ -public struct TrackRelationshipResource: Codable, Hashable { - - public var attributes: TrackRelationship? - /** relationships object describing relationships between the resource and other resources */ - public var relationships: [String: Relationship]? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: TrackRelationship? = nil, relationships: [String: Relationship]? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackRelationshipsDocument.swift b/Sources/Catalogue/Generated/Models/TrackRelationshipsDocument.swift deleted file mode 100644 index b932fa67..00000000 --- a/Sources/Catalogue/Generated/Models/TrackRelationshipsDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// TrackRelationshipsDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct TrackRelationshipsDocument: Codable, Hashable { - - /** document's primary data, consist of resource linkage objects */ - public var data: [ResourceIdentifier] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [TrackRelationshipResource]? - - public init(data: [ResourceIdentifier], links: Links? = nil, included: [TrackRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TrackResource.swift b/Sources/Catalogue/Generated/Models/TrackResource.swift deleted file mode 100644 index 2f578fa7..00000000 --- a/Sources/Catalogue/Generated/Models/TrackResource.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// TrackResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** document's primary data */ -public struct TrackResource: Codable, Hashable { - - public var attributes: TrackAttributes? - public var relationships: AvailableTrackRelationships? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: TrackAttributes? = nil, relationships: AvailableTrackRelationships? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/TracksDataDocument.swift b/Sources/Catalogue/Generated/Models/TracksDataDocument.swift deleted file mode 100644 index ae1487c8..00000000 --- a/Sources/Catalogue/Generated/Models/TracksDataDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// TracksDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct TracksDataDocument: Codable, Hashable { - - /** document's primary data */ - public var data: [TrackResource] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [TrackRelationshipResource]? - - public init(data: [TrackResource], links: Links? = nil, included: [TrackRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoAttributes.swift b/Sources/Catalogue/Generated/Models/VideoAttributes.swift deleted file mode 100644 index 86f8ff0b..00000000 --- a/Sources/Catalogue/Generated/Models/VideoAttributes.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// VideoAttributes.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** attributes object representing some of the resource's data */ -public struct VideoAttributes: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Album item's title */ - public var title: String - /** Version of the album's item; complements title */ - public var version: String? - /** ISRC code */ - public var isrc: String - /** Duration expressed in accordance with ISO 8601 */ - public var duration: String - /** Copyright information */ - public var copyright: String? - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Indicates whether a catalog item consist of any explicit content */ - public var explicit: Bool - /** Track or video popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines a catalog item availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - /** Represents available links to, and metadata about, an album item images */ - public var imageLinks: [ImageLink]? - /** Represents available links to something that is related to a catalog item, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - - public init(title: String, version: String? = nil, isrc: String, duration: String, copyright: String? = nil, releaseDate: Date? = nil, explicit: Bool, popularity: Double, availability: [Availability]? = nil, imageLinks: [ImageLink]? = nil, externalLinks: [ExternalLink]? = nil) { - self.title = title - self.version = version - self.isrc = isrc - self.duration = duration - self.copyright = copyright - self.releaseDate = releaseDate - self.explicit = explicit - self.popularity = popularity - self.availability = availability - self.imageLinks = imageLinks - self.externalLinks = externalLinks - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case version - case isrc - case duration - case copyright - case releaseDate - case explicit - case popularity - case availability - case imageLinks - case externalLinks - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encodeIfPresent(version, forKey: .version) - try container.encode(isrc, forKey: .isrc) - try container.encode(duration, forKey: .duration) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encode(explicit, forKey: .explicit) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoDataDocument.swift b/Sources/Catalogue/Generated/Models/VideoDataDocument.swift deleted file mode 100644 index 07cf454c..00000000 --- a/Sources/Catalogue/Generated/Models/VideoDataDocument.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// VideoDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct VideoDataDocument: Codable, Hashable { - - public var data: VideoResource - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [VideoRelationshipResource]? - - public init(data: VideoResource, links: Links? = nil, included: [VideoRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoLink.swift b/Sources/Catalogue/Generated/Models/VideoLink.swift deleted file mode 100644 index f9b1dd71..00000000 --- a/Sources/Catalogue/Generated/Models/VideoLink.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// VideoLink.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct VideoLink: Codable, Hashable { - - /** link to a video */ - public var href: String - public var meta: VideoLinkMeta - - public init(href: String, meta: VideoLinkMeta) { - self.href = href - self.meta = meta - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case href - case meta - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(href, forKey: .href) - try container.encode(meta, forKey: .meta) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoLinkMeta.swift b/Sources/Catalogue/Generated/Models/VideoLinkMeta.swift deleted file mode 100644 index f5ea0912..00000000 --- a/Sources/Catalogue/Generated/Models/VideoLinkMeta.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// VideoLinkMeta.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** metadata about a video */ -public struct VideoLinkMeta: Codable, Hashable { - - /** video width (in pixels) */ - public var width: Int - /** video height (in pixels) */ - public var height: Int - - public init(width: Int, height: Int) { - self.width = width - self.height = height - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case width - case height - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(width, forKey: .width) - try container.encode(height, forKey: .height) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoRelationship.swift b/Sources/Catalogue/Generated/Models/VideoRelationship.swift deleted file mode 100644 index 0afaed33..00000000 --- a/Sources/Catalogue/Generated/Models/VideoRelationship.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// VideoRelationship.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** attributes object representing some of the resource's data */ -public struct VideoRelationship: Codable, Hashable { - - public enum Availability: String, Codable, CaseIterable { - case stream = "STREAM" - case dj = "DJ" - case stem = "STEM" - } - /** Original title */ - public var title: String - /** Barcode id (EAN-13 or UPC-A) */ - public var barcodeId: String - /** Number of volumes */ - public var numberOfVolumes: Int - /** Number of album items */ - public var numberOfItems: Int - /** Duration (ISO-8601) */ - public var duration: String - /** Indicates whether an album consist of any explicit content */ - public var explicit: Bool - /** Release date (ISO-8601) */ - public var releaseDate: Date? - /** Copyright information */ - public var copyright: String? - /** Artist popularity (ranged in 0.00 ... 1.00). Conditionally visible */ - public var popularity: Double - /** Defines an album availability e.g. for streaming, DJs, stems */ - public var availability: [Availability]? - public var mediaTags: [String] - /** Represents available links to, and metadata about, an artist images */ - public var imageLinks: [ImageLink]? - /** Represents available links to, and metadata about, an album cover videos */ - public var videoLinks: [VideoLink]? - /** Represents available links to something that is related to an artist resource, but external to the TIDAL API */ - public var externalLinks: [ExternalLink]? - /** Provider name. Conditionally visible. */ - public var name: String - - public init(title: String, barcodeId: String, numberOfVolumes: Int, numberOfItems: Int, duration: String, explicit: Bool, releaseDate: Date? = nil, copyright: String? = nil, popularity: Double, availability: [Availability]? = nil, mediaTags: [String], imageLinks: [ImageLink]? = nil, videoLinks: [VideoLink]? = nil, externalLinks: [ExternalLink]? = nil, name: String) { - self.title = title - self.barcodeId = barcodeId - self.numberOfVolumes = numberOfVolumes - self.numberOfItems = numberOfItems - self.duration = duration - self.explicit = explicit - self.releaseDate = releaseDate - self.copyright = copyright - self.popularity = popularity - self.availability = availability - self.mediaTags = mediaTags - self.imageLinks = imageLinks - self.videoLinks = videoLinks - self.externalLinks = externalLinks - self.name = name - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case title - case barcodeId - case numberOfVolumes - case numberOfItems - case duration - case explicit - case releaseDate - case copyright - case popularity - case availability - case mediaTags - case imageLinks - case videoLinks - case externalLinks - case name - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(title, forKey: .title) - try container.encode(barcodeId, forKey: .barcodeId) - try container.encode(numberOfVolumes, forKey: .numberOfVolumes) - try container.encode(numberOfItems, forKey: .numberOfItems) - try container.encode(duration, forKey: .duration) - try container.encode(explicit, forKey: .explicit) - try container.encodeIfPresent(releaseDate, forKey: .releaseDate) - try container.encodeIfPresent(copyright, forKey: .copyright) - try container.encode(popularity, forKey: .popularity) - try container.encodeIfPresent(availability, forKey: .availability) - try container.encode(mediaTags, forKey: .mediaTags) - try container.encodeIfPresent(imageLinks, forKey: .imageLinks) - try container.encodeIfPresent(videoLinks, forKey: .videoLinks) - try container.encodeIfPresent(externalLinks, forKey: .externalLinks) - try container.encode(name, forKey: .name) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoRelationshipResource.swift b/Sources/Catalogue/Generated/Models/VideoRelationshipResource.swift deleted file mode 100644 index c16bbad3..00000000 --- a/Sources/Catalogue/Generated/Models/VideoRelationshipResource.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// VideoRelationshipResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** array of resource objects that are related to the primary data and/or each other */ -public struct VideoRelationshipResource: Codable, Hashable { - - public var attributes: VideoRelationship? - /** relationships object describing relationships between the resource and other resources */ - public var relationships: [String: Relationship]? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: VideoRelationship? = nil, relationships: [String: Relationship]? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoRelationshipsDocument.swift b/Sources/Catalogue/Generated/Models/VideoRelationshipsDocument.swift deleted file mode 100644 index 76cd53b9..00000000 --- a/Sources/Catalogue/Generated/Models/VideoRelationshipsDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// VideoRelationshipsDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct VideoRelationshipsDocument: Codable, Hashable { - - /** document's primary data, consist of resource linkage objects */ - public var data: [ResourceIdentifier] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [VideoRelationshipResource]? - - public init(data: [ResourceIdentifier], links: Links? = nil, included: [VideoRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideoResource.swift b/Sources/Catalogue/Generated/Models/VideoResource.swift deleted file mode 100644 index 2910951c..00000000 --- a/Sources/Catalogue/Generated/Models/VideoResource.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// VideoResource.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -/** document's primary data */ -public struct VideoResource: Codable, Hashable { - - public var attributes: VideoAttributes? - public var relationships: AvailableVideoRelationships? - public var links: Links? - /** resource unique identifier */ - public var id: String - /** resource unique type */ - public var type: String - - public init(attributes: VideoAttributes? = nil, relationships: AvailableVideoRelationships? = nil, links: Links? = nil, id: String, type: String) { - self.attributes = attributes - self.relationships = relationships - self.links = links - self.id = id - self.type = type - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case attributes - case relationships - case links - case id - case type - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(attributes, forKey: .attributes) - try container.encodeIfPresent(relationships, forKey: .relationships) - try container.encodeIfPresent(links, forKey: .links) - try container.encode(id, forKey: .id) - try container.encode(type, forKey: .type) - } -} - diff --git a/Sources/Catalogue/Generated/Models/VideosDataDocument.swift b/Sources/Catalogue/Generated/Models/VideosDataDocument.swift deleted file mode 100644 index 0f031583..00000000 --- a/Sources/Catalogue/Generated/Models/VideosDataDocument.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// VideosDataDocument.swift -// -// Generated by openapi-generator -// https://openapi-generator.tech -// - -import Foundation -#if canImport(AnyCodable) -import AnyCodable -#endif - -public struct VideosDataDocument: Codable, Hashable { - - /** document's primary data */ - public var data: [VideoResource] - public var links: Links? - /** array of resource objects that are related to the primary data and/or each other */ - public var included: [VideoRelationshipResource]? - - public init(data: [VideoResource], links: Links? = nil, included: [VideoRelationshipResource]? = nil) { - self.data = data - self.links = links - self.included = included - } - - public enum CodingKeys: String, CodingKey, CaseIterable { - case data - case links - case included - } - - // Encodable protocol methods - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encode(data, forKey: .data) - try container.encodeIfPresent(links, forKey: .links) - try container.encodeIfPresent(included, forKey: .included) - } -} - diff --git a/Sources/Catalogue/README.md b/Sources/Catalogue/README.md deleted file mode 100644 index 4521bbd2..00000000 --- a/Sources/Catalogue/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Catalogue -Add here one or two sentences what this library is. - ---- -## Prerequisites -This is a section about things you need to use the software and how to install them. - ---- -## Installation -Add installation instructions here. - ---- -## Usage -Use this space to show useful examples of how this module can be used. Additional screenshots, code examples and demos work well in this space. You may also link to more resources. - ---- -## Contributing -How can others contribute to this? - ---- -## License -Add license information for this open source project. diff --git a/Sources/Catalogue/openapi/catalogue_openapi.json b/Sources/Catalogue/openapi/catalogue_openapi.json deleted file mode 100644 index 0273649d..00000000 --- a/Sources/Catalogue/openapi/catalogue_openapi.json +++ /dev/null @@ -1,11847 +0,0 @@ -{ - "openapi" : "3.0.1", - "info" : { - "title" : "Catalogue v2 - beta", - "description" : "The Catalogue API v2 provides a set of JSON:API compatible endpoints for accessing the TIDAL metadata catalogue: albums, artists, tracks, videos, and more", - "contact" : { - "url" : "https://github.com/orgs/tidal-music/discussions" - }, - "version" : "1.0.0", - "x-url-compatible-spec-id" : "catalogue-v2", - "x-spec-default-endpoint-url-unique-name" : "get-artists-v2" - }, - "externalDocs" : { - "description" : "TIDAL Developer Documentation", - "url" : "https://developer.tidal.com/documentation" - }, - "servers" : [ { - "url" : "https://openapi.stage.tidal.com/v2", - "description" : "Staging" - } ], - "tags" : [ { - "name" : "Album JSON:API", - "description" : "Album JSON:API endpoints" - }, { - "name" : "Artist JSON:API", - "description" : "Artist JSON:API endpoints" - }, { - "name" : "Track JSON:API", - "description" : "Track JSON:API endpoints" - }, { - "name" : "Video JSON:API", - "description" : "Video JSON:API endpoints" - }, { - "name" : "Provider JSON:API", - "description" : "Provider JSON:API endpoints" - } ], - "paths" : { - "/videos" : { - "get" : { - "tags" : [ "Video JSON:API" ], - "summary" : "Get multiple videos", - "description" : "Retrieve multiple video details.", - "operationId" : "getVideos", - "parameters" : [ { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, albums, providers", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - }, { - "name" : "filter[id]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on id attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "75623239" - } - } - }, { - "name" : "filter[isrc]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on isrc attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "USSM21600755" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Videos_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ "id", "isrc" ], - "url-compatible-unique-name" : "get-videos-v2", - "json-api-available-relationships" : [ "artists", "albums", "providers" ] - } - } - }, - "/videos/{id}" : { - "get" : { - "tags" : [ "Video JSON:API" ], - "summary" : "Get single video", - "description" : "Retrieve video details by TIDAL video id.", - "operationId" : "getVideo", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL video id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 75623239 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, albums, providers", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Video_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-video-v2", - "json-api-available-relationships" : [ "artists", "albums", "providers" ] - } - } - }, - "/videos/{id}/relationships/providers" : { - "get" : { - "tags" : [ "Video JSON:API" ], - "summary" : "Relationship: providers", - "description" : "This endpoint can be used to retrieve a list of video's related providers.", - "operationId" : "getVideoProviders", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the video", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 75623239 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: providers", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "providers" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Video_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-video-providers-v2", - "json-api-available-relationships" : [ "providers" ] - } - } - }, - "/videos/{id}/relationships/artists" : { - "get" : { - "tags" : [ "Video JSON:API" ], - "summary" : "Relationship: artists", - "description" : "Retrieve artist details of the related video.", - "operationId" : "getVideoArtists", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL video id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 75623239 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Video_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-video-artists-v2", - "json-api-available-relationships" : [ "artists" ] - } - } - }, - "/videos/{id}/relationships/albums" : { - "get" : { - "tags" : [ "Video JSON:API" ], - "summary" : "Relationship: albums", - "description" : "Retrieve album details of the related video.", - "operationId" : "getVideoAlbums", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL video id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 75623239 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: albums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "albums" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Video_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-video-albums-v2", - "json-api-available-relationships" : [ "albums" ] - } - } - }, - "/tracks" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Get multiple tracks", - "description" : "Retrieve multiple track details.", - "operationId" : "getTracks", - "parameters" : [ { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, albums, providers, similarTracks", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - }, { - "name" : "filter[id]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on id attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "251380837" - } - } - }, { - "name" : "filter[isrc]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on isrc attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "USSM12209515" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Tracks_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ "id", "isrc" ], - "url-compatible-unique-name" : "get-tracks-v2", - "json-api-available-relationships" : [ "artists", "albums", "providers", "similarTracks" ] - } - } - }, - "/tracks/{id}" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Get single track", - "description" : "Retrieve track details by TIDAL track id.", - "operationId" : "getTrack", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL track id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380837 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, albums, providers, similarTracks", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Track_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-track-v2", - "json-api-available-relationships" : [ "artists", "albums", "providers", "similarTracks" ] - } - } - }, - "/tracks/{id}/relationships/similarTracks" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Relationship: similar tracks", - "description" : "This endpoint can be used to retrieve a list of tracks similar to the given track.", - "operationId" : "getSimilarAlbums", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the track", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380837 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: similarTracks", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "similarTracks" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Track_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-similar-tracks-v2", - "json-api-available-relationships" : [ "similarTracks" ] - } - } - }, - "/tracks/{id}/relationships/providers" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Relationship: providers", - "description" : "This endpoint can be used to retrieve a list of track's related providers.", - "operationId" : "getTrackProviders", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the track", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380837 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: providers", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "providers" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Track_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-track-providers-v2", - "json-api-available-relationships" : [ "providers" ] - } - } - }, - "/tracks/{id}/relationships/artists" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Relationship: artists", - "description" : "Retrieve artist details of the related track.", - "operationId" : "getTrackArtists", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL track id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380837 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Track_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-track-artists-v2", - "json-api-available-relationships" : [ "artists" ] - } - } - }, - "/tracks/{id}/relationships/albums" : { - "get" : { - "tags" : [ "Track JSON:API" ], - "summary" : "Relationship: albums", - "description" : "Retrieve album details of the related track.", - "operationId" : "getTrackAlbums", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL track id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380837 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: albums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "albums" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Track_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-track-albums-v2", - "json-api-available-relationships" : [ "albums" ] - } - } - }, - "/providers" : { - "get" : { - "tags" : [ "Provider JSON:API" ], - "summary" : "Get multiple providers", - "description" : "Retrieve multiple provider details.", - "operationId" : "getProviders", - "parameters" : [ { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : null - } - } - }, { - "name" : "filter[id]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on id attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "771" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Providers_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ "id" ], - "url-compatible-unique-name" : "get-providers-v2", - "json-api-available-relationships" : [ ] - } - } - }, - "/providers/{id}" : { - "get" : { - "tags" : [ "Provider JSON:API" ], - "summary" : "Get single provider", - "description" : "Retrieve provider details by TIDAL provider id.", - "operationId" : "getProvider", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL provider id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 771 - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : null - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Provider_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-provider-v2", - "json-api-available-relationships" : [ ] - } - } - }, - "/artists" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Get multiple artists", - "description" : "Retrieve multiple artist details.", - "operationId" : "getArtists", - "parameters" : [ { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: albums, tracks, videos, similarArtists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "albums" - } - } - }, { - "name" : "filter[id]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on id attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "1566" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artists_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ "id" ], - "url-compatible-unique-name" : "get-artists-v2", - "json-api-available-relationships" : [ "albums", "tracks", "videos", "similarArtists" ] - } - } - }, - "/artists/{id}" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Get single artist", - "description" : "Retrieve artist details by TIDAL artist id.", - "operationId" : "getArtist", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL artist id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 1566 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: albums, tracks, videos, similarArtists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "albums" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artist_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-artist-v2", - "json-api-available-relationships" : [ "albums", "tracks", "videos", "similarArtists" ] - } - } - }, - "/artists/{id}/relationships/videos" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Relationship: videos", - "description" : "Retrieve video details by related artist.", - "operationId" : "getArtistVideos", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL artist id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 1566 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: videos", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "videos" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artist_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-artist-videos-v2", - "json-api-available-relationships" : [ "videos" ] - } - } - }, - "/artists/{id}/relationships/tracks" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Relationship: tracks", - "description" : "Retrieve track details by related artist.", - "operationId" : "getArtistTracks", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL artist id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 1566 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: tracks", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "tracks" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artist_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-artist-tracks-v2", - "json-api-available-relationships" : [ "tracks" ] - } - } - }, - "/artists/{id}/relationships/similarArtists" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Relationship: similar artists", - "description" : "This endpoint can be used to retrieve a list of artists similar to the given artist.", - "operationId" : "getSimilarArtists", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the artist", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 1566 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: similarArtists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "similarArtists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artist_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-similar-artists-v2", - "json-api-available-relationships" : [ "similarArtists" ] - } - } - }, - "/artists/{id}/relationships/albums" : { - "get" : { - "tags" : [ "Artist JSON:API" ], - "summary" : "Relationship: albums", - "description" : "Retrieve album details of the related artist.", - "operationId" : "getArtistAlbums", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL artist id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 1566 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: albums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "albums" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Artist_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-artist-albums-v2", - "json-api-available-relationships" : [ "albums" ] - } - } - }, - "/albums" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Get multiple albums", - "description" : "Retrieve multiple album details.", - "operationId" : "getAlbums", - "parameters" : [ { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, items, providers, similarAlbums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - }, { - "name" : "filter[id]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on id attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "251380836" - } - } - }, { - "name" : "filter[barcodeId]", - "in" : "query", - "description" : "Allows to filter the collection of resources based on barcodeId attribute value", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "196589525444" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Albums_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ "id", "barcodeId" ], - "url-compatible-unique-name" : "get-albums-v2", - "json-api-available-relationships" : [ "artists", "items", "providers", "similarAlbums" ] - } - } - }, - "/albums/{id}" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Get single album", - "description" : "Retrieve album details by TIDAL album id.", - "operationId" : "getAlbum", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL album id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380836 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists, items, providers, similarAlbums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Album_Data_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-album-v2", - "json-api-available-relationships" : [ "artists", "items", "providers", "similarAlbums" ] - } - } - }, - "/albums/{id}/relationships/similarAlbums" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Relationship: similar albums", - "description" : "This endpoint can be used to retrieve a list of albums similar to the given album.", - "operationId" : "getSimilarAlbums_1", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the album", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380836 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: similarAlbums", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "similarAlbums" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Album_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-similar-albums-v2", - "json-api-available-relationships" : [ "similarAlbums" ] - } - } - }, - "/albums/{id}/relationships/providers" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Relationship: providers", - "description" : "This endpoint can be used to retrieve a list of album's related providers.", - "operationId" : "getAlbumProviders", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL id of the album", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380836 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: providers", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "providers" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Album_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-album-providers-v2", - "json-api-available-relationships" : [ "providers" ] - } - } - }, - "/albums/{id}/relationships/items" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Relationship: items", - "description" : "Retrieve album item details.", - "operationId" : "getAlbumItems", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL album id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380836 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: items", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "items" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Album_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-album-items-v2", - "json-api-available-relationships" : [ "items" ] - } - } - }, - "/albums/{id}/relationships/artists" : { - "get" : { - "tags" : [ "Album JSON:API" ], - "summary" : "Relationship: artists", - "description" : "Retrieve artist details of the related album.", - "operationId" : "getAlbumArtists", - "parameters" : [ { - "name" : "id", - "in" : "path", - "description" : "TIDAL album id", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : 251380836 - }, { - "name" : "countryCode", - "in" : "query", - "description" : "ISO 3166-1 alpha-2 country code", - "required" : true, - "schema" : { - "type" : "string" - }, - "example" : "US" - }, { - "name" : "include", - "in" : "query", - "description" : "Allows the client to customize which related resources should be returned. Available options: artists", - "required" : false, - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "example" : "artists" - } - } - } ], - "requestBody" : { - "content" : { - "application/vnd.api+json" : { } - } - }, - "responses" : { - "415" : { - "description" : "Unsupported Media Type. The API is using content negotiation. Ensure the proper media type is set into Content-Type header.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "$ref" : "#/components/examples/Unsupported_Media_Type_Error_Doc" - } - } - } - } - }, - "400" : { - "description" : "Bad request on client party. Ensure the proper HTTP request is sent (query parameters, request body, etc.).", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Bad_Request_Error_Doc" : { - "$ref" : "#/components/examples/Bad_Request_Error_Doc" - } - } - } - } - }, - "404" : { - "description" : "Resource not found. The requested resource is not found.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Resource_Not_Found_Error_Doc" : { - "$ref" : "#/components/examples/Resource_Not_Found_Error_Doc" - } - } - } - } - }, - "500" : { - "description" : "Internal Server Error. Something went wrong on the server party.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Internal_Server_Error_Doc" : { - "$ref" : "#/components/examples/Internal_Server_Error_Doc" - } - } - } - } - }, - "406" : { - "description" : "Not acceptable. The server doesn't support any of the requested by client acceptable content types.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Not_Acceptable_Error_Doc" : { - "$ref" : "#/components/examples/Not_Acceptable_Error_Doc" - } - } - } - } - }, - "405" : { - "description" : "Method not supported. Ensure a proper HTTP method for an HTTP request is used.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Error_Document" - }, - "examples" : { - "Method_Not_Supported_Error_Doc" : { - "$ref" : "#/components/examples/Method_Not_Supported_Error_Doc" - } - } - } - } - }, - "200" : { - "description" : "Successfully executed request.", - "headers" : { - "X-RateLimit-Remaining" : { - "description" : "Number of tokens currently remaining. Refer to X-RateLimit-Replenish-Rate header for replenishment information.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Burst-Capacity" : { - "description" : "Initial number of tokens, and max number of tokens that can be replenished.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "20" - }, - "X-RateLimit-Replenish-Rate" : { - "description" : "Number of tokens replenished per second.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - }, - "X-RateLimit-Requested-Tokens" : { - "description" : "Request cost in tokens.", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int32" - }, - "example" : "5" - } - }, - "content" : { - "application/vnd.api+json" : { - "schema" : { - "$ref" : "#/components/schemas/Album_Relationships_Document" - } - } - } - } - }, - "security" : [ { - "OAuth2_Client_Credentials_grant_flow" : [ ] - } ], - "x-endpoint-properties" : { - "json-api-available-filters" : [ ], - "url-compatible-unique-name" : "get-album-artists-v2", - "json-api-available-relationships" : [ "artists" ] - } - } - } - }, - "components" : { - "schemas" : { - "Error_Document" : { - "type" : "object", - "properties" : { - "errors" : { - "type" : "array", - "description" : "array of error objects", - "items" : { - "$ref" : "#/components/schemas/Error_Object" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "Error_Object" : { - "type" : "object", - "properties" : { - "id" : { - "type" : "string", - "description" : "unique identifier for this particular occurrence of the problem" - }, - "status" : { - "type" : "string", - "description" : "HTTP status code applicable to this problem" - }, - "code" : { - "type" : "string", - "description" : "application-specific error code" - }, - "detail" : { - "type" : "string", - "description" : "human-readable explanation specific to this occurrence of the problem" - }, - "source" : { - "$ref" : "#/components/schemas/Error_Object_Source" - } - } - }, - "Error_Object_Source" : { - "type" : "object", - "properties" : { - "pointer" : { - "type" : "string", - "description" : "a JSON Pointer [RFC6901] to the value in the request document that caused the error", - "example" : "/data/attributes/title" - }, - "parameter" : { - "type" : "string", - "description" : "string indicating which URI query parameter caused the error.", - "example" : "countryCode" - }, - "header" : { - "type" : "string", - "description" : "string indicating the name of a single request header which caused the error", - "example" : "X-some-custom-header" - } - }, - "description" : "object containing references to the primary source of the error" - }, - "Links" : { - "required" : [ "self" ], - "type" : "object", - "properties" : { - "self" : { - "type" : "string", - "description" : "the link that generated the current response document", - "example" : "/artists/xyz/relationships/tracks" - }, - "next" : { - "type" : "string", - "description" : "the next page of data (pagination)", - "example" : "/artists/xyz/relationships/tracks?page[cursor]=zyx" - } - }, - "description" : "links object" - }, - "Album_Attributes" : { - "required" : [ "barcodeId", "duration", "explicit", "mediaTags", "numberOfItems", "numberOfVolumes", "popularity", "title" ], - "type" : "object", - "properties" : { - "title" : { - "type" : "string", - "description" : "Original title", - "example" : "4:44" - }, - "barcodeId" : { - "type" : "string", - "description" : "Barcode id (EAN-13 or UPC-A)", - "example" : "00854242007552" - }, - "numberOfVolumes" : { - "type" : "integer", - "description" : "Number of volumes", - "format" : "int32", - "example" : 1 - }, - "numberOfItems" : { - "type" : "integer", - "description" : "Number of album items", - "format" : "int32", - "example" : 13 - }, - "duration" : { - "type" : "string", - "description" : "Duration (ISO-8601)", - "example" : "P41M5S" - }, - "explicit" : { - "type" : "boolean", - "description" : "Indicates whether an album consist of any explicit content", - "example" : true - }, - "releaseDate" : { - "type" : "string", - "description" : "Release date (ISO-8601)", - "format" : "date", - "example" : "2017-06-30" - }, - "copyright" : { - "type" : "string", - "description" : "Copyright information", - "example" : "(p)(c) 2017 S. CARTER ENTERPRISES, LLC. MARKETED BY ROC NATION & DISTRIBUTED BY ROC NATION/UMG RECORDINGS INC." - }, - "popularity" : { - "type" : "number", - "description" : "Album popularity (ranged in 0.00 ... 1.00). Conditionally visible", - "format" : "double", - "example" : 0.56 - }, - "availability" : { - "type" : "array", - "description" : "Defines an album availability e.g. for streaming, DJs, stems", - "items" : { - "type" : "string", - "enum" : [ "STREAM", "DJ", "STEM" ] - } - }, - "mediaTags" : { - "type" : "array", - "items" : { - "type" : "string", - "description" : "Media metadata tags", - "example" : "LOSSLESS" - } - }, - "imageLinks" : { - "type" : "array", - "description" : "Represents available links to, and metadata about, an album cover images", - "items" : { - "$ref" : "#/components/schemas/Image_Link" - } - }, - "videoLinks" : { - "type" : "array", - "description" : "Represents available links to, and metadata about, an album cover videos", - "items" : { - "$ref" : "#/components/schemas/Video_Link" - } - }, - "externalLinks" : { - "type" : "array", - "description" : "Represents available links to something that is related to an album resource, but external to the TIDAL API", - "items" : { - "$ref" : "#/components/schemas/External_Link" - } - } - } - }, - "Artist_Attributes" : { - "required" : [ "name", "popularity" ], - "type" : "object", - "properties" : { - "name" : { - "type" : "string", - "description" : "Artist name", - "example" : "JAY Z" - }, - "popularity" : { - "type" : "number", - "description" : "Artist popularity (ranged in 0.00 ... 1.00). Conditionally visible", - "format" : "double", - "example" : 0.56 - }, - "imageLinks" : { - "type" : "array", - "description" : "Represents available links to, and metadata about, an artist images", - "items" : { - "$ref" : "#/components/schemas/Image_Link" - } - }, - "externalLinks" : { - "type" : "array", - "description" : "Represents available links to something that is related to an artist resource, but external to the TIDAL API", - "items" : { - "$ref" : "#/components/schemas/External_Link" - } - } - } - }, - "External_Link" : { - "required" : [ "href", "meta" ], - "type" : "object", - "properties" : { - "href" : { - "type" : "string", - "description" : "link to something that is related to a resource", - "example" : "https://tidal.com/browse/artist/1566" - }, - "meta" : { - "$ref" : "#/components/schemas/External_Link_Meta" - } - } - }, - "External_Link_Meta" : { - "required" : [ "type" ], - "type" : "object", - "properties" : { - "type" : { - "type" : "string", - "description" : "external link type", - "example" : "TIDAL_SHARING", - "enum" : [ "TIDAL_SHARING", "TIDAL_AUTOPLAY_ANDROID", "TIDAL_AUTOPLAY_IOS", "TIDAL_AUTOPLAY_WEB", "TWITTER", "FACEBOOK", "INSTAGRAM", "TIKTOK", "SNAPCHAT", "HOMEPAGE" ] - } - }, - "description" : "metadata about an external link" - }, - "Image_Link" : { - "required" : [ "href", "meta" ], - "type" : "object", - "properties" : { - "href" : { - "type" : "string", - "description" : "link to an image", - "example" : "https://resources.tidal.com/images/717dfdae/beb0/4aea/a553/a70064c30386/80x80.jpg" - }, - "meta" : { - "$ref" : "#/components/schemas/Image_Link_Meta" - } - } - }, - "Image_Link_Meta" : { - "required" : [ "height", "width" ], - "type" : "object", - "properties" : { - "width" : { - "type" : "integer", - "description" : "image width (in pixels)", - "format" : "int32", - "example" : 80 - }, - "height" : { - "type" : "integer", - "description" : "image height (in pixels)", - "format" : "int32", - "example" : 80 - } - }, - "description" : "metadata about an image" - }, - "Provider_Attributes" : { - "required" : [ "name" ], - "type" : "object", - "properties" : { - "name" : { - "type" : "string", - "description" : "Provider name. Conditionally visible.", - "example" : "Columbia/Legacy" - } - } - }, - "Relationship" : { - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "resource linkage", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - } - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "Resource_Identifier" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - } - }, - "Video_Attributes" : { - "required" : [ "duration", "explicit", "isrc", "popularity", "title" ], - "type" : "object", - "properties" : { - "title" : { - "type" : "string", - "description" : "Album item's title", - "example" : "Kill Jay Z" - }, - "version" : { - "type" : "string", - "description" : "Version of the album's item; complements title", - "example" : "Kill Jay Z" - }, - "isrc" : { - "type" : "string", - "description" : "ISRC code", - "example" : "TIDAL2274" - }, - "duration" : { - "type" : "string", - "description" : "Duration expressed in accordance with ISO 8601", - "example" : "P30M5S" - }, - "copyright" : { - "type" : "string", - "description" : "Copyright information", - "example" : "(p)(c) 2017 S. CARTER ENTERPRISES, LLC. MARKETED BY ROC NATION & DISTRIBUTED BY ROC NATION/UMG RECORDINGS INC." - }, - "releaseDate" : { - "type" : "string", - "description" : "Release date (ISO-8601)", - "format" : "date", - "example" : "2017-06-27" - }, - "explicit" : { - "type" : "boolean", - "description" : "Indicates whether a catalog item consist of any explicit content", - "example" : false - }, - "popularity" : { - "type" : "number", - "description" : "Track or video popularity (ranged in 0.00 ... 1.00). Conditionally visible", - "format" : "double", - "example" : 0.56 - }, - "availability" : { - "type" : "array", - "description" : "Defines a catalog item availability e.g. for streaming, DJs, stems", - "items" : { - "type" : "string", - "enum" : [ "STREAM", "DJ", "STEM" ] - } - }, - "imageLinks" : { - "type" : "array", - "description" : "Represents available links to, and metadata about, an album item images", - "items" : { - "$ref" : "#/components/schemas/Image_Link" - } - }, - "externalLinks" : { - "type" : "array", - "description" : "Represents available links to something that is related to a catalog item, but external to the TIDAL API", - "items" : { - "$ref" : "#/components/schemas/External_Link" - } - } - }, - "description" : "attributes object representing some of the resource's data" - }, - "Video_Link" : { - "required" : [ "href", "meta" ], - "type" : "object", - "properties" : { - "href" : { - "type" : "string", - "description" : "link to a video", - "example" : "https://resources.tidal.com/images/717dfdae/beb0/4aea/a553/a70064c30386/80x80.mp4" - }, - "meta" : { - "$ref" : "#/components/schemas/Video_Link_Meta" - } - } - }, - "Video_Link_Meta" : { - "required" : [ "height", "width" ], - "type" : "object", - "properties" : { - "width" : { - "type" : "integer", - "description" : "video width (in pixels)", - "format" : "int32", - "example" : 80 - }, - "height" : { - "type" : "integer", - "description" : "video height (in pixels)", - "format" : "int32", - "example" : 80 - } - }, - "description" : "metadata about a video" - }, - "Video_Relationship" : { - "type" : "object", - "description" : "attributes object representing some of the resource's data", - "anyOf" : [ { - "$ref" : "#/components/schemas/Album_Attributes" - }, { - "$ref" : "#/components/schemas/Artist_Attributes" - }, { - "$ref" : "#/components/schemas/Provider_Attributes" - } ] - }, - "Video_Relationship_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Video_Relationship" - }, - "relationships" : { - "type" : "object", - "additionalProperties" : { - "$ref" : "#/components/schemas/Relationship" - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "array of resource objects that are related to the primary data and/or each other" - }, - "Video_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Video_Attributes" - }, - "relationships" : { - "$ref" : "#/components/schemas/Available_Video_Relationships" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "document's primary data" - }, - "Videos_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data", - "items" : { - "$ref" : "#/components/schemas/Video_Resource" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Video_Relationship_Resource" - } - } - } - }, - "Video_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "$ref" : "#/components/schemas/Video_Resource" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Video_Relationship_Resource" - } - } - } - }, - "Video_Relationships_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data, consist of resource linkage objects", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Video_Relationship_Resource" - } - } - } - }, - "Track_Attributes" : { - "required" : [ "duration", "explicit", "isrc", "mediaTags", "popularity", "title" ], - "type" : "object", - "properties" : { - "title" : { - "type" : "string", - "description" : "Album item's title", - "example" : "Kill Jay Z" - }, - "version" : { - "type" : "string", - "description" : "Version of the album's item; complements title", - "example" : "Kill Jay Z" - }, - "isrc" : { - "type" : "string", - "description" : "ISRC code", - "example" : "TIDAL2274" - }, - "duration" : { - "type" : "string", - "description" : "Duration expressed in accordance with ISO 8601", - "example" : "P30M5S" - }, - "copyright" : { - "type" : "string", - "description" : "Copyright information", - "example" : "(p)(c) 2017 S. CARTER ENTERPRISES, LLC. MARKETED BY ROC NATION & DISTRIBUTED BY ROC NATION/UMG RECORDINGS INC." - }, - "explicit" : { - "type" : "boolean", - "description" : "Indicates whether a catalog item consist of any explicit content", - "example" : false - }, - "popularity" : { - "type" : "number", - "description" : "Track or video popularity (ranged in 0.00 ... 1.00). Conditionally visible", - "format" : "double", - "example" : 0.56 - }, - "availability" : { - "type" : "array", - "description" : "Defines a catalog item availability e.g. for streaming, DJs, stems", - "items" : { - "type" : "string", - "enum" : [ "STREAM", "DJ", "STEM" ] - } - }, - "mediaTags" : { - "type" : "array", - "items" : { - "type" : "string", - "description" : "Media metadata tags", - "example" : "LOSSLESS" - } - }, - "externalLinks" : { - "type" : "array", - "description" : "Represents available links to something that is related to a catalog item, but external to the TIDAL API", - "items" : { - "$ref" : "#/components/schemas/External_Link" - } - } - } - }, - "Track_Relationship" : { - "type" : "object", - "description" : "attributes object representing some of the resource's data", - "anyOf" : [ { - "$ref" : "#/components/schemas/Album_Attributes" - }, { - "$ref" : "#/components/schemas/Artist_Attributes" - }, { - "$ref" : "#/components/schemas/Provider_Attributes" - }, { - "$ref" : "#/components/schemas/Track_Attributes" - } ] - }, - "Track_Relationship_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Track_Relationship" - }, - "relationships" : { - "type" : "object", - "additionalProperties" : { - "$ref" : "#/components/schemas/Relationship" - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "array of resource objects that are related to the primary data and/or each other" - }, - "Track_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Track_Attributes" - }, - "relationships" : { - "$ref" : "#/components/schemas/Available_Track_Relationships" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "document's primary data" - }, - "Tracks_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data", - "items" : { - "$ref" : "#/components/schemas/Track_Resource" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Track_Relationship_Resource" - } - } - } - }, - "Track_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "$ref" : "#/components/schemas/Track_Resource" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Track_Relationship_Resource" - } - } - } - }, - "Track_Relationships_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data, consist of resource linkage objects", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Track_Relationship_Resource" - } - } - } - }, - "Provider_Relationship" : { - "type" : "object", - "description" : "attributes object representing some of the resource's data" - }, - "Provider_Relationship_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Provider_Relationship" - }, - "relationships" : { - "type" : "object", - "additionalProperties" : { - "$ref" : "#/components/schemas/Relationship" - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "array of resource objects that are related to the primary data and/or each other" - }, - "Provider_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Provider_Attributes" - }, - "relationships" : { - "$ref" : "#/components/schemas/Available_Provider_Relationships" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "document's primary data" - }, - "Providers_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data", - "items" : { - "$ref" : "#/components/schemas/Provider_Resource" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Provider_Relationship_Resource" - } - } - } - }, - "Provider_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "$ref" : "#/components/schemas/Provider_Resource" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Provider_Relationship_Resource" - } - } - } - }, - "Artist_Relationship" : { - "type" : "object", - "description" : "attributes object representing some of the resource's data", - "anyOf" : [ { - "$ref" : "#/components/schemas/Album_Attributes" - }, { - "$ref" : "#/components/schemas/Track_Attributes" - }, { - "$ref" : "#/components/schemas/Video_Attributes" - }, { - "$ref" : "#/components/schemas/Artist_Attributes" - } ] - }, - "Artist_Relationship_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Artist_Relationship" - }, - "relationships" : { - "type" : "object", - "additionalProperties" : { - "$ref" : "#/components/schemas/Relationship" - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "array of resource objects that are related to the primary data and/or each other" - }, - "Artist_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Artist_Attributes" - }, - "relationships" : { - "$ref" : "#/components/schemas/Available_Artist_Relationships" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "document's primary data" - }, - "Artists_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data", - "items" : { - "$ref" : "#/components/schemas/Artist_Resource" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Artist_Relationship_Resource" - } - } - } - }, - "Artist_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "$ref" : "#/components/schemas/Artist_Resource" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Artist_Relationship_Resource" - } - } - } - }, - "Artist_Relationships_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data, consist of resource linkage objects", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Artist_Relationship_Resource" - } - } - } - }, - "Album_Relationship" : { - "type" : "object", - "description" : "attributes object representing some of the resource's data", - "anyOf" : [ { - "$ref" : "#/components/schemas/Artist_Attributes" - }, { - "$ref" : "#/components/schemas/Track_Attributes" - }, { - "$ref" : "#/components/schemas/Video_Attributes" - }, { - "$ref" : "#/components/schemas/Album_Attributes" - }, { - "$ref" : "#/components/schemas/Provider_Attributes" - } ] - }, - "Album_Relationship_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Album_Relationship" - }, - "relationships" : { - "type" : "object", - "additionalProperties" : { - "$ref" : "#/components/schemas/Relationship" - }, - "description" : "relationships object describing relationships between the resource and other resources" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "array of resource objects that are related to the primary data and/or each other" - }, - "Album_Resource" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "attributes" : { - "$ref" : "#/components/schemas/Album_Attributes" - }, - "relationships" : { - "$ref" : "#/components/schemas/Available_Album_Relationships" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - } - }, - "description" : "document's primary data" - }, - "Albums_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data", - "items" : { - "$ref" : "#/components/schemas/Album_Resource" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Album_Relationship_Resource" - } - } - } - }, - "Album_Data_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "$ref" : "#/components/schemas/Album_Resource" - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Album_Relationship_Resource" - } - } - } - }, - "Album_Relationships_Document" : { - "required" : [ "data" ], - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "document's primary data, consist of resource linkage objects", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - }, - "included" : { - "type" : "array", - "description" : "array of resource objects that are related to the primary data and/or each other", - "items" : { - "$ref" : "#/components/schemas/Album_Relationship_Resource" - } - } - } - }, - "Resource_Relationship" : { - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "description" : "resource linkage", - "items" : { - "$ref" : "#/components/schemas/Resource_Identifier" - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "Available_Video_Relationships" : { - "properties" : { - "albums" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "artists" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "providers" : { - "$ref" : "#/components/schemas/Resource_Relationship" - } - }, - "description" : "Available video relationships" - }, - "Available_Provider_Relationships" : { - "properties" : { }, - "description" : "Available provider relationships" - }, - "Available_Album_Relationships" : { - "properties" : { - "artists" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "similarAlbums" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "items" : { - "type" : "object", - "properties" : { - "data" : { - "type" : "array", - "items" : { - "required" : [ "id", "type" ], - "type" : "object", - "properties" : { - "id" : { - "type" : "string", - "description" : "resource unique identifier", - "example" : "12345" - }, - "type" : { - "type" : "string", - "description" : "resource unique type", - "example" : "tracks" - }, - "meta" : { - "required" : [ "trackNumber", "volumeNumber" ], - "type" : "object", - "properties" : { - "volumeNumber" : { - "type" : "integer", - "description" : "volume number", - "format" : "int32", - "example" : 1 - }, - "trackNumber" : { - "type" : "integer", - "description" : "track number", - "format" : "int32", - "example" : 4 - } - } - } - } - } - }, - "links" : { - "$ref" : "#/components/schemas/Links" - } - } - }, - "providers" : { - "$ref" : "#/components/schemas/Resource_Relationship" - } - }, - "description" : "Available album relationships" - }, - "Available_Artist_Relationships" : { - "properties" : { - "similarArtists" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "albums" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "videos" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "tracks" : { - "$ref" : "#/components/schemas/Resource_Relationship" - } - }, - "description" : "Available artist relationships" - }, - "Available_Track_Relationships" : { - "properties" : { - "albums" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "artists" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "similarTracks" : { - "$ref" : "#/components/schemas/Resource_Relationship" - }, - "providers" : { - "$ref" : "#/components/schemas/Resource_Relationship" - } - }, - "description" : "Available track relationships" - } - }, - "examples" : { - "Unsupported_Media_Type_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"880e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"415\",\n \"code\": \"UNSUPPORTED_MEDIA_TYPE\",\n \"detail\": \"Unsupported request media type: application/json. Expected media type format: application/vnd.api+json\",\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - }, - "Bad_Request_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"400\",\n \"code\": \"INVALID_ENUM_VALUE\",\n \"detail\": \"country code must be in ISO2 format\",\n \"source\": {\n \"parameter\": \"countryCode\"\n },\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n },\n {\n \"id\": \"770e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"400\",\n \"code\": \"VALUE_REGEX_MISMATCH\",\n \"detail\": \"barcode should have a valid EAN-13 or UPC-A format\",\n \"source\": {\n \"parameter\": \"filter[barcodeId]\"\n },\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - }, - "Internal_Server_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"120e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"500\",\n \"code\": \"INTERNAL_SERVER_ERROR\",\n \"detail\": \"The service encountered an error\",\n \"meta\": {\n \"category\": \"API_ERROR\"\n }\n }\n ]\n}\n" - }, - "Not_Acceptable_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"570e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"406\",\n \"code\": \"NOT_ACCEPTABLE\",\n \"detail\": \"Not acceptable response media type on client: application/xml\",\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - }, - "Method_Not_Supported_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"320e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"405\",\n \"code\": \"METHOD_NOT_SUPPORTED\",\n \"detail\": \"The resource doesnt support the requested HTTP method: POST\",\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - }, - "Resource_Not_Found_Error_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"770e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"404\",\n \"code\": \"NOT_FOUND\",\n \"detail\": \"Resource for a given 'id' is not found\",\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - }, - "Unavailable_For_Legal_Reasons_Doc" : { - "value" : "{\n \"errors\": [\n {\n \"id\": \"490e8400-e29b-41d4-a716-446655440000\",\n \"status\": \"451\",\n \"code\": \"UNAVAILABLE_FOR_LEGAL_REASONS_RESPONSE\",\n \"detail\": \"Unavailable due to demand from the right-holders to prohibit access to the resource.\",\n \"meta\": {\n \"category\": \"INVALID_REQUEST_ERROR\"\n }\n }\n ]\n}\n" - } - }, - "securitySchemes" : { - "OAuth2_Client_Credentials_grant_flow" : { - "type" : "oauth2", - "description" : "Use this grant flow to access non-personalized TIDAL data.", - "flows" : { - "clientCredentials" : { - "tokenUrl" : "https://auth.stage.tidal.com/v1/oauth2/token", - "scopes" : { } - } - } - } - } - } -} diff --git a/Sources/Catalogue/openapi/openapi-config.yml b/Sources/Catalogue/openapi/openapi-config.yml deleted file mode 100644 index 1efb4db3..00000000 --- a/Sources/Catalogue/openapi/openapi-config.yml +++ /dev/null @@ -1,3 +0,0 @@ -additionalProperties: - swiftPackagePath: . - useJsonEncodable: false From 6838089f31a4a3c41edcf097164cd461a964cb39 Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Thu, 24 Oct 2024 13:28:54 +0200 Subject: [PATCH 05/10] compilation fixes --- Sources/Player/Common/Logging/PlayerLoggable.swift | 1 - TestApps/Player/PlayerTestApp/PlayerViewModel.swift | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Sources/Player/Common/Logging/PlayerLoggable.swift b/Sources/Player/Common/Logging/PlayerLoggable.swift index 330ff76f..fab87c6a 100644 --- a/Sources/Player/Common/Logging/PlayerLoggable.swift +++ b/Sources/Player/Common/Logging/PlayerLoggable.swift @@ -533,7 +533,6 @@ extension PlayerLoggable { .sendEventsNotAuthorized, .getAuthBearerTokenToBearerTokenFailed, .audioCodecInitWithEmpty, - .audioCodecInitWithNilQuality, .audioCodecInitWithLowQualityAndNilMode, .avplayerSeekWithoutCurrentItem, .interruptionMonitorHandleNotificationWithoutRequiredData, diff --git a/TestApps/Player/PlayerTestApp/PlayerViewModel.swift b/TestApps/Player/PlayerTestApp/PlayerViewModel.swift index bf84c176..0926a019 100644 --- a/TestApps/Player/PlayerTestApp/PlayerViewModel.swift +++ b/TestApps/Player/PlayerTestApp/PlayerViewModel.swift @@ -1,4 +1,5 @@ import Auth +import AVFAudio import EventProducer import Foundation import Player @@ -90,9 +91,13 @@ extension PlayerViewModel: PlayerListener { func mediaServicesWereReset() { // We must set up again the audio session for the correct behavior after media services are reset. - let audioSession = AVAudioSession.sharedInstance() - try? audioSession.setCategory(.playback, mode: .default, policy: .longFormAudio) - try audioSession.setActive(true) + do { + let audioSession = AVAudioSession.sharedInstance() + try? audioSession.setCategory(.playback, mode: .default, policy: .longFormAudio) + try audioSession.setActive(true) + } catch { + print("Error: \(String(describing: error))") + } } } From 03afbfe6292c5858478bf706cbcc389c18f05412 Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Thu, 24 Oct 2024 15:55:43 +0200 Subject: [PATCH 06/10] renaming --- .../AudioSessionMediaServicesWereResetMonitor.swift | 2 +- Sources/Player/PlaybackEngine/PlayerEngine.swift | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift index d2cbaf5e..5ebbf55f 100644 --- a/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift +++ b/Sources/Player/PlaybackEngine/Internal/AudioSessionMonitors/AudioSessionMediaServicesWereResetMonitor.swift @@ -51,7 +51,7 @@ private extension AudioSessionMediaServicesWereResetMonitor { func handleMediaServicesWereReset(notification: Notification) { PlayerWorld.logger?.log(loggable: PlayerLoggable.handleMediaServicesWereReset) - self.playerEngine?.resetPlayerAndSetUpAudioSessionAfterMediaServiceWereReset() + self.playerEngine?.mediaServicesWereReset() } } #endif diff --git a/Sources/Player/PlaybackEngine/PlayerEngine.swift b/Sources/Player/PlaybackEngine/PlayerEngine.swift index 67dfd2a8..c6468905 100644 --- a/Sources/Player/PlaybackEngine/PlayerEngine.swift +++ b/Sources/Player/PlaybackEngine/PlayerEngine.swift @@ -96,6 +96,7 @@ final class PlayerEngine { #if !os(macOS) private var audioSessionInterruptionMonitor: AudioSessionInterruptionMonitor! private var audioSessionRouteChangeMonitor: AudioSessionRouteChangeMonitor! + // swiftlint:disable:next identifier_name private var audioSessionMediaServicesWereResetMonitor: AudioSessionMediaServicesWereResetMonitor! #endif @@ -347,8 +348,10 @@ final class PlayerEngine { currentItem?.asset?.player } - func resetPlayerAndSetUpAudioSessionAfterMediaServiceWereReset() { - // When media services are reset, we must reset the player. + func mediaServicesWereReset() { + // When media services are reset, Apple recommends to reinitialize the app's audio objects, which is out case is the player, + // and which is performed directly by the SDK. It's also recommended to reset the audio session’s category, options, and mode + // configuration. This is performed below. self.reset() // Then we should also set it up again the audio session as done initially. Since this is done outside the SDK, we delegate it From 9dfed4362280a761e07bc13127be7f9e4bd8f677 Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Sun, 27 Oct 2024 22:34:29 +0100 Subject: [PATCH 07/10] Add player item monitor for when an item reaches the end when action at end is none --- .../AVQueuePlayer/AVPlayerItemMonitor.swift | 3 ++ .../AVQueuePlayer/AVQueuePlayerWrapper.swift | 7 ++++ .../Legacy/AVQueuePlayerWrapperLegacy.swift | 9 +++++ .../Observers/ItemPlayedToEndMonitor.swift | 35 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVPlayerItemMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVPlayerItemMonitor.swift index e7941521..3b3d6d72 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVPlayerItemMonitor.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVPlayerItemMonitor.swift @@ -8,6 +8,7 @@ final class AVPlayerItemMonitor { private let completelyDownloadedMonitor: CompletelyDownloadedMonitor private let readyToPlayMonitor: ReadyToPlayMonitor private let inStreamMetadataMonitor: DJSessionTransitionMonitor + private let playerItemDidPlayToEndTimeMonitor: ItemPlayedToEndMonitor init( _ playerItem: AVPlayerItem, @@ -15,6 +16,7 @@ final class AVPlayerItemMonitor { onStall: @escaping (AVPlayerItem) -> Void, onCompletelyDownloaded: @escaping (AVPlayerItem) -> Void, onReadyToPlayToPlay: @escaping (AVPlayerItem) -> Void, + onItemPlayedToEnd: @escaping (AVPlayerItem) -> Void, onDjSessionTransition: @escaping (AVPlayerItem, DJSessionTransition) -> Void ) { failureMonitor = FailureMonitor(playerItem, onFailure) @@ -22,6 +24,7 @@ final class AVPlayerItemMonitor { stallMonitor = StallMonitor(playerItem, onStall) completelyDownloadedMonitor = CompletelyDownloadedMonitor(playerItem, onCompletelyDownloaded) readyToPlayMonitor = ReadyToPlayMonitor(playerItem, onReadyToPlayToPlay) + playerItemDidPlayToEndTimeMonitor = ItemPlayedToEndMonitor(playerItem: playerItem, onPlayedToEnd: onItemPlayedToEnd) inStreamMetadataMonitor = DJSessionTransitionMonitor( with: playerItem, and: DispatchQueue.global(qos: .default), diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift index 39e7a86b..cc30d9d0 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/AVQueuePlayerWrapper.swift @@ -401,6 +401,7 @@ private extension AVQueuePlayerWrapper { onStall: stalled, onCompletelyDownloaded: downloaded, onReadyToPlayToPlay: loaded, + onItemPlayedToEnd: playedToEnd, onDjSessionTransition: receivedDjSessionTransition ) } @@ -631,6 +632,12 @@ private extension AVQueuePlayerWrapper { self.delegates.djSessionTransition(asset: asset, transition: transition) } } + + func playedToEnd(playerItem: AVPlayerItem) { + if featureFlagProvider.shouldNotPerformActionAtItemEnd() { + self.player.remove(playerItem) + } + } } // MARK: AssetFactoryDelegate diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift index 3eb1b181..9e944bc1 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Legacy/AVQueuePlayerWrapperLegacy.swift @@ -372,6 +372,7 @@ private extension AVQueuePlayerWrapperLegacy { onStall: stalled, onCompletelyDownloaded: downloaded, onReadyToPlayToPlay: loaded, + onItemPlayedToEnd: playedToEnd, onDjSessionTransition: receivedDjSessionTransition ) } @@ -530,6 +531,8 @@ private extension AVQueuePlayerWrapperLegacy { let asset = self.playerItemAssets.removeValue(forKey: oldPlayerItem) self.delegates.completed(asset: asset) + self.player.remove(oldPlayerItem) + guard let newPlayerItem = self.player.currentItem else { self.reset() return @@ -560,6 +563,12 @@ private extension AVQueuePlayerWrapperLegacy { self.delegates.djSessionTransition(asset: asset, transition: transition) } } + + func playedToEnd(playerItem: AVPlayerItem) { + if featureFlagProvider.shouldNotPerformActionAtItemEnd() { + self.player.remove(playerItem) + } + } } private extension AVQueuePlayerWrapperLegacy { diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift new file mode 100644 index 00000000..eaa5ddd7 --- /dev/null +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift @@ -0,0 +1,35 @@ +import AVFoundation +import Foundation + +final class ItemPlayedToEndMonitor { + private let playerItem: AVPlayerItem + private let onPlayedToEnd: (AVPlayerItem) -> Void + + init(playerItem: AVPlayerItem, onPlayedToEnd: @escaping (AVPlayerItem) -> Void) { + self.playerItem = playerItem + self.onPlayedToEnd = onPlayedToEnd + + NotificationCenter.default.addObserver( + self, + selector: #selector(playerItemDidPlayToEndTime(notification:)), + name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, + object: playerItem + ) + } + + deinit { + NotificationCenter.default.removeObserver( + self, + name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, + object: playerItem + ) + } + + @objc + private func playerItemDidPlayToEndTime(notification: Notification) { + if let playerItem = notification.object as? AVPlayerItem { + print("--> PlayerItemDidPlayToEndTimeMonitor.playerItemDidPlayToEndTime(notification: \(notification))") + onPlayedToEnd(playerItem) + } + } +} From ad2ebf128b2ce1d7989ef0d3227dc625de98bfd9 Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Mon, 28 Oct 2024 13:35:42 +0100 Subject: [PATCH 08/10] delete print --- .../AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift index eaa5ddd7..2739a598 100644 --- a/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift +++ b/Sources/Player/PlaybackEngine/Internal/AVQueuePlayer/Observers/ItemPlayedToEndMonitor.swift @@ -28,7 +28,6 @@ final class ItemPlayedToEndMonitor { @objc private func playerItemDidPlayToEndTime(notification: Notification) { if let playerItem = notification.object as? AVPlayerItem { - print("--> PlayerItemDidPlayToEndTimeMonitor.playerItemDidPlayToEndTime(notification: \(notification))") onPlayedToEnd(playerItem) } } From bc177d7a1dd80ef6a42a9d0ae47cb49b5821d4d9 Mon Sep 17 00:00:00 2001 From: Alberto Sendra Date: Mon, 28 Oct 2024 16:08:49 +0100 Subject: [PATCH 09/10] Change how external players are provided so they can be changed at runtime. --- Sources/Player/Player.swift | 18 +++++++++--------- Tests/PlayerTests/Player/PlayerTests.swift | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Sources/Player/Player.swift b/Sources/Player/Player.swift index 50484cb4..85e6e4d8 100644 --- a/Sources/Player/Player.swift +++ b/Sources/Player/Player.swift @@ -53,7 +53,7 @@ public final class Player { private var networkMonitor: NetworkMonitor private var notificationsHandler: NotificationsHandler private let featureFlagProvider: FeatureFlagProvider - private var registeredPlayers: [GenericMediaPlayer.Type] = [] + private var externalPlayersSupplier: (() -> [GenericMediaPlayer.Type])? private let credentialsProvider: CredentialsProvider // MARK: - Initialization @@ -72,7 +72,7 @@ public final class Player { playerEngine: PlayerEngine, offlineEngine: OfflineEngine, featureFlagProvider: FeatureFlagProvider, - externalPlayers: [GenericMediaPlayer.Type], + externalPlayersSupplier: (() -> [GenericMediaPlayer.Type])?, credentialsProvider: CredentialsProvider ) { self.queue = queue @@ -88,7 +88,7 @@ public final class Player { self.playerEngine = playerEngine self.offlineEngine = offlineEngine self.featureFlagProvider = featureFlagProvider - registeredPlayers = externalPlayers + self.externalPlayersSupplier = externalPlayersSupplier self.credentialsProvider = credentialsProvider } } @@ -113,9 +113,9 @@ public extension Player { offlineEngineListener: OfflineEngineListener? = nil, listenerQueue: DispatchQueue = .main, featureFlagProvider: FeatureFlagProvider = .standard, - externalPlayers: [GenericMediaPlayer.Type] = [], credentialsProvider: CredentialsProvider, eventSender: EventSender, + externalPlayersSupplier: (() -> [GenericMediaPlayer.Type])? = nil, userClientIdSupplier: (() -> Int)? = nil, shouldAddLogging: Bool = false ) -> Player? { @@ -201,7 +201,7 @@ public extension Player { playerEventSender, notificationsHandler, featureFlagProvider, - externalPlayers, + externalPlayersSupplier, credentialsProvider ) @@ -219,7 +219,7 @@ public extension Player { playerEngine: playerEngine, offlineEngine: offlineEngine, featureFlagProvider: featureFlagProvider, - externalPlayers: externalPlayers, + externalPlayersSupplier: externalPlayersSupplier, credentialsProvider: credentialsProvider ) @@ -408,7 +408,7 @@ private extension Player { playerEventSender, notificationsHandler, featureFlagProvider, - registeredPlayers, + externalPlayersSupplier, credentialsProvider ) } @@ -423,7 +423,7 @@ private extension Player { _ playerEventSender: PlayerEventSender, _ notificationsHandler: NotificationsHandler?, _ featureFlagProvider: FeatureFlagProvider, - _ externalPlayers: [GenericMediaPlayer.Type], + _ externalPlayersSupplier: (() -> [GenericMediaPlayer.Type])? = nil, _ credentialsProvider: CredentialsProvider ) -> PlayerEngine { let internalPlayerLoader = InternalPlayerLoader( @@ -432,7 +432,7 @@ private extension Player { featureFlagProvider: featureFlagProvider, credentialsProvider: credentialsProvider, mainPlayer: Player.mainPlayerType(featureFlagProvider), - externalPlayers: externalPlayers + externalPlayers: externalPlayersSupplier?() ?? [] ) let playerInstance = PlayerEngine( diff --git a/Tests/PlayerTests/Player/PlayerTests.swift b/Tests/PlayerTests/Player/PlayerTests.swift index e8f0eb7e..4dc77bc6 100644 --- a/Tests/PlayerTests/Player/PlayerTests.swift +++ b/Tests/PlayerTests/Player/PlayerTests.swift @@ -71,7 +71,7 @@ final class PlayerTests: XCTestCase { playerEngine: playerEngine, offlineEngine: offlineEngine, featureFlagProvider: .mock, - externalPlayers: [], + externalPlayersSupplier: nil, credentialsProvider: CredentialsProviderMock() ) } From 058605fc75924984101b67ca29775c37df34908a Mon Sep 17 00:00:00 2001 From: Cecilia de Siqueira Saraiva Date: Mon, 28 Oct 2024 17:08:36 +0100 Subject: [PATCH 10/10] bump version from 0.3.40 to 0.3.41 --- CHANGELOG.md | 13 +++++++++++++ version.txt | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a13f5868..4c112f3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.41] - 2024-10-28 + +### Added +- Add TidalAPI module (TidalAPI) +- Add logic in Player to handle issue when media services are reset (Player) +- Add player item monitor for when an item reaches the end when action at end is none (Player) + +### Removed +- Remove old Catalogue module (Catalogue) + +### Changed +- Change how external players are provided so they can be changed at runtime (Player) + ## [0.3.40] - 2024-10-23 ### Added diff --git a/version.txt b/version.txt index a02af241..b463c010 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.3.40 +0.3.41