From 79f337b12e9f40f97af1b504b17ee59000f77fec Mon Sep 17 00:00:00 2001 From: zeek <707472783@qq.com> Date: Wed, 18 Nov 2015 00:50:36 +0800 Subject: [PATCH] add user level --- douyu/douyu.py | 174 ++++++++++++++++++++++++++++++------------ douyu/level.json | 1 + douyu/mplay.py | 30 +++++--- douyu/music_list.json | 2 +- 4 files changed, 147 insertions(+), 60 deletions(-) create mode 100644 douyu/level.json diff --git a/douyu/douyu.py b/douyu/douyu.py index 47de2c4..55cf6c8 100644 --- a/douyu/douyu.py +++ b/douyu/douyu.py @@ -27,31 +27,30 @@ def __init__(self, root): self.g_exit= False - + self.p=None self.mutex = 0 self.m_list = {} # list from search netcloud self.selected = False - #self.FOLD = r'E:\m\music' - self.FOLD = 'Documents/sublime/danmu_diange/music' - - - - + 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' + with open(self.VIP_LIST, 'r') as f: + self.vips = json.loads(f.read()) + def initUI(self): - self.MUSIC_LIST='Documents/sublime/danmu_diange/douyu_0.0.3/music_list.json' + self.MUSIC_LIST=r'E:\m\douyu_0.0.4\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=25, state=DISABLED, font=bigFont) + self.text = Text(mainframe, bg="white", width=50, height=30, state=DISABLED, font=bigFont) self.lb_play_list=StringVar() self.lb_play_list.set(self.play_list_4_show()) - print(self.play_list) self.label = ttk.Label(mainframe, textvariable=self.lb_play_list, font=bigFont, width=20) mainframe.grid(column=0,row=0) self.text.grid(column=0,row=0) @@ -69,11 +68,13 @@ def on_closing(self): if messagebox.askokcancel("Quit", "Do you want to quit?"): with open(self.MUSIC_LIST,'w') as f: json.dump(self.play_list, f) + with open(self.VIP_LIST,'w') as f: + json.dump(self.vips, f) self.root.destroy() -############################################################################### +#####################################弹幕##################################### def is_exit(self): self.g_exit return self.g_exit @@ -153,15 +154,15 @@ def get_longinres(self,s_ip=b'117.79.132.20', s_port=8001, rid=b'265352'): self.sendmsg(s,b'type@=loginreq/username@=/password@=/roomid@='+rid+b'/\x00') - #print('==========longinres') + print('==========longinres') longinres= self.unpackage(self.recvmsg(s)) - #print('==========msgrepeaterlist') + print('==========msgrepeaterlist') msgrepeaterlist= self.unpackage(self.recvmsg(s)) lst= self.unpackage(msgrepeaterlist[b'list']) tb= self.unpackage(random.choice(tuple(lst.values()))) - #print('==========setmsggroup') + print('==========setmsggroup') setmsggroup= self.unpackage(self.recvmsg(s)) ret= {'rid':rid, @@ -176,7 +177,9 @@ def keepalive_send(): try: self.sendmsg(s,b'type@=keeplive/tick@='+str(random.randint(1,99)).encode('ascii')+b'/\x00') except Exception as e: - threading.Thread(target=keepalive_send).start() + print(e) + threading.Thread(target=self.main).start() + exit() time.sleep(45) s.close() threading.Thread(target=keepalive_send).start() @@ -185,15 +188,17 @@ def keepalive_recv(): try: bmsg= self.recvmsg(s) except Exception as e: - threading.Thread(target=keepalive_recv).start() - #print('*** usr alive:',unpackage(bmsg),'***') + print(e) + threading.Thread(target=self.main).start() + exit() + print('*** usr alive:',self.unpackage(bmsg),'***') s.close() threading.Thread(target=keepalive_recv).start() return ret def get_danmu(self,rid=b'5275', ip=b'danmu.douyutv.com', port=8001, username=b'visitor42', gid=b'0'): "args needs bytes not str" - #print('==========danmu') + print('==========danmu') s= socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ip,int(port))) @@ -206,7 +211,9 @@ def keepalive(): try: self.sendmsg(s,b'type@=keeplive/tick@='+str(random.randint(1,99)).encode('ascii')+b'/\x00') except Exception as e: - threading.Thread(target=keepalive).start() + print(e) + threading.Thread(target=self.main).start() + exit() time.sleep(45) s.close() threading.Thread(target=keepalive).start() @@ -215,9 +222,9 @@ def keepalive(): try: bmsg= self.recvmsg(s) except Exception as e: - print('restarting...') + print(e) threading.Thread(target=self.main).start() - break + exit() if not bmsg: print('*** connection break ***') @@ -238,8 +245,15 @@ def keepalive(): elif msgtype==b'donateres': sui= self.unpackage(msg.get(b'sui',b'nick@=undifined//00')) nick= sui[b'nick'].decode('utf8') - #print('***', nick, '送给主播', int(msg[b'ms']),\ - # '个鱼丸 (', cast_wetght(msg[b'dst_weight']), ') ***') + 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'])) + '个鱼丸') elif msgtype==b'keeplive': pass @@ -365,6 +379,7 @@ def main(self,url='http://www.douyutv.com/im707'): #print('login_room_info', login_room_info) self.write_text('系统','已启动...') self.get_danmu(**login_room_info) + ############################################################################### @@ -377,7 +392,7 @@ def time_count(self,nick, times): time.sleep(0.1) count = times*10+1-i if count % 100 == 0: - self.write_text('系统','将在%d秒之后自动播放第一首歌' % int(count/10)) + self.write_text('系统','将在%d秒之后自动选择第一首歌' % int(count/10)) else: return @@ -410,12 +425,13 @@ def show_music_list(self): """ def analysis_danmu(self, nick, content): + #print(self.vips) #self.write_text('测试',str(self.mutex)) - content = content.split(' ') - if content[0] == '点歌': + contents = content.split(' ') + if contents[0] == '点歌': if self.mutex == 0: self.mutex = nick - song_name = ''.join(content[1:]) + song_name = ''.join(contents[1:]) self.m_list = mplay.search_song_by_name(song_name) if self.m_list == -1: self.mutex = 0 @@ -426,7 +442,7 @@ def analysis_danmu(self, nick, content): threading.Thread(target=self.time_count, args=([nick, 30])).start() elif self.mutex == nick: self.selected = True - song_name = ''.join(content[1:]) + song_name = ''.join(contents[1:]) self.m_list = mplay.search_song_by_name(song_name) if self.m_list == -1: self.mutex = 0 @@ -436,51 +452,71 @@ def analysis_danmu(self, nick, content): self.show_music_list() threading.Thread(target=self.time_count, args=([nick, 30])).start() else: - self.write_text('系统','%s 请等待 %s 点歌' % (nick, self.mutex)) - elif content[0] == '选歌': + self.write_text('%s' % self.mutex,'%s 等我选完,我手速慢' % nick) + elif contents[0] == '选歌': if self.mutex == 0: self.write_text('系统','%s 请先点歌' % nick) elif self.mutex == nick: - selected_song = ''.join(content[1:]) + selected_song = ''.join(contents[1:]) try: selected_song = int(selected_song) song = 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 - print(music_path) - print(self.play_list) self.play_list['music list'].append({'id':nick,'mname':song['name'],'mpath':music_path}) self.lb_play_list.set(self.play_list_4_show()) - # with open(self.MUSIC_LIST, 'w') as f: - # json.dump(m_list, f) - print(self.play_list['music list'][-1]) - - # with open(self.MUSIC_LIST, 'r') as f: - # m_list = json.loads(f.read()) - # self.write_text('song',m_list['music list'][1]['mname']) - + + self.write_text('系统','%s 选歌成功' % nick) + self.handle_lvl(nick,1) + with open(self.VIP_LIST,'w') as f: + json.dump(self.vips, f) else: self.write_text('系统','%s 请按照序号选歌' % nick) except: self.write_text('系统', '%s 请注意选歌格式' % nick) else: - self.write_text('系统','%s 请等待 %s 选歌' % (nick, self.mutex)) + 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)) + else: + mplay.killu(self.p) + if nick == cut_nick: + self.write_text('%s' % nick,'我把自己的歌切了') + else: + self.write_text('%s' % nick,'%s 我把你的的歌切了,你打我啊' % cut_nick) + else: + self.write_text('系统','哪有歌让你切啊!') + elif content.strip() == '等级': + self.write_text('%s' % nick,'我怎么才%d级' % self.get_level(nick)) else: pass def play_mp3(self): while 1: while self.play_list['music list']: - p = mplay.playmp3(self.play_list['music list'][0]['mpath']) - # while not p.returncode: - # print(p) - # time.sleep(5) + self.p = mplay.playmp3(self.play_list['music list'][0]['mpath']) + self.p.wait() self.f5_list() self.lb_play_list.set(self.play_list_4_show()) # refresh play list - print(self.play_list) + #print(self.play_list) else: time.sleep(10)# no music play, wait for sb diange @@ -490,16 +526,56 @@ def f5_list(self): def play_list_4_show(self): tmp_str=' 播放列表\n\n' for i,v in enumerate(self.play_list['music list']): - tmp_str=''.join([tmp_str,str(i+1),'. %s:\n %s' % (v['id'],v['mname']), '\n']) + tmp_str=''.join([tmp_str,str(i+1),'. %s:\n %s' % (v['id'],v['mname']), '\n']) 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 + + def calc_level(self,lvl): + start=1 + MAX=100 + while start < MAX: + lvl_value=(start*(start+1))/2 + if lvl < lvl_value: + return start-1 + else: + start += 1 + else: + self.write_text('系统','等级已到上限') + return -1 + + def write_level(self,nick,lvl): + for i in self.vips['vips']: + if i['name'] == nick: + i['lvl'] += lvl + break + else: + self.vips['vips'].append({'name':nick,'lvl':lvl}) + + def handle_lvl(self,nick, exp): + lvl = self.get_level(nick) + self.write_level(nick,exp) #100鱼丸=10点经验 + after_lvl=self.get_level(nick) + if after_lvl > lvl: + self.write_text('%s' % nick,'我终于升到%d级了' % after_lvl) + ############################################################################### def maintk(): root = Tk() app = my_gui(root) #app.delete_music_start() + threading.Thread(target=app.main).start() + + threading.Thread(target=app.play_mp3).start() #root.after(2000, app.main) root.mainloop() @@ -510,4 +586,6 @@ def maintk(): # url= sys.argv[1] if len(sys.argv)>1 else 'http://www.douyutv.com/im707' # #danmu_play_music.delete_music_start() # main(url) + maintk() + diff --git a/douyu/level.json b/douyu/level.json new file mode 100644 index 0000000..393e9ee --- /dev/null +++ b/douyu/level.json @@ -0,0 +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 diff --git a/douyu/mplay.py b/douyu/mplay.py index ec9f888..39fe97c 100644 --- a/douyu/mplay.py +++ b/douyu/mplay.py @@ -16,8 +16,8 @@ """ffplay path """ -#FFMPEG=r'E:\ffmpeg\bin\ffplay.exe' -FFMPEG='ffplay' +FFMPEG=r'E:\ffmpeg\bin\ffplay.exe' +#FFMPEG='ffplay' """set cookies """ @@ -136,10 +136,11 @@ def save_song_to_disk(song, folder): """ def playmp3(filename): if os.path.exists(filename): - #p = Popen([FFMPEG, '-autoexit', filename]) - call([FFMPEG, '-autoexit', filename]) - os.remove(filename) - #return p + p = Popen([FFMPEG, '-autoexit', filename]) + #call([FFMPEG, '-autoexit', filename]) + #os.remove(filename) + + return p else: return -1 @@ -162,6 +163,10 @@ def select(select_id, song_list): song_js = json.loads(resp.read().decode('utf-8')) return song_js['songs'][0] # 音质? +def killu(p): + time.sleep(3) + p.kill() #切了之后没有删除歌曲 + if __name__ == '__main__': # folder = 'E:\m\music' # name = input('song:') @@ -171,9 +176,12 @@ def select(select_id, song_list): # song = select(sid, m_list) # fpath = save_song_to_disk(song, folder) # playmp3(fpath) - p = playmp3('Desktop/m/a.mp3') - print(p.returncode) + p = playmp3(r'E:\m\a.mp3') + print('returncode:',p.returncode) time.sleep(3) - p.kill() - print(p.returncode) - + 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) diff --git a/douyu/music_list.json b/douyu/music_list.json index a6fa8d0..956a234 100644 --- a/douyu/music_list.json +++ b/douyu/music_list.json @@ -1 +1 @@ -{"music list": []} \ No newline at end of file +{"music list": [{"mpath": "E:\\m\\music\\0.3355452473420514.mp3", "id": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b", "mname": "\u767d\u73ab\u7470"}, {"mpath": "E:\\m\\music\\0.7026518719378951.mp3", "id": "\u661f\u8fb0\u98de\u626c", "mname": "\u557c\u7b11\u59fb\u7f18"}, {"mpath": "E:\\m\\music\\0.3539438818138908.mp3", "id": "douyuing", "mname": "\u7231\u4f60\u4e00\u4e07\u5e74"}, {"mpath": "E:\\m\\music\\0.3104496965131013.mp3", "id": "douyuing", "mname": "Burning"}, {"mpath": "E:\\m\\music\\0.3809596000057409.mp3", "id": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b", "mname": "Baby Song"}, {"mpath": "E:\\m\\music\\0.8746173219286956.mp3", "id": "douyuing", "mname": "\u732a\u516b\u6212\u80cc\u5ab3\u5987"}, {"mpath": "E:\\m\\music\\0.07710910743800581.mp3", "id": "douyuing", "mname": "Glimmer"}, {"mpath": "E:\\m\\music\\0.9044317011611708.mp3", "id": "douyuing", "mname": "\u675c\u752b\uff1a\u671b\u5cb3"}, {"mpath": "E:\\m\\music\\0.7596898237376472.mp3", "id": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b", "mname": "\u5c06\u519b"}, {"mpath": "E:\\m\\music\\0.2115632128896181.mp3", "id": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b", "mname": "\u66f9\u64cd"}, {"mpath": "E:\\m\\music\\0.4392667223848523.mp3", "id": "\u5979\u662f\u6211\u7684\u6d77\u8d3c\u738b", "mname": "\u5e73\u51e1\u4e4b\u8def"}, {"mpath": "E:\\m\\music\\0.8002633796551467.mp3", "id": "douyuing", "mname": "\u56f4\u68cb\u5c11\u5e74"}, {"mpath": "E:\\m\\music\\0.5985370372857964.mp3", "id": "691130", "mname": "\u91ce\u5b50"}]} \ No newline at end of file