python下载m3u8类型链接的视频

37 篇文章 1 订阅
#-*- coding:utf-8 -*-
#*******************************************************************
#*******************************************************************
#*************************导入模块***********************************
#*******************************************************************
#*******************************************************************
from  PyQt4.QtGui  import *
from  PyQt4.QtCore  import *

import shutil
import sys
import random
import os
import json


import subprocess





reload(sys)
sys.setdefaultencoding("utf-8")

ffpmpegRoot=os.path.abspath(os.path.dirname(__file__)).replace('\\','/')

ffmpeg=ffpmpegRoot+"/ffmpeg/bin/ffmpeg.exe"
ffplay=ffpmpegRoot+"/ffmpeg/bin/ffplay.exe"
ffprobe=ffpmpegRoot+"/ffmpeg/bin/ffprobe=.exe"






#*******************************************************************
#*******************************************************************
#***************************布局类**********************************
#*******************************************************************
#*******************************************************************
class graphicsView(QGraphicsView):
    def __init__(self,parent=None):
        super(graphicsView,self).__init__(parent)
        
     
        self.image=""
        QObject.connect(self, SIGNAL('mousePressEvent()'),self.mousePressEvent)

        

        
    def wheelEvent(self, event):
        
        value=event.delta()
        if event.delta() >= 0:
            self.width =self.image.width()
            self.height=self.image.height()
            if self.width< 400:
                self.width =self.image.width()*1.5
                self.height=self.image.height()*1.5
                pic=self.image.scaled(self.width,self.height,aspectRatioMode=Qt.KeepAspectRatio)
                self.graphicsView.removeItem(self.item)
                item1= QGraphicsPixmapItem(pic)

                self.graphicsView= QGraphicsScene()
                self.graphicsView.addItem(item1)                
                self.setScene(self.graphicsView)
                #self.setAlignment(Qt.AlignCenter and Qt.AlignTop)
                self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
                self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
                self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setFrameShape(QFrame.NoFrame)
                #self.setBackgroundBrush(QBrush(QColor(70, 170, 80)))
                        
                self.item=item1
                
            elif self.width< 800:
                self.width =self.image.width()*1.2
                self.height=self.image.height()*1.2
                pic=self.image.scaled(self.width,self.height,aspectRatioMode=Qt.KeepAspectRatio)
                self.graphicsView.removeItem(self.item)

                self.graphicsView= QGraphicsScene()
                item1= QGraphicsPixmapItem(pic)               
                self.graphicsView.addItem(item1)                
                self.setScene(self.graphicsView)
                #self.setAlignment(Qt.AlignCenter and Qt.AlignTop)
                self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
                self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
                self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setFrameShape(QFrame.NoFrame)
                #self.setBackgroundBrush(QBrush(QColor(70, 170, 80)))
                self.item=item1
        elif event.delta() <=  0:
            
    
            self.width =self.image.width()
            self.height=self.image.height()
            if self.width>800:
                self.width =self.image.width()*0.5
                self.height=self.image.height()*0.5
                pic=self.image.scaled(self.width,self.height,Qt.IgnoreAspectRatio)
                
                self.graphicsView.removeItem(self.item)
        
         
                self.graphicsView= QGraphicsScene()
                
                item1 = QGraphicsPixmapItem(pic)               
                self.graphicsView.addItem(item1)
                
                self.setScene(self.graphicsView)
                #self.setAlignment(Qt.AlignCenter or Qt.AlignTop)
                self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
                self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
                self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setFrameShape(QFrame.NoFrame)
                #self.setBackgroundBrush(QBrush(QColor(50, 200, 100)))
                
                
                self.item=item1
                
                
            elif self.width>400:
                self.width =self.image.width()*0.75
                self.height=self.image.height()*0.75
                pic=self.image.scaled(self.width,self.height,Qt.IgnoreAspectRatio)
                
                self.graphicsView.removeItem(self.item)
        
         
                self.graphicsView= QGraphicsScene()
                
                item1 = QGraphicsPixmapItem(pic)               
                self.graphicsView.addItem(item1)

                self.setScene(self.graphicsView)
                #self.setAlignment(Qt.AlignCenter or Qt.AlignTop)
                self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
                self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
                self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
                self.setFrameShape(QFrame.NoFrame)
                #self.setBackgroundBrush(QBrush(QColor(50, 200, 100)))
                
                
                self.item=item1
                

                
           
                
