Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]

### Added
- **MPD gains an optional, detectable exclusive-control/ownership mode that enables automatic
orphan cleanup only after a bounded observation window proves the partition is genuinely
ours** (`src/audio/mpd_output.rs`, `src/ui/output_dialogs.rs`,
`src/ui/output_switch.rs`, `locales/*.yml`). A new `MpdControlMode::Detected` variant and
matching `detection_enabled` persisted field opt in to a bipartite detection probe: the worker
restarts the probe on every successful load, advances it on each clean status observation
(no foreign current song, no option drift, no stale observation window), and only promotes it
to `Confirmed` after `MIN_DETECTION_OBSERVATIONS = 3` consecutive clean observations spanning
`MIN_DETECTION_AGE = 250 ms`. While `Confirmed`, automatic orphan cleanup is permitted
(matching the user-confirmed `Exclusive` mode); on a foreign current song, any of
`repeat`/`random`/`single`/`consume` flipped away from the enforced defaults, or an
observation gap beyond `MAX_DETECTION_GAP = 2 s`, the probe lapses and the partition is
treated as `Unconfirmed` until the next load restarts the probe. The legacy
`exclusive_control: false` default and the fail-closed load gate are preserved; legacy
`outputs.json` entries continue to deserialize with `detection_enabled: false` so the
conservative retain-on-cleanup path is the default. A new opt-in checkbox in the Add
Output dialog pairs with a localized warning/confirmation message in every supported
catalog (13 locales).
- **Last.fm now has a fail-closed protocol, desktop-authorization, credential-vault, durable-queue,
playback-evidence/owner, delivery/lifecycle runtime, and application-owner foundation**
([#50](https://github.com/jm2/tributary/issues/50),
Expand Down
2 changes: 2 additions & 0 deletions locales/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Port"
output_exclusive_control_warning: "MPD-Befehle für Pause, Stopp, Wiederholen, Zufall, Einzelwiedergabe und Verbrauch betreffen die gesamte Wiedergabepartition. Teilen Sie sie nicht mit einem anderen Controller oder einer anderen Tributary-Instanz."
output_exclusive_control_confirmation: "Ich bestätige, dass Tributary die exklusive Kontrolle über diese MPD-Wiedergabepartition hat."
output_detection_warning: "Tributary kann durch das Beobachten mehrerer aufeinanderfolgender Statusantworten erkennen, ob kein anderer Controller die Partition verändert, bevor die automatische Orphan-Bereinigung aktiviert wird. Die Erkennung ist fehlergeschützt: Jedes fremde aktuelle Lied, jede fremde Optionsänderung oder ein veraltetes Beobachtungsfenster kehrt zur konservativen Standardeinstellung zurück und behält den verwaisten Warteschlangeneintrag."
output_detection_confirmation: "Tributary darf die exklusive Kontrolle vor der automatischen Orphan-Bereinigung automatisch erkennen."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,8 @@ dialogs:
output_port: "Port"
output_exclusive_control_warning: "MPD pause, stop, repeat, random, single, and consume commands affect the entire playback partition. Do not share it with another controller or Tributary instance."
output_exclusive_control_confirmation: "I confirm Tributary has exclusive control of this MPD playback partition."
output_detection_warning: "Tributary can detect whether no other controller is mutating the partition by observing multiple consecutive status responses before enabling automatic orphan cleanup. Detection is fail-closed: any foreign current song, foreign option change, or stale observation window reverts to the conservative default of retaining the orphaned queue entry."
output_detection_confirmation: "Allow Tributary to detect exclusive control automatically before automatic orphan cleanup."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/es.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Puerto"
output_exclusive_control_warning: "Los comandos de MPD para pausar, detener, repetir, aleatorio, único y consumir afectan a toda la partición de reproducción. No la comparta con otro controlador ni con otra instancia de Tributary."
output_exclusive_control_confirmation: "Confirmo que Tributary tiene el control exclusivo de esta partición de reproducción de MPD."
output_detection_warning: "Tributary puede detectar si ningún otro controlador está modificando la partición observando varias respuestas de estado consecutivas antes de habilitar la limpieza automática de huérfanos. La detección es a prueba de fallos: cualquier canción actual ajena, cambio de opción ajeno o ventana de observación obsoleta revierte al valor predeterminado conservador de conservar la entrada de cola huérfana."
output_detection_confirmation: "Permitir que Tributary detecte automáticamente el control exclusivo antes de la limpieza automática de huérfanos."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/fr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Port"
output_exclusive_control_warning: "Les commandes MPD de pause, arrêt, répétition, lecture aléatoire, lecture unique et consommation affectent toute la partition de lecture. Ne la partagez pas avec un autre contrôleur ou une autre instance de Tributary."
output_exclusive_control_confirmation: "Je confirme que Tributary contrôle exclusivement cette partition de lecture MPD."
output_detection_warning: "Tributary peut détecter qu'aucun autre contrôleur ne modifie la partition en observant plusieurs réponses d'état consécutives avant d'activer le nettoyage automatique des orphelins. La détection est à sécurité intégrée : toute chanson actuelle étrangère, changement d'option étranger ou fenêtre d'observation obsolète rétablit la valeur par défaut conservatrice consistant à conserver l'entrée de file d'attente orpheline."
output_detection_confirmation: "Permettre à Tributary de détecter automatiquement le contrôle exclusif avant le nettoyage automatique des orphelins."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/it.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Porta"
output_exclusive_control_warning: "I comandi MPD pausa, arresto, ripetizione, casuale, singolo e consumo influiscono sull'intera partizione di riproduzione. Non condividerla con un altro controller o un'altra istanza di Tributary."
output_exclusive_control_confirmation: "Confermo che Tributary ha il controllo esclusivo di questa partizione di riproduzione MPD."
output_detection_warning: "Tributary può rilevare se nessun altro controller sta modificando la partizione osservando più risposte di stato consecutive prima di abilitare la pulizia automatica degli orfani. Il rilevamento è a prova di errore: qualsiasi brano corrente esterno, modifica di opzione esterna o finestra di osservazione non aggiornata ripristina l'impostazione predefinita conservativa di conservare la voce in coda orfana."
output_detection_confirmation: "Consenti a Tributary di rilevare automaticamente il controllo esclusivo prima della pulizia automatica degli orfani."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/ja.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "ポート"
output_exclusive_control_warning: "MPD の一時停止、停止、リピート、ランダム、シングル、consume コマンドは再生パーティション全体に影響します。別のコントローラーや Tributary インスタンスと共有しないでください。"
output_exclusive_control_confirmation: "Tributary がこの MPD 再生パーティションを排他的に制御することを確認します。"
output_detection_warning: "Tributary は、自動オーファンクリーンアップを有効にする前に、複数の連続したステータス応答を観察することで、他のコントローラーがパーティションを変更していないことを検出できます。検出はフェイルセーフです。外部の現在の曲、外部のオプション変更、または古い観察ウィンドウが発生すると、孤児キューエントリを保持する保守的なデフォルトに戻ります。"
output_detection_confirmation: "自動オーファンクリーンアップの前に、Tributary が排他制御を自動的に検出することを許可します。"

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/ko.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "포트"
output_exclusive_control_warning: "MPD의 일시 정지, 정지, 반복, 무작위, 단일 및 consume 명령은 전체 재생 파티션에 영향을 줍니다. 다른 컨트롤러나 Tributary 인스턴스와 공유하지 마세요."
output_exclusive_control_confirmation: "Tributary가 이 MPD 재생 파티션을 독점 제어함을 확인합니다."
output_detection_warning: "Tributary는 자동 고아 정리를 활성화하기 전에 여러 연속 상태 응답을 관찰하여 다른 컨트롤러가 파티션을 변경하지 않는지 감지할 수 있습니다. 감지는 페일 세이프입니다. 외부 현재 곡, 외부 옵션 변경 또는 오래된 관찰 창이 발생하면 고아 큐 항목을 유지하는 보수적 기본값으로 되돌아갑니다."
output_detection_confirmation: "자동 고아 정리 전에 Tributary가 독점 제어를 자동으로 감지하도록 허용합니다."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/nl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Poort"
output_exclusive_control_warning: "MPD-opdrachten voor pauzeren, stoppen, herhalen, willekeurig, enkel en verbruiken beïnvloeden de hele afspeelpartitie. Deel deze niet met een andere controller of Tributary-instantie."
output_exclusive_control_confirmation: "Ik bevestig dat Tributary exclusieve controle over deze MPD-afspeelpartitie heeft."
output_detection_warning: "Tributary kan detecteren of geen enkele andere controller de partitie wijzigt door meerdere opeenvolgende statusreacties te observeren voordat de automatische weesopruiming wordt ingeschakeld. Detectie is fail-safe: elk vreemd huidig nummer, vreemde optiewijziging of verouderd observatievenster valt terug op de conservatieve standaard om het wees-wachtrij-item te behouden."
output_detection_confirmation: "Tributary toestaan om automatisch exclusieve controle te detecteren vóór automatische weesopruiming."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/pl.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Port"
output_exclusive_control_warning: "Polecenia MPD wstrzymania, zatrzymania, powtarzania, losowania, trybu pojedynczego i zużywania dotyczą całej partycji odtwarzania. Nie udostępniaj jej innemu kontrolerowi ani innej instancji Tributary."
output_exclusive_control_confirmation: "Potwierdzam, że Tributary ma wyłączną kontrolę nad tą partycją odtwarzania MPD."
output_detection_warning: "Tributary może wykryć, czy żaden inny kontroler nie modyfikuje partycji, obserwując wiele kolejnych odpowiedzi stanu przed włączeniem automatycznego czyszczenia sierot. Wykrywanie jest bezpieczne w razie awarii: każdy obcy bieżący utwór, obca zmiana opcji lub nieaktualne okno obserwacji powracają do konserwatywnej wartości domyślnej polegającej na zachowaniu osieroconego wpisu kolejki."
output_detection_confirmation: "Pozwól Tributary automatycznie wykrywać wyłączną kontrolę przed automatycznym czyszczeniem sierot."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/pt-BR.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Porta"
output_exclusive_control_warning: "Os comandos MPD de pausar, parar, repetir, aleatório, único e consumir afetam toda a partição de reprodução. Não a compartilhe com outro controlador ou outra instância do Tributary."
output_exclusive_control_confirmation: "Confirmo que o Tributary tem controle exclusivo desta partição de reprodução MPD."
output_detection_warning: "O Tributary pode detectar se nenhum outro controlador está modificando a partição observando várias respostas de status consecutivas antes de habilitar a limpeza automática de órfãos. A detecção é à prova de falhas: qualquer música atual estrangeira, alteração de opção estrangeira ou janela de observação obsoleta reverte para o padrão conservador de manter a entrada órfã da fila."
output_detection_confirmation: "Permitir que o Tributary detecte automaticamente o controle exclusivo antes da limpeza automática de órfãos."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/ru.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "Порт"
output_exclusive_control_warning: "Команды MPD паузы, остановки, повтора, случайного и одиночного воспроизведения и consume влияют на весь раздел воспроизведения. Не используйте его совместно с другим контроллером или экземпляром Tributary."
output_exclusive_control_confirmation: "Я подтверждаю, что Tributary имеет исключительный контроль над этим разделом воспроизведения MPD."
output_detection_warning: "Tributary может определить, что никакой другой контроллер не изменяет раздел, наблюдая за несколькими последовательными ответами состояния, прежде чем включить автоматическую очистку потерянных записей. Обнаружение отказоустойчиво: любая посторонняя текущая песня, постороннее изменение параметра или устаревшее окно наблюдения возвращают к консервативному значению по умолчанию, сохраняющему потерянную запись очереди."
output_detection_confirmation: "Разрешить Tributary автоматически определять исключительный контроль перед автоматической очисткой потерянных записей."

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/zh-CN.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "端口"
output_exclusive_control_warning: "MPD 的暂停、停止、重复、随机、单曲和 consume 命令会影响整个播放分区。请勿与其他控制器或 Tributary 实例共享。"
output_exclusive_control_confirmation: "我确认 Tributary 独占控制此 MPD 播放分区。"
output_detection_warning: "在启用自动孤立项清理之前,Tributary 可以通过观察多个连续的状态响应来检测是否有其他控制器正在修改分区。检测是故障安全的:任何外部当前歌曲、外部选项更改或过时的观察窗口都会恢复到保留孤立队列条目的保守默认值。"
output_detection_confirmation: "允许 Tributary 在自动孤立项清理之前自动检测独占控制。"

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
2 changes: 2 additions & 0 deletions locales/zh-TW.yml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ dialogs:
output_port: "連接埠"
output_exclusive_control_warning: "MPD 的暫停、停止、重複、隨機、單曲和 consume 指令會影響整個播放分割區。請勿與其他控制器或 Tributary 執行個體共用。"
output_exclusive_control_confirmation: "我確認 Tributary 獨佔控制此 MPD 播放分割區。"
output_detection_warning: "在啟用自動孤兒清理之前,Tributary 可以透過觀察多個連續的狀態回應來偵測是否有其他控制器正在修改分割區。偵測是故障安全的:任何外部當前歌曲、外部選項變更或過時的觀察視窗都會還原為保留孤兒佇列項目的保守預設值。"
output_detection_confirmation: "允許 Tributary 在自動孤兒清理之前自動偵測獨佔控制。"

# ── Playlist import and export ─────────────────────────────────────
playlist_io:
Expand Down
Loading
Loading