Найти - Пользователи
Полная версия: Вопрос по eyed3 - вывести все заданные тэги
Начало » Python для новичков » Вопрос по eyed3 - вывести все заданные тэги
1
alibek
Мне нужно получить отладочный вывод (например в JSON) всех имеющихся тэгов id3 из файла.
Не подскажете, как это сделать?
Тэги считываются из eyed3.id3.tag, но это свойство не является перечисляемым и я не могу использовать for.
Если обращаться к eyed3.id3.tag.__dict__, то получаю служебные свойства, которые нельзя сериализовать.
В идеале я бы хотел получить название свойства (как оно указано в eyed3.id3.tag), код атрибута id3 (например XDOR для поля original_release_date) и значение атрибута (в том числе если оно в нескольких фреймах).

Вот, собственно, сами фреймы: https://eyed3.readthedocs.io/en/latest/_modules/eyed3/id3/frames.html
Их можно перебрать в eyed3.id3.frames.
Но не могу понять, как получить из них значения и сопоставить с названиями свойств.
py.user.next
alibek
Мне нужно получить отладочный вывод (например в JSON) всех имеющихся тэгов id3 из файла.
Не подскажете, как это сделать?
Тэги считываются из eyed3.id3.tag, но это свойство не является перечисляемым и я не могу использовать for.
Так ты составь сначала словарь, а потом его переведи в JSON.

  
#!/usr/bin/env python3
 
import eyed3
import json
 
mp3file = eyed3.load('file.mp3')
 
dct = {}
for frame in mp3file.tag.frameiter():
    dct[frame.id.decode('latin1')] = frame.text
 
out = json.dumps(dct)
print(out)

[guest@localhost mp3tags]$ ./mp3tags.py 
{"COMM": "https://vk.com/the.zeus", "TALB": "https://vk.com/the.zeus", "TIT2": "The Power (Jump & Hide Remix)", "TPE1": "Snap"}
[guest@localhost mp3tags]$

Ничего вумного, я просто использовал функцию help() и dir()
  
>>> import eyed3                    
>>> 
>>> mp3file = eyed3.load('file.mp3')
>>> 
>>> help(mp3file)
 
>>> 
>>> mp3file.tag
<eyed3.id3.tag.Tag object at 0x7f45adcbdfd0>
>>> 
>>> help(mp3file.tag)
 
>>> 
>>> mp3file.tag.frameiter()
<generator object Tag.frameiter at 0x7f45aa89d9e8>
>>> 
>>> frame = next(_)
>>> 
>>> frame
<eyed3.id3.frames.CommentFrame object at 0x7f45aa839080>
>>> 
>>> help(frame)
 
>>> 
>>> frame.header
<eyed3.id3.headers.FrameHeader object at 0x7f45aa8390f0>
>>> 
>>> help(frame.header)
 
>>> 
>>> dir(frame.header)
['COMPRESSED', 'DATA_LEN', 'ENCRYPTED', 'FILE_ALTER', 'GROUPED', 'READ_ONLY', 'TAG_ALTER', 'UNSYNC', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_flags', '_isValidFrameId', '_parse2_2', '_setBitMask', '_version', 'compressed', 'copyFlags', 'data_length_indicator', 'data_size', 'encrypted', 'file_alter', 'grouped', 'id', 'major_version', 'minor_version', 'parse', 'read_only', 'render', 'size', 'tag_alter', 'unsync', 'version']
>>> 
>>> frame.header.id
b'COMM'
>>> 
>>> frame.id
b'COMM'
>>>
alibek
py.user.next
Так ты составь сначала словарь, а потом его переведи в JSON.
Что подразумевается под словарем?
Если место хранения тэгов, то я использую dataclass (но не суть).
Если имеется ввиду вручную сопоставить названия фреймов с именами свойств, то я в итоге так и сделал:
 ID3_FRAMES = [
    ...
    [b"TALB", "album"             , "Album/Movie/Show title"],
    [b"TIT1", None                , "Content group description"],
    [b"TIT2", "title"             , "Title/songname/content description"],
    [b"TIT3", "subtitle"          , "Subtitle/Description refinement"],
    ...
]
Но по идее, это сопоставление в модуле eyed3 и так уже есть, я думал использовать соответствующее свойство или метод eyed3.

py.user.next
Ничего вумного, я просто использовал функцию help() и dir()
Спасибо за пример.
Это не совсем то, потому что мне нужно использовать свойства из .tag, а не “сырые” данные из фреймов, которые нужно еще декодировать.
Но поскольку сопоставление между тэгами и свойствами я уже сделал, то в принципе этого достаточно.
py.user.next
alibek
Что подразумевается под словарем?
alibek
Но по идее, это сопоставление в модуле eyed3 и так уже есть, я думал использовать соответствующее свойство или метод eyed3.
В этом eyed3 нихера нет, это просто какой-то базовый уровень разбора тегов, весь этот модуль.

alibek
Это не совсем то, потому что мне нужно использовать свойства из .tag, а не “сырые” данные из фреймов, которые нужно еще декодировать.
Если чего-то нет, сделай это сам. Но правда ты сам делать ничего не умеешь, поэтому ты ищешь, где бы тебе принесли это на блюдечке с голубой каёмочкой. А чтобы самому уметь что-то делать, надо брать и руками своими что-то делать постоянно. И потом вот оно и начнёт получаться.

Ты просто думал, что программирование - это сказка. Ты вот типа взмахнул волшебной палочкой - и всё появилось. Вот захотелось тебе что-то использовать и там раз и модуль или API у чего-то появился удобный. Ага. Реальность дикого мира программирования такова, что никогда ничего нет, никаких API нет, а если и есть, то они не замечательные, а какая-то параша то тут, то там. И тебе всё равно, даже при существующих API, придётся делать своё всё, чтобы оно было более-менее нормальным и стабильным.

Если там есть методы в eyed3, которые ты нафантазировал себе, то что же ты такой умный их не нашёл там сам? А если их там нет, то зачем ты про них вообще спрашиваешь? Ты ждёшь, что тебе скажут “вот! смотри! блюдечко вон там лежит!”, да? А его нет, этого блюдечка. И это обычная жизнь. Другого программирования какого-то удобного - его не бывает. Оно всё сложное, но пока ты нихрена не умеешь, вот как ты прям со своими этими школьными познаниями.
alibek
Вы так страшно напрягаетесь, стараясь рассказать о программировании.
Не напрягайтесь, это плохо на здоровье и психике сказывается.
Можете далее меня игнорировать, я разрешаю.
py.user.next
Скажи спасибо, что тебе говорят правду в лицо, а не восторгаются тем, какой ты умный и гениальный. К счастью, тебе повезло, ты не форуме бухгалтерш оказался, где все будут только восторгаться твоей тупизной только потому, что все они ещё тупее тебя раз в десять. Здесь твоя ахинея про то, какой ты гений, просто не прокатит.

Зачем тебе думать, что ты очень умный? Ведь это, наоборот, мешает тебе всё узнавать. Какую-то ахинею пишешь, а потом сидишь и сам себя радуешь такой мантрой “ох! как же я умён!”. Это же тупость натуральная. И в итоге ты остаёшься на уровне какого-то недоразвитого ушлепана. Как ты научишься чему-то новому, если ты якобы всё умеешь?

Так что не надо тут обижаться. Спасибо скажи!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB