]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/extractor/audiomack.py
   2 from __future__ 
import unicode_literals
 
   7 from .common 
import InfoExtractor
 
   8 from .soundcloud 
import SoundcloudIE
 
  15 class AudiomackIE(InfoExtractor
): 
  16     _VALID_URL 
= r
'https?://(?:www\.)?audiomack\.com/song/(?P<id>[\w/-]+)' 
  21             'url': 'http://www.audiomack.com/song/roosh-williams/extraordinary', 
  26                 'uploader': 'Roosh Williams', 
  27                 'title': 'Extraordinary' 
  30         # audiomack wrapper around soundcloud song 
  32             'add_ie': ['Soundcloud'], 
  33             'url': 'http://www.audiomack.com/song/xclusiveszone/take-kare', 
  37                 'description': 'md5:1fc3272ed7a635cce5be1568c2822997', 
  38                 'title': 'Young Thug ft Lil Wayne - Take Kare', 
  39                 'uploader': 'Young Thug World', 
  40                 'upload_date': '20141016', 
  45     def _real_extract(self
, url
): 
  46         # URLs end with [uploader name]/[uploader title] 
  47         # this title is whatever the user types in, and is rarely 
  48         # the proper song title.  Real metadata is in the api response 
  49         album_url_tag 
= self
._match
_id
(url
) 
  51         # Request the extended version of the api for extra fields like artist and title 
  52         api_response 
= self
._download
_json
( 
  53             'http://www.audiomack.com/api/music/url/song/%s?extended=1&_=%d' % ( 
  54                 album_url_tag
, time
.time()), 
  57         # API is inconsistent with errors 
  58         if 'url' not in api_response 
or not api_response
['url'] or 'error' in api_response
: 
  59             raise ExtractorError('Invalid url %s' % url
) 
  61         # Audiomack wraps a lot of soundcloud tracks in their branded wrapper 
  62         # if so, pass the work off to the soundcloud extractor 
  63         if SoundcloudIE
.suitable(api_response
['url']): 
  64             return {'_type': 'url', 'url': api_response
['url'], 'ie_key': 'Soundcloud'} 
  67             'id': api_response
.get('id', album_url_tag
), 
  68             'uploader': api_response
.get('artist'), 
  69             'title': api_response
.get('title'), 
  70             'url': api_response
['url'], 
  74 class AudiomackAlbumIE(InfoExtractor
): 
  75     _VALID_URL 
= r
'https?://(?:www\.)?audiomack\.com/album/(?P<id>[\w/-]+)' 
  76     IE_NAME 
= 'audiomack:album' 
  78         # Standard album playlist 
  80             'url': 'http://www.audiomack.com/album/flytunezcom/tha-tour-part-2-mixtape', 
  85                 'title': 'Tha Tour: Part 2 (Official Mixtape)' 
  88         # Album playlist ripped from fakeshoredrive with no metadata 
  90             'url': 'http://www.audiomack.com/album/fakeshoredrive/ppp-pistol-p-project', 
  92                 'title': 'PPP (Pistol P Project)', 
  97                     'title': 'PPP (Pistol P Project) - 9. Heaven or Hell (CHIMACA) ft Zuse (prod by DJ FU)', 
 100                     'uploader': 'Lil Herb a.k.a. G Herbo', 
 110     def _real_extract(self
, url
): 
 111         # URLs end with [uploader name]/[uploader title] 
 112         # this title is whatever the user types in, and is rarely 
 113         # the proper song title.  Real metadata is in the api response 
 114         album_url_tag 
= self
._match
_id
(url
) 
 115         result 
= {'_type': 'playlist', 'entries': []} 
 116         # There is no one endpoint for album metadata - instead it is included/repeated in each song's metadata 
 117         # Therefore we don't know how many songs the album has and must infi-loop until failure 
 118         for track_no 
in itertools
.count(): 
 119             # Get song's metadata 
 120             api_response 
= self
._download
_json
( 
 121                 'http://www.audiomack.com/api/music/url/album/%s/%d?extended=1&_=%d' 
 122                 % (album_url_tag
, track_no
, time
.time()), album_url_tag
, 
 123                 note
='Querying song information (%d)' % (track_no 
+ 1)) 
 125             # Total failure, only occurs when url is totally wrong 
 126             # Won't happen in middle of valid playlist (next case) 
 127             if 'url' not in api_response 
or 'error' in api_response
: 
 128                 raise ExtractorError('Invalid url for track %d of album url %s' % (track_no
, url
)) 
 129             # URL is good but song id doesn't exist - usually means end of playlist 
 130             elif not api_response
['url']: 
 133                 # Pull out the album metadata and add to result (if it exists) 
 134                 for resultkey
, apikey 
in [('id', 'album_id'), ('title', 'album_title')]: 
 135                     if apikey 
in api_response 
and resultkey 
not in result
: 
 136                         result
[resultkey
] = api_response
[apikey
] 
 137                 song_id 
= url_basename(api_response
['url']).rpartition('.')[0] 
 138                 result
['entries'].append({ 
 139                     'id': api_response
.get('id', song_id
), 
 140                     'uploader': api_response
.get('artist'), 
 141                     'title': api_response
.get('title', song_id
), 
 142                     'url': api_response
['url'],