在python中使用gui怎么实现一个视频下载功能

  介绍

本篇文章为大家展示了在python中使用gui怎么实现一个视频下载功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>运行效果:

在python中使用gui怎么实现一个视频下载功能

<强>完整代码:

 # !/usr/bin/python
  # - * -编码:utf - 8 - *
  #时间:2019/07/02——08:12
  __author__=& # 39;亨利和# 39;
  
  
  & # 39;& # 39;& # 39;
  项目:B站视频下载——GUI版本
  版版本1:加密的API,不需要加入cookie,直接即可下载1080 p视频
  20190422——增加多P视频单独下载其中一集的功能
  20190702——增加视频多线程下载速度大幅提升
  20190711——增加GUI版本,可视化界面,操作更加友好
  & # 39;& # 39;& # 39;
  
  导入请求,时间、hashlib urllib。要求,再保险,json
  进口imageio
  imageio.plugins.ffmpeg.download ()
  从moviepy。编辑器进口*
  导入系统,系统、线程
  
  
  
  从tkinter进口*
  从tkinter进口ttk
  从tkinter进口StringVar
  根=Tk ()
  start_time=time.time ()
  
  #将输出重定向到表格
  def打印(theText):
  msgbox.insert(最终,theText + & # 39; \ n # 39;)
  
  
  #访问API地址
  def get_play_list (start_url, cid,质量):=& # 39;熵rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg& # 39;
  appkey秒=& # 39;& # 39;. join(杆(奥德(i) + 2),因为我在熵[::1]]).split (& # 39;: & # 39;
  params=& # 39; appkey=% s& cid=% s& otype=json& qn=% s&质量=% s& type=& # 39;% (appkey, cid,质量、质量)
  chksum=hashlib。md5(字节(params +秒& # 39;use utf8 # 39;)) .hexdigest ()
  url_api=& # 39; https://interface.bilibili.com/v2/playurl& # 63; % s&标志=% & # 39;% (params chksum)
  头={
  & # 39;推荐人# 39;:start_url #注意加上推荐人
  & # 39;用户代理# 39;:& # 39;Mozilla/5.0 (Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/55.0.2883.87 Safari 537.36 & # 39;
  }
  #打印(url_api)
  html=请求。get (url_api header=头). json ()
  #打印(json.dumps (html))
  video_list=[]
  因为我在html (& # 39; durl& # 39;):
  video_list.append(我[& # 39;url # 39;])
  #打印(video_list)
  返回video_list
  
  
  #下载视频
  & # 39;& # 39;& # 39;
  urllib。urlretrieve的回调函数:
  def callbackfunc (blocknum blocksize totalsize):
  @blocknum:已经下载的数据块
  @blocksize:数据块的大小
  @totalsize:远程文件的大小
  & # 39;& # 39;& # 39;
  
  
  def Schedule_cmd (blocknum blocksize totalsize):
  速度=(blocknum * blocksize)/(time.time () - start_time)
  # speed_str=?速度:% .2f"%的速度
  speed_str=?速度:% s"% format_size(速度)
  recv_size=blocknum * blocksize
  
  #设置下载进度条
  pervent=recv_size/totalsize
  .2f percent_str=? % %,% (pervent * 100)
  download.coords (fill_line1 (0, 0, pervent * 465、23))
  root.update ()
  pct.set (percent_str)
  
  
  
  def时间表(blocknum blocksize totalsize):
  速度=(blocknum * blocksize)/(time.time () - start_time)
  # speed_str=?速度:% .2f"%的速度
  speed_str=?速度:% s"% format_size(速度)
  recv_size=blocknum * blocksize
  
  #设置下载进度条
  f=sys.stdout
  pervent=recv_size/totalsize
  .2f percent_str=? % %,% (pervent * 100)
  n=圆(pervent * 50)
  s=(& # 39; # & # 39;* n) .ljust (50 & # 39; & # 39;)
  打印(percent_str。ljust(6日& # 39;& # 39;)+ & # 39;& # 39;+ speed_str)
  f.flush ()
  time . sleep (2)
  #打印(& # 39;\ " # 39;)
  
  
  #字节字节转化K、M \ G
  def format_size(字节数):
  试一试:
  字节=浮动(字节)
  kb=1024字节/除了:
  print(“传入的字节格式不对“)
  返回“Error"
  如果kb祝辞=1024:
  M=kb/1024
  如果M祝辞=1024:
  G=M/1024
  返回“% .3fG"% (G)
  其他:
  返回“% .3fM"% (M)
  其他:
  返回“% .3fK"% (kb)
  
  
  #下载视频
  def down_video (start_url video_list、标题,页面):
  num=1
  打印(& # 39;[正在下载P{}段视频,请稍等…]:& # 39;.format(页面)+标题)
  currentVideoPath=os.path.join (sys。路径[0]& # 39;bilibili_video& # 39;标题)#当前目录作为下载目录
  因为我在video_list:
  刀=urllib.request.build_opener ()
  #请求头
  首场比赛。addheaders=[
  #(& # 39;主机# 39;,& # 39;upos-hz-mirrorks3.acgvideo.com& # 39;), #注意修改主机,不用也行
  (& # 39;用户代理# 39;& # 39;Mozilla/5.0(麦金塔电脑;Intel Mac OS X 10.13;房车:Firefox 56.0)壁虎/20100101/56.0 & # 39;),
  (& # 39;接受# 39;& # 39;*/* & # 39;),
  (& # 39;接收语言# 39;& # 39;en - us, en; q=0.5 & # 39;),
  (& # 39;Accept-Encoding& # 39; & # 39; gzip、缩小,br # 39;),
  (& # 39;范围# 39;& # 39;字节=0 & # 39;),#范围的值要为字节=0,才能下载完整视频
  (& # 39;推荐人# 39;start_url), #注意修改推荐人,必须要加的!
  (& # 39;起源# 39;& # 39;https://www.bilibili.com& # 39;),
  (& # 39;连接# 39;& # 39;保活# 39;),
  ]
  urllib.request.install_opener(刀)
  #创建文件夹存放下载的视频
  如果不是os.path.exists (currentVideoPath):
  os.makedirs (currentVideoPath)
  #开始下载
  如果len (video_list)比;1:
  urllib.request。urlretrieve (url=我,文件名=os.path。加入(currentVideoPath " # 39; {}, {} . flv # 39;。格式(标题、num)), reporthook=Schedule_cmd) #写成mp4也行标题+ & # 39;& # 39;+ num + & # 39; . flv # 39;
  其他:
  urllib.request。urlretrieve (url=我,文件名=os.path。加入(currentVideoPath " # 39; {} . flv # 39; .format(标题)),reporthook=Schedule_cmd) #写成mp4也行标题+ & # 39;& # 39;+ num + & # 39; . flv # 39;
  num +=1
  
  #合并视频(20190802新版)
  def combine_video (title_list):
  video_path=os.path.join (sys。路径[0]& # 39;bilibili_video& # 39;) #下载目录
  title_list的标题:
  current_video_path=os.path。加入(video_path、标题)
  如果len (os.listdir (current_video_path))在=2:
  #视频大于一段才要合并
  打印(& # 39;[下载完成,正在合并视频…]:& # 39;+标题)
  #定义一个数组
  L=[]
  #遍历所有文件
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

在python中使用gui怎么实现一个视频下载功能