#*******************************************************************
#*******************************************************************
#***************************拖拽类**********************************
#*******************************************************************
#*******************************************************************

class MyLineEdit(QLineEdit):
        def __init__( self, parent=None ):
            super(MyLineEdit, self).__init__(parent)
            #self.setDragEnabled(True)
            pass
        def dragEnterEvent( self, event ):
            
            data = event.mimeData()
            urls = data.urls()
            if ( urls and urls[0].scheme() == 'file' ):
                event.acceptProposedAction()
        def dragMoveEvent( self, event ):
            data = event.mimeData()
            urls = data.urls()
            if ( urls and urls[0].scheme() == 'file' ):
                event.acceptProposedAction()

        def dropEvent( self, event ):
            data = event.mimeData()
            urls = data.urls()
            if ( urls and urls[0].scheme() == 'file' ):
                filepath = str(urls[0].path())[1:]
                filepath=filepath.decode('utf-8')
                self.setText(filepath)

#*******************************************************************
#*******************************************************************
#***************************功能类**********************************
#*******************************************************************
#*******************************************************************
class bilibili_gui(QWidget):
    
    def __init__(self):
        super(bilibili_gui,self).__init__()

        #self.setWindowFlags(Qt.Window)
        self.setWindowTitle(u"Vedio Download")
        self.initUI()

                        
    def initUI(self):
        #人员信息统计并从空添加,使用列表即可。
        #self._tree=Treeview()
        #self._list=Listview()

        down_address=QLabel(u'输入下载地址:')
        self.down_address=QLineEdit()
        analyze=QPushButton(u"解析")

        
        
        self._tree=graphicsView(self)
 
        
        
        save_adrss=QLabel(u'下载位置:')
        self.save_address=MyLineEdit()
        self.save_adrss_look=QPushButton(u"==>:")
        
        start_down=QPushButton(u"下载视频")
        open_video =QPushButton(u"缓存位置")

        file_name=QLabel(u'视频名称:')
        self.file_name=QLineEdit(u"")
        self.file_name.setPlaceholderText(u'自动获取')
        time_pos=QLabel(u"进度")
        self.time_pos=QLineEdit(u"0")
        self.pbar = QProgressBar()

        #print dir(self.pbar)

        
        #groupNameData.setFrameStyle(QFrame.Panel|QFrame.Sunken)
        

        
        laty_1=QHBoxLayout()
        laty_1.addWidget(down_address)
        laty_1.addWidget(self.down_address)
        laty_1.addWidget(analyze)
     

        laty_2=QHBoxLayout()
        laty_2.addWidget(self._tree)
        
        
      

        laty_3=QHBoxLayout()
        laty_3.addWidget(save_adrss)
        laty_3.addWidget(self.save_address)
        laty_3.addWidget(self.save_adrss_look)


        laty_4=QHBoxLayout()
        laty_4.addWidget(file_name,1)
        laty_4.addWidget(self.file_name,7)
        laty_4.addWidget(time_pos,1)
        laty_4.addWidget(self.pbar ,2)

        laty_5=QHBoxLayout()
        laty_5.addWidget(start_down)
        laty_5.addWidget(open_video)


        all_lay=QVBoxLayout()
        all_lay.addLayout(laty_1)
        all_lay.addLayout(laty_2)
        all_lay.addLayout(laty_3)
        all_lay.addLayout(laty_4)
        all_lay.addLayout(laty_5)


      
        self.setLayout(all_lay)
        
        self.resize(500,650)

        analyze.clicked.connect(self.resolve)
        self.save_adrss_look.clicked.connect(self.saveAdrss)
        start_down.clicked.connect(self.startDownload)
        open_video.clicked.connect(self.openVideo)


        self.show()



    def createRandomString(self,len):
        print ('wet'.center(10,'*'))
        raw = ""
        range1 = range(58, 65) # between 0~9 and A~Z
        range2 = range(91, 97) # between A~Z and a~z

        i = 0
        while i < len:
            seed = random.randint(48, 122)
            if ((seed in range1) or (seed in range2)):
                continue;
            raw += chr(seed);
            i += 1
        return raw


    def startDownload(self):
        url=str(self.down_address.text())
        save_address=str(self.save_address.text())
        if str(self.file_name.text())=="":
            save_address=save_address+"/"+self.createRandomString(6)+".mp4"
        else:
            save_address=save_address+"/"+str(self.file_name.text())+".mp4"
            
        cmd=ffmpeg + " -i "+ url + " "+save_address
        

        cmd=cmd.encode(sys.getfilesystemencoding())
        if "?" in cmd:
            cmd=cmd.replace("?","")
        print cmd
        subprocess.call(cmd , shell=True)

        
    def resolve(self):
        data="cache/image.png"
        print str(self.down_address.text())
        if str(self.down_address.text())!="":
            self.loadImage(data)
            #QMessageBox.information(self,u"提示", u"解析完成")
        else:
            QMessageBox.information(self,u"提示", u"地址为空,无法下载")
            
            
    def loadImage(self,data):
        try:
            if os.path.exists(data):
                self._tree.image=QPixmap(data)
                self._tree.graphicsView= QGraphicsScene()            
                self._tree.item = QGraphicsPixmapItem(self._tree.image)               
                self._tree.graphicsView.addItem(self._tree.item)                
                self._tree.setScene(self._tree.graphicsView)
                    
        except Exception as e:
            print e
            QMessageBox.information(self,u"提示", u"图像解析失败")
                        
       
               
                
           
    def openVideo(self):
        
        if os.path.exists(ffpmpegRoot+"/cache/history.part"):
            with open(ffpmpegRoot+"/cache/history.part") as file:
                filedata= json.loads(file.read())
                filepos=filedata[0]
                filename= filedata[1]
        else:
            filepos=""
            filename=""
        if str(self.save_address.text())!="" and str(self.file_name.text())!="":
            path= str(self.save_address.text()).decode("utf-8")
            if os.path.isdir(path):
                os.startfile(path)
        elif str(self.save_address.text())!='' and str(self.file_name.text())=="":
            path= str(self.save_address.text()).decode("utf-8")
            self.file_name.setText(filename)
        elif str(self.save_address.text())=='' and str(self.file_name.text())!="":
            self.save_address.setText(filepos)
        else:
            self.save_address.setText(filepos)
            self.file_name.setText(filename)
            #os.startfile(filepos)

            
            

            
        
 
   
    def saveAdrss(self):
        #利用文件保存对话框获取文件的路径名称,将存在的json,txt文件拷贝至指定位置。
        
        
        filename = QFileDialog.getExistingDirectory()
        
        if filename:
            filename=str(filename).decode('utf-8')
            filename=filename.replace("\\",'/')
            self.save_address.setText(filename)
        else:
            pass
            #QMessageBox.information(self,u'提示页面',u'取消成功')



#*******************************************************************
#*******************************************************************
#***************************主函数***********************************
#*******************************************************************
#******************************************************************* 

if __name__ == '__main__': 
    app = QApplication(sys.argv)
    bili = bilibili_gui()
    bili.show()
    sys.exit(app.exec_())

在这里插入图片描述

1,输入下载地址后,选择下载位置点击下载视频即可。
2,解析视频没有实际作用,随便加载了一张图片。
3,在cmd里显示下载进度,关闭任何一个窗口,结束下载,已下载部分能够播放。
4,有时cmd窗口卡死,原因未知,此时关闭窗口后下载的部分视频无法播放。
5,调用了ffmpeg进行核心功能。
6,如果填写视频名称按视频名称下载文件,不写随机生成视频名称。
7,建立文件结构,cache配置文件,download默认下载位置。
在这里插入图片描述
8,配置文件信息,图片
在这里插入图片描述
history
在这里插入图片描述

9,ffmpeg需要自己下载复制其中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

佐倉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值