テクノロジー · 実用ガイド
Linuxでmpvの動画を移動したら:一致する再開位置の記録を復元する
watch_laterのバックアップから別の復元用記録を作り、一致しない対応付けを確認して、唯一の保存記録を消費せずに再生を試します。

動画を移動しても、mpvの保存済み再生位置はバックアップに残っていることがあります。それでも新しいパスから動画を開くと、記録が見つからない場合があります。通常のフルパス方式の記録では、検索に使う名前がメディアのパスによって決まります。移動前と移動後の場所が分かっていれば、このガイドの補助ツールで記録を一括照合し、別の復元用ディレクトリにコピーできます。
これはLinux向けに範囲を限定した復元手順で、mpv 0.41.0とPython 3.12.14で検証しました。補助ツールにはPython 3.9以降が必要で、ほかのOSでは実行を拒否します。保存しておいたwatch_laterディレクトリと、同じ動画への信頼できる対応付けが必要です。以前の名前が不明なもの、削除された録画、同じ動画でも編集内容が異なるものは解決できません。
1. パスが本当に変わったかを確認する
mpvを閉じた状態で、元のwatch_laterディレクトリ全体を、ファイルの更新時刻を保ったまま新しいバックアップ先にコピーします。手順7のcp -aの形式を使い、存在しない新しいバックアップ先を指定してください。時刻をリセットする通常のコピーでは、後のmtimeチェックの結果が変わることがあります。--watch-later-directoryによる指定も含め、実際の設定で使っているディレクトリを選びます。現在のLinux向けドキュメントでは、既定の状態保存先は~/.local/state/mpv/watch_laterです。古い環境では~/.config/mpv/watch_laterにある場合があります。新しい環境のディレクトリが空でも、以前の記録が失われた証拠にはなりません。
メディアのパスが完全に同じなら、まず再開再生が有効で、mpvがコピーしたディレクトリを読んでいることを確認します。IINAのサポート事例には、コピーと設定で解決した例があります。それは、再インストールのたびにキーを付け直す必要があるという証拠ではありません。以下は、元の記録を保存したうえで、既知の移動や名前変更に対応する手順です。移行の近道としてベース名だけを使う保存方式に切り替えないでください。既存のフルパスのキーは変換されず、ファイル名が同じ別の動画でキーが重なることがあります。
2. 移動前と移動後の対応を確定する
ディレクトリ構造が変わっていなければ、以前のメディアルートと新しいルートを正確に控えます。例えば、すべてのファイル名とサブディレクトリを保ったまま、/media/old-drive/Showsが/mnt/media/Showsに移った場合です。以前のルート自体はもう存在しなくても構いませんが、その表記は分かっていなければなりません。大文字と小文字、シンボリックリンク経由の表記も含め、mpvが認識していたパスを使います。マウント名の推測は、信頼できる対応付けにはなりません。
補助ツールが受け付けるのは、./、../、連続する区切り文字、NUL、キャリッジリターン、改行を含まない、整ったLinuxの絶対パスです。古いバージョンの正規化方法を推測したり、匿名のハッシュを逆算したり、内容から名前変更後の動画を探したりはしません。パスから生成されるハッシュが保存記録と一致することは必要条件ですが、対応先が同じ録画、同じ編集版であることも確認する必要があります。動画が差し替えられたり編集されたりしていれば、以前の再生位置が同じ場面を指すとは限りません。
3. 完全な補助ツールを保存して内容を確認する
新しい作業フォルダーでターミナルを開き、python3 --versionを確認します。Linux上のPython 3.9以降を使ってください。次のコマンドは、実行せずにソース全体をダウンロードします。curlがなければ、同じアドレスをブラウザーで開き、recover-mpv-watch-later-v1.pyという名前で保存します。
curl --fail --location "https://watchatease.com/guide-tools/recover-mpv-watch-later-v1.py" --output "recover-mpv-watch-later-v1.py"
ソースを読んでから、sha256sum "recover-mpv-watch-later-v1.py"を実行します。このバージョンのSHA-256はe9b71043f6e0f1600387cf3b4760c84c1df673b866e62725ec5f5b93331d1d78でなければなりません。ハッシュが異なる場合、このガイドではそのバイト列を検証していません。処理を止め、ダウンロードを確認してください。補助ツールはmpvを起動せず、バックアップも編集しません。
4. 移動したツリーまたは明示的な名前変更をプレビューする
以下のサンプルパスをすべて自分のパスに置き換えます。バックアップには保存した状態記録のコピーを指定し、recovered-stateにはその外側にある、まだ存在しない新しいディレクトリを指定します。出力先の親ディレクトリを先に作り、recovered-state自体は作らずにおきます。計画とコピーの間は、バックアップと現在のメディアを変更しないでください。このルートモードのコマンドは、現在のツリーを列挙して対応する古いパスを組み立てます。--writeを付けなければJSONレポートを表示するだけです。検証したPython実行環境では、自動ツリースキャンはディレクトリのシンボリックリンクをたどりません。そのようなディレクトリ経由の既知のファイルには、明示的な対応付けを使ってください。
python3 "recover-mpv-watch-later-v1.py" --backup "/home/you/mpv-backup/watch_later" --output "/home/you/mpv-recovery/recovered-state" --old-root "/media/old-drive/Shows" --new-root "/mnt/media/Shows"
実際に名前を変更したものには、mapping.jsonというUTF-8ファイルを作り、[{"oldPath":"/media/old-drive/Shows/old-name.mkv","newPath":"/mnt/media/Shows/new-name.mkv"}]のような配列を記入します。既知の対応ごとにオブジェクトを一つ追加し、必要に応じて通常のJSONエスケープを行います。その場合は下の代替コマンドを使います。--mappingは、どちらのルート引数とも組み合わせられません。
python3 "recover-mpv-watch-later-v1.py" --backup "/home/you/mpv-backup/watch_later" --output "/home/you/mpv-recovery/recovered-state" --mapping "mapping.json"
5. 適用する前にレポートを読む
readyの行は、古いパスが、一つの有限で非負のstart値を含む、通常のUTF-8状態ファイルと一致したことを表します。oldPath、newPath、positionを確認してください。no-matching-position-recordは利用可能な再生位置記録が一致しなかったこと、current-media-missingは明示的な対応付けの先にファイルが存在しないことを示します。unmatchedBackupHashNamesには、ハッシュ名を持つほかの記録が並びます。その中にはディレクトリやプレイリストのリダイレクトマーカーも含まれ得ます。一致しない名前をすべて、失われた動画と解釈しないでください。
mtimeGateWouldMatchは、別個の任意の方針チェックとして読みます。mpvの--resume-playback-check-mtimeの既定値はnoです。この既定値で保存した記録は、メディアファイルと同じ更新時刻を持つとは限りません。したがって、falseだけでは破損や移動の失敗を意味しません。補助ツールは記録の既存の時刻を維持し、このフィールドがfalseでもreadyの行をコピーします。一致を作り出すためにメディアの時刻を変更することはありません。
試す前に再生方針を選びます。従来の運用でmtimeチェックを使っているなら、yesを維持し、チェックに通ることを条件にします。falseなら、その通常の復元経路をいったん止めます。同じ未編集の動画であることを別途確認できた場合に限り、もう一つの使い捨てコピーでnoを使い、保存位置を診断できます。それで時刻の整合性が修復されたり、後のyesでの再生が使えるようになったりするわけではありません。以下の既定値noの分岐にも、手順2の、対象が同じメディアと分かっているという条件が必要です。重複するコピー元、競合するコピー先のキー、不正な入力、未対応の状態記録がある場合は、都合のよい記録を選ぶのではなく、エラーや未一致の行を確認してください。
6. 別個の復元用記録を一組だけ書き出す
プレビューが意図した対応を示していることを確認したら、同じコマンドに--writeを追加して再実行します。パスと対応付けの方式は同じままにします。ルートモードの例は次のとおりです。
python3 "recover-mpv-watch-later-v1.py" --backup "/home/you/mpv-backup/watch_later" --output "/home/you/mpv-recovery/recovered-state" --old-root "/media/old-drive/Shows" --new-root "/mnt/media/Shows" --write
成功するとAPPLIED_TO_NEW_DIRECTORYと表示され、コピーした記録と並んでrecovery-report.jsonが書かれます。対象になった各記録のバイト列と更新時刻は維持されます。利用可能な記録がない場合、出力ディレクトリが既にある場合、または事前チェックでエラーがある場合は停止します。コピー中のI/Oエラーでは、新しいディレクトリが不完全なまま残ることがあります。エラーを保管し、修正後の実行では別の未使用の出力先を指定してください。不完全な結果を統合したり、フォルダーが存在するだけで完了と判断したりしないでください。
7. 使い捨てコピーで試してから、新しい状態を保存する
次のコマンドで、recovered-stateからresume-testという別のコピーを作ります。このコマンドは更新時刻を保ちます。コピー先には、まだ存在しない新しいディレクトリを指定してください。その後に作る作業用・テスト用コピーでも、毎回更新時刻を維持してください。recovered-stateと元のバックアップはそのまま保管します。以下のmpvコマンドは、同じ未編集の動画であることを確認したうえで、手順5の既定値noのmtime分岐を使います。従来の運用でmtimeチェックを使っているなら、そのオプションをyesに変え、チェックに通ることを条件にしてください。このテストでは普段の設定とスクリプトの自動読み込みを無効にし、再開再生を明示的に有効にします。サンプルパスはすべて置き換えてください。
cp -a -- "/home/you/mpv-recovery/recovered-state" "/home/you/mpv-recovery/resume-test"
mpv --no-config --load-scripts=no --ytdl=no --resume-playback=yes --resume-playback-check-mtime=no --watch-later-directory="/home/you/mpv-recovery/resume-test" "/mnt/media/Shows/episode.mkv"
意図した録画であり、期待した場面から再開することを確認します。代表的な名前変更済みファイルと、別々のディレクトリにある同名ファイルを含めて確認してください。mpvは再生の初期化中に読み込んだ再開記録を消費するため、もう一度試すには別のコピーか、新たに保存した再生位置が必要です。選んだ分岐で成功したら、Shift+Qで同じ方針のまま新しい状態を保存します。終了時の保存を設定していない限り、通常の終了は同じ操作ではありません。
条件を限定した確認に成功したら、普段のmpv設定を使い、--watch-later-directoryで作業用コピーを明示的に指定して、そのコピーを試します。選んだmtime方針を維持してください。noで保存しても、その記録を将来のyesで使えるように準備したことにはなりません。設定、スクリプト、保存済みオプションは通常の再生に影響する場合があります。必要な位置を確認し、新しい保存記録が機能することを確かめるまで、復元レポートと元のバックアップを保管します。この手順では、既存の運用中の状態ディレクトリに結果を自動統合しません。
8. 中止すべき場合と、テストで確認できた範囲を知る
再生がゼロから始まる場合は、まず試したパス、選んだ状態ディレクトリ、レポート、更新時刻の結果を照合します。パスの表記の変化や、有効になっているmtimeチェックが、記録を読めない理由になることがあります。不一致だけでは、バックアップの破損は証明できません。以前のパスが不明なもの、ベース名方式の記録、start値がないもの、編集内容が変わった動画は、この補助ツールの復元対象外です。コピーした古いファイル名のコメントやほかの保存済みオプションは書き換えないため、視聴履歴メニュー、g-wでの選択、プレイリストの順序、外部字幕のパスは復元しません。
検証では、この補助ツールと同じバイト列をLinux上で実行し、mpv 0.41.0と表示する第三者提供のバイナリを使いました。mpvが公式に推奨したパッケージではありません。mpv自身が生成した記録を使い、名前変更した既知の動画を4秒から再開できました。別の2ファイルのテストデータには、2秒と8秒という人工的な保存位置を使い、同名の両動画がそれぞれの位置から再開しました。ドライラン、競合、既に使われている出力先、バックアップのハッシュが変わらないことを含む、補助ツールの13項目の検証はすべて通過しました。別の12項目のプレーヤーテストでは、検索、mtime、記録の消費を確認しました。これらは生成したメディアを使う条件を限定したテストであり、元の投稿者の環境の再現や、Windows/macOS互換性の主張ではありません。
