MP3 meta verilerine Python ile erişme [kapalı]


Yanıtlar:


106

Ben kullanılan eyeD3 başarı bir sürü gün. Baktığım diğer modüllerin yapamadığı ID3 etiketine sanat ekleyebileceğini buldum. Pip kullanarak yüklemeniz veya tar dosyasını indirmeniz ve python setup.py installkaynak klasörden çalıştırmanız gerekir .

Web sitesinden ilgili örnekler aşağıdadır.

V1 veya v2 etiket bilgilerini içeren bir mp3 dosyasının içeriğini okuma:

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

Bir mp3 dosyasını okuyun (parça uzunluğu, bit hızı vb.) Ve etiketine erişin:

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

Belirli etiket sürümleri seçilebilir:

 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.

Veya ham kareler üzerinde yineleme yapabilirsiniz:

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

Bir etiket bir dosyaya bağlandığında değiştirilebilir ve kaydedilebilir:

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

Bağlantı verilen etiket v2 ise ve bunu v1 olarak kaydetmek istiyorsanız:

 tag.update(eyeD3.ID3_V1_1)

Bir etiketi okuyun ve dosyadan kaldırın:

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

Yeni bir etiket ekleyin:

 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 da GPL Programınıza da serbest programda ... bu insanlarla lanetlemek o, neden LGPL altında veremiyorlarmış olarak programınızı salmalıdır üzerinde kullanmayı planladığınız bu yüzden benim gibi eğer ...?
Ciantic

9
@Ciantic: ID3 etiketleri son derece basit, neden kendiniz bir kitaplık oluşturup onu BSD altında yayınlamıyorsunuz? Dahası, bu insanlar ilk başta size hiçbir şey sahip değiller. Buraya bak diveintopython.org/object%5Foriented%5Fframework/index.html
Esteban Küber

2
@voyager, ID3v1 etiketleri basit, ID3v2 etiketleri cehennem kadar karmaşık ... Ve şimdi pytagger github.com/Ciantic/songdetails için BSD sarıcı oluşturdum Henüz piyasaya sürüldüğü gibi etiketlemedim, ama işe yarıyor.
Ciantic

5
Yeni sürümde import eyed3(küçük d) kullanın .
Jake Z

4
Bu notların eyed3'ün eski bir sürümü için olduğunu ve artık iyi çalışmayacağını unutmayın. Örneğin, link () işlevi ortadan kalktı ve öznitelikler artık ayarlayıcılar olmadan bildirimsel olarak ayarlandı.
mlissner

37

Daha önce medya dosyalarındaki etiketleri düzenlemek için mutajen kullandım . Mutagen ile ilgili güzel olan şey, mp4, FLAC vb. Gibi diğer formatları işleyebilmesidir. Bu API'yi kullanarak çok başarılı birkaç komut dosyası yazdım.


2
code.google.com/p/mutagen - Ayrıca Mutagen'in GPL olduğuna dikkat edin, bu nedenle çoğu proje için hayır-hayır.
Ciantic

3
Mutagen güzel, ancak sanatçıyı, başlık türünü vb. Elde etmenin tek tip bir yolunu kaçırıyorum - formata bağlı çeşitli anahtarları bilmek zorunda kalıyorsunuz. TIT2mp3 için, titleogg \xa9namiçin, mp4 Titleiçin, WMA için vs. - bu berbat.
ÇIKTI - Anony-Mousse

20

İlgili bir sorun eyed3o atmak olacaktır NotImplementedError("Unable to write ID3 v2.2")ortak MP3 dosyaları için.

Tecrübelerime göre mutagensınıf EasyID3daha güvenilir çalışıyor. Misal:

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

Diğer tüm etiketlere bu şekilde erişilebilir ve çoğu amaca hizmet edecek şekilde kaydedilebilir. Daha fazla bilgi şurada bulunabilir:Mutajen Eğitimi'nde .


13

Peşinde olduğun şey ID3 modülü. Çok basit ve size tam olarak ihtiyacınız olanı verecek. ID3.py dosyasını site paketleri dizininize kopyalamanız yeterlidir ve aşağıdaki gibi bir şey yapabilirsiniz:

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
Sadece bir not. Bu modül çok eski (2002) ve ID3 etiketlerinin
V2'sini

8

şuna bir bak:

https://github.com/Ciantic/songdetails

Kullanım örneği:

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

Değişiklikleri kaydediyor:

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

7

Size sadece ek bilgiler:

PythonInMusic sayfasındaki "MP3 öğeleri ve Meta veri düzenleyicileri" bölümüne bir göz atın .


6

Dive Into Python kitabından basit bir örnek benim için iyi çalışıyor, bu indirme bağlantısı, örnek ise fileinfo.py. En iyisi mi bilmiyorum ama temel işi yapabilir.

Kitabın tamamı burada çevrimiçi olarak mevcuttur .


3
Bu örnek, hem python sürümü hem de ID3 sürümü açısından artık biraz modası geçmiş ...
Bex

