Esempio n. 1
0
    def do_GET(self):
        if self.path == "/":
            self.path = "/static/index.html"

        path_parts = filter(None, self.path.split("/"))[1:]
        if ".." not in path_parts:
            if self.path.startswith("/static/"):
                filename = os.path.join(self.STATIC_PATH, *path_parts)
                _, extension = os.path.splitext(filename)
                mimetype = util.mimetype_from_extension(extension)

                self.send_response(200)
                self.send_header("Content-type", mimetype)
                self.end_headers()
                self.wfile.write(open(filename).read())
                self.wfile.close()
                return
            elif self.path.startswith("/json/"):
                data = json_response(path_parts)
                if data is not None:
                    self.send_response(200)
                    self.send_header("Content-type", "application/json")
                    self.end_headers()
                    self.wfile.write(json.dumps(data))
                    self.wfile.close()
                    return

        self.send_response(400)
        self.send_header("Content-type", "text/html")
        self.end_headers()
        self.wfile.write("<p>Invalid request</p>")
        self.wfile.close()
Esempio n. 2
0
    def do_GET(self):
        if self.path == '/':
            self.path = '/static/index.html'

        path_parts = filter(None, self.path.split('/'))[1:]
        if '..' not in path_parts:
            if self.path.startswith('/static/'):
                filename = os.path.join(self.STATIC_PATH, *path_parts)
                _, extension = os.path.splitext(filename)
                mimetype = util.mimetype_from_extension(extension)

                self.send_response(200)
                self.send_header('Content-type', mimetype)
                self.end_headers()
                self.wfile.write(open(filename).read())
                self.wfile.close()
                return
            elif self.path.startswith('/json/'):
                data = json_response(path_parts)
                if data is not None:
                    self.send_response(200)
                    self.send_header('Content-type', 'application/json')
                    self.end_headers()
                    self.wfile.write(json.dumps(data))
                    self.wfile.close()
                    return

        self.send_response(400)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write('<p>Invalid request</p>')
        self.wfile.close()
Esempio n. 3
0
 def retrieve_resume(self, tempname, reporthook=None):
     """
     called by download.DownloadTask to perform the download.
     """
     self._reporthook = reporthook
     res = self._ytdl.fetch_video(self._url, tempname, self._my_hook)
     if 'duration' in res and res['duration']:
         self._episode.total_time = res['duration']
     headers = {}
     # youtube-dl doesn't return a content-type but an extension
     if 'ext' in res:
         dot_ext = '.{}'.format(res['ext'])
         ext_filetype = mimetype_from_extension(dot_ext)
         if ext_filetype:
             headers['content-type'] = ext_filetype
         # See #673 when merging multiple formats, the extension is appended to the tempname
         # by YoutubeDL resulting in empty .partial file + .partial.mp4 exists
         tempstat = os.stat(tempname)
         if not tempstat.st_size:
             tempname_with_ext = tempname + dot_ext
             if os.path.isfile(tempname_with_ext):
                 logger.debug(
                     'Youtubedl downloaded to %s instead of %s, moving',
                     os.path.basename(tempname),
                     os.path.basename(tempname_with_ext))
                 os.remove(tempname)
                 os.rename(tempname_with_ext, tempname)
     return headers, res.get('url', self._url)
Esempio n. 4
0
    def do_GET(self):
        if self.path == '/':
            self.path = '/static/index.html'

        path_parts = filter(None, self.path.split('/'))[1:]
        if '..' not in path_parts:
            if self.path.startswith('/static/'):
                filename = os.path.join(self.STATIC_PATH, *path_parts)
                _, extension = os.path.splitext(filename)
                mimetype = util.mimetype_from_extension(extension)

                self.send_response(200)
                self.send_header('Content-type', mimetype)
                self.end_headers()
                self.wfile.write(open(filename).read())
                self.wfile.close()
                return
            elif self.path.startswith('/json/'):
                data = json_response(path_parts)
                if data is not None:
                    self.send_response(200)
                    self.send_header('Content-type', 'application/json')
                    self.end_headers()
                    self.wfile.write(json.dumps(data))
                    self.wfile.close()
                    return

        self.send_response(400)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write('<p>Invalid request</p>')
        self.wfile.close()
