diff options
Diffstat (limited to 'module/plugins')
| -rw-r--r-- | module/plugins/hoster/SoundcloudCom.py | 88 | 
1 files changed, 43 insertions, 45 deletions
| diff --git a/module/plugins/hoster/SoundcloudCom.py b/module/plugins/hoster/SoundcloudCom.py index c7c9c3880..c559b392b 100644 --- a/module/plugins/hoster/SoundcloudCom.py +++ b/module/plugins/hoster/SoundcloudCom.py @@ -1,57 +1,55 @@  # -*- coding: utf-8 -*- -import pycurl  import re -from module.plugins.Hoster import Hoster +from module.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo +from module.common.json_layer import json_loads -class SoundcloudCom(Hoster): +class SoundcloudCom(SimpleHoster):      __name__    = "SoundcloudCom"      __type__    = "hoster" -    __version__ = "0.10" +    __version__ = "0.11" -    __pattern__ = r'https?://(?:www\.)?soundcloud\.com/(?P<UID>.+?)/(?P<SID>.+)' +    __pattern__ = r'https?://(?:www\.)?soundcloud\.com/[\w-]+/[\w-]+' +    __config__  = [("quality", "Lower;Higher", "Quality", "Higher")]      __description__ = """SoundCloud.com hoster plugin"""      __license__     = "GPLv3" -    __authors__     = [("Peekayy", "peekayy.dev@gmail.com")] - - -    def process(self, pyfile): -        # default UserAgent of HTTPRequest fails for this hoster so we use this one -        self.req.http.c.setopt(pycurl.USERAGENT, 'Mozilla/5.0') -        self.html = self.load(pyfile.url) -        m = re.search(r'<div class="haudio.*?large.*?" data-sc-track="(?P<ID>\d*)"', self.html) -        songId = clientId = "" -        if m: -            songId = m.group('ID') -        if len(songId) <= 0: -            self.logError(_("Could not find song id")) -            self.offline() -        else: -            m = re.search(r'"clientID":"(?P<CID>.*?)"', self.html) -            if m: -                clientId = m.group('CID') - -            if len(clientId) <= 0: -                clientId = "b45b1aa10f1ac2941910a7f0d10f8e28" - -            m = re.search(r'<em itemprop="name">\s(?P<TITLE>.*?)\s</em>', self.html) -            if m: -                pyfile.name = m.group('TITLE') + ".mp3" -            else: -                pyfile.name = re.match(self.__pattern__, pyfile.url).group('SID') + ".mp3" - -            # url to retrieve the actual song url -            self.html = self.load("https://api.sndcdn.com/i1/tracks/%s/streams" % songId, get={"client_id": clientId}) -            # getting streams -            # for now we choose the first stream found in all cases -            # it could be improved if relevant for this hoster -            streams = [ -                (result.group('QUALITY'), result.group('URL')) -                for result in re.finditer(r'"(?P<QUALITY>.*?)":"(?P<URL>.*?)"', self.html) -            ] -            self.logDebug("Found Streams", streams) -            self.logDebug("Downloading", streams[0][0], streams[0][1]) -            self.download(streams[0][1]) +    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")] + + +    NAME_PATTERN    = r'title" content="(?P<N>.+?)"' +    OFFLINE_PATTERN = r'<title>"SoundCloud - Hear the world’s sounds"</title>' + + +    def handleFree(self, pyfile): +        try: +            song_id = re.search(r'sounds:(\d+)"', self.html).group(1) + +        except Exception: +            self.error(_("Could not find song id")) + +        try: +            client_id = re.search(r'"clientID":"(.+?)"', self.html).group(1) + +        except Exception: +            client_id = "b45b1aa10f1ac2941910a7f0d10f8e28" + +        # url to retrieve the actual song url +        streams = json_loads(self.load("https://api.soundcloud.com/tracks/%s/streams" % song_id, +                             get={'client_id': client_id})) + +        regex = re.compile(r'[^\d]') +        http_streams = sorted([(key, value) for key, value in streams.iteritems() if key.startswith('http_')], +                              key=lambda t: regex.sub(t[0], ''), +                              reverse=True) + +        self.logDebug("Streams found: %s" % (http_streams or "None")) + +        if http_streams: +            stream_name, self.link = http_streams[0 if self.getConfig('quality') == "Higher" else -1] +            pyfile.name += '.' + stream_name.split('_')[1].lower() + + +getInfo = create_getInfo(SoundcloudCom) | 
