fujitv.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. from .common import InfoExtractor
  2. from ..networking import HEADRequest
  3. class FujiTVFODPlus7IE(InfoExtractor):
  4. _VALID_URL = r'https?://fod\.fujitv\.co\.jp/title/(?P<sid>[0-9a-z]{4})/(?P<id>[0-9a-z]+)'
  5. _BASE_URL = 'https://i.fod.fujitv.co.jp/'
  6. _BITRATE_MAP = {
  7. 300: (320, 180),
  8. 800: (640, 360),
  9. 1200: (1280, 720),
  10. 2000: (1280, 720),
  11. 4000: (1920, 1080),
  12. }
  13. _TESTS = [{
  14. 'url': 'https://fod.fujitv.co.jp/title/5d40/5d40110076',
  15. 'info_dict': {
  16. 'id': '5d40110076',
  17. 'ext': 'ts',
  18. 'title': '#1318 『まる子、まぼろしの洋館を見る』の巻',
  19. 'series': 'ちびまる子ちゃん',
  20. 'series_id': '5d40',
  21. 'description': 'md5:b3f51dbfdda162ac4f789e0ff4d65750',
  22. 'thumbnail': 'https://i.fod.fujitv.co.jp/img/program/5d40/episode/5d40110076_a.jpg',
  23. },
  24. }, {
  25. 'url': 'https://fod.fujitv.co.jp/title/5d40/5d40810083',
  26. 'info_dict': {
  27. 'id': '5d40810083',
  28. 'ext': 'ts',
  29. 'title': '#1324 『まる子とオニの子』の巻/『結成!2月をムダにしない会』の巻',
  30. 'description': 'md5:3972d900b896adc8ab1849e310507efa',
  31. 'series': 'ちびまる子ちゃん',
  32. 'series_id': '5d40',
  33. 'thumbnail': 'https://i.fod.fujitv.co.jp/img/program/5d40/episode/5d40810083_a.jpg'},
  34. 'skip': 'Video available only in one week',
  35. }]
  36. def _real_extract(self, url):
  37. series_id, video_id = self._match_valid_url(url).groups()
  38. self._request_webpage(HEADRequest(url), video_id)
  39. json_info = {}
  40. token = self._get_cookies(url).get('CT')
  41. if token:
  42. json_info = self._download_json(
  43. f'https://fod-sp.fujitv.co.jp/apps/api/episode/detail/?ep_id={video_id}&is_premium=false',
  44. video_id, headers={'x-authorization': f'Bearer {token.value}'}, fatal=False)
  45. else:
  46. self.report_warning(f'The token cookie is needed to extract video metadata. {self._login_hint("cookies")}')
  47. formats, subtitles = [], {}
  48. src_json = self._download_json(f'{self._BASE_URL}abrjson_v2/tv_android/{video_id}', video_id)
  49. for src in src_json['video_selector']:
  50. if not src.get('url'):
  51. continue
  52. fmt, subs = self._extract_m3u8_formats_and_subtitles(src['url'], video_id, 'ts')
  53. for f in fmt:
  54. f.update(dict(zip(('height', 'width'),
  55. self._BITRATE_MAP.get(f.get('tbr'), ()))))
  56. formats.extend(fmt)
  57. subtitles = self._merge_subtitles(subtitles, subs)
  58. return {
  59. 'id': video_id,
  60. 'title': json_info.get('ep_title'),
  61. 'series': json_info.get('lu_title'),
  62. 'series_id': series_id,
  63. 'description': json_info.get('ep_description'),
  64. 'formats': formats,
  65. 'subtitles': subtitles,
  66. 'thumbnail': f'{self._BASE_URL}img/program/{series_id}/episode/{video_id}_a.jpg',
  67. '_format_sort_fields': ('tbr', ),
  68. }