فهرست منبع

add youtube download lib

olinox 4 سال پیش
والد
کامیت
b564dca2b4

+ 8 - 0
core/exceptions.py

@@ -0,0 +1,8 @@
+
+
+
+
+
+
+class YoutubeStreamNotFound(Exception):
+    pass

+ 2 - 12
core/logging.yaml

@@ -24,21 +24,11 @@ handlers:
         maxBytes: 100000
         backupCount: 1
         encoding: utf8
-    mail:
-        class: core.logging_.BufferingSMTPHandler
-        level: ERROR
-        formatter: complete
-        mailhost: smtp.bas-rhin.fr
-        fromaddr: log.hello@bas-rhin.fr
- #       toaddrs: [user.name@bas-rhin.fr]
-        toaddrs: []
-        subject: log
-        capacity: 100000000
 
 loggers:
-    hello:
+    mew:
         level: DEBUG
-        handlers: [console, file, mail]
+        handlers: [console, file]
         propagate: no
 
 root:

+ 3 - 38
core/logging_.py

@@ -1,12 +1,5 @@
-'''
-Created on 6 juil. 2017
-
-@author: olivier.massot
-'''
 from datetime import datetime
-from email.mime.text import MIMEText
 import logging.config
-import smtplib
 import sys
 
 from path import Path
@@ -18,11 +11,11 @@ LOG_DIR.makedirs_p()
 SYS_EXCEPT_HOOK = sys.excepthook
 
 
-def start(name="main", level=0, filename=""):
+def get(name="main", level=0, filename=""):
     # charge la configuration du logging depuis le fichier 'logging.yaml'
     configfile = Path(__file__).parent
     with open(configfile / 'logging.yaml', 'rt') as f:
-        conf = yaml.load(f)
+        conf = yaml.load(f, Loader=yaml.FullLoader)
 
     if level:
         conf["loggers"][name]["level"] = level
@@ -35,32 +28,4 @@ def start(name="main", level=0, filename=""):
 
     logger = logging.getLogger(name)
     logger.info("Log start written at {}".format(filename))
-
-
-class BufferingSMTPHandler(logging.handlers.BufferingHandler):
-    def __init__(self, mailhost, fromaddr, toaddrs, subject, capacity):
-        logging.handlers.BufferingHandler.__init__(self, capacity)
-        self.mailhost = mailhost
-        self.mailport = None
-        self.fromaddr = fromaddr
-        self.toaddrs = toaddrs
-        self.subject = subject
-
-    def flush(self):
-        try:
-            if len(self.buffer) > 0:
-                port = self.mailport if self.mailport else smtplib.SMTP_PORT
-
-                msg = "\n".join([self.format(record) for record in self.buffer])
-                msg = MIMEText(msg.encode('utf-8'), _charset='utf-8')
-                msg['Subject'] = self.subject
-                msg['From'] = self.fromaddr
-                msg['To'] = ",".join(self.toaddrs)
-
-                smtp = smtplib.SMTP(self.mailhost, port)
-                smtp.sendmail(self.fromaddr, self.toaddrs, msg.as_string())
-                smtp.quit()
-                self.buffer = []
-        except Exception as e:
-            print(e)
-            raise
+    return logger

+ 66 - 0
core/youtube.py

@@ -0,0 +1,66 @@
+import time
+import urllib
+
+from pytube import YouTube
+
+from core import constants, logging_
+from core.exceptions import YoutubeStreamNotFound
+
+MAX_ATTEMPTS = 5
+
+logger = logging_.get("mew")
+
+
+class YoutubeDownloader:
+    output_dir = constants.APP_ROOT / 'data' / 'youtube'
+
+    @staticmethod
+    def get_audio_stream(yt):
+        args = [
+            {"only_audio": True},
+            {"file_extension": 'mp4'}
+        ]
+
+        for a in args:
+            stream = yt.streams \
+                .filter(**a) \
+                .first()
+            if stream:
+                return stream
+
+    @staticmethod
+    def get_stream(url):
+        for i in range(1, MAX_ATTEMPTS + 1):
+            logger.info(f"download {url} - attempt {i}/{MAX_ATTEMPTS}")
+            try:
+                yt = YouTube(url)
+                return YoutubeDownloader.get_audio_stream(yt)
+            except urllib.error.HTTPError:
+                time.sleep(500)
+                continue
+
+    @staticmethod
+    def download(url):
+        logger.info(f"** Download {url} into {YoutubeDownloader.output_dir}")
+
+        stream = YoutubeDownloader.get_stream(url)
+
+        if stream is None:
+            raise YoutubeStreamNotFound('Stream not found')
+
+        logger.info(f"stream found - start downloading")
+
+        stream.download(
+            output_path=YoutubeDownloader.output_dir,
+            timeout=3,
+            max_retries=5
+        )
+        fname = stream.title
+        logger.info(f"> file downloaded as {YoutubeDownloader.output_dir}/{fname}")
+        return fname
+
+
+if __name__ == "__main__":
+    YoutubeDownloader.download(
+        'https://www.youtube.com/watch?v=nOWjX4BpC24XXXXXX'
+    )

BIN
data/youtube/(Ghost) Riders In the Sky (American Outlaws Live at Nassau Coliseum 1990).mp4


+ 2 - 2
main.py

@@ -22,8 +22,8 @@ try:
 except:
     pass
 
-logger = logging.getLogger("hello")
-logging_.start("hello", level=10)
+logger = logging.getLogger("mew")
+logging_.start("mew", level=10)
 
 # Configure how errors are processed
 sys_err = sys.excepthook

+ 2 - 1
requirements.txt

@@ -2,4 +2,5 @@ PyQt5
 PyQt5-stubs
 python-vlc=3.0.12
 path.py
-pyyaml
+pyyaml
+pytube