Pythonを使用したMP3メタデータへのアクセス[終了]


122

Pythonでmp3メタデータを取得するにはどうすればよいですか?

回答:


106

先日eyeD3を使って成功しました。私が見た他のモジュールではできなかったアートワークをID3タグに追加できることがわかりました。pipを使用してインストールするか、tarをダウンロードしてpython setup.py install、ソースフォルダーから実行する必要があります。

Webサイトからの関連する例を以下に示します。

v1またはv2のいずれかのタグ情報を含むmp3ファイルの内容を読み取る:

 import eyeD3
 tag = eyeD3.Tag()
 tag.link("/some/file.mp3")
 print tag.getArtist()
 print tag.getAlbum()
 print tag.getTitle()

mp3ファイル(トラック長、ビットレートなど)を読み取り、そのタグにアクセスします。

if eyeD3.isMp3File(f):
     audioFile = eyeD3.Mp3AudioFile(f)
     tag = audioFile.getTag()

特定のタグバージョンを選択できます。

 tag.link("/some/file.mp3", eyeD3.ID3_V2)
 tag.link("/some/file.mp3", eyeD3.ID3_V1)
 tag.link("/some/file.mp3", eyeD3.ID3_ANY_VERSION)  # The default.

または、生のフレームを反復処理することもできます。

 tag = eyeD3.Tag()
 tag.link("/some/file.mp3")
 for frame in tag.frames:
    print frame

タグがファイルにリンクされると、変更して保存できます。

 tag.setArtist(u"Cro-Mags")
 tag.setAlbum(u"Age of Quarrel")
 tag.update()

リンクされたタグがv2で、v1として保存する場合:

 tag.update(eyeD3.ID3_V1_1)

タグを読み取り、ファイルから削除します。

 tag.link("/some/file.mp3")
 tag.remove()
 tag.update()

新しいタグを追加します。

 tag = eyeD3.Tag()
 tag.link('/some/file.mp3')    # no tag in this file, link returned False
 tag.header.setVersion(eyeD3.ID3_V2_3)
 tag.setArtist('Fugazi')
 tag.update()

19
eyeD3はGPLでもあります。私と同じようにプログラムで使用する場合は、プログラムを無料プログラムとしてリリースする必要があります。また、これらの人々と同じように、LGPLでリリースできないのはなぜですか?
Ciantic 2009

9
@Ciantic:ID3タグは非常にシンプルです。ライブラリを自分で作成し、BSDでリリースしてみませんか?さらに、この人々はそもそもあなたを何も所有していません。こちらをご覧
EstebanKüber10年

2
@ voyager、ID3v1タグは単純で、ID3v2タグは地獄のように複雑です...そして今、pytagger github.com/Ciantic/songdetailsの BSDラッパーを作成しました。まだリリース済みとしてタグ付けしていませんが、動作します。
Ciantic、2010年

5
新しいバージョンでは、import eyed3(小文字のd)を使用します。
Jake Z

4
これらのメモは、eyed3の古いバージョン用であり、正常に機能しなくなることに注意してください。たとえば、link()関数は廃止され、属性はセッターなしで宣言的に設定されるようになりました。
mlissner 2014

37

以前にメディアファイルのタグを編集するためにmutagenを使用しました。mutagenの良いところは、mp4、FLACなどの他の形式を処理できることです。このAPIを使用して、多くの成功を収めたスクリプトをいくつか作成しました。


2
code.google.com/p/mutagen-MutagenはGPLであるため、ほとんどのプロジェクトではno-noです。
Ciantic 2009

3
Mutagenは素晴らしいですが、アーティストやタイトルのジャンルなどを取得するための統一された方法がありません。フォーマットに依存するさまざまなキーを知っておく必要があります。TIT2mp3 title用、ogg \xa9nam用、mp4 Title用、WMA用など。
QUITあり--Anony-Mousse 2013年

20

の問題eyed3は、NotImplementedError("Unable to write ID3 v2.2")一般的なMP3ファイルをスローすることです。

私の経験では、mutagenクラスEasyID3はより確実に機能します。例:

from mutagen.easyid3 import EasyID3

audio = EasyID3("example.mp3")
audio['title'] = u"Example Title"
audio['artist'] = u"Me"
audio['album'] = u"My album"
audio['composer'] = u"" # clear
audio.save()

他のすべてのタグは、この方法でアクセスして保存でき、ほとんどの目的に役立ちます。詳細については、変異原チュートリアルをご覧ください。


