[freesound] Fix extraction and extended (closes #11602)
authorsh!zeeg <shizeeque@gmail.com>
Thu, 5 Jan 2017 01:52:42 +0000 (04:52 +0300)
committerSergey M․ <dstftw@gmail.com>
Thu, 12 Jan 2017 15:35:14 +0000 (22:35 +0700)
youtube_dl/extractor/freesound.py

index 5ff62af2a33d1743709bdb076dc0c80be0e3156b..f0b2400cfa7dfcca66fdfb2a7dd890797ccee59c 100644 (file)
@@ -3,6 +3,15 @@ from __future__ import unicode_literals
 import re
 
 from .common import InfoExtractor
+from ..utils import (
+    determine_ext,
+    float_or_none,
+    get_element_by_class,
+    get_element_by_id,
+    int_or_none,
+    parse_filesize,
+    unified_strdate,
+)
 
 
 class FreesoundIE(InfoExtractor):
@@ -23,17 +32,53 @@ class FreesoundIE(InfoExtractor):
         mobj = re.match(self._VALID_URL, url)
         music_id = mobj.group('id')
         webpage = self._download_webpage(url, music_id)
-        title = self._html_search_regex(
-            r'<div id="single_sample_header">.*?<a href="#">(.+?)</a>',
-            webpage, 'music title', flags=re.DOTALL)
+
+        audio_url = self._og_search_property('audio', webpage, 'song url')
+        title = self._og_search_property('audio:title', webpage, 'song title')
+        duration = float_or_none(get_element_by_class('duration', webpage), scale=1000)
+        tags = get_element_by_class('tags', webpage)
+        sound_info = get_element_by_id('sound_information_box', webpage)
+        release_date = get_element_by_id('sound_date', webpage)
+
         description = self._html_search_regex(
             r'<div id="sound_description">(.*?)</div>', webpage, 'description',
             fatal=False, flags=re.DOTALL)
 
+        download_count = int_or_none(self._html_search_regex(
+            r'Downloaded.*>(\d+)<', webpage, 'downloaded', fatal=False))
+
+        filesize = float_or_none(parse_filesize(self._search_regex(
+            r'Filesize</dt><dd>(.*)</dd>', sound_info, 'file size (approx)', fatal=False)))
+
+        if release_date:
+            release_date = unified_strdate(release_date.replace('th', ''))
+
+        bitdepth = self._html_search_regex(
+            r'Bitdepth</dt><dd>(.*)</dd>', sound_info, 'Bitdepth', fatal=False)
+
+        channels = self._html_search_regex(
+            r'Channels</dt><dd>(.*)</dd>', sound_info, 'Channels info', fatal=False)
+
+        formats = [{
+            'url': audio_url,
+            'id': music_id,
+            'format_id': self._og_search_property('audio:type', webpage, 'audio format', fatal=False),
+            'format_note': '{0} {1} {2}'.format(determine_ext(audio_url), bitdepth, channels),
+            'filesize_approx': filesize,
+            'asr': int_or_none(self._html_search_regex(
+                r'Samplerate</dt><dd>(\d+).*</dd>',
+                sound_info, 'samplerate', fatal=False)),
+        }]
+
         return {
             'id': music_id,
             'title': title,
-            'url': self._og_search_property('audio', webpage, 'music url'),
-            'uploader': self._og_search_property('audio:artist', webpage, 'music uploader'),
+            'uploader': self._og_search_property('audio:artist', webpage, 'music uploader', fatal=False),
             'description': description,
+            'duration': duration,
+            'tags': [self._html_search_regex(r'>(.*)</a>', t, 'tag', fatal=False)
+                     for t in tags.split('\n') if t.strip()],
+            'formats': formats,
+            'release_date': release_date,
+            'likes_count': download_count,
         }