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

⌈⌋ ⎇ branch:  streamtuner2


Check-in [d702f2e1c5]

Overview
Comment:Updated default categories, new sorting options.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: d702f2e1c584dd41323dc57cbf8364a885172516
User & Date: mario on 2016-04-06 00:24:42
Other Links: manifest | tags
Context
2016-04-07
00:17
Generate static plugin list for fossil wiki. check-in: e2867b44a2 user: mario tags: trunk
2016-04-06
00:24
Updated default categories, new sorting options. check-in: d702f2e1c5 user: mario tags: trunk
00:10
separate comment about "buffy" mode check-in: 6efe77d742 user: mario tags: trunk
Changes

Modified contrib/vtuner.py from [7f6be45465] to [6f96a2a9ba].

1
2
3
4
5
6
7
8
9
10

11
12
13
14
15
16
17
18


19

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39



40
41
42






43

44
45

46
47
48
49



50




51
52
53

54
55
56
57
58
59
60
61

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# encoding: UTF-8
# api: streamtuner2
# title: vTuner
# url: http://vtuner.com/
# description: 
# version: 0.1
# type: channel
# category: radio
# config:
#   { name: vtuner_pages,  value: 1,  type: int,  description: "Pages" }

# priority: contrib
# png:
#   iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhFBMVEUAAACIowCIowCIowCIowAkWlsAP3yIowCIowATTWoAP3wAP3xrjhsAP3wAP3yIowAAP3wAP3wAP3wMSHEbU2MAP3wV
#   TmkAP3wAP3wAP3yIowAAP3wJRXQzZU5Vfi9ehCcRTG1EcT4aUmWAnQgiWF0rXlVmih88a0Z3lxBNdzZvkBf///9k8C2HAAAAGnRSTlMAML8QgO8wIJ9wj3DfEN9wr2BAr++/z1Cfzypf+6cAAAABYktHRCskueQIAAAAB3RJTUUH4AQEFxQcg7S+WgAAAJFJREFUGNNVjlkWgjAMRSOiOCJzMa9SQGit
#   +1+gQ5CD+ct9Q0JEtArW9Dchb7ZEUTiDaLc/0PHEC885pvgSLFNJmizXLC9Q5Nm8p/rWGNO06U8H0DH3wOQpAXNnHjRKAdAjM1tAQ8DYOgHoBbgGsPx4R0YBFetvK1wlQHmr4fnZd2q6W/vhU+vr+TN1HTpXif4CK/0NNsIh2vQAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDQtMDVUMDE6MjA6MjAr
#   MDI6MDD2b3oJAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA0LTA1VDAxOjIwOjIwKzAyOjAwhzLCtQAAAABJRU5ErkJggg==
#
#


#


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


# vTuner directory
class vtuner (ChannelPlugin):

    # module attributes
    module = "vtuner"
    listformat = "pls"
    has_search = False
    categories = [
         "Alternative", "Folk", "Show Tunes", "Ambient", "Gospel", "Smooth Jazz",
         "Big Band", "Hard Rock", "Soft Rock", "Bluegrass", "Hip Hop",
         "Soundtracks", "Blues", "Holiday", "Top 40", "Celtic", "Jazz", "Variety",
         "Christian Contemporary", "Latin Hits", "World", "Christian Rock", "New Age",
         "World Asia", "Classic Rock", "Oldies", "World Europe", "Classical",



         "Pop", "World Hawaiian", "College", "Public", "World India", "Country",
         "R&B", "World Middle East", "Dance", "Reggae", "World", "Native American",
         "Electronica", "Rock", "World Tropical"






    ]

    titles = dict( genre="Genre", title="Station", playing="Location", bitrate="Bitrate", listeners=False )


    

    # just a static list for now
    def update_categories(self):



        pass






    # summarize links from surfmusik

    def update_streams(self, cat):

        entries = []
        url = "http://vtuner.com/setupapp/guide/asp/BrowseStations/BrowsePremiumStations.asp?sCategory=%s&sBrowseType=Format&sViewBy=&sSortby=POP&sWhatList=&sNiceLang=&iCurrPage=%s"
        html = ""
        for i in xrange(1, int(conf.vtuner_pages) + 1):
            html = html + ahttp.get(url % (cat, i))


        rx_radio = re.compile(r"""
            <a\s+href="\.\./func/dynampls.asp\?link=1&id=(\d+)">([^<>]+)</a>
            .+? "middle">([^<>]+)</td>
            .+? Category.+?>([^<>]+)</td>
            .+? <td.+?>(\w+)&nbsp;(\d+)K</td>
        """, re.X|re.S|re.I)

        # per-country list
        for uu in rx_radio.findall(html):
            log.DATA(uu)
            (id, title, loc, genre, fmt, br) = uu
            

            entries.append({
                "title": title,
                "url": "http://vtuner.com/setupapp/guide/asp/func/dynampls.asp?link=1&id=%s" % id, 
                "playing": loc,
                "genre": genre,
                "format": mime_fmt(fmt),
                "bitrate": int(br),
            })

        # done    
        return entries







|



|
>








>
>

>















|
<
<
|
|
>
>
>
|
|
|
>
>
>
>
>
>

>


>


|

>
>
>
|
>
>
>
>


<
>

<

<


|

>







|

<

<
<













1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39


40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

73
74

75

76
77
78
79
80
81
82
83
84
85
86
87
88
89

90