13

あなたが後にしていることであるID3のモジュール。それは非常にシンプルで、必要なものを正確に提供します。ID3.pyファイルをサイトのパッケージディレクトリにコピーするだけで、次のようなことができるようになります。

from ID3 import *
try:
  id3info = ID3('file.mp3')
  print id3info
  # Change the tags
  id3info['TITLE'] = "Green Eggs and Ham"
  id3info['ARTIST'] = "Dr. Seuss"
  for k, v in id3info.items():
    print k, ":", v
except InvalidTagError, message:
  print "Invalid ID3 tag:", message

12
ただのメモ。このモジュールは非常に古く(2002)、ID3タグのV2をサポートしていません
Eli Bendersky '28


7

皆さんへの追加情報:

PythonInMusicのページの「MP3スタッフとメタデータエディター」のセクションをご覧ください。


6

『Dive Into Python』という本の簡単な例は問題なく動作します。これはダウンロードリンクです。例はfileinfo.pyです。それが最高かどうかはわかりませんが、基本的な仕事はできます。

本全体はここからオンライン入手できます


3
その例は、Pythonバージョンの点でもID3バージョンの点でも、現在は少し古くなっています...
Bex

両方のリンクが機能しなくなります。(答えが9歳であることはわかっています)オンラインブック「Dive into Python」をお探しの場合は、ここに現在のリンクがあります
Edwin van Mierlo

そのリンクも機能しなくなります。私がすぐにグーグルできる最高のものはgithub.com/diveintomark/diveintopython3
tripleee

6

上記の回答を調べたところ、GPLのライセンス問題のため、これらの回答は私のプロジェクトには適していません。

そして、私が見つけたこの:PyID3Libは、その特定ながら、pythonのバインディングの発売日が古い、それが使用するID3Lib自体が最新の状態です。

注目に値するのは、どちらもLGPLであり、問​​題なく進むことです。


4

最も簡単な方法は、songdetailsです。

読み取りデータ用

import songdetails
song = songdetails.scan("blah.mp3")
if song is not None:
    print song.artist

同様に編集

import songdetails
song = songdetails.scan("blah.mp3")
if song is not None:
    song.artist = u"The Great Blah"
    song.save()

中国語がわかるまで、名前の前にuを追加することを忘れないでください。

uはpython globモジュールを使用して一括で読み取りおよび編集できます

例。

import glob
songs = glob.glob('*')   // script should be in directory of songs.
for song in songs:
    // do the above work.

4

pip installここで推奨されているeyeD3、pytaglib、およびID3モジュールの単純なルートを試した後、この4番目のオプションしか機能しないことがわかりました。残りの部分には、C ++での依存関係の欠落や、何かの魔法、または欠けていた他のライブラリのインポートエラーがありましpipた。したがって、ID3タグ(すべてのバージョン)の基本的な読み取りには、次のコードを使用します。

https://pypi.python.org/pypi/tinytag/0.18.0

from tinytag import TinyTag
tag = TinyTag.get('/some/music.mp3')

TinyTagで取得できる可能な属性のリスト:

tag.album         # album as string
tag.albumartist   # album artist as string
tag.artist        # artist name as string
tag.audio_offset  # number of bytes before audio data begins
tag.bitrate       # bitrate in kBits/s
tag.disc          # disc number
tag.disc_total    # the total number of discs
tag.duration      # duration of the song in seconds
tag.filesize      # file size in bytes
tag.genre         # genre as string
tag.samplerate    # samples per second
tag.title         # title of the song
tag.track         # track number as string
tag.track_total   # total number of tracks as string
tag.year          # year or data as string

宣伝されているように、それは小さくて自己完結型でした。


1
tinytagの新しいバージョン:pypi.org/project/tinytag
Daenys Targaryen

2

eyed3を使用する最初の回答は古くなっているので、こちらが更新版です。

mp3ファイルからタグを読み取る:

 import eyed3

 audiofile = eyed3.load("some/file.mp3")
 print(audiofile.tag.artist)
 print(audiofile.tag.album)
 print(audiofile.tag.album_artist)
 print(audiofile.tag.title)
 print(audiofile.tag.track_num)

