screencastify.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import urllib.parse
  2. from .common import InfoExtractor
  3. from ..utils import traverse_obj, update_url_query
  4. class ScreencastifyIE(InfoExtractor):
  5. _VALID_URL = [
  6. r'https?://watch\.screencastify\.com/v/(?P<id>[^/?#]+)',
  7. r'https?://app\.screencastify\.com/v[23]/watch/(?P<id>[^/?#]+)',
  8. ]
  9. _TESTS = [{
  10. 'url': 'https://watch.screencastify.com/v/sYVkZip3quLKhHw4Ybk8',
  11. 'info_dict': {
  12. 'id': 'sYVkZip3quLKhHw4Ybk8',
  13. 'ext': 'mp4',
  14. 'title': 'Inserting and Aligning the Case Top and Bottom',
  15. 'description': '',
  16. 'uploader': 'Paul Gunn',
  17. 'extra_param_to_segment_url': str,
  18. },
  19. 'params': {
  20. 'skip_download': 'm3u8',
  21. },
  22. }, {
  23. 'url': 'https://app.screencastify.com/v3/watch/J5N7H11wofDN1jZUCr3t',
  24. 'info_dict': {
  25. 'id': 'J5N7H11wofDN1jZUCr3t',
  26. 'ext': 'mp4',
  27. 'uploader': 'Scott Piesen',
  28. 'description': '',
  29. 'title': 'Lesson Recording 1-17 Burrr...',
  30. },
  31. 'params': {
  32. 'skip_download': 'm3u8',
  33. },
  34. }, {
  35. 'url': 'https://app.screencastify.com/v2/watch/BQ26VbUdfbQLhKzkktOk',
  36. 'only_matching': True,
  37. }]
  38. def _real_extract(self, url):
  39. video_id = self._match_id(url)
  40. info = self._download_json(
  41. f'https://umbrella.svc.screencastify.com/api/umbrellaService/watch/{video_id}', video_id)
  42. query_string = traverse_obj(info, ('manifest', 'auth', 'query'))
  43. query = urllib.parse.parse_qs(query_string)
  44. formats = []
  45. dash_manifest_url = traverse_obj(info, ('manifest', 'url'))
  46. if dash_manifest_url:
  47. formats.extend(
  48. self._extract_mpd_formats(
  49. dash_manifest_url, video_id, mpd_id='dash', query=query, fatal=False))
  50. hls_manifest_url = traverse_obj(info, ('manifest', 'hlsUrl'))
  51. if hls_manifest_url:
  52. formats.extend(
  53. self._extract_m3u8_formats(
  54. hls_manifest_url, video_id, ext='mp4', m3u8_id='hls', query=query, fatal=False))
  55. for f in formats:
  56. f['url'] = update_url_query(f['url'], query)
  57. return {
  58. 'id': video_id,
  59. 'title': info.get('title'),
  60. 'description': info.get('description'),
  61. 'uploader': info.get('userName'),
  62. 'formats': formats,
  63. 'extra_param_to_segment_url': query_string,
  64. }