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()
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()
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)
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)
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
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)