palcomp3.py (4532B)
1 # coding: utf-8 2 from __future__ import unicode_literals 3 4 import re 5 6 from .common import InfoExtractor 7 from ..compat import compat_str 8 from ..utils import ( 9 int_or_none, 10 str_or_none, 11 try_get, 12 ) 13 14 15 class PalcoMP3BaseIE(InfoExtractor): 16 _GQL_QUERY_TMPL = '''{ 17 artist(slug: "%s") { 18 %s 19 } 20 }''' 21 _ARTIST_FIELDS_TMPL = '''music(slug: "%%s") { 22 %s 23 }''' 24 _MUSIC_FIELDS = '''duration 25 hls 26 mp3File 27 musicID 28 plays 29 title''' 30 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), 35 })['data'] 36 37 def _parse_music(self, music): 38 music_id = compat_str(music['musicID']) 39 title = music['title'] 40 41 formats = [] 42 hls_url = music.get('hls') 43 if hls_url: 44 formats.append({ 45 'url': hls_url, 46 'protocol': 'm3u8_native', 47 'ext': 'mp4', 48 }) 49 mp3_file = music.get('mp3File') 50 if mp3_file: 51 formats.append({ 52 'url': mp3_file, 53 }) 54 55 return { 56 'id': music_id, 57 'title': title, 58 'formats': formats, 59 'duration': int_or_none(music.get('duration')), 60 'view_count': int_or_none(music.get('plays')), 61 } 62 63 def _real_initialize(self): 64 self._ARTIST_FIELDS_TMPL = self._ARTIST_FIELDS_TMPL % self._MUSIC_FIELDS 65 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) 71 72 73 class PalcoMP3IE(PalcoMP3BaseIE): 74 IE_NAME = 'PalcoMP3:song' 75 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)' 76 _TESTS = [{ 77 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/nossas-composicoes-cuida-bem-dela/', 78 'md5': '99fd6405b2d8fd589670f6db1ba3b358', 79 'info_dict': { 80 'id': '3162927', 81 'ext': 'mp3', 82 'title': 'Nossas Composições - CUIDA BEM DELA', 83 'duration': 210, 84 'view_count': int, 85 } 86 }] 87 88 @classmethod 89 def suitable(cls, url): 90 return False if PalcoMP3VideoIE.suitable(url) else super(PalcoMP3IE, cls).suitable(url) 91 92 93 class PalcoMP3ArtistIE(PalcoMP3BaseIE): 94 IE_NAME = 'PalcoMP3:artist' 95 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<id>[^/?&#]+)' 96 _TESTS = [{ 97 'url': 'https://www.palcomp3.com.br/condedoforro/', 98 'info_dict': { 99 'id': '358396', 100 'title': 'Conde do Forró', 101 }, 102 'playlist_mincount': 188, 103 }] 104 _ARTIST_FIELDS_TMPL = '''artistID 105 musics { 106 nodes { 107 %s 108 } 109 } 110 name''' 111 112 @ classmethod 113 def suitable(cls, url): 114 return False if re.match(PalcoMP3IE._VALID_URL, url) else super(PalcoMP3ArtistIE, cls).suitable(url) 115 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'] 119 120 def entries(): 121 for music in (try_get(artist, lambda x: x['musics']['nodes'], list) or []): 122 yield self._parse_music(music) 123 124 return self.playlist_result( 125 entries(), str_or_none(artist.get('artistID')), artist.get('name')) 126 127 128 class PalcoMP3VideoIE(PalcoMP3BaseIE): 129 IE_NAME = 'PalcoMP3:video' 130 _VALID_URL = r'https?://(?:www\.)?palcomp3\.com(?:\.br)?/(?P<artist>[^/]+)/(?P<id>[^/?&#]+)/?#clipe' 131 _TESTS = [{ 132 'url': 'https://www.palcomp3.com/maiaraemaraisaoficial/maiara-e-maraisa-voce-faz-falta-aqui-ao-vivo-em-vicosa-mg/#clipe', 133 'add_ie': ['Youtube'], 134 'info_dict': { 135 'id': '_pD1nR2qqPg', 136 'ext': 'mp4', 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', 142 } 143 }] 144 _MUSIC_FIELDS = 'youtubeID' 145 146 def _parse_music(self, music): 147 youtube_id = music['youtubeID'] 148 return self.url_result(youtube_id, 'Youtube', youtube_id)