Merge branch 'qqmusic-format-fix' of https://github.com/ping/youtube-dl into ping...
authorYen Chi Hsuan <yan12125@gmail.com>
Mon, 6 Jul 2015 09:24:44 +0000 (17:24 +0800)
committerYen Chi Hsuan <yan12125@gmail.com>
Mon, 6 Jul 2015 09:24:44 +0000 (17:24 +0800)
1  2 
youtube_dl/extractor/qqmusic.py

index 03e6c688f870d4dec3c57445497233409ef09e51,7183c2bb1147ba61103a69540e5f803d9ce9228e..8a724ab5117ae8e4b05f427b47b0562f7a037f71
@@@ -9,7 -9,6 +9,7 @@@ from .common import InfoExtracto
  from ..utils import (
      strip_jsonp,
      unescapeHTML,
 +    clean_html,
  )
  from ..compat import compat_urllib_request
  
@@@ -27,6 -26,20 +27,20 @@@ class QQMusicIE(InfoExtractor)
              'upload_date': '20141227',
              'creator': '林俊杰',
              'description': 'md5:d327722d0361576fde558f1ac68a7065',
+             'thumbnail': 'http://i.gtimg.cn/music/photo/mid_album_500/7/p/001IV22P1RDX7p.jpg',
+         }
+     }, {
+         'note': 'There is no mp3-320 version of this song.',
+         'url': 'http://y.qq.com/#type=song&mid=004MsGEo3DdNxV',
+         'md5': 'fa3926f0c585cda0af8fa4f796482e3e',
+         'info_dict': {
+             'id': '004MsGEo3DdNxV',
+             'ext': 'mp3',
+             'title': '如果',
+             'upload_date': '20050626',
+             'creator': '李季美',
+             'description': 'md5:46857d5ed62bc4ba84607a805dccf437',
+             'thumbnail': 'http://i.gtimg.cn/music/photo/mid_album_500/r/Q/0042owYj46IxrQ.jpg',
          }
      }]
  
          if lrc_content:
              lrc_content = lrc_content.replace('\\n', '\n')
  
+         thumbnail_url = None
+         albummid = self._search_regex(
+             [r'albummid:\'([0-9a-zA-Z]+)\'', r'"albummid":"([0-9a-zA-Z]+)"'],
+             detail_info_page, 'album mid', default=None)
+         if albummid:
+             thumbnail_url = "http://i.gtimg.cn/music/photo/mid_album_500/%s/%s/%s.jpg" \
+                             % (albummid[-2:-1], albummid[-1], albummid)
          guid = self.m_r_get_ruin()
  
          vkey = self._download_json(
                  'preference': details['preference'],
                  'abr': details.get('abr'),
              })
+         self._check_formats(formats, mid)
          self._sort_formats(formats)
  
          return {
              'upload_date': publish_time,
              'creator': singer,
              'description': lrc_content,
+             'thumbnail': thumbnail_url,
          }
  
  
@@@ -164,40 -187,31 +188,40 @@@ class QQMusicAlbumIE(QQPlaylistBaseIE)
      IE_NAME = 'qqmusic:album'
      _VALID_URL = r'http://y.qq.com/#type=album&mid=(?P<id>[0-9A-Za-z]+)'
  
 -    _TEST = {
 -        'url': 'http://y.qq.com/#type=album&mid=000gXCTb2AhRR1&play=0',
 +    _TESTS = [{
 +        'url': 'http://y.qq.com/#type=album&mid=000gXCTb2AhRR1',
          'info_dict': {
              'id': '000gXCTb2AhRR1',
              'title': '我们都是这样长大的',
 -            'description': 'md5:d216c55a2d4b3537fe4415b8767d74d6',
 +            'description': 'md5:179c5dce203a5931970d306aa9607ea6',
          },
          'playlist_count': 4,
 -    }
 +    }, {
 +        'url': 'http://y.qq.com/#type=album&mid=002Y5a3b3AlCu3',
 +        'info_dict': {
 +            'id': '002Y5a3b3AlCu3',
 +            'title': '그리고...',
 +            'description': 'md5:a48823755615508a95080e81b51ba729',
 +        },
 +        'playlist_count': 8,
 +    }]
  
      def _real_extract(self, url):
          mid = self._match_id(url)
  
 -        album_page = self._download_webpage(
 -            self.qq_static_url('album', mid), mid, 'Download album page')
 -
 -        entries = self.get_entries_from_page(album_page)
 +        album = self._download_json(
 +            'http://i.y.qq.com/v8/fcg-bin/fcg_v8_album_info_cp.fcg?albummid=%s&format=json' % mid,
 +            mid, 'Download album page')['data']
  
 -        album_name = self._html_search_regex(
 -            r"albumname\s*:\s*'([^']+)',", album_page, 'album name',
 -            default=None)
 -
 -        album_detail = self._html_search_regex(
 -            r'<div class="album_detail close_detail">\s*<p>((?:[^<>]+(?:<br />)?)+)</p>',
 -            album_page, 'album details', default=None)
 +        entries = [
 +            self.url_result(
 +                'http://y.qq.com/#type=song&mid=' + song['songmid'], 'QQMusic', song['songmid']
 +            ) for song in album['list']
 +        ]
 +        album_name = album.get('name')
 +        album_detail = album.get('desc')
 +        if album_detail is not None:
 +            album_detail = album_detail.strip()
  
          return self.playlist_result(entries, mid, album_name, album_detail)
  
@@@ -253,36 -267,3 +277,36 @@@ class QQMusicToplistIE(QQPlaylistBaseIE
          list_name = topinfo.get('ListName')
          list_description = topinfo.get('info')
          return self.playlist_result(entries, list_id, list_name, list_description)
 +
 +
 +class QQMusicPlaylistIE(QQPlaylistBaseIE):
 +    IE_NAME = 'qqmusic:playlist'
 +    _VALID_URL = r'http://y\.qq\.com/#type=taoge&id=(?P<id>[0-9]+)'
 +
 +    _TEST = {
 +        'url': 'http://y.qq.com/#type=taoge&id=3462654915',
 +        'info_dict': {
 +            'id': '3462654915',
 +            'title': '韩国5月新歌精选下旬',
 +            'description': 'md5:d2c9d758a96b9888cf4fe82f603121d4',
 +        },
 +        'playlist_count': 40,
 +    }
 +
 +    def _real_extract(self, url):
 +        list_id = self._match_id(url)
 +
 +        list_json = self._download_json(
 +            'http://i.y.qq.com/qzone-music/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&disstid=%s'
 +            % list_id, list_id, 'Download list page',
 +            transform_source=strip_jsonp)['cdlist'][0]
 +
 +        entries = [
 +            self.url_result(
 +                'http://y.qq.com/#type=song&mid=' + song['songmid'], 'QQMusic', song['songmid']
 +            ) for song in list_json['songlist']
 +        ]
 +
 +        list_name = list_json.get('dissname')
 +        list_description = clean_html(unescapeHTML(list_json.get('desc')))
 +        return self.playlist_result(entries, list_id, list_name, list_description)