]>
Commit | Line | Data |
---|---|---|
39ed931e | 1 | from .common import InfoExtractor |
2 | from ..compat import compat_str | |
3 | from ..utils import ( | |
4 | int_or_none, | |
5 | str_or_none, | |
6 | try_get, | |
7 | ) | |
8 | ||
9 | ||
10 | class PalcoMP3BaseIE(InfoExtractor): | |
11 | _GQL_QUERY_TMPL = '''{ | |
12 | artist(slug: "%s") { | |
13 | %s | |
14 | } | |
15 | }''' | |
16 | _ARTIST_FIELDS_TMPL = '''music(slug: "%%s") { | |
17 | %s | |
18 | }''' | |
19 | _MUSIC_FIELDS = '''duration | |
20 | hls | |
21 | mp3File | |
22 | musicID | |
23 | plays | |
24 | title''' | |
25 | ||
26 | def _call_api(self, artist_slug, artist_fields): | |
27 | return self._download_json( | |
28 | 'https://www.palcomp3.com.br/graphql/', artist_slug, query={ | |
29 | 'query': self._GQL_QUERY_TMPL % (artist_slug, artist_fields), | |
30 | })['data'] | |
31 | ||
32 | def _parse_music(self, music): | |
33 | music_id = compat_str(music['musicID']) | |
34 | title = music['title'] | |
35 | ||
36 | formats = [] | |
37 | hls_url = music.get('hls') | |
38 | if hls_url: | |
39 | formats.append({ | |
40 | 'url': hls_url, | |
41 | 'protocol': 'm3u8_native', | |
42 | 'ext': 'mp4', | |
43 | }) | |
44 | mp3_file = music.get('mp3File') | |
45 | if mp3_file: | |
46 | formats.append({ | |
47 | 'url': mp3_file, | |
48 | }) | |
49 | ||
50 | return { | |
51 | 'id': music_id, | |
52 | 'title': title, | |
53 | 'formats': formats, | |
54 | 'duration': int_or_none(music.get('duration')), | |
55 | 'view_count': int_or_none(music.get('plays')), | |
56 | } | |
57 | ||
58 | def _real_initialize(self): | |
59 | self._ARTIST_FIELDS_TMPL = self._ARTIST_FIELDS_TMPL % self._MUSIC_FIELDS | |
60 | ||
61 | def _real_extract(self, url): | |
5ad28e7f | 62 | artist_slug, music_slug = self._match_valid_url(url).groups() |
39ed931e | 63 | artist_fields = self._ARTIST_FIELDS_TMPL % music_slug |
64 | music = self._call_api(artist_slug, artist_fields)['artist']['music'] | |
65 | return self._parse_music(music) | |
66 | ||
67 | ||
68 | class PalcoMP3IE(PalcoMP3BaseIE): | |
69 | IE_NAME = 'PalcoMP3:song' | |
70 | _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)' | |
71 | _TESTS = [{ | |
72 | 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/nossas-composicoes-cuida-bem-dela/', | |
73 | 'md5': '99fd6405b2d8fd589670f6db1ba3b358', | |
74 | 'info_dict': { | |
75 | 'id': '3162927', | |
76 | 'ext': 'mp3', | |
77 | 'title': 'Nossas Composições - CUIDA BEM DELA', | |
78 | 'duration': 210, | |
79 | 'view_count': int, | |
80 | } | |
81 | }] | |
82 | ||
83 | @classmethod | |
84 | def suitable(cls, url): | |
85 | return False if PalcoMP3VideoIE.suitable(url) else super(PalcoMP3IE, cls).suitable(url) | |
86 | ||
87 | ||
88 | class PalcoMP3ArtistIE(PalcoMP3BaseIE): | |
89 | IE_NAME = 'PalcoMP3:artist' | |
90 | _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<id>[^/?&#]+)' | |
91 | _TESTS = [{ | |
92 | 'url': 'https://www.palcomp3.com.br/condedoforro/', | |
93 | 'info_dict': { | |
94 | 'id': '358396', | |
95 | 'title': 'Conde do Forró', | |
96 | }, | |
97 | 'playlist_mincount': 188, | |
98 | }] | |
99 | _ARTIST_FIELDS_TMPL = '''artistID | |
100 | musics { | |
101 | nodes { | |
102 | %s | |
103 | } | |
104 | } | |
105 | name''' | |
106 | ||
b5ae35ee | 107 | @classmethod |
39ed931e | 108 | def suitable(cls, url): |
5ad28e7f | 109 | return False if PalcoMP3IE._match_valid_url(url) else super(PalcoMP3ArtistIE, cls).suitable(url) |
39ed931e | 110 | |
111 | def _real_extract(self, url): | |
112 | artist_slug = self._match_id(url) | |
113 | artist = self._call_api(artist_slug, self._ARTIST_FIELDS_TMPL)['artist'] | |
114 | ||
115 | def entries(): | |
116 | for music in (try_get(artist, lambda x: x['musics']['nodes'], list) or []): | |
117 | yield self._parse_music(music) | |
118 | ||
119 | return self.playlist_result( | |
120 | entries(), str_or_none(artist.get('artistID')), artist.get('name')) | |
121 | ||
122 | ||
123 | class PalcoMP3VideoIE(PalcoMP3BaseIE): | |
124 | IE_NAME = 'PalcoMP3:video' | |
125 | _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)/?#clipe' | |
126 | _TESTS = [{ | |
127 | 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/maiara-e-maraisa-voce-faz-falta-aqui-ao-vivo-em-vicosa-mg/#clipe', | |
128 | 'add_ie': ['Youtube'], | |
129 | 'info_dict': { | |
130 | 'id': '_pD1nR2qqPg', | |
131 | 'ext': 'mp4', | |
132 | 'title': 'Maiara e Maraisa - Você Faz Falta Aqui - DVD Ao Vivo Em Campo Grande', | |
133 | 'description': 'md5:7043342c09a224598e93546e98e49282', | |
134 | 'upload_date': '20161107', | |
135 | 'uploader_id': 'maiaramaraisaoficial', | |
136 | 'uploader': 'Maiara e Maraisa', | |
137 | } | |
138 | }] | |
139 | _MUSIC_FIELDS = 'youtubeID' | |
140 | ||
141 | def _parse_music(self, music): | |
142 | youtube_id = music['youtubeID'] | |
143 | return self.url_result(youtube_id, 'Youtube', youtube_id) |