[22Tracks] Add new extractor

This commit is contained in:
Amish Bhadeshia 2015-03-23 13:02:44 +00:00
parent 944a3de278
commit d6c074392e
2 changed files with 115 additions and 0 deletions

View File

@ -370,6 +370,10 @@ from .tudou import TudouIE
from .tumblr import TumblrIE from .tumblr import TumblrIE
from .turbo import TurboIE from .turbo import TurboIE
from .tutv import TutvIE from .tutv import TutvIE
from .twentytwotracks import (
TwentyTwoTracksIE,
TwentyTwoTracksGenreIE
)
from .tvigle import TvigleIE from .tvigle import TvigleIE
from .tvp import TvpIE from .tvp import TvpIE
from .tvplay import TVPlayIE from .tvplay import TVPlayIE

View File

@ -0,0 +1,111 @@
from __future__ import unicode_literals
import re
from .common import InfoExtractor
# 22Tracks regularly replace the audio tracks that can be streamed on their
# site. The tracks usually expire after 1 months, so we can't add tests.
class TwentyTwoTracksIE(InfoExtractor):
_VALID_URL = r'http://22tracks\.com/([a-z]+)/([a-z]+[2]*)/(\d+)'
IE_NAME = 'TwentyTwoTracks:Tracks'
def _extract_info(self, city, genre, track=''):
self._base_url = "http://22tracks.com/api/"
if track == '':
itemid = genre
else:
itemid = track
cities = self._download_json(
self._base_url + 'cities', itemid,
'Downloading city info', 'Cannot download city info')
city_id = [x['id'] for x in cities if x['slug'] == city]
genres = self._download_json(
self._base_url + 'genres/' + str(city_id[0]), itemid,
'Downloading genre info', 'Cannot download genre info')
genre_id = [x['id'] for x in genres if x['slug'] == genre]
tracks = self._download_json(
self._base_url + 'tracks/' + str(genre_id[0]),
itemid, 'Downloading track info', 'Cannot download track info')
if track == '':
return [[x['title'] for x in genres if x['slug'] == genre][0],
tracks]
else:
return [x for x in tracks if x['id'] == itemid][0]
def _get_token(self, filename, track_id):
token = self._download_json(
'http://22tracks.com/token.php?desktop=true&u=%2F128%2f{0}'.format(
filename), track_id, 'Finding download link...')
down_url = 'http://audio.22tracks.com{0}?st={1}&e={2}'.format(
token['filename'],
token['st'],
token['e'])
return down_url
def _real_extract(self, url):
mobj = re.match(self._VALID_URL, url)
city_id = mobj.group(1)
genre_id = mobj.group(2)
track_id = mobj.group(3)
self.to_screen(':: Track ID found! - Downloading single track')
track_info = self._extract_info(city_id, genre_id, track_id)
download_url = self._get_token(track_info['filename'], track_id)
title = '{0}-{1}'.format(
track_info['artist'].strip(), track_info['title'].strip())
return {
'id': track_id,
'url': download_url,
'ext': 'mp3',
'title': title,
'duration': track_info['duration']
}
class TwentyTwoTracksGenreIE(TwentyTwoTracksIE):
_VALID_URL = r'http://22tracks\.com/([a-z]+)/([a-z]+[2]*)/?'
IE_NAME = 'TwentyTwoTracks:Genre'
def _real_extract(self, url):
mobj = re.match(self._VALID_URL, url)
city_id = mobj.group(1)
genre_id = mobj.group(2)
self.to_screen(':: Track ID not found! - Downloading entire genre')
playlist_info = self._extract_info(city_id, genre_id)
entries = []
for track in playlist_info[1]:
title = '{0}-{1}'.format(
track['artist'].strip(), track['title'].strip())
entries.append({
'id': track['id'],
'url': self._get_token(track['filename'], track['id']),
'ext': 'mp3',
'title': title
})
self.to_screen(':: Links found - Downloading Playlist')
return {
'_type': 'playlist',
'id': genre_id,
'title': playlist_info[0],
'entries': entries
}