using ErrorOr; namespace Musify.Application.Contracts { public record YouTubeArtistRef(string? Id, string Name); public record YouTubeSongResult( string VideoId, string Title, string Artist, string Album, int DurationSeconds, string ThumbnailUrl, bool IsExplicit, IReadOnlyList Artists); public record YouTubeSearchResult( IReadOnlyList Items, string ContinuationToken); public record YouTubeAlbumResult( string AlbumId, string Title, string Artist, string ThumbnailUrl, int? ReleaseYear, bool IsSingle, bool IsEp, IReadOnlyList Artists); public record YouTubeAlbumSearchResult( IReadOnlyList Items, string ContinuationToken); public record YouTubeAlbumTrack( string VideoId, string Title, int DurationSeconds, int TrackNumber, bool IsExplicit); public record YouTubeAlbumDetail( YouTubeAlbumResult Album, string Description, int TotalDurationSeconds, IReadOnlyList Tracks); public record YouTubeStreamInfo(string Url, int ExpiresInSeconds); public interface IYouTubeMusicService { Task> SearchSongsAsync(string query, string continuationToken, CancellationToken cancellationToken); Task> SearchAlbumsAsync(string query, string continuationToken, CancellationToken cancellationToken); Task> GetAlbumAsync(string albumId, CancellationToken cancellationToken); Task> GetAudioStreamAsync(string videoId, CancellationToken cancellationToken); Task> GetSongAsync(string videoId, CancellationToken cancellationToken); string ResolveArtworkUrl(string thumbnailUrl); } }