やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

RaspbianにeyeD3をインストールする

 音楽ファイルのジャケット画像とかほしいので。

対象環境

前提

参考

 2018-09-24時点での最新は0.87

方法

  1. eyeD3をインストールする
  2. タグ情報を取得する

1. eyeD3をインストールする

A. apt, apt-get

 インストールできなかった。

$ sudo apt install eyeD3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ eyeD3 が見つかりません
$ sudo apt-get install eyeD3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ eyeD3 が見つかりません

 検索してみると見つかった。小文字のd違い。だが、バージョンが古い。

$ sudo apt search eyeD3
ソート中... 完了
全文検索... 完了  
eyed3/stable,stable,stable 0.7.10-1 all
  Display and manipulate id3-tags on the command-line

python-eyed3/stable,stable,stable 0.7.10-1 all
  Python module for id3-tags manipulation

B. pip, pip3

 eyeD3はPython製らしいのでpipでインストールする。python2系ならpip, python3系ならpip3。今回は2系にする。念の為バージョン確認。

$ python -V
Python 2.7.13
$ pip -V
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)
$ pip3 -V
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.5)
$ python3 -V
Python 3.5.3

2系

$ pip search eyeD3
eyeD3 (0.8.7)  - Python audio data toolkit (ID3 and MP3)

 検索するとバージョンは0.8.7。現時点での最新だった。

$ pip install eyeD3

 なんかエラー出た。

Collecting eyeD3
  Downloading https://files.pythonhosted.org/packages/57/42/e6b868b2afb38ff51f23edff0f884c68a746cc1ba25e0b3696f64ca33b75/eyeD3-0.8.7-py2.py3-none-any.whl (147kB)
    100% |████████████████████████████████| 153kB 855kB/s 
Collecting six (from eyeD3)
  Downloading https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Collecting pathlib (from eyeD3)
  Downloading https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz (49kB)
    100% |████████████████████████████████| 51kB 1.8MB/s 
Collecting python-magic (from eyeD3)
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 554, in _prepare_file
    require_hashes
  File "/usr/lib/python2.7/dist-packages/pip/req/req_install.py", line 278, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 465, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 423, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 568, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 683, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 792, in get_page
    "Cache-Control": "max-age=600",
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 501, in get
    return self.request('GET', url, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/download.py", line 386, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/usr/share/python-wheels/CacheControl-0.11.7-py2.py3-none-any.whl/cachecontrol/adapter.py", line 47, in send
    resp = super(CacheControlAdapter, self).send(request, **kw)
  File "/usr/share/python-wheels/requests-2.12.4-py2.py3-none-any.whl/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/connectionpool.py", line 643, in urlopen
    _stacktrace=sys.exc_info()[2])
  File "/usr/share/python-wheels/urllib3-1.19.1-py2.py3-none-any.whl/urllib3/util/retry.py", line 315, in increment
    total -= 1
TypeError: unsupported operand type(s) for -=: 'Retry' and 'int'

 「-=演算子をサポートしていない」というエラーに見える。Pythonのバージョンが古いせい?

3系

$ pip3 search eyeD3
eyeD3 (0.8.7)  - Python audio data toolkit (ID3 and MP3)
$ pip3 install eyeD3

 成功!

Collecting eyeD3
  Using cached https://files.pythonhosted.org/packages/57/42/e6b868b2afb38ff51f23edff0f884c68a746cc1ba25e0b3696f64ca33b75/eyeD3-0.8.7-py2.py3-none-any.whl
Collecting python-magic (from eyeD3)
  Downloading https://files.pythonhosted.org/packages/42/a1/76d30c79992e3750dac6790ce16f056f870d368ba142f83f75f694d93001/python_magic-0.4.15-py2.py3-none-any.whl
Collecting pathlib (from eyeD3)
  Downloading https://www.piwheels.org/simple/pathlib/pathlib-1.0.1-py3-none-any.whl
Collecting six (from eyeD3)
  Using cached https://files.pythonhosted.org/packages/67/4b/141a581104b1f6397bfa78ac9d43d8ad29a7ca43ea90a2d863fe3056e86a/six-1.11.0-py2.py3-none-any.whl
Installing collected packages: python-magic, pathlib, six, eyeD3
Successfully installed eyeD3-0.8.7 pathlib-1.0.1 python-magic-0.4.15 six-1.11.0

 インストール確認。

 $ pip3 list | grep eyeD3
eyeD3 (0.8.7)

 えっ……。コマンドない。

$ eyeD3
bash: eyeD3: コマンドが見つかりません
$ eyed3
bash: eyed3: コマンドが見つかりません

 そもそも、どこにインストールされた?

