From d55041432d7a0a46d250c496fc26f7b46e40b6dc Mon Sep 17 00:00:00 2001 From: zeek <707472783@qq.com> Date: Wed, 18 Nov 2015 00:53:19 +0800 Subject: [PATCH] add lyric --- douyu/douyu.py | 231 +++++++++++++++++++++++++++++------------- douyu/level.json | 2 +- douyu/lyric.py | 54 ++++++++++ douyu/mplay.py | 109 ++++++++++++++++---- douyu/music_list.json | 2 +- 5 files changed, 306 insertions(+), 92 deletions(-) create mode 100644 douyu/lyric.py diff --git a/douyu/douyu.py b/douyu/douyu.py index 55cf6c8..71f0650 100644 --- a/douyu/douyu.py +++ b/douyu/douyu.py @@ -17,6 +17,7 @@ from tkinter import font import shutil from tkinter import messagebox +import lyric class my_gui(Frame): @@ -33,33 +34,41 @@ def __init__(self, root): self.selected = False self.FOLD = r'E:\m\music' #self.FOLD = 'Documents/sublime/danmu_diange/music' - self.VIP_LIST=r'E:\m\douyu_0.0.4\level.json' + self.VIP_LIST=r'E:\m\douyu_0.0.5\level.json' with open(self.VIP_LIST, 'r') as f: self.vips = json.loads(f.read()) + self.is_music_play=False def initUI(self): - self.MUSIC_LIST=r'E:\m\douyu_0.0.4\music_list.json' + self.MUSIC_LIST=r'E:\m\douyu_0.0.5\music_list.json' with open(self.MUSIC_LIST,'r') as f: self.play_list = json.loads(f.read()) # list from json self.root.protocol("WM_DELETE_WINDOW", self.on_closing) mainframe = ttk.Frame(self.root) bigFont = font.Font(size=12, weight='bold') - self.text = Text(mainframe, bg="white", width=50, height=30, state=DISABLED, font=bigFont) + self.text = Text(mainframe, bg="orange", width=50, height=29, state=DISABLED, font=bigFont) self.lb_play_list=StringVar() self.lb_play_list.set(self.play_list_4_show()) - self.label = ttk.Label(mainframe, textvariable=self.lb_play_list, font=bigFont, width=20) + self.label = ttk.Label(mainframe, textvariable=self.lb_play_list, font=bigFont, width=20, foreground='blue') + self.lyric_val=StringVar() + self.lyric_label=ttk.Label(mainframe, textvariable=self.lyric_val, font=bigFont, padding=10, foreground='red') + mainframe.grid(column=0,row=0) self.text.grid(column=0,row=0) self.label.grid(column=1, row=0) - + self.lyric_label.grid(column=0, row=1, columnspan=2) def write_text(self, nick, content): + colors=['red','blue','orange','yellow', + 'green','cyan','violet'] + rand_color=random.randint(0,6) self.text.config(state=NORMAL) + self.text['fg']=colors[1] self.text.insert("end",nick+": "+content+"\n") self.text.config(state=DISABLED) self.text.yview('end') @@ -178,7 +187,8 @@ def keepalive_send(): self.sendmsg(s,b'type@=keeplive/tick@='+str(random.randint(1,99)).encode('ascii')+b'/\x00') except Exception as e: print(e) - threading.Thread(target=self.main).start() + self.write_text('系统','我崩溃了') + #threading.Thread(target=self.main).start() exit() time.sleep(45) s.close() @@ -189,7 +199,8 @@ def keepalive_recv(): bmsg= self.recvmsg(s) except Exception as e: print(e) - threading.Thread(target=self.main).start() + self.write_text('系统','我崩溃了') + #threading.Thread(target=self.main).start() exit() print('*** usr alive:',self.unpackage(bmsg),'***') s.close() @@ -212,7 +223,8 @@ def keepalive(): self.sendmsg(s,b'type@=keeplive/tick@='+str(random.randint(1,99)).encode('ascii')+b'/\x00') except Exception as e: print(e) - threading.Thread(target=self.main).start() + self.write_text('系统','我崩溃了') + #threading.Thread(target=self.main).start() exit() time.sleep(45) s.close() @@ -223,7 +235,8 @@ def keepalive(): bmsg= self.recvmsg(s) except Exception as e: print(e) - threading.Thread(target=self.main).start() + self.write_text('系统','我崩溃了') + #threading.Thread(target=self.main).start() exit() if not bmsg: print('*** connection break ***') @@ -245,13 +258,13 @@ def keepalive(): elif msgtype==b'donateres': sui= self.unpackage(msg.get(b'sui',b'nick@=undifined//00')) nick= sui[b'nick'].decode('utf8') - print(self.vips) - self.handle_lvl(nick, 10) - with open(self.VIP_LIST,'w') as f: - json.dump(self.vips, f) - print(self.vips) - print(type(nick)) - print(type(msg[b'ms'])) + # print(self.vips) + # self.handle_lvl(nick, 10) + # with open(self.VIP_LIST,'w') as f: + # json.dump(self.vips, f) + # print(self.vips) + # print(type(nick)) + # print(type(msg[b'ms'])) print('***', nick, '送给主播', int(msg[b'ms']),\ '个鱼丸 (', self.cast_wetght(msg[b'dst_weight']), ') ***') #notify(nick, '送给主播' + str(int(msg[b'ms'])) + '个鱼丸') @@ -428,31 +441,36 @@ def analysis_danmu(self, nick, content): #print(self.vips) #self.write_text('测试',str(self.mutex)) contents = content.split(' ') +################################################ if contents[0] == '点歌': - if self.mutex == 0: - self.mutex = nick - song_name = ''.join(contents[1:]) - self.m_list = mplay.search_song_by_name(song_name) - if self.m_list == -1: - self.mutex = 0 - self.write_text('系统','%s 没有您要点的歌' % nick) - else: - self.selected = False - self.show_music_list() - threading.Thread(target=self.time_count, args=([nick, 30])).start() - elif self.mutex == nick: - self.selected = True - song_name = ''.join(contents[1:]) - self.m_list = mplay.search_song_by_name(song_name) - if self.m_list == -1: - self.mutex = 0 - self.write_text('系统','%s 没有您要点的歌' % nick) + if len(self.play_list['music list']) < 13: + if self.mutex == 0: + self.mutex = nick + song_name = ''.join(contents[1:]) + self.m_list = mplay.search_song_by_name(song_name) + if self.m_list == -1: + self.mutex = 0 + self.write_text('系统','%s 没有您要点的歌' % nick) + else: + self.selected = False + self.show_music_list() + threading.Thread(target=self.time_count, args=([nick, 40])).start() + elif self.mutex == nick: + self.selected = True + song_name = ''.join(contents[1:]) + self.m_list = mplay.search_song_by_name(song_name) + if self.m_list == -1: + self.mutex = 0 + self.write_text('系统','%s 没有您要点的歌' % nick) + else: + self.selected = False + self.show_music_list() + threading.Thread(target=self.time_count, args=([nick, 30])).start() else: - self.selected = False - self.show_music_list() - threading.Thread(target=self.time_count, args=([nick, 30])).start() + self.write_text('%s' % self.mutex,'%s 等我选完,我手速慢' % nick) else: - self.write_text('%s' % self.mutex,'%s 等我选完,我手速慢' % nick) + self.write_text('系统','%s 列表要爆炸了!' % nick) +###################################################### elif contents[0] == '选歌': if self.mutex == 0: self.write_text('系统','%s 请先点歌' % nick) @@ -460,14 +478,14 @@ def analysis_danmu(self, nick, content): selected_song = ''.join(contents[1:]) try: selected_song = int(selected_song) - song = mplay.select(selected_song, self.m_list) + song,song_id = mplay.select(selected_song, self.m_list) if song != -1: self.selected = True self.mutex = 0 self.write_text('系统','%s 正在对选择进行处理...' % nick) music_path = mplay.save_song_to_disk(song, self.FOLD) # add to list - self.play_list['music list'].append({'id':nick,'mname':song['name'],'mpath':music_path}) + self.play_list['music list'].append({'id':nick,'mname':song['name'],'mpath':music_path,'sid':song_id}) self.lb_play_list.set(self.play_list_4_show()) self.write_text('系统','%s 选歌成功' % nick) @@ -476,52 +494,98 @@ def analysis_danmu(self, nick, content): json.dump(self.vips, f) else: self.write_text('系统','%s 请按照序号选歌' % nick) - except: + except Exception as e: + print(e) self.write_text('系统', '%s 请注意选歌格式' % nick) else: self.write_text('%s' % self.mutex,'%s 等我选完,我手速慢' % nick) - elif content.strip() == '切歌': - if self.play_list['music list']: - cut_nick=self.play_list['music list'][0]['id'] - for i in self.vips['vips']: - if cut_nick==i['name']: - cut_lvl=self.calc_level(i['lvl']) - break - for i in self.vips['vips']: - if nick == i['name']: - lvl = self.calc_level(i['lvl']) - break - else: - lvl = 0 - if cut_lvl >= lvl and nick != cut_nick: - - self.write_text('%s(%d级)' % (cut_nick,cut_lvl),'%s(%d级) 你比我级高?还想切我的歌' % (nick,lvl)) +############################################################### + elif contents[0] == '切歌': + cut_num = ''.join(contents[1:]) + try: + cut_num = int(cut_num) + if cut_num > len(self.play_list['music list']): + self.write_text('系统','%s 你瞎啊!' % nick) else: - mplay.killu(self.p) - if nick == cut_nick: - self.write_text('%s' % nick,'我把自己的歌切了') + cut_nick=self.play_list['music list'][cut_num-1]['id'] + for i in self.vips['vips']: + if cut_nick==i['name']: + cut_lvl=self.calc_level(i['lvl']) + break + for i in self.vips['vips']: + if nick == i['name']: + lvl = self.calc_level(i['lvl']) + break else: - self.write_text('%s' % nick,'%s 我把你的的歌切了,你打我啊' % cut_nick) - else: - self.write_text('系统','哪有歌让你切啊!') + lvl = 0 + + if cut_lvl < 2 and nick != cut_nick: + self.write_text('%s' % cut_nick,'%s 我才1级,你忍心切我?' % nick) + elif cut_lvl >= lvl and nick != cut_nick: + + self.write_text('%s(%d级)' % (cut_nick,cut_lvl),'%s(%d级) 比我级高才能切哦' % (nick,lvl)) + else: + if cut_num == 1: + mplay.killu(self.p) + if nick == cut_nick: + self.write_text('%s' % nick,'我把自己的歌切了') + else: + self.write_text('%s' % nick,'%s 我把你的的歌切了,你打我啊' % cut_nick) + if lvl-cut_lvl >= 10: + self.write_text('系统','%s 欺负比你低10级以上的小朋友,扣10点经验' % nick) + self.handle_lvl(nick,-10) + else: + self.f5_list(cut_num-1) + self.lb_play_list.set(self.play_list_4_show()) + if nick == cut_nick: + self.write_text('%s' % nick,'我把自己的歌切了') + else: + self.write_text('%s' % nick,'%s 我把你的的歌切了,你打我啊' % cut_nick) + if lvl-cut_lvl >= 10: + self.write_text('系统','%s 欺负比你低10级以上的小朋友,扣掉10点经验' % nick) + self.handle_lvl(nick,-10) + except Exception as e: + self.write_text('系统','%s 注意切歌格式' % nick) +###################################################################### + elif content.strip() == '等级': self.write_text('%s' % nick,'我怎么才%d级' % self.get_level(nick)) +##################################################################################### + + elif nick == '707472783': + if contents[0] == '经验': + try: + contents[2] = int(contents[2]) + self.handle_lvl(contents[1],contents[2]) + with open(self.VIP_LIST,'w') as f: + json.dump(self.vips, f) + # with open(r'E:\m\douyu_0.0.5\log.txt','w') as f: + # f.write(' '.join(contents[1],contents[2],'\n')) + except Exception as e: + print('经验值不对') +############################################################################### + else: pass def play_mp3(self): while 1: while self.play_list['music list']: + self.is_music_play=True + threading.Thread(target=self.show_lyric).start() self.p = mplay.playmp3(self.play_list['music list'][0]['mpath']) + self.p.wait() + self.is_music_play=False self.f5_list() self.lb_play_list.set(self.play_list_4_show()) # refresh play list + time.sleep(3) #print(self.play_list) else: time.sleep(10)# no music play, wait for sb diange - def f5_list(self): - del(self.play_list['music list'][0]) + def f5_list(self,num=0): + del(self.play_list['music list'][num]) def play_list_4_show(self): tmp_str=' 播放列表\n\n' @@ -530,13 +594,11 @@ def play_list_4_show(self): return tmp_str def get_level(self,nick): - print(nick) - print(self.vips) for i in self.vips['vips']: if nick == i['name']: return self.calc_level(i['lvl']) else: - return -1 + return 0 def calc_level(self,lvl): start=1 @@ -566,18 +628,45 @@ def handle_lvl(self,nick, exp): if after_lvl > lvl: self.write_text('%s' % nick,'我终于升到%d级了' % after_lvl) + + def show_lyric(self): + # name=self.play_list['music list'][0]['mname'] + # selectid=self.play_list['music list'][0]['sid'] + # print('sid:',selectid) + # songid=mplay.get_songid(name,selectid-1) + # print('songid:',songid) + songid=self.play_list['music list'][0]['sid'] + getlyric=mplay.song_lyric(songid) + #print(getlyric) + if getlyric != None: + l = lyric.Lyric(getlyric) + l.process_lyric() + #print(l.time_minus) + self.lyric_val.set(getlyric) + #print(name,selectid,songid,l.time_minus,l.cut_lyric) + for i in range(len(l.cut_lyric)): + if self.is_music_play: + #print(l.cut_lyric[i]) + #print(l.time_minus[i]) + self.lyric_val.set(l.cut_lyric[i]) + time.sleep(l.time_minus[i]) + else: + self.lyric_val.set('') + return + else: + self.lyric_val.set('') + else: + self.lyric_val.set('无歌词') ############################################################################### def maintk(): root = Tk() app = my_gui(root) + #app.write_text('wo','wo') #app.delete_music_start() threading.Thread(target=app.main).start() - - threading.Thread(target=app.play_mp3).start() - #root.after(2000, app.main) root.mainloop() diff --git a/douyu/level.json b/douyu/level.json index 393e9ee..dbc4313 100644 --- a/douyu/level.json +++ b/douyu/level.json @@ -1 +1 @@ -{"vips": [{"lvl": 1, "name": "\u95f2\u8c08\u8005"}, {"lvl": 15, "name": "707472783"}, {"lvl": 3, "name": "\u9a6c\u95f9\u817ei"}, {"lvl": 42, "name": "\u661f\u8fb0\u98de\u626c"}, {"lvl": 10, "name": "\u9189\u751f\u5922\u6b7bmagura"}, {"lvl": 61, "name": "\u8bbd\u523a\u7684\u6bcd\u732a"}, {"lvl": 43, "name": "15281469825"}, {"lvl": 5, "name": "718133435"}, {"lvl": 1, "name": "1310300339"}, {"lvl": 2, "name": "\u53eb\u6211\u50bb\u68fa\u6750"}, {"lvl": 1, "name": "1094230867"}, {"lvl": 1, "name": "\u5948\u6587\u6469\u5c14nm"}, {"lvl": 63, "name": "abcdefg78563"}, {"lvl": 1, "name": "\u53cc\u6728\u68ee\u5fb7"}, {"lvl": 169, "name": "qq_xcY6kK"}, {"lvl": 1, "name": "Xanver"}, {"lvl": 3, "name": "1176681832"}, {"lvl": 1, "name": "\u4e03\u559c\u5148\u751f"}, {"lvl": 1, "name": "\u50cfUZI\u7684\u5c0f\u53f6\u5b50"}, {"lvl": 1, "name": "\u4eca\u5e74\u79cb\u5929"}, {"lvl": 2, "name": "\u65f6\u5149\u672a\u8001\u7231\u5df2\u8352\u51c9"}, {"lvl": 36, "name": "douyuing"}, {"lvl": 5, "name": "316124707"}, {"lvl": 12, "name": "\u5eb8\u4eba\u5eb8\u81ea\u5eb8"}, {"lvl": 2, "name": "\u8c01\u4eba\u4f7f\u4f60\u7231\u504f\u79bb"}, {"lvl": 1, "name": "a398818898"}, {"lvl": 2, "name": "chenteng730"}, {"lvl": 2, "name": "\u55b5\u8bfa"}, {"lvl": 9, "name": "Yjnnnnnnnnnnnnnnnnnnnnnn"}, {"lvl": 15, "name": "\u5c0f\u5c0f\u9f8d"}, {"lvl": 1, "name": "asdbbsb123"}, {"lvl": 15, "name": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b"}, {"lvl": 1, "name": "\u7edf\u4e00\u51bb\u67e0\u6aac"}, {"lvl": 1, "name": "\u963f\u79657373"}, {"lvl": 1, "name": "691130"}]} \ No newline at end of file +{"vips": [{"lvl": 1, "name": "\u95f2\u8c08\u8005"}, {"lvl": 231, "name": "707472783"}, {"lvl": 7, "name": "\u9a6c\u95f9\u817ei"}, {"lvl": 643, "name": "\u661f\u8fb0\u98de\u626c"}, {"lvl": 10, "name": "\u9189\u751f\u5922\u6b7bmagura"}, {"lvl": 82, "name": "\u8bbd\u523a\u7684\u6bcd\u732a"}, {"lvl": 82, "name": "15281469825"}, {"lvl": 5, "name": "718133435"}, {"lvl": 1, "name": "1310300339"}, {"lvl": 2, "name": "\u53eb\u6211\u50bb\u68fa\u6750"}, {"lvl": 2, "name": "1094230867"}, {"lvl": 1, "name": "\u5948\u6587\u6469\u5c14nm"}, {"lvl": 63, "name": "abcdefg78563"}, {"lvl": 1, "name": "\u53cc\u6728\u68ee\u5fb7"}, {"lvl": 183, "name": "qq_xcY6kK"}, {"lvl": 1, "name": "Xanver"}, {"lvl": 3, "name": "1176681832"}, {"lvl": 1, "name": "\u4e03\u559c\u5148\u751f"}, {"lvl": 1, "name": "\u50cfUZI\u7684\u5c0f\u53f6\u5b50"}, {"lvl": 1, "name": "\u4eca\u5e74\u79cb\u5929"}, {"lvl": 2, "name": "\u65f6\u5149\u672a\u8001\u7231\u5df2\u8352\u51c9"}, {"lvl": 1276, "name": "douyuing"}, {"lvl": 88, "name": "316124707"}, {"lvl": 13, "name": "\u5eb8\u4eba\u5eb8\u81ea\u5eb8"}, {"lvl": 2, "name": "\u8c01\u4eba\u4f7f\u4f60\u7231\u504f\u79bb"}, {"lvl": 1, "name": "a398818898"}, {"lvl": 2, "name": "chenteng730"}, {"lvl": 5, "name": "\u55b5\u8bfa"}, {"lvl": 9, "name": "Yjnnnnnnnnnnnnnnnnnnnnnn"}, {"lvl": 16, "name": "\u5c0f\u5c0f\u9f8d"}, {"lvl": 1, "name": "asdbbsb123"}, {"lvl": 42, "name": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b"}, {"lvl": 1, "name": "\u7edf\u4e00\u51bb\u67e0\u6aac"}, {"lvl": 1, "name": "\u963f\u79657373"}, {"lvl": 1, "name": "691130"}, {"lvl": 1, "name": "Douyu\u4e36Msee"}, {"lvl": 10, "name": "\u604b\u7476\u4ffa\u6ca1\u9519"}, {"lvl": 1, "name": "wensenv"}, {"lvl": 4, "name": "\u90c1\u90c1\u4e4b\u55e8"}, {"lvl": 1, "name": "1272457516"}, {"lvl": 16, "name": "dalalv"}, {"lvl": 1, "name": "EX\u4e3f\u5496\u55b1\u68d2"}, {"lvl": 8, "name": "\u7239\u54e5970"}, {"lvl": 1, "name": "99589937"}, {"lvl": 99, "name": "\u4e0d\u60f3\u6df1\u7231\u53d8\u6df1\u788d"}, {"lvl": 2, "name": "654710154"}, {"lvl": 17, "name": "bbkxczx"}, {"lvl": 17, "name": "\u72d0\u72f8\u7684\u6625\u5929"}, {"lvl": 7, "name": "Autism1995"}, {"lvl": 1, "name": "\u9f8d\u6653\u5b87"}, {"lvl": 1, "name": "1762511542"}, {"lvl": 1, "name": "1829079319"}, {"lvl": 1, "name": "yifangss"}, {"lvl": 25, "name": "qaz361463145"}, {"lvl": 1, "name": "acaiacai"}, {"lvl": 23, "name": "Tekkit"}, {"lvl": 45, "name": "\u6211\u88ab\u6d17\u8111\u4e86"}, {"lvl": 4, "name": "\u5929\u5929\u60c5\u6b87"}, {"lvl": 1, "name": "1816916296"}, {"lvl": 1, "name": "175FC"}, {"lvl": 2, "name": "923536929"}, {"lvl": 2, "name": "\u5c14\u7b49\u53ea\u80fd\u4ef0\u6155111"}, {"lvl": 600, "name": "\u5feb\u4e50\u5730\u76f4\u64ad\u5668"}, {"lvl": 6, "name": "2903023209"}, {"lvl": 1, "name": "\u97e9\u610f\u6deb"}, {"lvl": 1, "name": "\u6765\u667a\u661f\u661f\u7684\u4f60"}, {"lvl": 141, "name": "lwliyifan"}, {"lvl": 3, "name": "\u516e\u7ffc\u7a7a"}, {"lvl": 17, "name": "1040270097"}, {"lvl": 15, "name": "\u7d2f\u4e86\u4e36\u538c\u4e86"}, {"lvl": 2, "name": "Hello52145"}, {"lvl": 1, "name": "crazyking7"}, {"lvl": 122, "name": "Ariesssssss"}, {"lvl": 1, "name": "\u6211\u53ea\u662f\u706c\u770b\u5ba2"}, {"lvl": 1, "name": "847220267"}, {"lvl": 2, "name": "1772141946"}, {"lvl": 68, "name": "\u65e0\u60c5\u65e0\u4f24\u4e86"}, {"lvl": 121, "name": "\u4e0a\u8005\u4f55"}, {"lvl": 28, "name": "2085372375"}, {"lvl": 2, "name": "\u5f13\u867d\u5973\u5e72\u5973\u5c3c"}, {"lvl": 4, "name": "shuai2513099"}, {"lvl": 42, "name": "1446271289"}, {"lvl": 1, "name": "\u7ed9\u6211\u4e00\u676f\u5fd8\u60c5"}, {"lvl": 8, "name": "\u5446\u5446\u662f\u53ea\u732b"}, {"lvl": 3, "name": "DraculaSun"}, {"lvl": 61, "name": "247270974"}, {"lvl": 3, "name": "\u5b8f\u4e1a\u7684\u751f\u6210"}, {"lvl": 1, "name": "an755513190"}, {"lvl": 21, "name": "150642353861"}, {"lvl": 67, "name": "\u53ef\u7b11\u4e0d\u518d"}, {"lvl": 3, "name": "a252077"}, {"lvl": 10, "name": "\u5c0f1\u5b9d12345"}, {"lvl": 1, "name": "\u63d0\u83ab\u5f00\u7740\u5c0f\u8017\u5b50"}, {"lvl": 1, "name": "\u4f60\u6211\u4e0d\u4e86\u4e86\u4e4b"}, {"lvl": 1, "name": "\u4e28\u674e\u7b97\u8001\u51e0\u4e28"}, {"lvl": 2, "name": "\u7231\u841d\u8389loli\u771f\u662f\u592a\u597d\u4e86i"}, {"lvl": 6, "name": "2095460876"}, {"lvl": 1, "name": "937512599"}, {"lvl": 2, "name": "gaoyuan1125"}, {"lvl": 1, "name": "clnlove2"}, {"lvl": 1, "name": "\u4e07\u6076\u7684\u82b1\u5f00\u541b"}, {"lvl": 1, "name": "\u6216\u662f\u7684\u8bdd"}, {"lvl": 2, "name": "13060554785"}, {"lvl": 1, "name": "zx32315"}, {"lvl": 1, "name": "\u709c\u7231\u8475"}, {"lvl": 654, "name": "\u68a6\u91cc\u753b\u6866"}, {"lvl": 2, "name": "\u661f\u7237\u5728\u6b64"}, {"lvl": 2, "name": "\u5c55\u7fc5\u5927\u9e4f"}, {"lvl": 1, "name": "\u8d8a\u632b\u8d8a\u5e05\u6c14\u4e36"}, {"lvl": 4, "name": "\u6deb\u5c1b\u9b54"}, {"lvl": 12, "name": "cffgggg999"}, {"lvl": 62, "name": "\u5b89\u5c0f\u70e7"}, {"lvl": 4, "name": "865221501LiguO"}, {"lvl": 4, "name": "\u6d41\u6d6a\u306efish"}, {"lvl": 3, "name": "x396244583"}, {"lvl": 1, "name": "hu714949"}, {"lvl": 6, "name": "\u83ab\u5fd8\u521d\u5fc38889"}, {"lvl": 241, "name": "\u840c\u840c\u54d2\u4e36\u75bc"}, {"lvl": 1, "name": "Cloudlove\u4e36"}, {"lvl": 1, "name": "fishcn"}, {"lvl": 1, "name": "1961160023"}, {"lvl": 2, "name": "\u5c31\u4f60\u56fa\u5143\u818f"}, {"lvl": 35, "name": "\u4e36\u4e0a\u5b98\u5cf0"}, {"lvl": 112, "name": "zhulixun"}, {"lvl": 5, "name": "290080261"}, {"lvl": 1, "name": "bwrs985"}, {"lvl": 3, "name": "\u6696\u72d7\u5c4e"}, {"lvl": 1, "name": "0\u5473\u90530"}, {"lvl": 10, "name": "workhar"}, {"lvl": 4, "name": "\u8dea\u6c42\u53cc\u6392"}, {"lvl": 2, "name": "\u6768\u4e30\u65ed1"}, {"lvl": 1, "name": "\u989c\u5c0f\u673a"}, {"lvl": 2, "name": "maxcc520"}, {"lvl": 2, "name": "a29449370"}, {"lvl": 4, "name": "xieyupeng00"}, {"lvl": 3, "name": "silkmax"}, {"lvl": 323, "name": "\u51ef\u83f2\u706cangel"}, {"lvl": 54, "name": "\u9171\u6cb9\u795e\u541b"}, {"lvl": 3, "name": "\u6211\u5230\u7897\u91cc\u53bb"}, {"lvl": 2, "name": "a377168799"}, {"lvl": 1, "name": "magican1"}, {"lvl": 11, "name": "Lovewei2015"}, {"lvl": 1, "name": "EnderTV"}, {"lvl": 1, "name": "\u4e0d\u77e5\u9053\u53d6\u4ec0\u4e48\u540d\u597d"}, {"lvl": 1, "name": "\u554a\u54c8\u79cb\u88e4\u5466"}, {"lvl": 4, "name": "\u9ece\u6587\u6ce2"}, {"lvl": 1, "name": "\u4e0d\u5217\u98a0\u4e0d\u5217\u98a0"}, {"lvl": 4, "name": "FFEVA"}, {"lvl": 5, "name": "gback12"}, {"lvl": 2, "name": "784830322"}, {"lvl": 335, "name": "\u5854\u5317"}, {"lvl": 5, "name": "Timber0817"}, {"lvl": 12, "name": "\u53ef\u4e50\u559d\u767e\u4e8b"}, {"lvl": 1, "name": "\u6bd4\u5434\u5f66\u7956\u5dee\u4e00\u70b9"}, {"lvl": 33, "name": "\u5929\u8d50\u6069\u5ba0\u4e36"}, {"lvl": 28, "name": "\u70b8\u5c4e\u72c2"}, {"lvl": 2, "name": "\u7535\u7ade\u4e36\u5468\u6770\u4f26\u4e28"}, {"lvl": 9, "name": "Hungersir"}, {"lvl": 26, "name": "201453606"}, {"lvl": 14, "name": "\u4f0a\u5229\u838e\u767d8"}, {"lvl": 4, "name": "\u4f0a\u51e1\u98a8\u8563"}, {"lvl": 58, "name": "1483738797"}, {"lvl": 1, "name": "niceandi"}, {"lvl": 1, "name": "mole6677"}, {"lvl": 1, "name": "\u708e\u53d1\u707c\u773c\u590f\u5a1c"}, {"lvl": 96, "name": "\u7535\u996d\u9505\u7684\u7535\u6c60"}, {"lvl": 53, "name": "\u6211\u513f\u5b50\u7528\u4e86\u6211\u7684\u90ae\u7bb1"}, {"lvl": 38, "name": "yswtstw"}, {"lvl": 40, "name": "\u5df2\u7ecf\u79bb\u8fdc"}, {"lvl": 1, "name": "bereal"}, {"lvl": 1, "name": "zhankaipeng"}, {"lvl": 14, "name": "820364102"}, {"lvl": 2, "name": "ljf97521"}, {"lvl": 1, "name": "a55565745"}, {"lvl": 2, "name": "linfenzhen"}, {"lvl": 1, "name": "\u5730\u7403\u6ca1\u6709\u82b1"}, {"lvl": 4, "name": "\u6606\u543e\u5144"}, {"lvl": 1, "name": "zpzyx520"}, {"lvl": 3, "name": "sadasdasdsavcvbdfyer"}, {"lvl": 5, "name": "\u4e66\u751f\u4e36\u6d6e\u4e91"}, {"lvl": 2, "name": "\u4e36\u4e36\u4e36\u4e36\u5a73"}, {"lvl": 1, "name": "\u770b\u7740\u6597\u5403\u7740\u9c7c"}, {"lvl": 2, "name": "\u638c\u4e2d\u7684\u5149"}, {"lvl": 1, "name": "\u795e\u521d\u5584\u826f"}, {"lvl": 13, "name": "duxianlin"}, {"lvl": 1, "name": "529891235"}, {"lvl": 1, "name": "874757"}, {"lvl": 7, "name": "king4164"}, {"lvl": 2, "name": "\u8349\u8700"}, {"lvl": 5, "name": "1549583381"}, {"lvl": 5, "name": "Felicity\u4e36"}, {"lvl": 1, "name": "\u4f60\u6765\u6216\u8d70\u90fd\u968f\u4f60"}, {"lvl": 4, "name": "\u89c5\u5979\u5507\u9999"}, {"lvl": 4, "name": "\u83dc\u9e1fstudy"}, {"lvl": 5, "name": "\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u96f6"}, {"lvl": 4, "name": "q295333520"}, {"lvl": 2, "name": "742861868"}, {"lvl": 62, "name": "761478694"}, {"lvl": 39, "name": "\u67ab\u7ffc\u65e0\u75d5"}, {"lvl": 25, "name": "SpaceGrow"}, {"lvl": 5, "name": "\u5c0f\u9c7c\u4e38"}, {"lvl": 6, "name": "\u4e3f\u4e71\u4e16\u706c\u738b\u8005"}, {"lvl": 3, "name": "\u672a\u6765\u4e36\u5c3d\u5728\u6211\u624b"}, {"lvl": 4, "name": "fgbzl7777"}, {"lvl": 1, "name": "\u590f\u672bdou\u9c7c"}, {"lvl": 11, "name": "YK2257990383"}, {"lvl": 61, "name": "machine666"}, {"lvl": 1, "name": "740687792"}, {"lvl": 24, "name": "\u4e28ADO\u4e36\u5c0f\u98ce"}, {"lvl": 1, "name": "1300899163"}, {"lvl": 43, "name": "\u62bd\u98ceCRAY"}, {"lvl": 7, "name": "77948718"}, {"lvl": 1, "name": "asd1820205"}, {"lvl": 43, "name": "Bstreet\u82b1\u5c11"}, {"lvl": 3, "name": "15258770221"}, {"lvl": 1, "name": "shenxinnan"}, {"lvl": 3, "name": "\u8c61\u5927\u5c41"}, {"lvl": 4, "name": "\u4e00\u9a91\u8e0f\u897f\u51c9"}, {"lvl": 1, "name": "lidahai5812"}, {"lvl": 3, "name": "\u4e8c\u50bb\u75af\u5b50"}, {"lvl": 6, "name": "wowaijie"}, {"lvl": 23, "name": "\u88ab\u9057\u5fd8\u80050"}, {"lvl": 2, "name": "\u5c0f\u5c0f\u9cc5"}, {"lvl": 23, "name": "z897226585"}, {"lvl": 2, "name": "wwwlisiyan"}, {"lvl": 36, "name": "lhy7223641"}, {"lvl": 3, "name": "Ionia\u4e36Lumia"}, {"lvl": 4, "name": "\u79cb\u98a8\u4f3c\u7121\u75d5"}, {"lvl": 2, "name": "Victor_"}, {"lvl": 6, "name": "361806929"}, {"lvl": 3, "name": "gg225"}, {"lvl": 14, "name": "hyb365"}, {"lvl": 4, "name": "2538151112"}, {"lvl": 1, "name": "\u6e29\u67d4\u4f53\u8d34\u6253\u706b\u673a"}, {"lvl": 1, "name": "\u8001\u6768\u5927\u5927"}, {"lvl": 6, "name": "jmf13212605671"}, {"lvl": 11, "name": "1503107729"}, {"lvl": 1, "name": "choqttt"}, {"lvl": 88, "name": "\u72ec\u95e8694"}, {"lvl": 1, "name": "qq5219600"}, {"lvl": 12, "name": "woshiniyuayesa"}, {"lvl": 2, "name": "\u56ed\u4e50"}, {"lvl": 1, "name": "\u6851\u76f8\u4e28Hexakill"}, {"lvl": 1, "name": "Skirillex"}, {"lvl": 729, "name": "\u5b89\u6770\u5927\u54e5"}, {"lvl": 4, "name": "winysrj"}, {"lvl": 1, "name": "Snowdddd"}, {"lvl": 1, "name": "979266544"}, {"lvl": 10, "name": "\u65e5\u7167\u9999\u7089\u751f\u7d2b\u6e6e"}, {"lvl": 1, "name": "\u54d2\u54d2\u54d2\u54d2\u86e4"}, {"lvl": 2, "name": "\u5927\u5927\u5927\u5927\u5927\u6a59\u5b50"}, {"lvl": 11, "name": "\u5de8\u9524\u554a"}, {"lvl": 1, "name": "\u674f\u7cd5\u7092"}, {"lvl": 74, "name": "cj591794998"}, {"lvl": 2, "name": "XmCh1111"}, {"lvl": 34, "name": "\u4e0d\u5728\u4e4e\u4e36"}, {"lvl": 1, "name": "nask16607"}, {"lvl": 313, "name": "jewelilu"}, {"lvl": 19, "name": "\u6210521"}, {"lvl": 2, "name": "douyu1006733561"}, {"lvl": 1, "name": "1278432318"}, {"lvl": 2, "name": "wodhi1122333"}, {"lvl": 22, "name": "342364968"}, {"lvl": 4, "name": "\u989c\u7f8e\u4eba"}, {"lvl": 2, "name": "wx3362975"}, {"lvl": 1, "name": "zane7608"}, {"lvl": 1, "name": "gs545452"}, {"lvl": 3, "name": "guajige"}, {"lvl": 5, "name": "142565307"}, {"lvl": 6, "name": "xxxOrange"}, {"lvl": 1, "name": "\u620f\u5979\u5fc3\u6bc1\u4ed6\u68a6"}, {"lvl": 1, "name": "zhaobingdy"}, {"lvl": 19, "name": "\u7a77\u6e9c\u8fbe"}, {"lvl": 8, "name": "\u6cb9\u70b8\u6db2\u5316\u6c14\u7f50"}, {"lvl": 13, "name": "\u563f\u563f\u5c0fD"}, {"lvl": 1, "name": "baishuqi"}, {"lvl": 8, "name": "banana7671"}, {"lvl": 3, "name": "Lucky\u4e36NA"}, {"lvl": 1, "name": "\u590f\u6d1b\u7279\u70e6\u607c\u54ce"}, {"lvl": 61, "name": "\u98ce\u4e91\u72ec\u5c0a007"}, {"lvl": 174, "name": "funcir"}, {"lvl": 8, "name": "zxl2626815"}, {"lvl": 1, "name": "qq1989221"}, {"lvl": 39, "name": "q2531138"}, {"lvl": 8, "name": "\u6211\u7684\u5c0f\u571f\u8c46\u963f"}, {"lvl": 1, "name": "3245869320"}, {"lvl": 3, "name": "2857243617"}, {"lvl": 3, "name": "\u8fd9\u5c0f\u5b50\u771fTM\u5e05"}, {"lvl": 3, "name": "\u964c\u4e0a\u4eba\u5982\u7389\u4e36"}, {"lvl": 7, "name": "913704405"}, {"lvl": 4, "name": "yfsdylh"}, {"lvl": 13, "name": "\u6002\u8d2711"}]} \ No newline at end of file diff --git a/douyu/lyric.py b/douyu/lyric.py new file mode 100644 index 0000000..154c17d --- /dev/null +++ b/douyu/lyric.py @@ -0,0 +1,54 @@ +import re + +class Lyric(): + def __init__(self, down_lyric): + self.lyric_lines=down_lyric.split('\n') + self.pattern=re.compile(r'\[(.+):(.+)\.(.+)\](.*)') + self.time_minus=[] + self.cut_lyric=[] + + def get_line_lyric(self,line): + m = self.pattern.match(line) + if m!=None: + return m.group(1),m.group(2),m.group(3),m.group(4) + else: + return None + + def process_lyric(self): + for v in self.lyric_lines: + try: + if self.get_line_lyric(v)!=None: + mnt,sec,mili,content=self.get_line_lyric(v) + if len(mili)==3: + #print(int(mnt)*60+int(sec)+int(mili)/1000) + self.time_minus.append(int(mnt)*60+int(sec)+int(mili)/1000) + elif len(mili)==2: + self.time_minus.append(int(mnt)*60+int(sec)+int(mili)/1000) + self.cut_lyric.append(content) + else: + print('无歌词1') + except Exception as e: + print('无歌词2') + print(self.cut_lyric) + # print(len(self.cut_lyric)) + for i,v in enumerate(self.time_minus): + if i 0: + return + netease = NetEase() + lyric = netease.song_lyric(self.playing_id) + if (not lyric == []) or lyric == '未找到歌词': + lyric = lyric.split('\n') + self.songs[str(self.playing_id)]["lyric"] = lyric + return + + +def song_lyric(music_id): + action = "http://music.163.com/api/song/lyric?os=osx&id=" + str(music_id) + "&lv=-1&kv=-1&tv=-1" + try: + #params = urllib.parse.urlencode(params).encode('utf-8') + with urllib.request.urlopen(action) as resp: + data = json.loads(resp.read().decode('utf-8')) + if data['lrc']['lyric'] != None: + lyric_info = data['lrc']['lyric'] + return lyric_info + else: + return None + + except: + return None + +""" +id:选歌序号 +""" +def get_songid(name,selectid): + mlist=search_song_by_name(name) + return mlist['songs'][selectid]['id'] + + if __name__ == '__main__': - # folder = 'E:\m\music' - # name = input('song:') - # m_list = search_song_by_name(name) - # show_music_list(m_list) - # sid = int(input('select:')) - # song = select(sid, m_list) - # fpath = save_song_to_disk(song, folder) - # playmp3(fpath) - p = playmp3(r'E:\m\a.mp3') - print('returncode:',p.returncode) - time.sleep(3) - threading.Thread(target=killu, args=([p])).start() - p.wait() - print('returncode:',p.returncode) - p = playmp3(r'E:\m\a.mp3') - p.wait() - print('returncode:',p.returncode) + mlist=search_song_by_name('晴天') + song_id = mlist['songs'][0]['id'] + print(song_id) + show_music_list(mlist) + + lyric1=song_lyric(song_id) + print(lyric1) + l=lyric.Lyric(lyric1) + l.process_lyric() + print(l.time_minus) + print(l.cut_lyric) + path=save_song_to_disk(select(1,mlist),r'E:\m\music') + playmp3(path) + for i in range(len(l.cut_lyric)): + print(l.cut_lyric[i]) + time.sleep(l.time_minus[i]) + print(l.time_minus[i]) + + # lyric. + # lyric_line=lyric1.split('\n') + + + # l=lyric.Lyric(lyric_line[4]) + + + # time_minus=[] + # lyrics=[] + # for v in lyric_line: + # try: + # l=lyric.Lyric(v) + # if len(l.millsec)==3: + # print(l.millsec) + # print(int(l.minite)*60+int(l.sec)+int(l.millsec)/1000) + # time_minus.append(int(l.minite)*60+int(l.sec)+int(l.millsec)/1000) + # elif len(l.millsec)==2: + # time_minus.append(int(l.minite)*60+int(l.sec)+int(l.millsec)/1000) + # lyrics.append(l.content) + # except Exception as e: + # print('error') + # print(lyrics) + # print(len(lyrics)) + # for i,v in enumerate(time_minus): + # if i