syntax = "proto3"; package music_agregator.v1; option go_package = "homelab.lan/music-agregator/gen/music_agregator/v1/"; service MusicAgregatorService { rpc MonitorAlbum(MonitorAlbumRequest) returns (MonitorAlbumResponse) { option deprecated = true; } rpc MonitorAlbumStream(stream MonitorAlbumStreamRequest) returns (stream MonitorAlbumStreamResponse) {} rpc GetArtists(GetArtistsRequest) returns (GetArtistsResponse) {} rpc GetAlbum(GetAlbumRequest) returns (GetAlbumResponse) {} rpc AnalyzeAlbumRelease(AnalyzeAlbumReleaseRequest) returns (AnalyzeAlbumReleaseResponse) {} rpc SearchArtists(SearchArtistsRequest) returns (SearchArtistsResponse) {} rpc GetArtistAlbums(GetArtistAlbumsRequest) returns (GetArtistAlbumsResponse) {} rpc SubscribeEvents(SubscribeEventsRequest) returns (stream AlbumEvent) {} } message MonitorAlbumRequest { string album_id = 1; IndexerOptions indexer_options = 2; QualityType quality = 3; } message IndexerOptions { string tracker = 1; } enum QualityType { QUALITY_UNSPECIFIED = 0; QUALITY_LOSSLESS = 1; QUALITY_LOSSY = 2; } message MonitorAlbumResponse { AlbumDetail album = 1; ArtistSummary artist = 2; MonitoredRelease release = 3; } message GetArtistsRequest {} message GetArtistsResponse { repeated ArtistSummary artists = 1; } enum MonitorState { MONITOR_STATE_UNSPECIFIED = 0; MONITOR_STATE_MONITORED = 1; MONITOR_STATE_UNMONITORED = 2; MONITOR_STATE_EXCLUDED = 3; } message ArtistSummary { string id = 1; string external_id = 2; string name = 3; string artist_type = 4; string country = 5; repeated string genres = 6; string image_url = 7; MonitorState monitor_state = 8; repeated AlbumDetail albums = 9; } message AlbumDetail { string id = 1; string external_id = 2; string title = 3; string album_type = 4; string release_date = 5; int32 total_tracks = 6; int32 total_discs = 7; string cover_url = 8; repeated string genres = 9; string label = 10; MonitorState monitor_state = 11; DownloadInfo download = 12; AlbumReleaseDetail release = 13; } message DownloadInfo { string state = 1; string format = 2; string quality = 3; string save_path = 4; } message GetAlbumRequest { string album_id = 1; } message AlbumInfo { AlbumDetail album = 1; repeated TrackDetail tracks = 2; } message GetAlbumResponse { AlbumInfo info = 1; } message AnalyzeAlbumReleaseRequest { string album_id = 1; } message AnalyzeAlbumReleaseResponse { AlbumInfo info = 1; } message TrackDetail { string id = 1; string external_id = 2; string title = 3; int32 duration_ms = 4; int32 disc_number = 5; int32 track_number = 6; string isrc = 7; bool explicit = 8; repeated ArtistCredit artists = 9; string file_path = 10; int64 file_size = 11; string format = 12; int32 bit_depth = 13; int32 sample_rate = 14; int32 channels = 15; int32 bitrate_kbps = 16; } message ArtistCredit { string id = 1; string name = 2; } message AlbumReleaseDetail { string id = 1; string format = 2; int32 bit_depth = 3; int32 sample_rate = 4; int32 channels = 5; bool is_lossless = 6; string source = 7; int64 total_size = 8; int32 total_duration_ms = 9; int32 track_count = 10; bool has_cover_art = 11; bool has_cue_sheet = 12; bool has_rip_log = 13; string path = 14; } message MonitoredRelease { string info_hash = 1; string artist = 2; string album = 3; int32 year = 4; string format = 5; bool lossless = 6; int32 bit_depth = 7; int32 sample_rate = 8; string source = 9; int32 track_count = 10; repeated string track_names = 11; bool has_cover_art = 12; bool has_cue_sheet = 13; bool has_rip_log = 14; int64 total_audio_size = 15; string download_link = 16; int32 seeders = 17; string tracker = 18; } message SearchArtistsRequest { string query = 1; int32 limit = 2; int32 offset = 3; } message SearchArtistsResponse { repeated SearchArtistResult artists = 1; int32 total = 2; } message SearchArtistResult { string id = 1; string name = 2; string sort_name = 3; string artist_type = 4; string country = 5; string formed_date = 6; string disbanded_date = 7; string description = 8; string image_url = 9; repeated string genres = 10; repeated ExternalId external_ids = 11; } message ExternalId { string provider = 1; string id = 2; } message GetArtistAlbumsRequest { string artist_id = 1; int32 limit = 2; int32 offset = 3; } message GetArtistAlbumsResponse { repeated AlbumResult albums = 1; int32 total = 2; } message AlbumResult { string id = 1; string title = 2; string album_type = 3; string release_date = 4; string upc = 5; int32 total_tracks = 6; int32 total_discs = 7; string cover_url = 8; repeated AlbumArtistCredit artists = 9; AlbumLabel label = 10; repeated string genres = 11; repeated ExternalId external_ids = 12; } message AlbumArtistCredit { string id = 1; string name = 2; string role = 3; } message AlbumLabel { string id = 1; string name = 2; string country = 3; } message SubscribeEventsRequest { int64 since_seq = 1; } message AlbumEvent { int64 seq = 1; string workflow_run_id = 2; string album_id = 3; string quality = 4; string event_type = 5; string step = 6; string message = 7; bytes data_json = 8; int64 timestamp_ms = 9; } enum InteractionMode { INTERACTION_MODE_AUTOMATIC = 0; INTERACTION_MODE_MANUAL = 1; } enum MonitorStep { MONITOR_STEP_UNSPECIFIED = 0; MONITOR_STEP_FETCHING_METADATA = 1; MONITOR_STEP_CHECKING_OWNED = 2; MONITOR_STEP_SEARCHING_INDEXER = 3; MONITOR_STEP_PARSING_RESULTS = 4; MONITOR_STEP_FILTERING_QUALITY = 5; MONITOR_STEP_SELECTING_RELEASE = 6; MONITOR_STEP_ADDING_TORRENT = 7; MONITOR_STEP_SAVING = 8; MONITOR_STEP_COMPLETE = 9; } enum PromptType { PROMPT_TYPE_UNSPECIFIED = 0; PROMPT_TYPE_CONFIRM = 1; PROMPT_TYPE_SELECT_ONE = 2; PROMPT_TYPE_SELECT_MANY = 3; } message MonitorAlbumStreamRequest { oneof message { StartMonitorRequest start = 1; UserDecision decision = 2; CancelRequest cancel = 3; } } message StartMonitorRequest { string album_id = 1; IndexerOptions indexer_options = 2; QualityType quality = 3; InteractionMode mode = 4; } message UserDecision { string prompt_id = 1; oneof decision { bool confirm = 2; string selected_id = 3; SelectedIds selected_ids = 4; } } message SelectedIds { repeated string ids = 1; } message CancelRequest {} message MonitorAlbumStreamResponse { oneof message { StatusUpdate status = 1; PromptForDecision prompt = 2; MonitorAlbumResponse result = 3; ErrorUpdate error = 4; } } message StatusUpdate { MonitorStep step = 1; string message = 2; oneof data { StreamAlbumInfo album_info = 10; TorrentList torrents = 11; ReleaseInfo release_info = 12; } } message PromptForDecision { string prompt_id = 1; PromptType type = 2; string message = 3; int32 timeout_seconds = 4; oneof options { ConfirmPrompt confirm = 10; SelectOnePrompt select_one = 11; SelectManyPrompt select_many = 12; } } message ErrorUpdate { MonitorStep failed_step = 1; string message = 2; bool recoverable = 3; } message StreamAlbumInfo { string artist = 1; string title = 2; string release_date = 3; bool already_owned = 4; string owned_quality = 5; } message TorrentList { repeated TorrentSummary torrents = 1; } message TorrentSummary { string id = 1; string title = 2; string tracker = 3; int32 seeders = 4; string format = 5; bool lossless = 6; } message ReleaseInfo { string info_hash = 1; string format = 2; int32 bit_depth = 3; int32 sample_rate = 4; int32 seeders = 5; string tracker = 6; } message ConfirmPrompt { string confirm_label = 1; string cancel_label = 2; bool default_value = 3; } message SelectOnePrompt { repeated SelectOption options = 1; string default_id = 2; } message SelectManyPrompt { repeated SelectOption options = 1; repeated string default_ids = 2; int32 min_selections = 3; int32 max_selections = 4; } message SelectOption { string id = 1; string label = 2; string description = 3; }