Audio/video stream recording forums

Attention Visitor:
You may have to register or log in before you can post:
  • Click the register link to sign up.
  • Registered members please fill in the form below and click the "Log in" button.
To start viewing messages, select the forum that you want to visit from the selection below.

Go Back   Audio/video stream recording forums > Streaming media recording forum > Audio stream recording
Register FAQ Members List Calendar Mark Forums Read

Reply Post New Thread
 
Thread Tools Display Modes
  #1  
Old 04-18-2017, 07:58 AM
dinki dinki is offline
Junior Member
 
Join Date: Dec 2015
Posts: 5
dinki is on a distinguished road
Default

Stream the World script not working after all these years


Hey guys. I've been using this script for years to find the URL so that I can use wget to grab streams:

Code:
#!/usr/bin/env python

from random import choice
import os
import sys
import urllib2
import xml.dom.minidom as minidom

def validate_callsign(cs):
        '''
        Normal callsign format is 'WWWWFFAAA', where 'WWWW' is the radio station
        callsign, 'FF' is either 'AM' or 'FM', and 'AAA' is always 'AAC'.
        For this function, we expect the 'WWWWFF' part as input.
        '''
        if not cs or not isinstance(cs, str):
                raise ValueError('callsign \'%s\' is not a string.' % cs)
        if len(cs) < 6:
                raise ValueError('callsign \'%s\' is too short.' % cs)
        if not cs.endswith('AAC'):
                cs = cs + 'AAC'
        band = cs[-5:-3]
        if band != 'AM' and band != 'FM':
                raise ValueError('callsign \'%s\' is missing \'FM\' or \'AM\'.' % cs)
        return cs

def make_request(callsign):
        host = 'playerservices.streamtheworld.com'
        req = urllib2.Request(
                        'http://%s/api/livestream?version=1.2&mount=%s&lang=en' %
                        (host, callsign))
        req.add_header('User-Agent', 'Mozilla/5.0')
        return req

def t(element):
        '''get the text of a DOM element'''
        return element.firstChild.data

def check_status(ele):
        # should only be one status element inside a mountpoint
        status = ele.getElementsByTagName('status')[0]
        if t(status.getElementsByTagName('status-code')[0]) != '200':
                msg = t(status.getElementsByTagName('status-message')[0])
                raise Exception('Error locating stream: ' + msg)

def create_stream_urls(srcfile):
        doc = minidom.parse(srcfile)
        mp = doc.getElementsByTagName('mountpoint')[0]
        check_status(mp)
        mt = t(mp.getElementsByTagName('mount')[0])
        allurls = []
        for s in mp.getElementsByTagName('server'):
                # a thing of beauty, right?
                ip = t(s.getElementsByTagName('ip')[0])
                ports = [t(p) for p in s.getElementsByTagName('port')]
                # yes, it is always HTTP. We see ports 80, 443, and 3690 usually
                urls = ['http://%s:%s/%s' % (ip, p, mt) for p in ports]
                allurls.extend(urls)
        return allurls

def start_mplayer(location):
        print location
        return os.system('mplayer %s' % location)

if __name__ == '__main__':
        if len(sys.argv) < 2:
                print 'usage: station callsign must be the first argument'
                sys.exit(1)

        callsign = validate_callsign(sys.argv[1])

        req = make_request(callsign)
        result = urllib2.urlopen(req)

        urls = create_stream_urls(result)
        if len(urls) > 0:
                u = choice(urls)
                sys.exit(start_mplayer(u))
        sys.exit(1)
This has worked great for MANY years. Suddenly it seems that some stations are changing their URLs on every request. Here's an example with commands issued within a few seconds of each other:

Code:
root@debian# python streamtheworld.py KPELAMAAC            
http://14133.live.streamtheworld.com:3690/KPELAMAAC
( /mnt/data/data/radio/bin )
root@debian# python streamtheworld.py KPELAMAAC
http://13733.live.streamtheworld.com:3690/KPELAMAAC
( /mnt/data/data/radio/bin )
root@debian# python streamtheworld.py KPELAMAAC
http://14213.live.streamtheworld.com:80/KPELAMAAC
Does anyone know of a good way around this or do I need to look at a different stream capture method? Is there something decent for Linux?

Many thanks!
Reply With Quote
Reply Post New Thread
Tags: , ,



Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump


All times are GMT -6. The time now is 03:51 AM.


Powered by All-streaming-media.com; 2006-2011
vB forum hacked with Zoints add-ons