logo

youtube-dl

[mirror] Download/Watch videos from video hostersgit clone https://hacktivis.me/git/mirror/youtube-dl.git

dlf.py (9100B)


  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. import re
  4. from .common import InfoExtractor
  5. from ..compat import (
  6. compat_str,
  7. )
  8. from ..utils import (
  9. determine_ext,
  10. extract_attributes,
  11. int_or_none,
  12. merge_dicts,
  13. traverse_obj,
  14. url_or_none,
  15. variadic,
  16. )
  17. class DLFBaseIE(InfoExtractor):
  18. _VALID_URL_BASE = r'https?://(?:www\.)?deutschlandfunk\.de/'
  19. _BUTTON_REGEX = r'(<button[^>]+alt="Anhören"[^>]+data-audio-diraid[^>]*>)'
  20. def _parse_button_attrs(self, button, audio_id=None):
  21. attrs = extract_attributes(button)
  22. audio_id = audio_id or attrs['data-audio-diraid']
  23. url = traverse_obj(
  24. attrs, 'data-audio-download-src', 'data-audio', 'data-audioreference',
  25. 'data-audio-src', expected_type=url_or_none)
  26. ext = determine_ext(url)
  27. formats = (self._extract_m3u8_formats(url, audio_id, fatal=False)
  28. if ext == 'm3u8' else [{'url': url, 'ext': ext, 'vcodec': 'none'}])
  29. self._sort_formats(formats)
  30. def traverse_attrs(path):
  31. path = list(variadic(path))
  32. t = path.pop() if callable(path[-1]) else None
  33. return traverse_obj(attrs, path, expected_type=t, get_all=False)
  34. def txt_or_none(v, default=None):
  35. return default if v is None else (compat_str(v).strip() or default)
  36. return merge_dicts(*reversed([{
  37. 'id': audio_id,
  38. # 'extractor_key': DLFIE.ie_key(),
  39. # 'extractor': DLFIE.IE_NAME,
  40. 'formats': formats,
  41. }, dict((k, traverse_attrs(v)) for k, v in {
  42. 'title': (('data-audiotitle', 'data-audio-title', 'data-audio-download-tracking-title'), txt_or_none),
  43. 'duration': (('data-audioduration', 'data-audio-duration'), int_or_none),
  44. 'thumbnail': ('data-audioimage', url_or_none),
  45. 'uploader': 'data-audio-producer',
  46. 'series': 'data-audio-series',
  47. 'channel': 'data-audio-origin-site-name',
  48. 'webpage_url': ('data-audio-download-tracking-path', url_or_none),
  49. }.items())]))
  50. class DLFIE(DLFBaseIE):
  51. IE_NAME = 'dlf'
  52. _VALID_URL = DLFBaseIE._VALID_URL_BASE + r'[\w-]+-dlf-(?P<id>[\da-f]{8})-100\.html'
  53. _TESTS = [
  54. # Audio as an HLS stream
  55. {
  56. 'url': 'https://www.deutschlandfunk.de/tanz-der-saiteninstrumente-das-wild-strings-trio-aus-slowenien-dlf-03a3eb19-100.html',
  57. 'info_dict': {
  58. 'id': '03a3eb19',
  59. 'title': r're:Tanz der Saiteninstrumente [-/] Das Wild Strings Trio aus Slowenien',
  60. 'ext': 'm4a',
  61. 'duration': 3298,
  62. 'thumbnail': 'https://assets.deutschlandfunk.de/FALLBACK-IMAGE-AUDIO/512x512.png?t=1603714364673',
  63. 'uploader': 'Deutschlandfunk',
  64. 'series': 'On Stage',
  65. 'channel': 'deutschlandfunk'
  66. },
  67. 'params': {
  68. 'skip_download': 'm3u8'
  69. },
  70. 'skip': 'This webpage no longer exists'
  71. }, {
  72. 'url': 'https://www.deutschlandfunk.de/russische-athleten-kehren-zurueck-auf-die-sportbuehne-ein-gefaehrlicher-tueroeffner-dlf-d9cc1856-100.html',
  73. 'info_dict': {
  74. 'id': 'd9cc1856',
  75. 'title': 'Russische Athleten kehren zurück auf die Sportbühne: Ein gefährlicher Türöffner',
  76. 'ext': 'mp3',
  77. 'duration': 291,
  78. 'thumbnail': 'https://assets.deutschlandfunk.de/FALLBACK-IMAGE-AUDIO/512x512.png?t=1603714364673',
  79. 'uploader': 'Deutschlandfunk',
  80. 'series': 'Kommentare und Themen der Woche',
  81. 'channel': 'deutschlandfunk'
  82. }
  83. },
  84. ]
  85. def _real_extract(self, url):
  86. audio_id = self._match_id(url)
  87. webpage = self._download_webpage(url, audio_id)
  88. return self._parse_button_attrs(
  89. self._search_regex(self._BUTTON_REGEX, webpage, 'button'), audio_id)
  90. class DLFCorpusIE(DLFBaseIE):
  91. IE_NAME = 'dlf:corpus'
  92. IE_DESC = 'DLF Multi-feed Archives'
  93. _VALID_URL = DLFBaseIE._VALID_URL_BASE + r'(?P<id>(?![\w-]+-dlf-[\da-f]{8})[\w-]+-\d+)\.html'
  94. _TESTS = [
  95. # Recorded news broadcast with referrals to related broadcasts
  96. {
  97. 'url': 'https://www.deutschlandfunk.de/fechten-russland-belarus-ukraine-protest-100.html',
  98. 'info_dict': {
  99. 'id': 'fechten-russland-belarus-ukraine-protest-100',
  100. 'title': r're:Wiederzulassung als neutrale Athleten [-/] Was die Rückkehr russischer und belarussischer Sportler beim Fechten bedeutet',
  101. 'description': 'md5:91340aab29c71aa7518ad5be13d1e8ad'
  102. },
  103. 'playlist_mincount': 5,
  104. 'playlist': [{
  105. 'info_dict': {
  106. 'id': '1fc5d64a',
  107. 'title': r're:Wiederzulassung als neutrale Athleten [-/] Was die Rückkehr russischer und belarussischer Sportler beim Fechten bedeutet',
  108. 'ext': 'mp3',
  109. 'duration': 252,
  110. 'thumbnail': 'https://assets.deutschlandfunk.de/aad16241-6b76-4a09-958b-96d0ee1d6f57/512x512.jpg?t=1679480020313',
  111. 'uploader': 'Deutschlandfunk',
  112. 'series': 'Sport',
  113. 'channel': 'deutschlandfunk'
  114. }
  115. }, {
  116. 'info_dict': {
  117. 'id': '2ada145f',
  118. 'title': r're:(?:Sportpolitik / )?Fechtverband votiert für Rückkehr russischer Athleten',
  119. 'ext': 'mp3',
  120. 'duration': 336,
  121. 'thumbnail': 'https://assets.deutschlandfunk.de/FILE_93982766f7317df30409b8a184ac044a/512x512.jpg?t=1678547581005',
  122. 'uploader': 'Deutschlandfunk',
  123. 'series': 'Deutschlandfunk Nova',
  124. 'channel': 'deutschlandfunk-nova'
  125. }
  126. }, {
  127. 'info_dict': {
  128. 'id': '5e55e8c9',
  129. 'title': r're:Wiederzulassung von Russland und Belarus [-/] "Herumlavieren" des Fechter-Bundes sorgt für Unverständnis',
  130. 'ext': 'mp3',
  131. 'duration': 187,
  132. 'thumbnail': 'https://assets.deutschlandfunk.de/a595989d-1ed1-4a2e-8370-b64d7f11d757/512x512.jpg?t=1679173825412',
  133. 'uploader': 'Deutschlandfunk',
  134. 'series': 'Sport am Samstag',
  135. 'channel': 'deutschlandfunk'
  136. }
  137. }, {
  138. 'info_dict': {
  139. 'id': '47e1a096',
  140. 'title': r're:Rückkehr Russlands im Fechten [-/] "Fassungslos, dass es einfach so passiert ist"',
  141. 'ext': 'mp3',
  142. 'duration': 602,
  143. 'thumbnail': 'https://assets.deutschlandfunk.de/da4c494a-21cc-48b4-9cc7-40e09fd442c2/512x512.jpg?t=1678562155770',
  144. 'uploader': 'Deutschlandfunk',
  145. 'series': 'Sport am Samstag',
  146. 'channel': 'deutschlandfunk'
  147. }
  148. }, {
  149. 'info_dict': {
  150. 'id': '5e55e8c9',
  151. 'title': r're:Wiederzulassung von Russland und Belarus [-/] "Herumlavieren" des Fechter-Bundes sorgt für Unverständnis',
  152. 'ext': 'mp3',
  153. 'duration': 187,
  154. 'thumbnail': 'https://assets.deutschlandfunk.de/a595989d-1ed1-4a2e-8370-b64d7f11d757/512x512.jpg?t=1679173825412',
  155. 'uploader': 'Deutschlandfunk',
  156. 'series': 'Sport am Samstag',
  157. 'channel': 'deutschlandfunk'
  158. }
  159. }]
  160. },
  161. # Podcast feed with tag buttons, playlist count fluctuates
  162. {
  163. 'url': 'https://www.deutschlandfunk.de/kommentare-und-themen-der-woche-100.html',
  164. 'info_dict': {
  165. 'id': 'kommentare-und-themen-der-woche-100',
  166. 'title': 'Meinung - Kommentare und Themen der Woche',
  167. 'description': 'md5:2901bbd65cd2d45e116d399a099ce5d5',
  168. },
  169. 'playlist_mincount': 10,
  170. },
  171. # Podcast feed with no description
  172. {
  173. 'url': 'https://www.deutschlandfunk.de/podcast-tolle-idee-100.html',
  174. 'info_dict': {
  175. 'id': 'podcast-tolle-idee-100',
  176. 'title': 'Wissenschaftspodcast - Tolle Idee! - Was wurde daraus?',
  177. },
  178. 'playlist_mincount': 11,
  179. },
  180. ]
  181. def _real_extract(self, url):
  182. playlist_id = self._match_id(url)
  183. webpage = self._download_webpage(url, playlist_id)
  184. return self.playlist_result(
  185. map(self._parse_button_attrs, re.findall(self._BUTTON_REGEX, webpage)),
  186. playlist_id, self._html_search_meta(['og:title', 'twitter:title'], webpage, default=None),
  187. self._html_search_meta(['description', 'og:description', 'twitter:description'], webpage, default=None))