]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/jamendo.py
2 from __future__
import unicode_literals
7 from ..compat
import compat_str
8 from .common
import InfoExtractor
16 class JamendoIE(InfoExtractor
):
20 licensing\.jamendo\.com/[^/]+|
21 (?:www\.)?jamendo\.com
23 /track/(?P<id>[0-9]+)(?:/(?P<display_id>[^/?#&]+))?
26 'url': 'https://www.jamendo.com/track/196219/stories-from-emona-i',
27 'md5': '6e9e82ed6db98678f171c25a8ed09ffd',
30 'display_id': 'stories-from-emona-i',
32 # 'title': 'Maya Filipič - Stories from Emona I',
33 'title': 'Stories from Emona I',
34 # 'artist': 'Maya Filipič',
35 'track': 'Stories from Emona I',
37 'thumbnail': r
're:^https?://.*\.jpg',
38 'timestamp': 1217438117,
39 'upload_date': '20080730',
40 'license': 'by-nc-nd',
43 'average_rating': int,
44 'tags': ['piano', 'peaceful', 'newage', 'strings', 'upbeat'],
47 'url': 'https://licensing.jamendo.com/en/track/1496667/energetic-rock',
48 'only_matching': True,
51 def _call_api(self
, resource
, resource_id
):
52 path
= '/api/%ss' % resource
53 rand
= compat_str(random
.random())
54 return self
._download
_json
(
55 'https://www.jamendo.com' + path
, resource_id
, query
={
58 'X-Jam-Call': '$%s*%s~' % (hashlib
.sha1((path
+ rand
).encode()).hexdigest(), rand
)
61 def _real_extract(self
, url
):
62 track_id
, display_id
= self
._VALID
_URL
_RE
.match(url
).groups()
63 # webpage = self._download_webpage(
64 # 'https://www.jamendo.com/track/' + track_id, track_id)
65 # models = self._parse_json(self._html_search_regex(
66 # r"data-bundled-models='([^']+)",
67 # webpage, 'bundled models'), track_id)
68 # track = models['track']['models'][0]
69 track
= self
._call
_api
('track', track_id
)
70 title
= track_name
= track
['name']
71 # get_model = lambda x: try_get(models, lambda y: y[x]['models'][0], dict) or {}
72 # artist = get_model('artist')
73 # artist_name = artist.get('name')
75 # title = '%s - %s' % (artist_name, title)
76 # album = get_model('album')
79 'url': 'https://%s.jamendo.com/?trackid=%s&format=%s&from=app-97dab294'
80 % (sub_domain
, track_id
, format_id
),
81 'format_id': format_id
,
84 } for quality
, (format_id
, sub_domain
, ext
) in enumerate((
85 ('mp31', 'mp3l', 'mp3'),
86 ('mp32', 'mp3d', 'mp3'),
87 ('ogg1', 'ogg', 'ogg'),
88 ('flac', 'flac', 'flac'),
90 self
._sort
_formats
(formats
)
94 for covers
in (track
.get('cover') or {}).values():
95 for cover_id
, cover_url
in covers
.items():
96 if not cover_url
or cover_url
in urls
:
98 urls
.append(cover_url
)
99 size
= int_or_none(cover_id
.lstrip('size'))
108 for tag
in (track
.get('tags') or []):
109 tag_name
= tag
.get('name')
112 tags
.append(tag_name
)
114 stats
= track
.get('stats') or {}
115 license
= track
.get('licenseCC') or []
119 'display_id': display_id
,
120 'thumbnails': thumbnails
,
122 'description': track
.get('description'),
123 'duration': int_or_none(track
.get('duration')),
124 # 'artist': artist_name,
126 # 'album': album.get('name'),
128 'license': '-'.join(license
) if license
else None,
129 'timestamp': int_or_none(track
.get('dateCreated')),
130 'view_count': int_or_none(stats
.get('listenedAll')),
131 'like_count': int_or_none(stats
.get('favorited')),
132 'average_rating': int_or_none(stats
.get('averageNote')),
137 class JamendoAlbumIE(JamendoIE
):
138 _VALID_URL
= r
'https?://(?:www\.)?jamendo\.com/album/(?P<id>[0-9]+)'
140 'url': 'https://www.jamendo.com/album/121486/duck-on-cover',
143 'title': 'Duck On Cover',
144 'description': 'md5:c2920eaeef07d7af5b96d7c64daf1239',
147 'md5': 'e1a2fcb42bda30dfac990212924149a8',
151 'title': 'Shearer - Warmachine',
153 'track': 'Warmachine',
154 'timestamp': 1368089771,
155 'upload_date': '20130509',
158 'md5': '1f358d7b2f98edfe90fd55dac0799d50',
162 'title': 'Shearer - Without Your Ghost',
164 'track': 'Without Your Ghost',
165 'timestamp': 1368089771,
166 'upload_date': '20130509',
174 def _real_extract(self
, url
):
175 album_id
= self
._match
_id
(url
)
176 album
= self
._call
_api
('album', album_id
)
177 album_name
= album
.get('name')
180 for track
in (album
.get('tracks') or []):
181 track_id
= track
.get('id')
184 track_id
= compat_str(track_id
)
186 '_type': 'url_transparent',
187 'url': 'https://www.jamendo.com/track/' + track_id
,
188 'ie_key': JamendoIE
.ie_key(),
193 return self
.playlist_result(
194 entries
, album_id
, album_name
,
195 clean_html(try_get(album
, lambda x
: x
['description']['en'], compat_str
)))