youtube-dl

Another place where youtube-dl lives on
git clone git://git.oshgnacknak.de/youtube-dl.git
Log | Files | Refs | README | LICENSE

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)