$ pip3 show eyeD3
Name: eyeD3
Version: 0.8.7
Summary: Python audio data toolkit (ID3 and MP3)
Home-page: http://eyed3.nicfit.net/
Author: Travis Shirk
Author-email: travis@pobox.com
License: GNU GPL v3.0
Location: /home/pi/.local/lib/python3.5/site-packages
Requires: python-magic, six, pathlib

 /home/pi/.local/lib/python3.5/site-packages/eyed3を見てみたが実行ファイルがない……。もしやPython3ライブラリだけ? バイナリないの? なんかネットで見つけた情報と違う。

C. apt, apt-get

 もう古くてもいいや……。

$ sudo apt install eyed3
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  python-eyed3
以下のパッケージが新たにインストールされます:
  eyed3 python-eyed3
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
112 kB のアーカイブを取得する必要があります。
この操作後に追加で 524 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

 やっとインストールできた……。

$ eyeD3 --version
eyeD3 0.7.10-final (C) Copyright 2002-2014 Travis Shirk
This program comes with ABSOLUTELY NO WARRANTY! See COPYING for details.
Run with --help/-h for usage information or read the docs at
http://eyeD3.nicfit.net/
$ eyeD3 --help
usage: eyeD3 [-h] [--version] [-l LEVEL[:LOGGER]] [--exclude PATTERN] [-L]
             [-P NAME] [-C FILE] [--backup] [-Q] [--fs-encoding ENCODING]
             [--no-config] [--no-color] [--profile] [--pdb] [-a STRING]
             [-A STRING] [-b STRING] [-t STRING] [-n NUM] [-N NUM]
             [--track-offset N] [-d NUM] [-D NUM] [-G GENRE] [-Y YEAR]
             [-c STRING] [--rename PATTERN] [-1] [-2] [--to-v1.1] [--to-v2.3]
             [--to-v2.4] [--release-date DATE] [--orig-release-date DATE]
             [--recording-date DATE] [--encoding-date DATE]
             [--tagging-date DATE] [--publisher STRING] [--play-count <+>N]
             [--bpm N] [--unique-file-id OWNER_ID:ID]
             [--add-comment COMMENT[:DESCRIPTION[:LANG]]
             [--remove-comment DESCRIPTION[:LANG]] [--remove-all-comments]
             [--add-lyrics LYRICS_FILE[:DESCRIPTION[:LANG]]]
             [--remove-lyrics DESCRIPTION[:LANG]] [--remove-all-lyrics]
             [--text-frame FID:TEXT] [--user-text-frame DESC:TEXT]
             [--url-frame FID:URL] [--user-url-frame DESCRIPTION:URL]
             [--add-image IMG_PATH:TYPE[:DESCRIPTION]]
             [--remove-image DESCRIPTION] [--remove-all-images]
             [--write-images DIR]
             [--add-object OBJ_PATH:MIME-TYPE[:DESCRIPTION[:FILENAME]]]
             [--remove-object DESCRIPTION] [--write-objects DIR]
             [--remove-all-objects]
             [--add-popularity EMAIL:RATING[:PLAY_COUNT]]
             [--remove-popularity EMAIL] [--remove-v1] [--remove-v2]
             [--remove-all] [--remove-frame FID] [--max-padding NUM_BYTES]
             [--no-max-padding] [--encoding latin1|utf8|utf16|utf16-be]
             [--force-update] [-v] [--preserve-file-times]
             [PATH [PATH ...]]

positional arguments:
  PATH                  Files or directory paths

optional arguments:
  -h, --help            show this help message and exit
  --version             Display version information and exit
  --exclude PATTERN     A regular expression for path exclusion. May be
                        specified multiple times.
  -L, --plugins         List all available plugins
  -P NAME, --plugin NAME
                        Specify which plugin to use. The default is 'classic'
  -C FILE, --config FILE
                        Supply a configuration file. The default is
                        '/home/pi/.eyeD3/config.ini', although even that is
                        optional.
  --backup              Plugins should honor this option such that a backup is
                        made of any file modified. The backup is made in same
                        directory with a '.orig' extension added.
  -Q, --quiet           A hint to plugins to output less.
  --fs-encoding ENCODING
                        Use the specified file system encoding for filenames.
                        Default as it was detected is 'UTF-8' but this option
                        is still useful when reading from mounted file
                        systems.
  --no-config           Do not load the default user config
                        '/home/pi/.eyeD3/config.ini'. The -c/--config options
                        are still honored if present.
  --no-color            Suppress color codes in console output. This will
                        happen automatically if the output is not a TTY (e.g.
                        when redirecting to a file)

Debugging:
  -l LEVEL[:LOGGER], --log-level LEVEL[:LOGGER]
                        Set a log level. This option may be specified multiple
                        times. If a logger name is specified than the level
                        applies only to that logger, otherwise the level is
                        set on the top-level logger. Acceptable levels are
                        'debug', 'verbose', 'info', 'warning', 'error',
                        'critical'.
  --profile             Run using python profiler.
  --pdb                 Drop into 'pdb' when errors occur.

Plugin options:
  Classic eyeD3 interface for viewing and editing tags.
  
  All PATH arguments are parsed and displayed. Directory paths are searched
  recursively. Any editing options (--artist, --title) are applied to each file
  read.
  
  All date options (-Y, --release-year excepted) follow ISO 8601 format. This is
  ``yyyy-mm-ddThh:mm:ss``. The year is required, and each component thereafter is
  optional. For example, 2012-03 is valid, 2012--12 is not.

  -a STRING, --artist STRING
                        Set the artist name.
  -A STRING, --album STRING
                        Set the album name.
  -b STRING, --album-artist STRING
                        Set the album artist name. 'Various Artists', for
                        example. Another example is collaborations when the
                        track artist might be 'Eminem featuring Proof' the
                        album artist would be 'Eminem'.
  -t STRING, --title STRING
                        Set the track title.
  -n NUM, --track NUM   Set the track number. Use 0 to clear.
  -N NUM, --track-total NUM
                        Set total number of tracks. Use 0 to clear.
  --track-offset N      Increment/decrement the track number by [-]N. This
                        option is applied after --track=N is set.
  -d NUM, --disc-num NUM
                        Set the disc number. Use 0 to clear.
  -D NUM, --disc-total NUM
                        Set total number of discs in set. Use 0 to clear.
  -G GENRE, --genre GENRE
                        Set the genre. If the argument is a standard ID3 genre
                        name or number both will be set. Otherwise, any string
                        can be used. Run 'eyeD3 --plugin=genres' for a list of
                        standard ID3 genre names/ids.
  -Y YEAR, --release-year YEAR
                        Set the year the track was released. Use the date
                        options for more precise values or dates other than
                        release.
  -c STRING, --comment STRING
                        Set a comment. In ID3 tags this is the comment with an
                        empty description. See --add-comment to add multiple
                        comment frames.
  --rename PATTERN      Rename file (the extension is not affected) based on
                        data in the tag using substitution variables: $album,
                        $album_artist, $artist, $best_date,
                        $best_date:prefer_recording,
                        $best_date:prefer_recording:year,
                        $best_date:prefer_release,
                        $best_date:prefer_release:year, $best_date:year,
                        $disc:num, $disc:total, $file, $file:ext,
                        $original_release_date, $original_release_date:year,
                        $recording_date, $recording_date:year, $release_date,
                        $release_date:year, $title, $track:num, $track:total

ID3 options:
  -1, --v1              Only read and write ID3 v1.x tags. By default, v1.x
                        tags are only read or written if there is not a v2 tag
                        in the file.
  -2, --v2              Only read/write ID3 v2.x tags. This is the default
                        unless the file only contains a v1 tag.
  --to-v1.1             Convert the file's tag to ID3 v1.1 (Or 1.0 if there is
                        no track number)
  --to-v2.3             Convert the file's tag to ID3 v2.3
  --to-v2.4             Convert the file's tag to ID3 v2.4
  --release-date DATE   Set the date the track/album was released
  --orig-release-date DATE
                        Set the original date the track/album was released
  --recording-date DATE
                        Set the date the track/album was recorded
  --encoding-date DATE  Set the date the file was encoded
  --tagging-date DATE   Set the date the file was tagged
  --publisher STRING    Set the publisher/label name
  --play-count <+>N     Set the number of times played counter. If the
                        argument value begins with '+' the tag's play count is
                        incremented by N, otherwise the value is set to
                        exactly N.
  --bpm N               Set the beats per minute value.
  --unique-file-id OWNER_ID:ID
                        Add a unique file ID frame. If the ID arg is empty the
                        frame is removed. An OWNER_ID is required. The ID may
                        be no more than 64 bytes.
  --add-comment COMMENT[:DESCRIPTION[:LANG]
                        Add or replace a comment. There may be more than one
                        comment in a tag, as long as the DESCRIPTION and LANG
                        values are unique. The default DESCRIPTION is '' and
                        the default language code is 'eng'.
  --remove-comment DESCRIPTION[:LANG]
                        Remove comment matching DESCRIPTION and LANG. The
                        default language code is 'eng'.
  --remove-all-comments
                        Remove all comments from the tag.
  --add-lyrics LYRICS_FILE[:DESCRIPTION[:LANG]]
                        Add or replace a lyrics. There may be more than one
                        set of lyrics in a tag, as long as the DESCRIPTION and
                        LANG values are unique. The default DESCRIPTION is ''
                        and the default language code is 'eng'.
  --remove-lyrics DESCRIPTION[:LANG]
                        Remove lyrics matching DESCRIPTION and LANG. The
                        default language code is 'eng'.
  --remove-all-lyrics   Remove all lyrics from the tag.
  --text-frame FID:TEXT
                        Set the value of a text frame. To remove the frame,
                        specify an empty value. For example, --text-
                        frame='TDRC:'
  --user-text-frame DESC:TEXT
                        Set the value of a user text frame (i.e., TXXX). To
                        remove the frame, specify an empty value. e.g.,
                        --user-text-frame='SomeDesc:'
  --url-frame FID:URL   Set the value of a URL frame. To remove the frame,
                        specify an empty value. e.g., --url-frame='WCOM:'
  --user-url-frame DESCRIPTION:URL
                        Set the value of a user URL frame (i.e., WXXX). To
                        remove the frame, specify an empty value. e.g.,
                        --user-url-frame='SomeDesc:'
  --add-image IMG_PATH:TYPE[:DESCRIPTION]
                        Add or replace an image. There may be more than one
                        image in a tag, as long as the DESCRIPTION values are
                        unique. The default DESCRIPTION is ''. If PATH begins
                        with 'http[s]://' then it is interpreted as a URL
                        instead of a file containing image data. The TYPE must
                        be one of the following: OTHER, ICON, OTHER_ICON,
                        FRONT_COVER, BACK_COVER, LEAFLET, MEDIA, LEAD_ARTIST,
                        ARTIST, CONDUCTOR, BAND, COMPOSER, LYRICIST,
                        RECORDING_LOCATION, DURING_RECORDING,
                        DURING_PERFORMANCE, VIDEO, BRIGHT_COLORED_FISH,
                        ILLUSTRATION, BAND_LOGO, PUBLISHER_LOGO.
  --remove-image DESCRIPTION
                        Remove image matching DESCRIPTION.
  --remove-all-images   Remove all images from the tag
  --write-images DIR    Causes all attached images (APIC frames) to be written
                        to the specified directory.
  --add-object OBJ_PATH:MIME-TYPE[:DESCRIPTION[:FILENAME]]
                        Add or replace an object. There may be more than one
                        object in a tag, as long as the DESCRIPTION values are
                        unique. The default DESCRIPTION is ''.
  --remove-object DESCRIPTION
                        Remove object matching DESCRIPTION.
  --write-objects DIR   Causes all attached objects (GEOB frames) to be
                        written to the specified directory.
  --remove-all-objects  Remove all objects from the tag
  --add-popularity EMAIL:RATING[:PLAY_COUNT]
                        Adds a pupularity metric. There may be multiples
                        popularity values, but each must have a unique email
                        address component. The rating is a number between 0
                        (worst) and 255 (best). The play count is optional,
                        and defaults to 0, since there is already a dedicated
                        play count frame.
  --remove-popularity EMAIL
                        Removes the popularity frame with the specified email
                        key.
  --remove-v1           Remove ID3 v1.x tag.
  --remove-v2           Remove ID3 v2.x tag.
  --remove-all          Remove ID3 v1.x and v2.x tags.
  --remove-frame FID    Remove all frames with the given ID. This option may
                        be specified multiple times.
  --max-padding NUM_BYTES
                        Shrink file if tag padding (unused space) exceeds the
                        given number of bytes. (Useful e.g. after removal of
                        large cover art.) Default is 64 KiB, file will be
                        rewritten with default padding (1 KiB) or max padding,
                        whichever is smaller.
  --no-max-padding      Disable --max-padding altogether.
  --encoding latin1|utf8|utf16|utf16-be
                        Set the encoding that is used for all text frames.
                        This option is only applied if the tag is updated as
                        the result of an edit option (e.g. --artist, --title,
                        etc.) or --force-update is specified.

Misc options:
  --force-update        Rewrite the tag despite there being no edit options.
  -v, --verbose         Show all available tag data
  --preserve-file-times
                        When writing, do not update file modification times.

使ってみる

$ eyeD3 音楽ファイルパス

 え……。できてないじゃん。

$ eyeD3 /tmp/音楽ファイル.wav
Nothing to do

 ネットで見たのと違う……。

 ググってみると、MP3でないと使えないとか……。

 MP3は音質が劣化するから嫌。wavでタグ情報つけたいのに。

 ググってみると、FLACでないと無劣化&タグ付け仕様でないという。

 そういうことは先に言ってくれ……。