def get_download_url(s, t, user, song = "nothing"): print('[log]getting url:'+t+str(s)) params = urllib.parse.urlencode({t: s}) f = urllib.request.urlopen(download_api_url + "?%s" % params) url = f.read().decode('utf-8') send_dm('已启动下载'+t+str(s)) try: filename = str(time.mktime(datetime.datetime.now().timetuple())) if(t == 'id'): urllib.request.urlretrieve(url, path+'/downloads/'+filename+'.mp3') if(song == "nothing"): ass_maker.make_ass(filename,'当前歌曲网易云id:'+str(s)+"\\N点播人:"+user,path) ass_maker.make_info(filename,'id:'+str(s)+",点播人:"+user,path) else: ass_maker.make_ass(filename,'当前网易云id:'+str(s)+"\\N点播关键词:"+song+"\\N点播人:"+user,path) ass_maker.make_info(filename,'id:'+str(s)+",点的:"+song+",点播人:"+user,path) elif(t == 'mv'): urllib.request.urlretrieve(url, path+'/downloads/'+filename+'.mp4') if(song == "nothing"): ass_maker.make_ass(filename,'当前MV网易云id:'+str(s)+"\\N点播人:"+user,path) ass_maker.make_info(filename,'MVid:'+str(s)+",点播人:"+user,path) else: ass_maker.make_ass(filename,'当前MV网易云id:'+str(s)+"\\NMV点播关键词:"+song+"\\N点播人:"+user,path) ass_maker.make_ass(filename,'MVid:'+str(s)+",MV:"+song+",点播人:"+user,path) send_dm('下载完成,已加入播放队列排队播放') print('[log]已添加排队项目:'+t+str(s)) except: send_dm('出错了:下载出错,请换一首或重试') print('[log]下载文件出错:'+t+str(s)+',url:'+url) del_file(filename+'.mp3') del_file(filename+'.mp4') return url
def download_av(video_url, user): global encode_lock if (clean_files()): send_dm_long('树莓存储空间已爆炸,请联系up') return try: v_format = 'flv' print('[log]downloading bilibili video:' + str(video_url)) video_info = json.loads( os.popen('you-get ' + video_url + ' --json').read()) video_title = video_info['title'] send_dm_long('正在下载' + video_title) #send_dm('注意,视频下载十分费时,请耐心等待') filename = str(time.mktime(datetime.datetime.now().timetuple())) os.system('you-get ' + video_url + ' --format=flv -o ' + path + '/downloads -O ' + filename + 'rendering1') print('you-get ' + video_url + ' --format=flv -o ' + path + '/downloads -O ' + filename + 'rendering1') if (os.path.isfile(path + '/downloads/' + filename + 'rendering1.flv') == False): os.system('you-get ' + video_url + ' --format=mp4 -o ' + path + '/downloads -O ' + filename + 'rendering1') print('you-get ' + video_url + ' --format=mp4 -o ' + path + '/downloads -O ' + filename + 'rendering1') v_format = 'mp4' if (os.path.isfile(path + '/downloads/' + filename + 'rendering1.' + v_format) == False): send_dm_long('视频' + video_title + '下载失败,请重试') return ass_maker.make_ass( filename + 'ok', '点播人:' + user + "\\N视频:" + video_title + "\\N" + video_url, path) ass_maker.make_info(filename + 'ok', '视频:' + video_title + ",点播人:" + user, path) send_dm_long('视频' + video_title + '下载完成,等待渲染') while (encode_lock): time.sleep(1) encode_lock = True send_dm_long('视频' + video_title + '正在渲染') os.system('ffmpeg -i "' + path + '/downloads/' + filename + 'rendering1.' + v_format + '" -aspect 16:9 -vf "scale=1280:720, ass=' + path + "/downloads/" + filename + 'ok.ass' + '" -c:v libx264 -preset ultrafast -maxrate ' + var_set.maxbitrate + 'k -tune fastdecode -acodec aac -b:a 192k "' + path + '/downloads/' + filename + 'rendering.flv"') encode_lock = False del_file(filename + 'rendering1.' + v_format) os.rename(path + '/downloads/' + filename + 'rendering.flv', path + '/downloads/' + filename + 'ok.flv') send_dm_long('视频' + video_title + '渲染完毕,已加入播放队列') except: send_dm_long('出错了:请检查命令或重试')
def get_download_url(s, t, user, song="nothing"): print('[log]getting url:' + t + str(s)) params = urllib.parse.urlencode({t: s}) f = urllib.request.urlopen(download_api_url + "?%s" % params) url = f.read().decode('utf-8') send_dm('已启动下载' + t + str(s)) try: filename = str(time.mktime(datetime.datetime.now().timetuple())) if (t == 'id'): urllib.request.urlretrieve( url, path + '/downloads/' + filename + '.mp3') lyric_get = urllib.parse.urlencode({'lyric': s}) lyric_w = urllib.request.urlopen(download_api_url + "?%s" % lyric_get) lyric = lyric_w.read().decode('utf-8') if (song == "nothing"): ass_maker.make_ass(filename, '当前歌曲网易云id:' + str(s) + "\\N点播人:" + user, path, lyric) ass_maker.make_info(filename, 'id:' + str(s) + ",点播人:" + user, path) else: ass_maker.make_ass( filename, '当前网易云id:' + str(s) + "\\N点播关键词:" + song + "\\N点播人:" + user, path, lyric) ass_maker.make_info( filename, 'id:' + str(s) + ",点的:" + song + ",点播人:" + user, path) elif (t == 'mv'): urllib.request.urlretrieve( url, path + '/downloads/' + filename + '.mp4') if (song == "nothing"): ass_maker.make_ass(filename, '当前MV网易云id:' + str(s) + "\\N点播人:" + user, path) ass_maker.make_info(filename, 'MVid:' + str(s) + ",点播人:" + user, path) else: ass_maker.make_ass( filename, '当前MV网易云id:' + str(s) + "\\NMV点播关键词:" + song + "\\N点播人:" + user, path) ass_maker.make_info( filename, 'MVid:' + str(s) + ",MV:" + song + ",点播人:" + user, path) send_dm('下载完成,已加入播放队列排队播放') print('[log]已添加排队项目:' + t + str(s)) try: log_file = open(path + '/songs.log', 'a') log_file.writelines( time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + ',' + user + ',' + t + str(s) + '\r\n') log_file.close() except: print('[error]log error') except: send_dm('出错了:下载出错,请换一首或重试') print('[log]下载文件出错:' + t + str(s) + ',url:' + url) del_file(filename + '.mp3') del_file(filename + '.mp4') return url
def download_av(video_url,user): try: print('[log]downloading bilibili video:'+str(video_url)) video_info = json.loads(os.popen('you-get '+video_url+' --json').read()) video_title = video_info['title'] send_dm_long('正在下载'+video_title) send_dm('注意,视频下载十分费时,请耐心等待') filename = str(time.mktime(datetime.datetime.now().timetuple())) os.system('you-get '+video_url+' --format=mp4 -o '+path+'/downloads -O '+filename+'.mp4') ass_maker.make_ass(filename,'视频:'+video_title+"\\N"+video_url+"\\N点播人:"+user,path) ass_maker.make_info(filename,'视频:'+video_title+",点播人:"+user,path) send_dm_long('视频'+video_title+'下载完成,已加入播放队列') except: send_dm('出错了:可能下载时炸了')
def download_av(video_url,user): global encode_lock #视频渲染锁,用来排队 if(clean_files()): #检查空间是否在设定值以内,并自动删除多余视频缓存 send_dm_long('树莓存储空间已爆炸,请联系up') return if check_coin(user, 500) == False and var_set.use_gift_check: #扣掉瓜子数 send_dm_long('用户'+user+'赠送的瓜子不够点视频哦,还差'+str(500-get_coin(user))+'瓜子的礼物') return try: v_format = 'flv' print('[log]downloading bilibili video:'+str(video_url)) video_info = json.loads(os.popen('you-get '+video_url+' --json').read()) #获取视频标题,标题错误则说明点播参数不对,跳到except video_title = video_info['title'] #获取标题 send_dm_long('正在下载'+video_title) #send_dm('注意,视频下载十分费时,请耐心等待') filename = str(time.mktime(datetime.datetime.now().timetuple())) #用时间戳设定文件名 os.system('you-get '+video_url+' -o '+path+'/downloads -O '+filename+'rendering1') #下载视频文件 print('you-get '+video_url+' -o '+path+'/downloads -O '+filename+'rendering1') if(os.path.isfile(path+'/downloads/'+filename+'rendering1.flv')): #判断视频格式 v_format = 'flv' elif(os.path.isfile(path+'/downloads/'+filename+'rendering1.mp4')): v_format = 'mp4' else: send_dm_long('视频'+video_title+'下载失败,请重试') if var_set.use_gift_check: give_coin(user,500) return ass_maker.make_ass(filename+'ok','点播人:'+user+"\\N视频:"+video_title+"\\N"+video_url,path) #生成字幕 ass_maker.make_info(filename+'ok','视频:'+video_title+",点播人:"+user,path) #生成介绍信息,用来查询 send_dm_long('视频'+video_title+'下载完成,等待渲染') while (encode_lock): #渲染锁,如果现在有渲染任务,则无限循环等待 time.sleep(1) #等待 encode_lock = True #进入渲染,加上渲染锁,防止其他视频一起渲染 send_dm_long('视频'+video_title+'正在渲染') os.system('ffmpeg -threads 1 -i "'+path+'/downloads/'+filename+'rendering1.'+v_format+'" -aspect 16:9 -vf "scale=1280:720, ass='+path+"/downloads/"+filename+'ok.ass'+'" -c:v libx264 -preset ultrafast -maxrate '+var_set.maxbitrate+'k -tune fastdecode -acodec aac -b:a 192k "'+path+'/downloads/'+filename+'rendering.flv"') encode_lock = False #关闭渲染锁,以便其他任务继续渲染 del_file(filename+'rendering1.'+v_format) #删除渲染所用的原文件 os.rename(path+'/downloads/'+filename+'rendering.flv',path+'/downloads/'+filename+'ok.flv') #重命名文件,标记为渲染完毕(ok) send_dm_long('视频'+video_title+'渲染完毕,已加入播放队列') except: #报错提示,一般只会出现在获取标题失败时出现,就是点播参数不对 send_dm_long('出错了:请检查命令或重试') if var_set.use_gift_check: give_coin(user,500)
def download_bilibili(video_url, user): global encode_lock #视频渲染锁,用来排队 if (clean_files()): #检查空间是否在设定值以内,并自动删除多余视频缓存 send_dm_long('树莓存储空间已爆炸,请联系up') return try: print('[log]downloading bilibili video:' + str(video_url)) video_info = json.loads( os.popen('you-get ' + video_url + ' --json').read()) #获取视频标题,标题错误则说明点播参数不对,跳到except video_title = video_info['title'] #获取标题 send_dm_long('正在下载' + video_title) #send_dm('注意,视频下载十分费时,请耐心等待') filename = str(time.mktime( datetime.datetime.now().timetuple())) #用时间戳设定文件名 os.system('you-get ' + video_url + ' --format=flv -o ' + path + '/downloads -O ' + filename + 'rendering1') #下载视频文件 ass_maker.make_ass(filename + 'ok', "点播人:" + user + "\\N番剧:" + video_title + "\\N" + video_url, path) #生成字幕 ass_maker.make_info(filename + 'ok', '番剧:' + video_title + ",点播人:" + user, path) #生成介绍信息,用来查询 send_dm_long('番剧' + video_title + '下载完成,等待渲染') while (encode_lock): #渲染锁,如果现在有渲染任务,则无限循环等待 time.sleep(1) #等待 encode_lock = True #进入渲染,加上渲染锁,防止其他视频一起渲染 send_dm_long('番剧' + video_title + '正在渲染') os.system('ffmpeg -i "' + path + '/downloads/' + filename + 'rendering1.flv" -aspect 16:9 -vf "scale=1280:720, ass=' + path + "/downloads/" + filename + 'ok.ass' + '" -c:v libx264 -preset ultrafast -maxrate ' + var_set.maxbitrate + 'k -tune fastdecode -acodec aac -b:a 192k "' + path + '/downloads/' + filename + 'rendering.flv"') encode_lock = False #关闭渲染锁,以便其他任务继续渲染 del_file(filename + 'rendering1.flv') #删除渲染所用的原文件 os.rename(path + '/downloads/' + filename + 'rendering.flv', path + '/downloads/' + filename + 'ok.flv') #重命名文件,标记为渲染完毕(ok) send_dm_long('番剧' + video_title + '渲染完毕,已加入播放队列') except: #报错提示,一般只会出现在获取标题失败时出现,就是点播参数不对 send_dm_long('出错了:请检查命令或重试')
night_files = os.listdir(path+'/night') #获取所有缓存文件 night_files.sort() #排序文件 night_ran = random.randint(0,len(night_files)-1) #随机抽一个文件 if(night_files[night_ran].find('.flv') != -1): #如果为flv视频 #直接暴力推流 print('ffmpeg -threads 0 -re -i "'+path+"/night/"+night_files[night_ran]+'" -vcodec copy -acodec copy -f flv "'+rtmp+live_code+'"') os.system('ffmpeg -threads 0 -re -i "'+path+"/night/"+night_files[night_ran]+'" -vcodec copy -acodec copy -f flv "'+rtmp+live_code+'"') if(night_files[night_ran].find('.mp3') != -1): #如果为mp3 pic_files = os.listdir(path+'/default_pic') #获取准备的图片文件夹中的所有图片 pic_files.sort() #排序数组 pic_ran = random.randint(0,len(pic_files)-1) #随机选一张图片 audio = MP3(path+'/night/'+night_files[night_ran]) #获取mp3文件信息 seconds=audio.info.length #获取时长 print('mp3 long:'+convert_time(seconds)) if not os.path.isfile(path+'/night/'+night_files[night_ran]+'.ass'): ass_maker.make_ass('../night/'+night_files[night_ran].replace('.mp3',''),'当前是晚间专属时间哦~时间范围:晚上23点-凌晨5点\\N大家晚安哦~做个好梦~\\N当前文件名:'+night_files[night_ran],path) print('ffmpeg -threads 0 -re -loop 1 -r 2 -t '+str(int(seconds))+' -f image2 -i "'+path+'/default_pic/'+pic_files[pic_ran]+'" -i "'+path+'/night/'+night_files[night_ran]+'" -vf ass="'+path+'/night/'+night_files[night_ran]+'.ass" -pix_fmt yuv420p -preset ultrafast -maxrate '+var_set.maxbitrate+'k -acodec copy -c:v h264_omx -f flv "'+rtmp+live_code+'"') os.system('ffmpeg -threads 0 -re -loop 1 -r 2 -t '+str(int(seconds))+' -f image2 -i "'+path+'/default_pic/'+pic_files[pic_ran]+'" -i "'+path+'/night/'+night_files[night_ran]+'" -vf ass="'+path+'/night/'+night_files[night_ran].replace('.mp3','')+'.ass" -pix_fmt yuv420p -preset ultrafast -maxrate '+var_set.maxbitrate+'k -acodec copy -c:v h264_omx -f flv "'+rtmp+live_code+'"') continue files = os.listdir(path+'/downloads') #获取文件夹下全部文件 files.sort() #排序文件,按文件名(点播时间)排序 count=0 #总共匹配到的点播文件统计 for f in files: if((f.find('.mp3') != -1) and (f.find('.download') == -1)): #如果是mp3文件 print(path+'/downloads/'+f) seconds = 600 bitrate = 0 try: audio = MP3(path+'/downloads/'+f) #获取mp3文件信息 seconds=audio.info.length #获取时长
#coding:utf-8 #电脑上用的视频渲染工具 #用于夜间文件的预渲染工作 #请自行用pip装好相应模块 #还有个imageio.plugins.ffmpeg.download()记得运行 #文件夹请自行更改 #本工具仅用于生成ass字幕文件,渲染请去用小丸工具箱~ import os import ass_maker path = 'C:\\Users\\liucx\\Desktop' #ffmpeg_path = 'C:\\Program Files (x86)\\MarukoToolbox\\tools\\ffmpeg.exe' maxbitrate = '1800' files = os.listdir(path+'\\downloads') #获取所有缓存文件 for i in files: if i.find('.flv') != -1 or i.find('.mp4') != -1: print('find file:'+i) ass_maker.make_ass(i.replace('.flv','').replace('.mp4',''),'当前是晚间专属时间哦~时间范围:晚上23点-凌晨5点\\N大家晚安哦~做个好梦~\\N当前文件名:'+i,path) print('ffmpeg -threads 0 -i "'+path+'/downloads/'+i+'" -aspect 16:9 -vf "scale=1280:720, ass='+path+"/downloads/"+i.replace(".mp4",'').replace(".flv",'')+'.ass'+'" -c:v libx264 -preset ultrafast -maxrate '+maxbitrate+'k -tune fastdecode -acodec aac -b:a 192k "'+path+'/downloads/'+i+'rendering.flv"')
def get_download_url(s, t, user, song="nothing"): global encode_lock #视频渲染锁,用来排队 if (clean_files()): #检查空间是否在设定值以内,并自动删除多余视频缓存 send_dm_long('树莓存储空间已爆炸,请联系up') return send_dm_long('正在下载' + t + str(s)) print('[log]getting url:' + t + str(s)) params = urllib.parse.urlencode({t: s}) #格式化参数 f = urllib.request.urlopen(download_api_url + "?%s" % params) #设定获取的网址 url = f.read().decode('utf-8') #读取结果 try: filename = str(time.mktime( datetime.datetime.now().timetuple())) #获取时间戳,用来当作文件名 if (t == 'id'): #当参数为歌曲时 urllib.request.urlretrieve(url, path + '/downloads/' + filename + '.mp3') #下载歌曲 lyric_get = urllib.parse.urlencode({'lyric': s}) #格式化参数 lyric_w = urllib.request.urlopen(download_api_url + "?%s" % lyric_get) #设定获取歌词的网址 lyric = lyric_w.read().decode('utf-8') #获取歌词文件 tlyric_get = urllib.parse.urlencode({'tlyric': s}) #格式化参数 tlyric_w = urllib.request.urlopen(download_api_url + "?%s" % tlyric_get) #设定获取歌词的网址 tlyric = tlyric_w.read().decode('utf-8') #获取歌词文件 if (song == "nothing"): #当直接用id点歌时 ass_maker.make_ass(filename, '当前歌曲网易云id:' + str(s) + "\\N点播人:" + user, path, lyric, tlyric) #生成字幕 ass_maker.make_info(filename, 'id:' + str(s) + ",点播人:" + user, path) #生成介绍信息,用来查询 else: #当用关键字搜索点歌时 ass_maker.make_ass(filename, '当前网易云id:' + str(s) + "\\N点播关键词:" + song + "\\N点播人:" + user, path, lyric, tlyric) #生成字幕 ass_maker.make_info(filename, 'id:' + str(s) + ",关键词:" + song + ",点播人:" + user, path) #生成介绍信息,用来查询 send_dm_long(t + str(s) + '下载完成,已加入播放队列') print('[log]已添加排队项目:' + t + str(s)) elif (t == 'mv'): #当参数为mv时 urllib.request.urlretrieve(url, path + '/downloads/' + filename + '.mp4') #下载mv if (song == "nothing"): #当直接用id点mv时 ass_maker.make_ass(filename + 'ok', '当前MV网易云id:' + str(s) + "\\N点播人:" + user, path) #生成字幕 ass_maker.make_info(filename + 'ok', 'MVid:' + str(s) + ",点播人:" + user, path) #生成介绍信息,用来查询 else: #当用关键字搜索点mv时 ass_maker.make_ass(filename + 'ok', '当前MV网易云id:' + str(s) + "\\NMV点播关键词:" + song + "\\N点播人:" + user, path) #生成字幕 ass_maker.make_info(filename + 'ok', 'MVid:' + str(s) + ",关键词:" + song + ",点播人:" + user, path) #生成介绍信息,用来查询 send_dm_long(t + str(s) + '下载完成,等待渲染') while (encode_lock): #渲染锁,如果现在有渲染任务,则无限循环等待 time.sleep(1) #等待 encode_lock = True #进入渲染,加上渲染锁,防止其他视频一起渲染 send_dm_long(t + str(s) + '正在渲染') os.system('ffmpeg -i "' + path + '/downloads/' + filename + '.mp4" -aspect 16:9 -vf "scale=1280:720, ass=' + path + "/downloads/" + filename + 'ok.ass' + '" -c:v libx264 -preset ultrafast -maxrate ' + var_set.maxbitrate + 'k -tune fastdecode -acodec aac -b:a 192k "' + path + '/downloads/' + filename + 'rendering.flv"') encode_lock = False #关闭渲染锁,以便其他任务继续渲染 del_file(filename + '.mp4') #删除渲染所用的原文件 os.rename(path + '/downloads/' + filename + 'rendering.flv', path + '/downloads/' + filename + 'ok.flv') #重命名文件,标记为渲染完毕(ok) send_dm_long(t + str(s) + '渲染完毕,已加入播放队列') try: #记录日志,已接近废弃 log_file = open(path + '/songs.log', 'a') log_file.writelines( time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) + ',' + user + ',' + t + str(s) + '\r\n') log_file.close() except: print('[error]log error') except: #下载出错 send_dm_long('出错了:请检查命令或重试') print('[log]下载文件出错:' + t + str(s) + ',url:' + url) del_file(filename + '.mp3') del_file(filename + '.mp4') del_file(filename + '.flv') return url
def get_download_url(s, t, user, song = "nothing"): global encode_lock #视频渲染锁,用来排队 if(clean_files()): #检查空间是否在设定值以内,并自动删除多余视频缓存 send_dm_long('树莓存储空间已爆炸,请联系up') return if t == 'id' and var_set.use_gift_check: #检查送过的礼物数量 if check_coin(user, 100) == False: send_dm_long('用户'+user+'赠送的瓜子不够点歌哦,还差'+str(100-get_coin(user))+'瓜子的礼物') return elif t == 'mv' and var_set.use_gift_check: if check_coin(user, 500) == False: send_dm_long('用户'+user+'赠送的瓜子不够点mv哦,还差'+str(500-get_coin(user))+'瓜子的礼物') return send_dm_long('正在下载'+t+str(s)) print('[log]getting url:'+t+str(s)) try: filename = str(time.mktime(datetime.datetime.now().timetuple())) #获取时间戳,用来当作文件名 if(t == 'id'): #当参数为歌曲时 #伪装浏览器,防止屏蔽 opener=urllib.request.build_opener() opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] urllib.request.install_opener(opener) urllib.request.urlretrieve("http://music.163.com/song/media/outer/url?id="+str(s), path+'/downloads/'+filename+'.mp3') #下载歌曲 lyric_get = urllib.parse.urlencode({'lyric': s}) #格式化参数 lyric_w = urllib.request.urlopen(download_api_url + "?%s" % lyric_get,timeout=5) #设定获取歌词的网址 lyric = lyric_w.read().decode('utf-8') #获取歌词文件 tlyric_get = urllib.parse.urlencode({'tlyric': s}) #格式化参数 tlyric_w = urllib.request.urlopen(download_api_url + "?%s" % tlyric_get,timeout=5) #设定获取歌词的网址 tlyric = tlyric_w.read().decode('utf-8') #获取歌词文件 (song_temp,pic_url) = get_song_info.get_song_info(s)#获取歌曲信息 if song_temp != "": song = "歌名:"+song_temp else: song = "关键词:"+song if pic_url != "": try: #伪装浏览器,防止屏蔽 opener=urllib.request.build_opener() opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] urllib.request.install_opener(opener) urllib.request.urlretrieve(pic_url+"?param=200y200", path+'/downloads/'+filename+'.jpg') #下载封面 except Exception as e: #下载出错 print('[log]下载封面出错:'+pic_url) print(e) del_file(filename+'.jpg') ass_maker.make_ass(filename,'当前网易云id:'+str(s)+"\\N"+song+"\\N点播人:"+user,path,lyric,tlyric) #生成字幕 ass_maker.make_info(filename,'id:'+str(s)+","+song+",点播人:"+user,path) #生成介绍信息,用来查询 send_dm_long(t+str(s)+'下载完成,已加入播放队列') print('[log]已添加排队项目:'+t+str(s)) elif(t == 'mv'): #当参数为mv时 params = urllib.parse.urlencode({t: s}) #格式化参数 f = urllib.request.urlopen(download_api_url + "?%s" % params,timeout=5) #设定获取的网址 url = f.read().decode('utf-8') #读取结果 print('[log]获取'+t+str(s)+'网址:'+url) #伪装浏览器,防止屏蔽 opener=urllib.request.build_opener() opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')] urllib.request.install_opener(opener) urllib.request.urlretrieve(url, path+'/downloads/'+filename+'.mp4') #下载mv print('[log]'+t+str(s)+'下载完成') if(song == "nothing"): #当直接用id点mv时 ass_maker.make_ass(filename+'ok','当前MV网易云id:'+str(s)+"\\N点播人:"+user,path)#生成字幕 ass_maker.make_info(filename+'ok','MVid:'+str(s)+",点播人:"+user,path)#生成介绍信息,用来查询 else: #当用关键字搜索点mv时 ass_maker.make_ass(filename+'ok','当前MV网易云id:'+str(s)+"\\NMV点播关键词:"+song+"\\N点播人:"+user,path)#生成字幕 ass_maker.make_info(filename+'ok','MVid:'+str(s)+",关键词:"+song+",点播人:"+user,path)#生成介绍信息,用来查询 send_dm_long(t+str(s)+'下载完成,等待渲染') print('[log]获取'+t+str(s)+'下载完成,等待渲染') while (encode_lock): #渲染锁,如果现在有渲染任务,则无限循环等待 time.sleep(1) #等待 encode_lock = True #进入渲染,加上渲染锁,防止其他视频一起渲染 send_dm_long(t+str(s)+'正在渲染') print('[log]获取'+t+str(s)+'正在渲染') os.system('ffmpeg -threads 1 -i "'+path+'/downloads/'+filename+'.mp4" -aspect 16:9 -vf "scale=1280:720, ass='+path+"/downloads/"+filename+'ok.ass'+'" -c:v libx264 -preset ultrafast -maxrate '+var_set.maxbitrate+'k -tune fastdecode -acodec aac -b:a 192k "'+path+'/downloads/'+filename+'rendering.flv"') encode_lock = False #关闭渲染锁,以便其他任务继续渲染 del_file(filename+'.mp4') #删除渲染所用的原文件 os.rename(path+'/downloads/'+filename+'rendering.flv',path+'/downloads/'+filename+'ok.flv') #重命名文件,标记为渲染完毕(ok) send_dm_long(t+str(s)+'渲染完毕,已加入播放队列') print('[log]获取'+t+str(s)+'渲染完毕,已加入播放队列') try: #记录日志,已接近废弃 log_file = open(path+'/songs.log', 'a') log_file.writelines(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ','+user+','+t+str(s)+'\r\n') log_file.close() except: print('[error]log error') except Exception as e: #下载出错 send_dm_long('出错了:请检查命令或重试') if t == 'id' and var_set.use_gift_check: #归还用掉的瓜子 give_coin(user,100) elif t == 'mv' and var_set.use_gift_check: give_coin(user,500) print('[log]下载文件出错:'+t+str(s)) print(e) del_file(filename+'.mp3') del_file(filename+'.mp4') del_file(filename+'.flv')
def get_download_url(s, t, user, song = "nothing"): global encode_lock #视频渲染锁,用来排队 if(clean_files()): #检查空间是否在设定值以内,并自动删除多余视频缓存 send_dm_long('树莓存储空间已爆炸,请联系up') return if t == 'id' and var_set.use_gift_check: #检查送过的礼物数量 if check_coin(user, 100) == False: send_dm_long('用户'+user+'赠送的瓜子不够点歌哦,还差'+str(100-get_coin(user))+'瓜子的礼物') return elif t == 'mv' and var_set.use_gift_check: if check_coin(user, 500) == False: send_dm_long('用户'+user+'赠送的瓜子不够点mv哦,还差'+str(500-get_coin(user))+'瓜子的礼物') return send_dm_long('正在下载'+t+str(s)) print('[log]getting url:'+t+str(s)) try: filename = str(time.mktime(datetime.datetime.now().timetuple())) #获取时间戳,用来当作文件名 if(t == 'id'): #当参数为歌曲时 urllib.request.urlretrieve("http://music.163.com/song/media/outer/url?id="+str(s)+".mp3", path+'/downloads/'+filename+'.mp3') #下载歌曲 lyric_get = urllib.parse.urlencode({'lyric': s}) #格式化参数 lyric_w = urllib.request.urlopen(download_api_url + "?%s" % lyric_get,timeout=5) #设定获取歌词的网址 lyric = lyric_w.read().decode('utf-8') #获取歌词文件 tlyric_get = urllib.parse.urlencode({'tlyric': s}) #格式化参数 tlyric_w = urllib.request.urlopen(download_api_url + "?%s" % tlyric_get,timeout=5) #设定获取歌词的网址 tlyric = tlyric_w.read().decode('utf-8') #获取歌词文件 if(song == "nothing"): #当直接用id点歌时 ass_maker.make_ass(filename,'当前歌曲网易云id:'+str(s)+"\\N点播人:"+user,path,lyric,tlyric) #生成字幕 ass_maker.make_info(filename,'id:'+str(s)+",点播人:"+user,path) #生成介绍信息,用来查询 else: #当用关键字搜索点歌时 ass_maker.make_ass(filename,'当前网易云id:'+str(s)+"\\N点播关键词:"+song+"\\N点播人:"+user,path,lyric,tlyric) #生成字幕 ass_maker.make_info(filename,'id:'+str(s)+",关键词:"+song+",点播人:"+user,path) #生成介绍信息,用来查询 send_dm_long(t+str(s)+'下载完成,已加入播放队列') print('[log]已添加排队项目:'+t+str(s)) elif(t == 'mv'): #当参数为mv时 params = urllib.parse.urlencode({t: s}) #格式化参数 f = urllib.request.urlopen(download_api_url + "?%s" % params,timeout=5) #设定获取的网址 url = f.read().decode('utf-8') #读取结果 urllib.request.urlretrieve(url, path+'/downloads/'+filename+'.mp4') #下载mv if(song == "nothing"): #当直接用id点mv时 ass_maker.make_ass(filename+'ok','当前MV网易云id:'+str(s)+"\\N点播人:"+user,path)#生成字幕 ass_maker.make_info(filename+'ok','MVid:'+str(s)+",点播人:"+user,path)#生成介绍信息,用来查询 else: #当用关键字搜索点mv时 ass_maker.make_ass(filename+'ok','当前MV网易云id:'+str(s)+"\\NMV点播关键词:"+song+"\\N点播人:"+user,path)#生成字幕 ass_maker.make_info(filename+'ok','MVid:'+str(s)+",关键词:"+song+",点播人:"+user,path)#生成介绍信息,用来查询 send_dm_long(t+str(s)+'下载完成,等待渲染') while (encode_lock): #渲染锁,如果现在有渲染任务,则无限循环等待 time.sleep(1) #等待 encode_lock = True #进入渲染,加上渲染锁,防止其他视频一起渲染 send_dm_long(t+str(s)+'正在渲染') os.system('ffmpeg -threads 1 -i "'+path+'/downloads/'+filename+'.mp4" -aspect 16:9 -vf "scale=1280:720, ass='+path+"/downloads/"+filename+'ok.ass'+'" -c:v libx264 -preset ultrafast -maxrate '+var_set.maxbitrate+'k -tune fastdecode -acodec aac -b:a 192k "'+path+'/downloads/'+filename+'rendering.flv"') encode_lock = False #关闭渲染锁,以便其他任务继续渲染 del_file(filename+'.mp4') #删除渲染所用的原文件 os.rename(path+'/downloads/'+filename+'rendering.flv',path+'/downloads/'+filename+'ok.flv') #重命名文件,标记为渲染完毕(ok) send_dm_long(t+str(s)+'渲染完毕,已加入播放队列') try: #记录日志,已接近废弃 log_file = open(path+'/songs.log', 'a') log_file.writelines(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) + ','+user+','+t+str(s)+'\r\n') log_file.close() except: print('[error]log error') except: #下载出错 send_dm_long('出错了:请检查命令或重试') if t == 'id' and var_set.use_gift_check: #归还用掉的瓜子 give_coin(user,100) elif t == 'mv' and var_set.use_gift_check: give_coin(user,500) print('[log]下载文件出错:'+t+str(s)) del_file(filename+'.mp3') del_file(filename+'.mp4') del_file(filename+'.flv')