91
92
93
94
95
96
97
98
99
100
101
102
103
# encoding: UTF-8
# api: streamtuner2
# title: vTuner
# url: http://vtuner.com/
# description: 
# version: 0.2
# type: channel
# category: radio
# config:
#   { name: vtuner_pages,  value: 1,  type: int,  description: "Number of pages to fetch." }
#   { name: vtuner_order,  value: "POP",  type: select,  select: "POP=Popularity|AA=Alphabetically|HBR=Quality|RELI=Uptime|OP=Country",  description: "Station sorting order." }
# priority: contrib
# png:
#   iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAhFBMVEUAAACIowCIowCIowCIowAkWlsAP3yIowCIowATTWoAP3wAP3xrjhsAP3wAP3yIowAAP3wAP3wAP3wMSHEbU2MAP3wV
#   TmkAP3wAP3wAP3yIowAAP3wJRXQzZU5Vfi9ehCcRTG1EcT4aUmWAnQgiWF0rXlVmih88a0Z3lxBNdzZvkBf///9k8C2HAAAAGnRSTlMAML8QgO8wIJ9wj3DfEN9wr2BAr++/z1Cfzypf+6cAAAABYktHRCskueQIAAAAB3RJTUUH4AQEFxQcg7S+WgAAAJFJREFUGNNVjlkWgjAMRSOiOCJzMa9SQGit
#   +1+gQ5CD+ct9Q0JEtArW9Dchb7ZEUTiDaLc/0PHEC885pvgSLFNJmizXLC9Q5Nm8p/rWGNO06U8H0DH3wOQpAXNnHjRKAdAjM1tAQ8DYOgHoBbgGsPx4R0YBFetvK1wlQHmr4fnZd2q6W/vhU+vr+TN1HTpXif4CK/0NNsIh2vQAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDQtMDVUMDE6MjA6MjAr
#   MDI6MDD2b3oJAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA0LTA1VDAxOjIwOjIwKzAyOjAwhzLCtQAAAABJRU5ErkJggg==
#
#
# vTuner is a rather large station directory. The website is somewhat
# slow though. So fetching large results sets isn't advisable.
#


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


# vTuner directory
class vtuner (ChannelPlugin):

    # module attributes
    module = "vtuner"
    listformat = "pls"
    has_search = False
    categories = [
        'Alternative', 'Ambient', 'Big Band', 'Bluegrass', 'Blues',


        'Business News', 'Celtic', 'Christian Contemporary', 'Christian Rock',
        'Classic Rock', 'Classical', 'College', 'Country', 'Dance',
        'Electronica', 'Folk', 'Gospel', 'Hard Rock', 'Hip Hop', 'Holiday',
        'Jazz', 'Latin Hits', 'New Age', 'Oldies', 'Pop', 'Public', 'Reggae',
        'Rock', 'Show Tunes', 'Smooth Jazz', 'Soft Rock', 'Soundtracks', 'Top 40',
        'Variety', 'World', 'World Asia', 'World Europe', 'World Hawaiian',
        'World India', 'World Middle East', 'World Native American',
        'World Tropical',
        'Talk', ['Business News', 'News Talk', 'Scanner', 'Comedy',
        'News Updates', 'Sports', 'Government', 'Radio Drama', 'Talk', 'News',
        'Religious', 'Weather'],
        'TV', ['Music TV', 'TV Live Broadcast', 'TV Sports', 'TV Audio', 'TV News',
        'TV Variety', 'TV College', 'TV Public', 'TV Government', 'TV Religious',
        'Web Video']
    ]
    
    titles = dict( genre="Genre", title="Station", playing="Location", bitrate="Bitrate", listeners=False )

    base_url = "http://vtuner.com/setupapp/guide/asp/BrowseStations/BrowsePremiumStations.asp?sCategory=%s&sBrowseType=Format&sViewBy=&sSortby=%s&sWhatList=&sNiceLang=&iCurrPage=%s"
    

    # update list
    def update_categories(self):
        html = ahttp.get("http://vtuner.com/setupapp/guide/asp/BrowseStations/startpage.asp")
        rx_cat = re.compile("""BrowsePremiumStations\.asp\?sCategory=([\w\s]+)&""")
        cats = rx_cat.findall(html)
        if cats:
            self.categories = sorted(cats[:14*3])  \
                            + ["Talk"] + [cats[14*3-1:18*3-1]] \
                            + ["TV"] + [cats[18*3-1:]]
        return



    # fetchy fetch
    def update_streams(self, cat):

        entries = []

        html = ""
        for i in xrange(1, int(conf.vtuner_pages) + 1):
            html = html + ahttp.get(self.base_url % (cat, conf.vtuner_order, i))

        # crude <tr> extraction
        rx_radio = re.compile(r"""
            <a\s+href="\.\./func/dynampls.asp\?link=1&id=(\d+)">([^<>]+)</a>
            .+? "middle">([^<>]+)</td>
            .+? Category.+?>([^<>]+)</td>
            .+? <td.+?>(\w+)&nbsp;(\d+)K</td>
        """, re.X|re.S|re.I)

        # assemble
        for uu in rx_radio.findall(html):

            (id, title, loc, genre, fmt, br) = uu


            entries.append({
                "title": title,
                "url": "http://vtuner.com/setupapp/guide/asp/func/dynampls.asp?link=1&id=%s" % id, 
                "playing": loc,
                "genre": genre,
                "format": mime_fmt(fmt),
                "bitrate": int(br),
            })

        # done    
        return entries