Mengakses metadata MP3 dengan Python [ditutup]


Jawaban:


106

Saya menggunakan eyeD3 beberapa hari yang lalu dengan banyak kesuksesan. Saya menemukan bahwa itu bisa menambahkan karya seni ke tag ID3 yang modul lain yang saya lihat tidak bisa. Anda harus menginstal menggunakan pip atau mengunduh tar dan mengeksekusi python setup.py installdari folder sumber.

Contoh yang relevan dari situs web ada di bawah ini.

Membaca konten file mp3 yang berisi info tag v1 atau v2:

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

Baca file mp3 (panjang trek, kecepatan bit, dll.) Dan akses tagnya:

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

Versi tag tertentu dapat dipilih:

 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.

Atau Anda dapat melakukan iterasi pada frame mentah:

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

Setelah tag ditautkan ke file, tag dapat dimodifikasi dan disimpan:

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

Jika tag yang ditautkan adalah v2 dan Anda ingin menyimpannya sebagai v1:

 tag.update(eyeD3.ID3_V1_1)

Baca di tag dan hapus dari file:

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

Tambahkan tag baru:

 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 juga GPL ... jadi jika seperti saya Anda berencana untuk menggunakannya pada program Anda, Anda harus merilis program Anda sebagai program gratis juga ... sial dengan orang-orang ini, mengapa mereka tidak bisa merilis di bawah LGPL?
Ciantic

9
@Ciantic: Tag ID3 sangat sederhana, mengapa Anda tidak membuat perpustakaan sendiri dan merilisnya di BSD? Selain itu, orang - orang ini sejak awal tidak memiliki apa pun untuk Anda. Lihat di sini diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, tag ID3v1 sederhana, tag ID3v2 rumit sekali ... Dan sekarang saya telah membuat pembungkus BSD untuk pytagger github.com/Ciantic/songdetails Saya belum menandainya saat dirilis, tetapi berhasil.
Ciantic

5
Di versi yang lebih baru, gunakan import eyed3(huruf kecil d).
Jake Z

4
Perhatikan bahwa catatan ini untuk versi eyed3 yang lebih lama dan tidak akan berfungsi dengan baik lagi. Misalnya, fungsi link () telah hilang dan atribut disetel secara deklaratif sekarang, tanpa setter.
mlissner

37

Saya telah menggunakan mutagen untuk mengedit tag di file media sebelumnya. Hal yang baik tentang mutagen adalah dapat menangani format lain, seperti mp4, FLAC dll. Saya telah menulis beberapa skrip dengan banyak keberhasilan menggunakan API ini.


2
code.google.com/p/mutagen - Perhatikan juga bahwa Mutagen adalah GPL, jadi itu tidak boleh dilakukan untuk sebagian besar proyek.
Ciantic

3
Mutagen itu bagus, namun saya kehilangan cara yang seragam untuk mendapatkan artis, genre judul, dll. - Anda akhirnya harus mengetahui berbagai kunci, yang bergantung pada format. TIT2untuk mp3, titleuntuk ogg, \xa9namuntuk mp4, Titleuntuk WMA dll - itu menyebalkan.
Memiliki QUIT - Anony-Mousse

20

Masalahnya eyed3adalah ia akan membuang NotImplementedError("Unable to write ID3 v2.2")file MP3 umum.

Menurut pengalaman saya, mutagenkelas EasyID3bekerja dengan lebih andal. Contoh:

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()

Semua tag lainnya dapat diakses dengan cara ini dan disimpan, yang akan melayani sebagian besar tujuan. Informasi lebih lanjut dapat ditemukan di Tutorial Mutagen .


13

Apa yang Anda kejar adalah modul ID3 . Ini sangat sederhana dan akan memberikan apa yang Anda butuhkan. Cukup salin file ID3.py ke direktori paket situs Anda dan Anda akan dapat melakukan sesuatu seperti berikut:

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
Hanya sebuah catatan. Modul ini sangat tua (2002) dan tidak mendukung tag ID3 V2
Eli Bendersky

8

lihat yang ini:

https://github.com/Ciantic/songdetails

Contoh penggunaan:

>>> import songdetails
>>> song = songdetails.scan("data/song.mp3")
>>> print song.duration
0:03:12

Menyimpan perubahan:

>>> import songdetails
>>> song = songdetails.scan("data/commit.mp3")
>>> song.artist = "Great artist"
>>> song.save()


6

Contoh sederhana dari buku Dive Into Python berfungsi baik bagi saya, ini adalah tautan unduhan, contohnya fileinfo.py. Tidak tahu apakah itu yang terbaik, tetapi dapat melakukan pekerjaan dasar.

Seluruh buku tersedia online di sini .


