我正在为音乐播放器应用程序修改python插件。该插件使用lrc文件显示同步歌词。这些文件具有以下格式,可以在给定时间显示行:
[00:02.32]Some lyric
[00:03.21]More lyrics
[00:05.76]You get the point by now
有一个称为elrc的lrc文件的“改进”版本。它们是相同的,除了它们可以在行内包含时间戳,如下所示:
[00:02.32]Some lyric <00:02.98>something else is shown here
[00:03.21]More lyrics <00:04.21>even more lyrics <00:05.21>maybe two of these
[00:05.76]You get the point by now x2
我修改了插件,使其支持elrc文件。我想这样做的方法是在遇到时间戳时更改文本的颜色,但是应更改的文本区域必须在下一个时间戳处停止。因此,如果每个字都有时间戳,则文本的颜色会在正确的时间逐字更改。
插件的工作方式是通过时间戳和单词/行的二维数组。
def _set_timers(self):
print_d("Setting timers")
if len(self._timers) == 0:
cur_time = self._cur_position()
cur_idx = self._greater(self._lines, cur_time)
if cur_idx != -1:
while (cur_idx < len(self._lines) and
self._lines[cur_idx][0] < cur_time + self.SYNC_PERIOD):
timestamp = self._lines[cur_idx][0]
line = self._lines[cur_idx][1]
#word = self._words[cur_idx][1]
tid = GLib.timeout_add(timestamp - cur_time, self._show, line, #word)
self._timers.append((timestamp, tid))
cur_idx += 1
(行和带有“#”标记的参数是我添加的使插件支持elrc文件的行。我将它们区别开来,以便您可以看到插件最初的工作方式。)
_lines和_words变量是数组,它们的值传递到“ _show”函数,然后使用Gtk的TextView在屏幕上显示歌词。这是_show函数:
def _show(self, line, word):
self.text_buffer.set_text(line)
#startIter = self.text_buffer.get_start_iter()
#endIter = self.text_buffer.get_end_iter()
#color = self.text_buffer.create_tag("highlight", foreground=self._highlight_text())
#self.text_buffer.apply_tag(color, startIter, endIter)
self._start_clearing_from += 1
print_d("♪ %s ♪" % line.strip())
return False
和以前一样,我标记为“#”的行是我添加以支持elrc标记的行(因此,逐字显示)。我遇到的问题是“ apply_tag”方法仅使用iters作为值来定义必须更改的文本部分,而我找不到找到使这些iters成为“ word”参数的方法。请记住,大多数代码不是我的,并且大多数代码都严重缺乏注释,因此我不明白它是如何100%工作的。如果需要更多上下文来解决此问题,可以询问我,也可以自己检查整个源代码。您可以找到原始的未经修改的插件here,也可以找到我的插件here的版本(稍有过时的版本)。