錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

mps-youtubeが何だかうまく動かない(解決)

コマンドラインからyoutubeが見られる(もしくは聴ける)mps-youtubeというツールがある。ながら聞きに便利なので、久しぶりに使ってみようとしたところ、色々とエラーが出て動かなかったので、Github公式ページのIssuesを見て対応した。

不具合と対応

対応した内容は以下。

  • 再生しようとすると「KeyError: 'dislike_count'」というエラーが出てクラッシュする

    Exception in thread Thread-1:
    Traceback (most recent call last):
    # ---------- 省略 ----------
      File "/home/username/.local/lib/python3.6/site-packages/pafy/backend_youtube_dl.py", line 54, in _fetch_basic
        self._dislikes = self._ydl_info['dislike_count']
    KeyError: 'dislike_count'
    

    「KeyError: 'dislike_count'」と出ているように、Youtubeで低評価が表示されなくなったアップデートが原因。
    ひとまずはsite-packages/pafy/backend_youtube_dl.pyの54行目をコメントアウトすれば良いようだ。手元の環境では、上記にエラーの出ている通り~/.local/lib/python3.6/site-packages/pafy/backend_youtube_dl.pyを修正した。

            self._likes = self._ydl_info['like_count']
    #        self._dislikes = self._ydl_info['dislike_count']
            self._username = self._ydl_info['uploader_id']
    

    KeyError: 'dislike_count' in pafy · Issue #1180 · mps-youtube/mps-youtube · GitHub

  • 再生を実行しても再生が開始しない
    再生しても画面下部に再生時間やプログレスバーが表示されず、動画ID・ファイル形式・ファイル容量(一桁数字+Mb)が表示されたままで画面が止まってしまう(以下のような状態)。

    qMfVmQf7UOPM; webm 113.137k; 8 Mb 
    

    本来であれば、以下のようにプログレスバーと再生時間が表示される。

    BUUxNsOONzI; m4a 129.472k; 53 Mb; 00:14:00 [30%]    [============================>
    

    「set」を実行してオプションの値を見ると、「ここに何々を設定する」的な説明文がセットされているキーがあったため「set playerargs」のようにしてこれらのキーの内容をクリアしたところ、正常に再生されるようになった。
    不具合時のオプション設定の状態は以下(該当箇所のみ抜粋)。

    Key                 Value
    ---------------------------------------------------------------------------------
    playerargs        : <args> - use specified arguments with player
    columns           : <columns> - select extra displayed fields in search results:
    download_command  : <command> - type help dl-command for info
    lastfm_username   : <username> - scrobble to this Last.fm userprofile
    

  • 「Problem playing last item: [Errno 2] No such file or directory: '<notifier'」というエラーが出る
    「set notifier」を実行してnotifierを「None」にセットする。
  • 「ValueError: time data '20xx-xx-xxTxx:xx:xxZ' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'」というエラーが出てクラッシュする
    「userpl hoge」(指定したユーザーのプレイリストを表示)したところ発生した。
    /usr/local/lib/python3.x/dist-packages/mps_youtube/util.pyの315行目と325行目を以下のように直せばよいとのこと。

    time_obj = time.strptime(yt_date_time, "%Y-%m-%dT%H:%M:%SZ")
    

    ValueError: time data does not match format '%Y-%m-%dT%H:%M:%S.%fZ' · Issue #1086 · mps-youtube/mps-youtube · GitHub

  • 「Problem playing last item: unconverted data remains: Z」と言われる
    曲一覧から「i 1」(曲の情報を取得)したところ発生した。
    /usr/local/lib/python3.x/dist-packages/mps_youtube/commands/misc.pyの253行目を以下のように書き換えるとのこと。

    pub = datetime.strptime(str(p.published), "%Y-%m-%d %H:%M:%SZ")
    

    Problem playing last item: unconverted data remains: Z · Issue #1101 · mps-youtube/mps-youtube · GitHub

  • 「urllib.error.HTTPError: HTTP Error 403: Forbidden」が出て起動しない
    同エラー表示に続けて「pafy.util.GdataError: Youtube Error 403: The request cannot be completed because you have exceeded your quota.」というエラーも出現した。
    「~/.config/mps-youtube/cache_py_*」を消したら直った(以下引用リンクに記述あり)。

    Problem playing last item: HTTP Error 403: Forbidden · Issue #1071 · mps-youtube/mps-youtube · GitHub

  • (番外)set api_keyしてもInvalid key or quota exceededと言われる
    これはmps-youtubeの問題ではなかった。
    作成したapiキーをコピペして入力しているのにエラーが出る。mps-youtubeのバージョンを下げたり、別のパッケージ管理ツールからインストールしてみてもダメ。
    対応として、Google Cloud Platformでプロジェクトを作り直し、apiキーを作り直したところ解決した。
    以下Githubコメントの通り、APIキーは、ある程度使わないでいるとプロジェクトやらキーやらが無効になることが原因であるらしい。確かに、mps-youtubeをしばらく使っていなかった。

    (翻訳)
    「無効なキーまたはクォータを超えました」というエラーが発生した場合、APIキーは保存されないため、代わりに元の開発者キーが使用されます。
    Google Developers Consoleで新しいプロジェクトと新しい認証情報を作成し、Youtube Data APIを追加して、そのAPIのみに制限する必要があります。理由は100%わかりませんが、キーをしばらく使用しないと、プロジェクトが無効になるか、プロジェクトの背後にあるIDが削除される場合に発生するようです。

    Polluted by AIzaSyCIM4EzNqi1in22f4Z3Ru3iYvLaY8tc3bo API key. · Issue #1061 · mps-youtube/mps-youtube · GitHub

対応できない不具合

  • 再生が止まったりクラッシュしたりする
    検索結果やプレイリスト上では表示されているが、実際に再生すると以下のようなエラーが出て再生が止まってしまう動画がある。連続再生していると、たびたびこうしたエラーで再生が止まってしまうので、できればこれらのような動画はmps-youtubeが自動でスキップしてほしいところ。
    回避するには、予め確実に再生できる動画だけをプレイリストに追加して再生すればよい(個人的には、その作業が面倒なのでmps-youtubeの使用頻度が落ちている)。
    • 「Forbidden」で再生できない場合
      検索結果に表示されていても、以下のエラーが出て再生できない場合がある。

      Problem playing last item: HTTP Error 403: Forbidden 
      

    • 「ERROR: Video unavailable」でmps-youtubeがクラッシュする
      Youtubeのライブラリ上で「利用できない動画」として非表示になっている動画が、userplコマンドなどで表示されるプレイリスト上では表示されてしまい、この動画を再生しようとした際に動画が読み込めないので発生している模様。mps-youtubeでも「利用できない動画」を除外して表示してくれればよいのだが…(「KeyError: 'xxxxxxxxxxx'」の「xxxxxxxxxxx」が非表示になっている動画のビデオID)。
      公式GitHub IssuesのApplication crashes when video is unavailable · Issue #847 · mps-youtube/mps-youtubeでバグとして認識はされている模様(ただし2018年に不具合が報告されてから未だ解決されていない)。

      ERROR: Video unavailable
      This video is not available
      # ---------- 省略 ----------
      youtube_dl.utils.ExtractorError: Video unavailable
      This video is not available
      During handling of the above exception, another exception occurred:
      
      Traceback (most recent call last):
        File "/usr/local/bin/mpsyt", line 8, in <module>
      # ---------- 省略 ----------
        File "/usr/local/lib/python3.6/dist-packages/mps_youtube/player.py", line 186, in stream_details
          cached = g.streams[song.ytid]
      KeyError: 'xxxxxxxxxxx'