3
Contoh itu agak ketinggalan jaman sekarang, baik dari segi versi python maupun dalam hal versi ID3 ...
Bex

kedua tautan tidak lagi berfungsi. (Saya tahu jawabannya adalah 9 tahun) Jika Anda mencari buku online "Dive into Python", ini tautan
Edwin van Mierlo

Tautan itu juga tidak berfungsi lagi. Yang terbaik yang saya bisa dengan cepat google sekarang adalah github.com/diveintomark/diveintopython3
tripleee

6

Saya melihat jawaban di atas dan menemukan bahwa itu tidak baik untuk proyek saya karena masalah lisensi dengan GPL.

Dan saya menemukan ini: PyID3Lib , sementara tanggal rilis pengikatan python tertentu itu sudah tua, ia menggunakan ID3Lib , yang dengan sendirinya sudah diperbarui.

Yang perlu diperhatikan adalah keduanya LGPL , dan bagus untuk digunakan.


4

metode termudah adalah detail lagu ..

untuk membaca data

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

demikian pula untuk edit

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

Jangan lupa untuk menambahkan u sebelum nama sampai Anda tahu bahasa cina.

u dapat membaca dan mengedit secara massal menggunakan modul python glob

ex.

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

4

Setelah mencoba pip installrute sederhana untuk modul eyeD3, pytaglib, dan ID3 yang direkomendasikan di sini, saya menemukan opsi keempat ini adalah satu-satunya yang berfungsi. Sisanya memiliki kesalahan impor dengan dependensi yang hilang di C ++ atau sesuatu yang ajaib atau pustaka lain yang piptidak terjawab. Jadi gunakan yang ini untuk membaca dasar tag ID3 (semua versi):

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

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

Daftar atribut yang mungkin Anda dapatkan dengan 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

Itu kecil dan mandiri, seperti yang diiklankan.


1
versi terbaru untuk tinytag: pypi.org/project/tinytag
Daenys Targaryen

2

Jawaban pertama yang menggunakan eyed3 sudah usang, jadi berikut adalah versi terbarunya.

Membaca tag dari file 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)

Contoh dari situs web untuk mengubah tag:

 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

Masalah yang saya temui saat mencoba menggunakan eyed3 untuk pertama kalinya berkaitan dengan kesalahan impor libmagic meskipun telah diinstal. Untuk mengatasinya, instal magic-bin whl dari sini


2

Saya akan menyarankan mp3-tagger . Hal terbaik tentang ini adalah didistribusikan di bawah Lisensi MIT dan mendukung semua atribut yang diperlukan.

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

Contoh:

from mp3_tagger import MP3File

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

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

Ini mendukung set, dapatkan, perbarui dan hapus atribut file mp3.


1

Ini dapat bergantung pada apa yang ingin Anda lakukan selain membaca metadata. Jika hanya bitrate / nama dll yang Anda butuhkan, dan tidak ada yang lain, sesuatu yang ringan mungkin yang terbaik.

Jika Anda memanipulasi mp3 sebelumnya, PyMedia mungkin cocok.

Ada cukup banyak, apapun yang Anda dapatkan, pastikan dan ujilah di banyak contoh media. Ada beberapa versi khusus dari tag ID3, jadi pastikan itu tidak terlalu ketinggalan zaman.

Secara pribadi saya telah menggunakan kelas MP3Info kecil ini dengan keberuntungan. Ini sudah cukup tua.

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


0

Setelah beberapa penelitian awal, saya pikir detail lagu mungkin sesuai dengan kasus penggunaan saya, tetapi tidak menangani file .m4b. Mutagen melakukannya. Perhatikan bahwa sementara beberapa (cukup) mengambil masalah dengan kemunculan Mutagen dari kunci format-asli, yang bervariasi dari format ke format (TIT2 untuk mp3, judul untuk ogg, \ xa9nam untuk mp4, Judul untuk WMA dll.), Mutagen.File ( ) memiliki parameter (baru?) easy = True yang menyediakan tag EasyMP3 / EasyID3, yang memiliki sekumpulan kunci yang konsisten, meskipun terbatas. Sejauh ini saya hanya melakukan pengujian terbatas, tetapi kunci umum, seperti album, artis, albumartist, genre, tracknumber, discnumber, dll. Semuanya ada dan identik untuk file .mb4 dan .mp3 saat menggunakan easy = True, membuatnya sangat nyaman untuk tujuan saya.


0

menggunakan 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

Bisakah Anda memberikan dan penjelasan untuk ini?
Nelles

0

Saya menggunakan tinytag 1.3.1 karena

  1. Ini secara aktif didukung:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Ini mendukung format utama:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Kode BEKERJA hanya dalam beberapa menit pengembangan.
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)
  • HASIL
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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.