freesound.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import re
  2. from .common import InfoExtractor
  3. from ..utils import (
  4. float_or_none,
  5. get_element_by_class,
  6. get_element_by_id,
  7. unified_strdate,
  8. )
  9. class FreesoundIE(InfoExtractor):
  10. _VALID_URL = r'https?://(?:www\.)?freesound\.org/people/[^/]+/sounds/(?P<id>[^/]+)'
  11. _TEST = {
  12. 'url': 'http://www.freesound.org/people/miklovan/sounds/194503/',
  13. 'md5': '12280ceb42c81f19a515c745eae07650',
  14. 'info_dict': {
  15. 'id': '194503',
  16. 'ext': 'mp3',
  17. 'title': 'gulls in the city.wav',
  18. 'description': 'the sounds of seagulls in the city',
  19. 'duration': 130.233,
  20. 'uploader': 'miklovan',
  21. 'upload_date': '20130715',
  22. 'tags': list,
  23. },
  24. }
  25. def _real_extract(self, url):
  26. audio_id = self._match_id(url)
  27. webpage = self._download_webpage(url, audio_id)
  28. audio_url = self._og_search_property('audio', webpage, 'song url')
  29. title = self._og_search_property('audio:title', webpage, 'song title')
  30. description = self._html_search_regex(
  31. r'(?s)id=["\']sound_description["\'][^>]*>(.+?)</div>',
  32. webpage, 'description', fatal=False)
  33. duration = float_or_none(
  34. get_element_by_class('duration', webpage), scale=1000)
  35. upload_date = unified_strdate(get_element_by_id('sound_date', webpage))
  36. uploader = self._og_search_property(
  37. 'audio:artist', webpage, 'uploader', fatal=False)
  38. channels = self._html_search_regex(
  39. r'Channels</dt><dd>(.+?)</dd>', webpage,
  40. 'channels info', fatal=False)
  41. tags_str = get_element_by_class('tags', webpage)
  42. tags = re.findall(r'<a[^>]+>([^<]+)', tags_str) if tags_str else None
  43. audio_url = re.sub(r'^https?://freesound\.org(https?://)', r'\1', audio_url)
  44. audio_urls = [audio_url]
  45. LQ_FORMAT = '-lq.mp3'
  46. if LQ_FORMAT in audio_url:
  47. audio_urls.append(audio_url.replace(LQ_FORMAT, '-hq.mp3'))
  48. formats = [{
  49. 'url': format_url,
  50. 'format_note': channels,
  51. 'quality': quality,
  52. } for quality, format_url in enumerate(audio_urls)]
  53. return {
  54. 'id': audio_id,
  55. 'title': title,
  56. 'description': description,
  57. 'duration': duration,
  58. 'uploader': uploader,
  59. 'upload_date': upload_date,
  60. 'tags': tags,
  61. 'formats': formats,
  62. }