Internet radio browser GUI for music/video streams from various directory services.

βŒˆβŒ‹ βŽ‡ branch:  streamtuner2


Artifact [64c5bb569c]

Artifact 64c5bb569c07f2add1fcf05105af427ef4ebf58d:


# encoding: UTF-8
# api: streamtuner2
# title: redditβ›±music
# description: Music recommendations from reddit /r/music etc.
# version: 0.5
# type: channel
# url: http://reddit.com/r/Music
# category: playlist
# config:
#   { name: reddit_pages, type: int, value: 2, description: Number of pages to fetch. }
#   ( name: kill_soundcloud, type: boolean, value: 1, description: Filter soundcloud links (no player configurable). )
# png:
#   iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJ1BMVEUAAAAcICX/AABHSk1jZ299hYz/bmajq6//lY/d0M3C1+3T7P38+/iaLhuGAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF
#   HUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffBRUXIyQbWArCAAAAh0lEQVQI12Pg3g0BDLtXrVq1eveq3Qy7gIxCU9dqEGO11/ZKbzBDenUIUM3u7cGi1UDFW0TE55wsdpZikAw/
#   eebMnMmHGVxqDuUc0zzpynD4zIk5J3vOSDNsOQMG1gy7bI5HTq85Ws2wu/jM9PIzrkArdhmXlzuuXg00eVd5+epVqxmgrtgNAOWeS1KYtcY4AAAAAElFTkSuQmCC
# priority: extra
#
# Just imports Youtube links from music-related subreddits.
# Those are usually new bands or fresh releases, or favorite
# user selections. Soundcloud and weblinks are filtered out.
#
# This plugin currently uses the old reddit API, which will
# be obsolete by August. It's thus a temporary channel, as
# migrating to OAuth or regressing to plain HTML extraction
# is not very enticing.


import json
import re
from config import *
from channels import *
import ahttp


# reddit.com
#
# Uses old API requests such as:
#  β†’ http://www.reddit.com/r/music/new.json?sort=new
#
class reddit (ChannelPlugin):

    # control attributes
    has_search = False
    listformat = "srv"
    audioformat = "video/youtube"
    titles = dict(playing="submitter", listeners="votes", bitrate=False)
    
    # just subreddit names to extract from
    categories = [
        "radioreddit",
        "Music",
        "music_discovery",
        "trueMusic",
        "futurebeats",
        "futurefunkairlines",
        "ElectronicMusic",
        ["acidhouse", "ambientmusic", "bigbeat", "breakbeat", "breakcore", "chillout",
        "darkstep", "deephouse", "DnB", "Dubstep", "EDM", "electronicdancemusic", "electrohouse",
        "electropop", "funkhouse", "gabber", "hardhouse", "house", "industrialmusic",
        "minimal", "partymusic", "psytrance", "Techno", "Trance", "tech_house", "witchhouse"],
        "indiewok",
        "Jazz",
        "ClassicalMusic",
        ["baroque", "composer", "contempory", "ChamberMusic",
        "choralmusic", "EarlyMusic", "ElitistClassical", "opera", "pianocovers"],
        "ListenToThis",
        "ListenToUs",
        "WhatIListenTo",
        "ListenToConcerts",
        "HeadBangToThis",
        "unheardof",
        "under10k",
        "MusicForConcentration", ["MusicToSleepTo"],
        "gamemusic", 
        "2010sMusic", ["2000sMusic", "90sMusic", "80sMusic", "70sMusic", "60sMusic",
        "50sMusic", "SoundsVintage"],
        "PopMusic",
        "Catchysongs",
        "CoverSongs",
        ["ICoveredASong", "MyMusic", "UserProduced", "RepublicOfMusic", "RoyaltyFreeMusic"],
        "musicvideos",
        "Frisson",
        "Turntablists",
    ]


    # static
    def update_categories(self):
        pass


    # Extract video/music news links
    def update_streams(self, cat, search=None):
        
        # radioreddit
        if cat == "radioreddit":
           return self.radioreddit()

        # collect links
        data = []
        after = ""
        for i in range(1, int(conf.reddit_pages) + 1):
            j = json.loads(ahttp.get(
                "http://www.reddit.com/r/{}/new.json?sort=new&after={}".format(
                    cat.lower(), after
                )
            ))
            if not j.get("data",[]).get("children"):
                break
            data += j["data"]["children"]
            after = j["data"]["after"]

        # convert
        r = []
        for row in (ls["data"] for ls in data):

            # find links in text posts
            text_urls = re.findall("\]\((https?://(?:www\.)?youtu[^\"\'\]\)]+)", row.get("selftext", ""))
            url_ext = (re.findall("\.(\w+)$", row["url"]) or [None])[0]
            listformat = "href"

            # Youtube
            if re.search("youtu", row["url"]):
                format = "video/youtube"
                listformat = "srv"
            # direct MP3/Ogg
            elif url_ext in ("mp3", "ogg", "flac", "aac", "aacp"):
                format = "audio/" + url_ext
                listformat = "srv"
                print row
                print url_ext
            # playlists?
            elif url_ext in ("m3u", "pls", "xspf"):
                listformat = url_ext
                format = "audio/x-unknown"
                print url_ext
            # links from selftext
            elif text_urls:
                row["url"] = text_urls[0]
            # filter out Soundcloud etc.
            else:
                continue

            # repack into streams list
            r.append(dict(
                title = row["title"],
                url = row["url"],
                genre = re.findall("\[(.+?)\]", row["title"] + "[-]")[0],
                playing = row["author"],
                listeners = row["score"],
                homepage = "http://reddit.com{}".format(row["permalink"]),
                img = row.get("thumbnail", ""),
                format = format,
                listformat = listformat,
            ))
        return r        


    # static station list
    def radioreddit(self):
        return [
            dict(
                genre=id, title=id.title(),
                url="http://cdn.audiopump.co/radioreddit/"+id+"_mp3_128k",
                format="audio/mpeg", homepage="http://radioreddit.com/",
                listformat="srv"
            )
            for id in [
                "main", "random", "rock", "metal", "indie",
                "electronic", "hiphop", "talk", "festival"
            ]
        ]