タグを変更するWebサイトの例:

 import eyed3

 audiofile = eyed3.load("some/file.mp3")
 audiofile.tag.artist = u"Integrity"
 audiofile.tag.album = u"Humanity Is The Devil"
 audiofile.tag.album_artist = u"Integrity"
 audiofile.tag.title = u"Hollow"
 audiofile.tag.track_num = 2

初めてeyed3を使用しようとしたときに発生した問題は、インストールされていてもlibmagicのインポートエラーに関係していました。これを修正するには、ここからmagic-bin whlをインストールします


2

mp3-taggerをお勧めします。これについての最もよい事はそれがMITライセンスの下で配布されて、すべての必要な属性をサポートすることです。

- artist;
- album;
- song;
- track;
- comment;
- year;
- genre;
- band;
- composer;
- copyright;
- url;
- publisher.

例:

from mp3_tagger import MP3File

# Create MP3File instance.
mp3 = MP3File('File_Name.mp3')

# Get all tags.
tags = mp3.get_tags()
print(tags)

MP3ファイルの属性の設定、取得、更新、削除をサポートしています。


1

メタデータの読み取りに加えて、何をしたいかに正確に依存する可能性があります。それが単に必要なビットレート/名前などであり、他に何もない場合は、軽量のものがおそらく最良です。

あなたが過去のmp3を操作しているなら、そのPyMediaは適切かもしれません。

入手するものが何であれ、かなりの数のサンプルメディアで確認してテストしてください。特にID3タグにはいくつかの異なるバージョンがあるため、古すぎないことを確認してください。

個人的に私はこの小さなMP3Infoクラスを運で使用しました。それはかなり古いです。

http://www.omniscia.org/~vivake/python/MP3Info.py


0

最初の調査の後、songdetailsは私のユースケースに合うかもしれないと思いましたが、それは.m4bファイルを処理しません。変異原はそうです。Mutagenのフォーマットネイティブキーの表示に(合理的に)問題を抱えている人もいますが、フォーマットごとに異なります(mp3の場合はTIT2、oggの場合はタイトル、mp4の場合は\ xa9nam、WMAの場合はタイトル)、mutagen.File( )EasyMP3 / EasyID3タグを提供する(新しい?)easy = Trueパラメーターがあり、これには一貫性のある、ただし限定されたキーのセットがあります。私はこれまで限られたテストしか行っていませんが、アルバム、アーティスト、アルバムアーティスト、ジャンル、トラック番号、ディスク番号などの一般的なキーはすべて存在し、easy = Trueを使用する場合、.mb4ファイルと.mp3ファイルで同じです。私の目的のために非常に便利です。


0

https://github.com/nicfit/eyeD3を使用

import eyed3
import os

for root,  dirs, files in os.walk(folderp):
    for file in files:
        try:
            if file.find(".mp3") < 0:
                continue
            path = os.path.abspath(os.path.join(root , file))
            t = eyed3.load(path)
            print(t.tag.title , t.tag.artist)
            #print(t.getArtist())
        except Exception as e:
            print(e)
            continue

これについて説明してください。
Nelles

0

私はtinytag 1.3.1を使用しました。

  1. それは積極的にサポートされています:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. それは主要なフォーマットをサポートします:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. コードはわずか数分の開発で機能しました。
from tinytag import TinyTag

fileNameL ='''0bd1ab5f-e42c-4e48-a9e6-b485664594c1.mp3
0ea292c0-2c4b-42d4-a059-98192ac8f55c.mp3
1c49f6b7-6f94-47e1-a0ea-dd0265eb516c.mp3
5c706f3c-eea4-4882-887a-4ff71326d284.mp3
'''.split()

for fn in fileNameL:
    fpath = './data/'+fn
    tag = TinyTag.get(fpath)
    print()
    print('"artist": "%s",' % tag.artist)
    print('"album": "%s",' % tag.album)
    print('"title": "%s",' % tag.title)
    print('"duration(secs)": "%s",' % tag.duration)
  • 結果
JoeTagPj>python joeTagTest.py

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "17. Thomas Middleditch and Ben Schwartz",
"duration(secs)": "3565.1829583532785",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "Are you ready to make friends?",
"duration(secs)": "417.71840447045264",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "Introducing Conan’s new podcast",
"duration(secs)": "327.22187551899646",

"artist": "Conan O’Brien Needs A Friend",
"album": "Conan O’Brien Needs A Friend",
"title": "19. Ray Romano",
"duration(secs)": "3484.1986772305863",

C:\1d\PodcastPjs\JoeTagPj>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.