如何修改此插件以使用mp3标签而不是lrc文件?

时间:2019-05-12 04:33:59

标签: python-3.x tags audio-player .lrc

我下载了一个名为Quod Libet的Linux音乐播放器。这是一个非常简洁的音乐播放器,我真的很喜欢。它带有许多插件,其中一个引起了我的兴趣,“ Syncronized歌词”。现在,我一直是lrc文件(具有特定语法的文本文件,可以使歌曲的歌词进行同步)的爱好者,并且花了很多时间标记我的mp3文件,以尽可能地完美地播放歌词支持lrc文件的手机音乐播放器。因此,当我看到该播放器也支持lrc文件时,我被大肆宣传。我尝试了插件,...当然需要一个lrc文件。我的意思是,它不会从嵌入式mp3标签(我保留歌词的位置)中获取所需的文本,因此它不会显示任何内容。

我在PC上进行了一些挖掘,发现包含插件的.py文件。我浏览了该代码,希望它会很容易,但是我从未使用python进行编程,并且有些代码我不理解。看起来好像不太复杂,所以我在想你们是否可以解密。

def _build_data(self):
    self.text_buffer.set_text("")
    if app.player.song is not None:
        # check in same location as track
        track_name = app.player.song.get("~filename")
        new_lrc = os.path.splitext(track_name)[0] + ".lrc"
        print_d("Checking for lyrics file %s" % new_lrc)
        if self._current_lrc != new_lrc:
            self._lines = []
            if os.path.exists(new_lrc):
                print_d("Found lyrics file: %s" % new_lrc)
                self._parse_lrc_file(new_lrc)
        self._current_lrc = new_lrc

因此,我在这里发现的是有一个名为“ new_lrc”的变量,该变量试图通过当前歌曲的文件名+“。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 :(得分:0)

没关系,我已经自己对其进行了修改,并且现在可以按需运行了。这是一个链接,因此您可以下载并检查是否需要:{{3}}