Как я могу изменить этот плагин, чтобы использовать mp3-теги вместо файлов lrc? - PullRequest
0 голосов
/ 12 мая 2019

Я скачал музыкальный проигрыватель для Linux под названием Quod Libet.Это довольно аккуратный музыкальный проигрыватель, и мне очень нравится.Он поставляется с множеством плагинов, и один из них привлек мой интерес, "Syncronized Lyrics".Теперь я был поклонником файлов lrc (текстовый файл со специальным синтаксисом, позволяющим синхронизировать текст песни), я трачу часы, помечая свои mp3-файлы, чтобы получить как можно более близкое к идеальному воспроизведению лирикимузыкальный проигрыватель моего телефона, который поддерживает файлы lrc.Итак, когда я увидел, что этот плеер также поддерживает файлы lrc, я был раздут.Я попробовал плагин и ... ему нужен файл lrc, конечно.Под этим я подразумеваю, что он не извлекает необходимый текст из встроенных mp3-тегов (вот где я храню текст), поэтому он ничего не отображает.

Я пробежался по компьютеру и нашел.py файл, содержащий плагин.Я просмотрел код в надежде, что это будет легко, но я никогда не программировал на python, и есть некоторый код, который я не понимаю.Это не выглядит слишком сложным, поэтому я подумал, могли бы вы расшифровать его.файл по имени файла текущей песни + ".lrc".Достаточно очевидно.Моей первой попыткой было изменить это:

        new_lrc = os.path.splitext(track_name)[0] + ".lrc"

На это:

        new_lrc = app.player.song.get("~lyrics")

Я использовал приведенную выше строку, чтобы увидеть, как программа получает доступ к тегу файла, и яскопировал его, изменив «имя файла» на «текст песни».Я знаю, что «слова» - это правильный способ ссылки на тег песни, потому что я видел, как он упоминается так же в другом плагине, который фактически извлекает слова из файла (как обычный текст, но не синхронизируется).

Это сработалов некоторой степени.Это было улучшение по сравнению с предыдущим тестом в том смысле, что оно не сообщало мне, что было что-то неопределенное, вот что программа сообщает мне, когда я загружаю его:

TypeError: stat: path should be string, bytes, os.PathLike or integer  not NoneType
------
Traceback (most recent call last):

  File "/usr/lib/python3/dist-packages/quodlibet/plugins/events.py", line 141, in __invoke
    handler(*args)

  File "/usr/lib/python3/dist-packages/quodlibet/ext/events/synchronizedlyrics.py", line 282, in plugin_on_song_started
self._build_data()

  File "/usr/lib/python3/dist-packages/quodlibet/ext/events/synchronizedlyrics.py", line 195, in _build_data
    if os.path.exists(new_lrc):

  File "/usr/lib/python3.6/genericpath.py", line 19, in exists
    os.stat(path)

TypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType

Я позволю вам решитьчто вы делаете из этого.Вот еще один фрагмент кода, который является другой частью головоломки:

def _parse_lrc_file(self, filename):
    with open(filename, 'r', encoding="utf-8") as f:
        raw_file = f.read()
    raw_file = raw_file.replace("\n", "")
    begin = 0
    keep_reading = len(raw_file) != 0
    tmp_dict = {}
    compressed = []
    while keep_reading:
        next_find = raw_file.find("[", begin + 1)
        if next_find == -1:
            keep_reading = False
            line = raw_file[begin:]
        else:
            line = raw_file[begin:next_find]
        begin = next_find

        # parse lyricsLine
        if len(line) < 2 or not line[1].isdigit():
            continue
        close_bracket = line.find("]")
        t = datetime.strptime(line[1:close_bracket], '%M:%S.%f')
        timestamp = (t.minute * 60000 + t.second * 1000 +
                     t.microsecond / 1000)
        words = line[close_bracket + 1:]
        if not words:
            compressed.append(timestamp)
        else:
            tmp_dict[timestamp] = words
            for t in compressed:
                tmp_dict[t] = words
            compressed = []

    keys = list(tmp_dict.keys())
    keys.sort()
    for key in keys:
        self._lines.append((key, tmp_dict[key]))
    del keys
    del tmp_dict

Это та часть, которая усложнила ситуацию, и вот где я застрял сейчас.На мой взгляд, код рассчитан на работу с файлом, а не с тегом, поэтому, когда он делает свои вызовы, они не работают.Любые подсказки к тому, что я могу попробовать?

1 Ответ

0 голосов
/ 12 мая 2019

Не имеет значения, ребята, я уже модифицировал его сам, и теперь он работает так, как я хочу. Вот ссылка, по которой вы можете скачать и проверить ее, если хотите: GitHub Issue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...