clyp.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from .common import InfoExtractor
  2. from ..utils import (
  3. float_or_none,
  4. parse_qs,
  5. unified_timestamp,
  6. )
  7. class ClypIE(InfoExtractor):
  8. _VALID_URL = r'https?://(?:www\.)?clyp\.it/(?P<id>[a-z0-9]+)'
  9. _TESTS = [{
  10. 'url': 'https://clyp.it/iynkjk4b',
  11. 'md5': '4bc6371c65210e7b372097fce4d92441',
  12. 'info_dict': {
  13. 'id': 'iynkjk4b',
  14. 'ext': 'ogg',
  15. 'title': 'research',
  16. 'description': '#Research',
  17. 'duration': 51.278,
  18. 'timestamp': 1435524981,
  19. 'upload_date': '20150628',
  20. },
  21. }, {
  22. 'url': 'https://clyp.it/b04p1odi?token=b0078e077e15835845c528a44417719d',
  23. 'info_dict': {
  24. 'id': 'b04p1odi',
  25. 'ext': 'ogg',
  26. 'title': 'GJ! (Reward Edit)',
  27. 'description': 'Metal Resistance (THE ONE edition)',
  28. 'duration': 177.789,
  29. 'timestamp': 1528241278,
  30. 'upload_date': '20180605',
  31. },
  32. 'params': {
  33. 'skip_download': True,
  34. },
  35. }, {
  36. 'url': 'https://clyp.it/v42214lc',
  37. 'md5': '4aca4dfc3236fb6d6ddc4ea08314f33f',
  38. 'info_dict': {
  39. 'id': 'v42214lc',
  40. 'ext': 'wav',
  41. 'title': 'i dont wanna go (old version)',
  42. 'duration': 113.528,
  43. 'timestamp': 1607348505,
  44. 'upload_date': '20201207',
  45. },
  46. }]
  47. def _real_extract(self, url):
  48. audio_id = self._match_id(url)
  49. qs = parse_qs(url)
  50. token = qs.get('token', [None])[0]
  51. query = {}
  52. if token:
  53. query['token'] = token
  54. metadata = self._download_json(
  55. f'https://api.clyp.it/{audio_id}', audio_id, query=query)
  56. formats = []
  57. for secure in ('', 'Secure'):
  58. for ext in ('Ogg', 'Mp3'):
  59. format_id = f'{secure}{ext}'
  60. format_url = metadata.get(f'{format_id}Url')
  61. if format_url:
  62. formats.append({
  63. 'url': format_url,
  64. 'format_id': format_id,
  65. 'vcodec': 'none',
  66. 'acodec': ext.lower(),
  67. })
  68. page = self._download_webpage(url, video_id=audio_id)
  69. wav_url = self._html_search_regex(
  70. r'var\s*wavStreamUrl\s*=\s*["\'](?P<url>https?://[^\'"]+)', page, 'url', default=None)
  71. if wav_url:
  72. formats.append({
  73. 'url': wav_url,
  74. 'format_id': 'wavStreamUrl',
  75. 'vcodec': 'none',
  76. 'acodec': 'wav',
  77. })
  78. title = metadata['Title']
  79. description = metadata.get('Description')
  80. duration = float_or_none(metadata.get('Duration'))
  81. timestamp = unified_timestamp(metadata.get('DateCreated'))
  82. return {
  83. 'id': audio_id,
  84. 'title': title,
  85. 'description': description,
  86. 'duration': duration,
  87. 'timestamp': timestamp,
  88. 'formats': formats,
  89. }