Esempio n. 5
0
 def retrieve_resume(self, tempname, reporthook=None):
     """
     called by download.DownloadTask to perform the download.
     """
     self._reporthook = reporthook
     res = self._ytdl.fetch_video(self._url, tempname, self._my_hook)
     headers = {}
     # youtube-dl doesn't return a content-type but an extension
     if 'ext' in res:
         ext_filetype = mimetype_from_extension('.{}'.format(res['ext']))
         if ext_filetype:
             headers['content-type'] = ext_filetype
     return headers, res.get('url', self._url)
Esempio n. 6
0
 def get_new_episodes(self, channel, existing_guids):
     # entries are already sorted by decreasing date
     # trim guids to max episodes
     entries = [
         e for i, e in enumerate(self._ie_result['entries'])
         if not self._max_episodes or i < self._max_episodes
     ]
     all_seen_guids = set(e['guid'] for e in entries)
     # only fetch new ones from youtube since they are so slow to get
     new_entries = [e for e in entries if e['guid'] not in existing_guids]
     logger.debug('%i/%i new entries', len(new_entries),
                  len(all_seen_guids))
     self._ie_result['entries'] = new_entries
     self._downloader.refresh_entries(self._ie_result)
     # episodes from entries
     episodes = []
     for en in self._ie_result['entries']:
         guid = video_guid(en['id'])
         description = remove_html_tags(
             en.get('description') or _('No description available'))
         html_description = nice_html_description(en.get('thumbnail'),
                                                  description)
         if en.get('ext'):
             mime_type = mimetype_from_extension('.{}'.format(en['ext']))
         else:
             mime_type = 'application/octet-stream'
         if en.get('filesize'):
             filesize = int(en['filesize'] or 0)
         else:
             filesize = sum(
                 int(f.get('filesize') or 0)
                 for f in en.get('requested_formats', []))
         ep = {
             'title': en.get('title', guid),
             'link': en.get('webpage_url'),
             'description': description,
             'description_html': html_description,
             'url': en.get('webpage_url'),
             'file_size': filesize,
             'mime_type': mime_type,
             'guid': guid,
             'published': youtube_parsedate(en.get('upload_date', None)),
             'total_time': int(en.get('duration') or 0),
         }
         episode = channel.episode_factory(ep)
         episode.save()
         episodes.append(episode)
     return episodes, all_seen_guids
Esempio n. 7
0
 def retrieve_resume(self, tempname, reporthook=None):
     """
     called by download.DownloadTask to perform the download.
     """
     self._reporthook = reporthook
     # outtmpl: use given tempname by DownloadTask
     # (escape % and $ because outtmpl used as a string template by youtube-dl)
     outtmpl = tempname.replace('%', '%%').replace('$', '$$')
     res = self._ytdl.fetch_video(self._url, outtmpl, self._my_hook)
     if outtmpl != tempname:
         if 'ext' in res and os.path.isfile(outtmpl +
                                            '.{}'.format(res['ext'])):
             os.rename(outtmpl + '.{}'.format(res['ext']), tempname)
         else:
             os.rename(outtmpl, tempname)
     if 'duration' in res and res['duration']:
         self._episode.total_time = res['duration']
     headers = {}
     # youtube-dl doesn't return a content-type but an extension
     if 'ext' in res:
         dot_ext = '.{}'.format(res['ext'])
         # See #673 when merging multiple formats, the extension is appended to the tempname
         # by YoutubeDL resulting in empty .partial file + .partial.mp4 exists
         # and #796 .mkv is chosen by ytdl sometimes
         tempstat = os.stat(tempname)
         if not tempstat.st_size:
             for try_ext in (dot_ext, ".mp4", ".m4a", ".webm", ".mkv"):
                 tempname_with_ext = tempname + try_ext
                 if os.path.isfile(tempname_with_ext):
                     logger.debug(
                         'Youtubedl downloaded to "%s" instead of "%s", moving',
                         os.path.basename(tempname_with_ext),
                         os.path.basename(tempname))
                     os.remove(tempname)
                     os.rename(tempname_with_ext, tempname)
                     dot_ext = try_ext
                     break
         ext_filetype = mimetype_from_extension(dot_ext)
         if ext_filetype:
             # Youtube weba formats have a webm extension and get a video/webm mime-type
             # but audio content has no width or height, so change it to audio/webm for correct icon and player
             if ext_filetype.startswith('video/') and (
                     'height' not in res or res['height'] is None):
                 ext_filetype = ext_filetype.replace('video/', 'audio/')
             headers['content-type'] = ext_filetype
     return headers, res.get('url', self._url)