2 from __future__ import unicode_literals
6 from .common import InfoExtractor
7 from ..compat import compat_str
15 class PalcoMP3BaseIE(InfoExtractor):
16 _GQL_QUERY_TMPL = '''{
21 _ARTIST_FIELDS_TMPL = '''music(slug: "%%s") {
24 _MUSIC_FIELDS = '''duration
31 def _call_api(self, artist_slug, artist_fields):
32 return self._download_json(
33 'https://www.palcomp3.com.br/graphql/', artist_slug, query={
34 'query': self._GQL_QUERY_TMPL % (artist_slug, artist_fields),
37 def _parse_music(self, music):
38 music_id = compat_str(music['musicID'])
39 title = music['title']
42 hls_url = music.get('hls')
46 'protocol': 'm3u8_native',
49 mp3_file = music.get('mp3File')
59 'duration': int_or_none(music.get('duration')),
60 'view_count': int_or_none(music.get('plays')),
63 def _real_initialize(self):
64 self._ARTIST_FIELDS_TMPL = self._ARTIST_FIELDS_TMPL % self._MUSIC_FIELDS
66 def _real_extract(self, url):
67 artist_slug, music_slug = re.match(self._VALID_URL, url).groups()
68 artist_fields = self._ARTIST_FIELDS_TMPL % music_slug
69 music = self._call_api(artist_slug, artist_fields)['artist']['music']
70 return self._parse_music(music)
73 class PalcoMP3IE(PalcoMP3BaseIE):
74 IE_NAME = 'PalcoMP3:song'
75 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)'
77 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/nossas-composicoes-cuida-bem-dela/',
78 'md5': '99fd6405b2d8fd589670f6db1ba3b358',
82 'title': 'Nossas Composições - CUIDA BEM DELA',
89 def suitable(cls, url):
90 return False if PalcoMP3VideoIE.suitable(url) else super(PalcoMP3IE, cls).suitable(url)
93 class PalcoMP3ArtistIE(PalcoMP3BaseIE):
94 IE_NAME = 'PalcoMP3:artist'
95 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<id>[^/?&#]+)'
97 'url': 'https://www.palcomp3.com.br/condedoforro/',
100 'title': 'Conde do Forró',
102 'playlist_mincount': 188,
104 _ARTIST_FIELDS_TMPL = '''artistID
113 def suitable(cls, url):
114 return False if re.match(PalcoMP3IE._VALID_URL, url) else super(PalcoMP3ArtistIE, cls).suitable(url)
116 def _real_extract(self, url):
117 artist_slug = self._match_id(url)
118 artist = self._call_api(artist_slug, self._ARTIST_FIELDS_TMPL)['artist']
121 for music in (try_get(artist, lambda x: x['musics']['nodes'], list) or []):
122 yield self._parse_music(music)
124 return self.playlist_result(
125 entries(), str_or_none(artist.get('artistID')), artist.get('name'))
128 class PalcoMP3VideoIE(PalcoMP3BaseIE):
129 IE_NAME = 'PalcoMP3:video'
130 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)/?#clipe'
132 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/maiara-e-maraisa-voce-faz-falta-aqui-ao-vivo-em-vicosa-mg/#clipe',
133 'add_ie': ['Youtube'],
137 'title': 'Maiara e Maraisa - Você Faz Falta Aqui - DVD Ao Vivo Em Campo Grande',
138 'description': 'md5:7043342c09a224598e93546e98e49282',
139 'upload_date': '20161107',
140 'uploader_id': 'maiaramaraisaoficial',
141 'uploader': 'Maiara e Maraisa',
144 _MUSIC_FIELDS = 'youtubeID'
146 def _parse_music(self, music):
147 youtube_id = music['youtubeID']
148 return self.url_result(youtube_id, 'Youtube', youtube_id)