from pafy import backend_youtube_dl import pafy from spotdl import internals def _getbestthumb(self): url = self._ydl_info["thumbnails"][0]["url"] if url: return url part_url = "https://i.ytimg.com/vi/%s/" % self.videoid # Thumbnail resolution sorted in descending order thumbs = ( "maxresdefault.jpg", "sddefault.jpg", "hqdefault.jpg", "mqdefault.jpg", "default.jpg", ) for thumb in thumbs: url = part_url + thumb if self._content_available(url): return url def _process_streams(self): for format_index in range(len(self._ydl_info["formats"])): try: self._ydl_info["formats"][format_index]["url"] = self._ydl_info["formats"][ format_index ]["fragment_base_url"] except KeyError: pass return backend_youtube_dl.YtdlPafy._old_process_streams(self) @classmethod def _content_available(cls, url): return internals.content_available(url) class PatchPafy: """ These patches have not been released by pafy on PyPI yet but are useful to us. """ def patch_getbestthumb(self): # https://github.com/mps-youtube/pafy/pull/211 pafy.backend_shared.BasePafy._bestthumb = None pafy.backend_shared.BasePafy._content_available = _content_available pafy.backend_shared.BasePafy.getbestthumb = _getbestthumb def patch_process_streams(self): # https://github.com/mps-youtube/pafy/pull/230 backend_youtube_dl.YtdlPafy._old_process_streams = ( backend_youtube_dl.YtdlPafy._process_streams ) backend_youtube_dl.YtdlPafy._process_streams = _process_streams def patch_insecure_streams(self): # https://github.com/mps-youtube/pafy/pull/235 pafy.g.def_ydl_opts["prefer_insecure"] = False