1, беги
Загрузите youtube-dl с помощью launch.json,
# 本文中 himala 是代指,具体见文末的 github repo
"configurations": [
{
"name": "audio",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/youtube_dl",
"console": "integratedTerminal",
"args": ["-F", "http://www.himala.com/61425525/sound/47740352/"]
}
]
Затем позвоните напрямуюmain.py
пройти черезmain.py файл, положить
if __package__ is None and not hasattr(sys, 'frozen'):
import os.path
path = os.path.realpath(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(path)))
заменить
import os.path
path = os.path.realpath(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(path)))
2, план операции
2.1, вход в программу, получение параметров командной строки, действия
__main__.py
файл,
if __name__ == '__main__':
youtube_dl.main()
__init__.py
файл, иди
def main(argv=None):
try:
_real_main(argv)
except DownloadError:
sys.exit(1)
# ...
__init__.py
файл, затем перейдите
def _real_main(argv=None):
# 里面做了一个参数配置
#...
try:
if opts.load_info_filename is not None:
retcode = ydl.download_with_info_file(expand_path(opts.load_info_filename))
else:
retcode = ydl.download(all_urls)
except MaxDownloadsReached:
#...
2.2, в файле YoutubeDL.py возьмите URL-адрес для загрузки аудио и видео.
class YoutubeDL(object):
def download(self, url_list):
# ...
for url in url_list:
try:
# It also downloads the videos
res = self.extract_info(
url, force_generic_extractor=self.params.get('force_generic_extractor', False))
except UnavailableVideoError:
# ...
В этой функции не только извлекается актуальная информация, но и загружаются веб-страницы, аудио и видео.
все решено
def extract_info(self, url, download=True, ie_key=None, extra_info={},
process=True, force_generic_extractor=False):
if not ie_key and force_generic_extractor:
ie_key = 'Generic'
if ie_key:
ies = [self.get_info_extractor(ie_key)]
else:
ies = self._ies
for ie in ies:
if not ie.suitable(url):
continue
ie = self.get_info_extractor(ie.ie_key())
# ...
try:
ie_result = ie.extract(url)
# ...
т.е. Info Extract в приведенном выше коде
youtube-dl может обрабатывать информацию со многих веб-сайтов, каждый веб-сайт имеет соответствующий файл Info Extract.
youtube-dl, аудио и видео, все относятся к видео
3. Узнайте т.е.
Как youtube-dl, учитывая url, узнать соответствующий IE
По регулярным, сделать сопоставление
youtube-dl реализует расширяемость поддержки сайта с помощью регулярных выражений
3.1, в коде вышеself._ies
, инициализация
3.1.1 self._ies
Добавить к
В файле YoutubeDL.py
self._ies
, инициализированная запись
class YoutubeDL(object):
def __init__(self, params=None, auto_init=True):
# ...
if auto_init:
self.print_debug_header()
self.add_default_info_extractors()
# ...
Пучокgen_extractor_classes
информация внутри,
добавить вself._ies
def add_default_info_extractors(self):
"""
Add the InfoExtractors returned by gen_extractors to the end of the list
"""
for ie in gen_extractor_classes():
self.add_info_extractor(ie)
def add_info_extractor(self, ie):
"""Add an InfoExtractor object to the end of the list."""
self._ies.append(ie)
# ...
3.1.2 self._ies
Добавленный контент
__init__.py
файл,
_ALL_CLASSES
Добавлена папка экстрактораextractors.py
документы, на которые имеются ссылки, все начинающиеся сIE
конец урока
#...
except ImportError:
_LAZY_LOADER = False
from .extractors import *
_ALL_CLASSES = [
klass
for name, klass in globals().items()
if name.endswith('IE') and name != 'GenericIE'
]
_ALL_CLASSES.append(GenericIE)
def gen_extractor_classes():
return _ALL_CLASSES
_ALL_CLASSES
, порядок этого списка очень важен, сначала сопоставьте его через обычный,
использует IE
3.1.3, Добавить веб-сайт
Поддерживается новый веб-сайт и создается соответствующий файл IE.
extractors.py
В файле добавьте ссылку следующим образом
from .youtube import (
YoutubeIE,
YoutubeChannelIE,
# ...
}
3.2, узнать соответствующий IE
Улучшено выше, в файле YoutubeDL.py,
def extract_info(self, url, download=True, ie_key=None, extra_info={},
process=True, force_generic_extractor=False):
# ...
for ie in ies:
if not ie.suitable(url):
continue
ie = self.get_info_extractor(ie.ie_key())
# ...
Каждый ie имеет метод классаdef suitable(cls, url):
IE каждого сайта наследуется от
в файле common.pyclass InfoExtractor(object)
class InfoExtractor(object):
@classmethod
def suitable(cls, url):
if '_VALID_URL_RE' not in cls.__dict__:
cls._VALID_URL_RE = re.compile(cls._VALID_URL)
return cls._VALID_URL_RE.match(url) is not None
Если ie веб-сайта не реализует свой собственныйsuitable
,
затем подать заявкуInfoExtractor
Категорияsuitable
IE на веб-сайт
class XimalayaIE(XimalayaBaseIE):
# 本文中 himala 是代指,具体见文末的 github repo
IE_NAME = 'himala'
IE_DESC = 'himala 网站'
_VALID_URL = r'https?://(?:www\.|m\.)?himala\.com/(?P<uid>[0-9]+)/sound/(?P<id>[0-9]+)'
InfoExtractor
класс, через__dict__
Получить, мы настроили_VALID_URL
Атрибуты,
Регулярно определяйте его
4. Узнайте информацию о веб-странице
В приведенном выше коде в файле YoutubeDL.py введите ie и выполните следующие действия.
def extract_info(self, url, download=True, ie_key=None, extra_info={},
process=True, force_generic_extractor=False):
# ...
try:
ie_result = ie.extract(url)
# ...
войти первымcommon.py
файл,InfoExtractor
Добрый
def extract(self, url):
"""Extracts URL information and returns it in list of dicts."""
try:
for _ in range(2):
try:
self.initialize()
ie_result = self._real_extract(url)
# ...
Затем введите класс, который действительно делает вещи,himala.py
в файле
Загружайте веб-страницы и регулярно извлекайте информацию
# 本文中 himala 是代指,具体见文末的 github repo
class HimalaIE(InfoExtractor):
def _real_extract(self, url):
#...
webpage = self._download_webpage(url, audio_id,
note='Download sound page for %s' % audio_id,
errnote='Unable to get sound page')
# ...
if is_m:
audio_description = self._html_search_regex(r'(?s)<section\s+class=["\']content[^>]+>(.+?)</section>',
webpage, 'audio_description', fatal=False)
else:
audio_description = self._html_search_regex(r'(?s)<div\s+class=["\']rich_intro[^>]*>(.+?</article>)',
webpage, 'audio_description', fatal=False)
# ...
5. Применение
На сайте Himala у хоста много работ.
В якоре нет функции поиска работы
Просто расширив youtube-dl , можно узнать
Сколько серий Fallout у ведущего и какая страница соответствует
Код простой, см.
github repo
Связанный
launch.json в отладке python, пример youtube-dl
python: сделать, например youtube-dl
Дополнительные блоги об операциях начального уровня см. в их блоге.