]> Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/eighttracks.py
debian/changelog: Annotate bugs being closed.
[youtubedl] / youtube_dl / extractor / eighttracks.py
1 # coding: utf-8
2 from __future__ import unicode_literals
3
4 import json
5 import random
6 import re
7
8 from .common import InfoExtractor
9 from ..utils import (
10 compat_str,
11 )
12
13
14 class EightTracksIE(InfoExtractor):
15 IE_NAME = '8tracks'
16 _VALID_URL = r'https?://8tracks\.com/(?P<user>[^/]+)/(?P<id>[^/#]+)(?:#.*)?$'
17 _TEST = {
18 "name": "EightTracks",
19 "url": "http://8tracks.com/ytdl/youtube-dl-test-tracks-a",
20 "info_dict": {
21 'id': '1336550',
22 'display_id': 'youtube-dl-test-tracks-a',
23 "description": "test chars: \"'/\\ä↭",
24 "title": "youtube-dl test tracks \"'/\\ä↭<>",
25 },
26 "playlist": [
27 {
28 "md5": "96ce57f24389fc8734ce47f4c1abcc55",
29 "info_dict": {
30 "id": "11885610",
31 "ext": "m4a",
32 "title": "youtue-dl project<>\"' - youtube-dl test track 1 \"'/\\\u00e4\u21ad",
33 "uploader_id": "ytdl"
34 }
35 },
36 {
37 "md5": "4ab26f05c1f7291ea460a3920be8021f",
38 "info_dict": {
39 "id": "11885608",
40 "ext": "m4a",
41 "title": "youtube-dl project - youtube-dl test track 2 \"'/\\\u00e4\u21ad",
42 "uploader_id": "ytdl"
43 }
44 },
45 {
46 "md5": "d30b5b5f74217410f4689605c35d1fd7",
47 "info_dict": {
48 "id": "11885679",
49 "ext": "m4a",
50 "title": "youtube-dl project as well - youtube-dl test track 3 \"'/\\\u00e4\u21ad",
51 "uploader_id": "ytdl"
52 }
53 },
54 {
55 "md5": "4eb0a669317cd725f6bbd336a29f923a",
56 "info_dict": {
57 "id": "11885680",
58 "ext": "m4a",
59 "title": "youtube-dl project as well - youtube-dl test track 4 \"'/\\\u00e4\u21ad",
60 "uploader_id": "ytdl"
61 }
62 },
63 {
64 "md5": "1893e872e263a2705558d1d319ad19e8",
65 "info_dict": {
66 "id": "11885682",
67 "ext": "m4a",
68 "title": "PH - youtube-dl test track 5 \"'/\\\u00e4\u21ad",
69 "uploader_id": "ytdl"
70 }
71 },
72 {
73 "md5": "b673c46f47a216ab1741ae8836af5899",
74 "info_dict": {
75 "id": "11885683",
76 "ext": "m4a",
77 "title": "PH - youtube-dl test track 6 \"'/\\\u00e4\u21ad",
78 "uploader_id": "ytdl"
79 }
80 },
81 {
82 "md5": "1d74534e95df54986da7f5abf7d842b7",
83 "info_dict": {
84 "id": "11885684",
85 "ext": "m4a",
86 "title": "phihag - youtube-dl test track 7 \"'/\\\u00e4\u21ad",
87 "uploader_id": "ytdl"
88 }
89 },
90 {
91 "md5": "f081f47af8f6ae782ed131d38b9cd1c0",
92 "info_dict": {
93 "id": "11885685",
94 "ext": "m4a",
95 "title": "phihag - youtube-dl test track 8 \"'/\\\u00e4\u21ad",
96 "uploader_id": "ytdl"
97 }
98 }
99 ]
100 }
101
102 def _real_extract(self, url):
103 mobj = re.match(self._VALID_URL, url)
104 playlist_id = mobj.group('id')
105
106 webpage = self._download_webpage(url, playlist_id)
107
108 json_like = self._search_regex(
109 r"(?s)PAGE.mix = (.*?);\n", webpage, 'trax information')
110 data = json.loads(json_like)
111
112 session = str(random.randint(0, 1000000000))
113 mix_id = data['id']
114 track_count = data['tracks_count']
115 first_url = 'http://8tracks.com/sets/%s/play?player=sm&mix_id=%s&format=jsonh' % (session, mix_id)
116 next_url = first_url
117 entries = []
118 for i in range(track_count):
119 api_json = self._download_webpage(
120 next_url, playlist_id,
121 note='Downloading song information %d/%d' % (i + 1, track_count),
122 errnote='Failed to download song information')
123 api_data = json.loads(api_json)
124 track_data = api_data['set']['track']
125 info = {
126 'id': compat_str(track_data['id']),
127 'url': track_data['track_file_stream_url'],
128 'title': track_data['performer'] + u' - ' + track_data['name'],
129 'raw_title': track_data['name'],
130 'uploader_id': data['user']['login'],
131 'ext': 'm4a',
132 }
133 entries.append(info)
134 next_url = 'http://8tracks.com/sets/%s/next?player=sm&mix_id=%s&format=jsonh&track_id=%s' % (
135 session, mix_id, track_data['id'])
136 return {
137 '_type': 'playlist',
138 'entries': entries,
139 'id': compat_str(mix_id),
140 'display_id': playlist_id,
141 'title': data.get('name'),
142 'description': data.get('description'),
143 }