her iki bağlantı da artık çalışmıyor. (Cevabın 9 yaşında olduğunu biliyorum) "Python'a Dalın" adlı çevrimiçi kitabı arıyorsanız, işte mevcut bağlantı
Edwin van Mierlo

Bu bağlantı da artık çalışmıyor. Hızlı bir şekilde google'a şimdi yapabileceğim en iyi şey github.com/diveintomark/diveintopython3
tripleee

6

Yukarıdaki cevaplara baktım ve GPL ile ilgili lisans sorunları nedeniyle projem için iyi olmadıklarını öğrendim.

Ve şunu öğrendim: PyID3Lib , bu belirli python bağlama çıkış tarihi eski olmasına rağmen , kendisi güncel olan ID3Lib'i kullanıyor .

Her ikisinin de LGPL olduğu ve gitmesi iyi olduğu söylenebilir.


4

en kolay yöntem şarkı ayrıntılarıdır ..

verileri okumak için

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

benzer şekilde düzenleme için

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

Çince öğrenene kadar isimden önce u eklemeyi unutmayın .

python glob modülünü kullanarak toplu olarak okuyabilir ve düzenleyebilirsiniz

ex.

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

4

pip installBurada önerilen eyeD3, pytaglib ve ID3 modülleri için basit yolu denedikten sonra , bu dördüncü seçeneğin işe yarayan tek seçenek olduğunu buldum. Geri kalanında, C ++ 'da eksik bağımlılıklarla ilgili içe aktarma hataları veya sihirli bir şey veya pipkaçırılan başka bir kitaplık vardı . Öyleyse, ID3 etiketlerinin (tüm sürümler) temel okuması için bununla devam edin:

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

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

TinyTag ile alabileceğiniz olası özelliklerin listesi:

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

Söylendiği gibi küçük ve bağımsızdı.


1
tinytag için yeni sürüm: pypi.org/project/tinytag
Daenys Targaryen

2

Eyed3 kullanan ilk cevap güncel değil, bu yüzden işte güncellenmiş bir versiyonu.

Bir mp3 dosyasından etiket okuma:

 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)

Etiketleri değiştirmek için web sitesinden bir örnek:

 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'ü ilk kez kullanmaya çalışırken karşılaştığım bir sorun, yüklü olmasına rağmen libmagic'in içe aktarma hatasıyla ilgiliydi. Bunu düzeltmek için sihirli kutusu buradan takın


2

Mp3-tagger öneririm . Bununla ilgili en iyi şey, MIT Lisansı altında dağıtılması ve gerekli tüm özellikleri desteklemesidir.

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

Misal:

from mp3_tagger import MP3File

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

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

Mp3 dosyalarının özelliklerini ayarlama, alma, güncelleme ve silme işlemlerini destekler.


1

Meta verileri okumaya ek olarak tam olarak ne yapmak istediğinize bağlı olabilir. Sadece ihtiyacınız olan bit hızı / ad vb. İse ve başka bir şey değilse, hafif bir şey muhtemelen en iyisidir.

MP3'ü geçmişte manipüle ediyorsanız, PyMedia uygun olabilir.

Ne alırsanız alın, emin olun ve bol miktarda örnek ortam üzerinde test edin. Özellikle ID3 etiketlerinin birkaç farklı sürümü vardır, bu yüzden çok eski olmadığından emin olun.

Şahsen ben bu küçük MP3Info sınıfını şansla kullandım. Yine de oldukça eski.

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


0

İlk araştırmalardan sonra şarkı ayrıntılarının benim kullanım durumuma uyabileceğini düşündüm, ancak .m4b dosyalarını işlemiyor. Mutagen yapar. Bazılarının (makul olarak) Mutagen'in format-yerel anahtarları ortaya çıkarmasıyla ilgili sorun yaşadığını unutmayın; bu, formattan formata (mp3 için TIT2, ogg için başlık, mp4 için \ xa9nam, WMA için Başlık vb.), Mutajen. ) (yeni?) easy = True parametresi vardır ve EasyMP3 / EasyID3 etiketlerini sağlar, ancak sınırlı da olsa tutarlı bir anahtar setine sahiptir. Şimdiye kadar yalnızca sınırlı testler yaptım, ancak albüm, sanatçı, albüm sanatçısı, tür, parça numarası, disk numarası vb. Gibi ortak anahtarlar easy = True kullanılırken .mb4 ve .mp3 dosyaları için mevcut ve aynı. amaçlarım için çok uygun.


0

https://github.com/nicfit/eyeD3 kullanarak

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

Bunun için açıklama ve açıklama yapabilir misiniz?
Nelles

0

Tinytag 1.3.1 kullandım çünkü

  1. Aktif olarak desteklenmektedir:
1.3.0 (2020-03-09):
added option to ignore encoding errors ignore_errors #73
Improved text decoding for many malformed files
  1. Başlıca formatları destekler:
MP3 (ID3 v1, v1.1, v2.2, v2.3+)
Wave/RIFF
OGG
OPUS
FLAC
WMA
MP4/M4A/M4B
  1. Kod sadece birkaç dakikalık geliştirmede ÇALIŞMIŞTIR.
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)
  • SONUÇ
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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.