Files
music-agregator/proto/music_agregator/v1/music_agregator.proto
T
2026-05-11 15:54:09 +02:00

400 lines
8.1 KiB
Protocol Buffer

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;
}