myvi.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. import re
  4. from .common import InfoExtractor
  5. from .vimple import SprutoBaseIE
  6. class MyviIE(SprutoBaseIE):
  7. _VALID_URL = r'''(?x)
  8. (?:
  9. https?://
  10. (?:www\.)?
  11. myvi\.(?:ru/player|tv)/
  12. (?:
  13. (?:
  14. embed/html|
  15. flash|
  16. api/Video/Get
  17. )/|
  18. content/preloader\.swf\?.*\bid=
  19. )|
  20. myvi:
  21. )
  22. (?P<id>[\da-zA-Z_-]+)
  23. '''
  24. _TESTS = [{
  25. 'url': 'http://myvi.ru/player/embed/html/oOy4euHA6LVwNNAjhD9_Jq5Ha2Qf0rtVMVFMAZav8wObeRTZaCATzucDQIDph8hQU0',
  26. 'md5': '571bbdfba9f9ed229dc6d34cc0f335bf',
  27. 'info_dict': {
  28. 'id': 'f16b2bbd-cde8-481c-a981-7cd48605df43',
  29. 'ext': 'mp4',
  30. 'title': 'хозяин жизни',
  31. 'thumbnail': r're:^https?://.*\.jpg$',
  32. 'duration': 25,
  33. },
  34. }, {
  35. 'url': 'http://myvi.ru/player/content/preloader.swf?id=oOy4euHA6LVwNNAjhD9_Jq5Ha2Qf0rtVMVFMAZav8wOYf1WFpPfc_bWTKGVf_Zafr0',
  36. 'only_matching': True,
  37. }, {
  38. 'url': 'http://myvi.ru/player/api/Video/Get/oOy4euHA6LVwNNAjhD9_Jq5Ha2Qf0rtVMVFMAZav8wObeRTZaCATzucDQIDph8hQU0',
  39. 'only_matching': True,
  40. }, {
  41. 'url': 'http://myvi.tv/embed/html/oTGTNWdyz4Zwy_u1nraolwZ1odenTd9WkTnRfIL9y8VOgHYqOHApE575x4_xxS9Vn0?ap=0',
  42. 'only_matching': True,
  43. }, {
  44. 'url': 'http://myvi.ru/player/flash/ocp2qZrHI-eZnHKQBK4cZV60hslH8LALnk0uBfKsB-Q4WnY26SeGoYPi8HWHxu0O30',
  45. 'only_matching': True,
  46. }, {
  47. 'url': 'myvi:YwbqszQynUaHPn_s82sx0Q2',
  48. 'only_matching': True,
  49. }]
  50. @classmethod
  51. def _extract_url(cls, webpage):
  52. mobj = re.search(
  53. r'<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//myvi\.(?:ru/player|tv)/(?:embed/html|flash)/[^"]+)\1', webpage)
  54. if mobj:
  55. return mobj.group('url')
  56. def _real_extract(self, url):
  57. video_id = self._match_id(url)
  58. spruto = self._download_json(
  59. 'http://myvi.ru/player/api/Video/Get/%s?sig' % video_id, video_id)['sprutoData']
  60. return self._extract_spruto(spruto, video_id)
  61. class MyviEmbedIE(InfoExtractor):
  62. _VALID_URL = r'https?://(?:www\.)?myvi\.tv/(?:[^?]+\?.*?\bv=|embed/)(?P<id>[\da-z]+)'
  63. _TESTS = [{
  64. 'url': 'https://www.myvi.tv/embed/ccdqic3wgkqwpb36x9sxg43t4r',
  65. 'info_dict': {
  66. 'id': 'b3ea0663-3234-469d-873e-7fecf36b31d1',
  67. 'ext': 'mp4',
  68. 'title': 'Твоя (original song).mp4',
  69. 'thumbnail': r're:^https?://.*\.jpg$',
  70. 'duration': 277,
  71. },
  72. 'params': {
  73. 'skip_download': True,
  74. },
  75. }, {
  76. 'url': 'https://www.myvi.tv/idmi6o?v=ccdqic3wgkqwpb36x9sxg43t4r#watch',
  77. 'only_matching': True,
  78. }]
  79. @classmethod
  80. def suitable(cls, url):
  81. return False if MyviIE.suitable(url) else super(MyviEmbedIE, cls).suitable(url)
  82. def _real_extract(self, url):
  83. video_id = self._match_id(url)
  84. webpage = self._download_webpage(
  85. 'https://www.myvi.tv/embed/%s' % video_id, video_id)
  86. myvi_id = self._search_regex(
  87. r'CreatePlayer\s*\(\s*["\'].*?\bv=([\da-zA-Z_]+)',
  88. webpage, 'video id')
  89. return self.url_result('myvi:%s' % myvi_id, ie=MyviIE.ie_key())