需求:播放指定歌曲的時(shí)候榜晦,給一個(gè)時(shí)間,能夠把這首歌在這個(gè)時(shí)間對(duì)應(yīng)的詞返回
面向?qū)ο? 找一個(gè)類尼啡,讓它擁有解析歌詞的功能
歌詞文件:
[00:00.20]藍(lán)蓮花
[00:00.80]沒有什么能夠阻擋
[00:06.53]你對(duì)自由地向往
[00:11.59]天馬行空的生涯
[00:16.53]你的心了無牽掛
[02:11.27][01:50.22][00:21.95]穿過幽暗地歲月
[02:16.51][01:55.46][00:26.83]也曾感到彷徨
[02:21.81][02:00.60][00:32.30]當(dāng)你低頭地瞬間
[02:26.79][02:05.72][00:37.16]才發(fā)覺腳下的路
[02:32.17][00:42.69]心中那自由地世界
[02:37.20][00:47.58]如此的清澈高遠(yuǎn)
[02:42.32][00:52.72]盛開著永不凋零
[02:47.83][00:57.47]藍(lán)蓮花
class Lyrics:
"""歌詞類"""
def __init__(self, time='', word=''):
self._time = time
self.word = word
@property
def time(self):
return self._time
@time.setter
def time(self, value):
fen = float(value[1:3])
miao = float(value[4:])
self._time = fen*60+miao
def __gt__(self, other):
return self._time > other._time
def __repr__(self):
return str(self.__dict__)
class LyricsAnalysis:
"""歌詞解析類"""
# name = ''
def __init__(self, name):
self.__name = name # 歌名
self.__all_lyric = [] # 保存當(dāng)前歌名解析出來的歌詞對(duì)象
# 分離歌詞和時(shí)間
def __split_time_word(self, line):
# 時(shí)間 <-> 歌詞
lines = line.split(']')
# print(lines)
# 獲取每行的詞
word = lines[-1]
# 遍歷獲取每一行的時(shí)間
for time in lines[:-1]:
# 根據(jù)時(shí)間和詞創(chuàng)建歌詞對(duì)象
ly_obj = Lyrics(word=word)
ly_obj.time = time
self.__all_lyric.append(ly_obj)
# 根據(jù)時(shí)間獲取歌詞
def get_lyric(self, time: int):
# 判斷之前是否已經(jīng)解析過
if self.__all_lyric:
print('~~~~~')
# 解析過暂衡,根據(jù)時(shí)間取值
for item in self.__all_lyric:
if item.time < time:
return item.word
# 沒有解析過
# 讀文件內(nèi)容
try:
print('======')
with open('./files/'+self.__name+'.txt', 'r', encoding='utf-8') as f:
line = f.readline()
while line:
# print(line)
self.__split_time_word(line)
line = f.readline()
# __all_lyric保存了所有的歌詞對(duì)象
self.__all_lyric.sort(reverse=True)
# print(self.__all_lyric)
# 根據(jù)時(shí)間取值
for item in self.__all_lyric:
if item.time < time:
return item.word
except FileNotFoundError:
print('沒有響應(yīng)的歌詞')
# 藍(lán)蓮花 --> 藍(lán)蓮花數(shù)據(jù) -->
ly_lan = LyricsAnalysis('藍(lán)蓮花')
print(ly_lan.get_lyric(10))
print(ly_lan.get_lyric(12))
print(ly_lan.get_lyric(20))
print(ly_lan.get_lyric(30))