I’ve changed the USTVnow script from my previous post. I needed it to work without XBMC running or even installed.

The script below will login into USTVnow, grab the stream info for each channel you have access to and then write out .strm files to a directory of your choosing. To use it just change email, password, and stream_dir to your own credentials.

I have the script set to run via CRON every thirty minutes. Then I have the scripts stream_dir setup as a source in XBMC so I can play the stream files.

The script is pure Python and should run on anything that will run Python. No need to have XBMC working.

Download: ustvnow.py

7/14/15: I’ve updated the script to work with USTVNOW’s website changes.

    ustvnow XBMC Plugin
    Copyright (C) 2011 t0mm0

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

20131227 - Modified by Dean Vaughan - http://deanvaughan.org to work from command line and output stream files to a directory
20140610 - Modified by Dean Vaughan - http://deanvaughan.org to work without XBMC running or installed

email = 'youemail'
password = 'yourpassword'
stream_dir = 'Streams'

stream_type = 'rtmp'
quality = '1'

import cookielib
import os
import re
import urllib, urllib2
import sys

class Ustvnow:
    __BASE_URL = 'http://lv2.ustvnow.com'
    def __init__(self, user, password):
        self.user = user
        self.password = password

    def get_channels(self, quality=1, stream_type='rtmp'):
        html = self._get_html('iphone_ajax', {'tab': 'iphone_playingnow',
                                              'token': self.token})
        channels = []
        for channel in re.finditer('class="panel".+?title="(.+?)".+?src="' +
                                   '(.+?)".+?class="nowplaying_item">(.+?)' +
                                   '<\/td>.+?class="nowplaying_itemdesc".+?' +
                                   html, re.DOTALL):
            name, icon, title, plot, url = channel.groups()

            #tmp work around till ustvnow stablizes changes
            name = name.replace('\n','').replace('\t','').replace('\r','').replace('<fieldset> ','').replace('<div class=','').replace('>','').replace('"','').replace(' ','')
            if not name:
                name = ((icon.rsplit('/',1)[1]).replace('.png','')).upper()
                name = name.replace('WLYH','CW').replace('WHTM','ABC').replace('WPMT','FOX').replace('WPSU','PBS').replace('WHP','CBS').replace('WGAL','NBC').replace('WHVLLD','MY9')

                if not url.startswith('http'):
                    now = {'title': title, 'plot': plot.strip()}
                    url = '%s%s%d' % (stream_type, url[4:-1], quality + 1)

                   # if self.premium == False:
                   #     if name not in ['CW','ABC','FOX','PBS','CBS','NBS','MY9']:
                   #         raise

                    print name
                    channels.append({'name': name, 'url': url,
                                   'icon': icon, 'now': now})
        return channels

    def _build_url(self, path, queries={}):
        if queries:
            query = build_query(queries)
            return '%s/%s?%s' % (self.__BASE_URL, path, query)
            return '%s/%s' % (self.__BASE_URL, path)

    def _fetch(self, url, form_data=False):
        if form_data:
            req = urllib2.Request(url, form_data)
            req = url
            response = urllib2.urlopen(url)
            return response
        except urllib2.URLError, e:
            return False

    def _get_html(self, path, queries={}):
        html = False
        url = self._build_url(path, queries)

        response = self._fetch(url)
        if response:
            html = response.read()
            html = False

        return html

    def _login(self):
        self.token = None
        self.cj = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))

        url = self._build_url('iphone_login', {'username': self.user,
                                               'password': self.password})
        response = self._fetch(url)
        #response = opener.open(url)

        for cookie in self.cj:
            if cookie.name == 'token':
                self.token = cookie.value

def build_query(queries):
    return '&amp;'.join([k+'='+urllib.quote(str(v)) for (k,v) in queries.items()])

ustv = Ustvnow(email, password)
channels = ustv.get_channels(int(quality), stream_type)

    old_streams = os.listdir(stream_dir)
    for old_stream in old_streams:
        if 'USTV-' in old_stream:
          os.remove(stream_dir + '/' + old_stream)

for c in channels:
    title = c['now']['title']
    title = re.sub('[^\w\-_\. ]', '', title)
    title = title.replace(' amp ', ' and ')
    f = open(stream_dir + '/USTV-' + c['name'] + ': ' + title + '.strm', 'w')


I have an ASUS Transformer Book T100 Windows 8.1 tablet I purchased for work purposes. I was in need of a something small and cheap that runs Windows that I was able to toss into a backpack. I looked around quite a bit and chose the T100 because of the price and how well reviewed it is. After turning off its touchpad gesture software and using Classic Shell to ditch the new Windows 8 interface its a really good laptop. Pop off the keyboard and it makes a good tablet too.

The T100 has a 1.3GHZ CPU and 2GB of memory, while I never have a problem running my day to day apps, I quickly became curious about what games it would run.

On a cool note, its a tablet running Windows. Getting a controller to work was a breeze. I’ve been using a XBOX 360 controller, just plugged it in and it was all good.

On another note, most games need to have the tablet in the keyboard dock or they have a bit of a freak out. This isn’t too bad as the dock makes for a nice lap or desk stand. For instance, Halo crashes on startup without the keyboard docked, once started it plays fine undocked.


The ASUS Transformer Book T100 runs NES, Gameboy, SNES, Genesis, and Gameboy Advances games well. Any newer systems don’t work out to well.

Old Games

All of the games I have from Good Old Games work fine. Duke Nukem 3d, Roller Coaster Tycoon 1&2, Dungeon Keeper 1&2, Populous, Sim City 2000, Tryian 2000, Stronghold HD, Stronghold Crusader, The Incredible Machine, Ultima 7, Wing Commander 3, and Wing Commander 4 all run well.

Other random games I have that work well,  Warcraft 2, Warcraft 3, Quake 1, Quake 2, Halo, and Torchlight. I can’t find my copy of Diablo 1&2, but I don’t see any reason why they won’t run.

I tried The Ultimate Doom. It wouldn’t run, from reading around this is a Windows 8 thing and not specific to the T100. I would bet prBoom or something similar would work.

Here I am playing Halo: Combat Evolved.

Recent Games

The Steam client runs well. These Steam games run, FTL, Starbound, Magicka, and Age of Empires II HD.

Defender’s Quest and Rogue Legacy also run (as non Steam games).

DOTA and League of Legends run. Problem is it takes so long to load everyone hates you by the time the game starts.

I have World of Warcraft but didn’t try it. Spec wise it should run at the lowest settings, problem is WoW would take up about 1/4 of the space the 64GB the T100 Transformer has.

The only other games I have require a decent graphics card to run, I didn’t bother to try them.

Final Thoughts

All in all I’m impressed with my ASUS Transformer Book T100. Don’t let the specs fool you, it’ll do a lot.


I’m fortunate enough to own a Nintendo 3DS, GCW Zero, and a Samsung Galaxy S3 Android smart phone. At one time or another I’ve used all three to emulate classic game consoles and play games. How do they compare to each other?


Out of the box the GCW Zero is ready to go. The Nintendo 3DS requires you to buy a $40 DSTWO flash cartridge. The S3 needs a Game Klip and a PS3 controller.

The 3DS has the biggest screen. It also has two screen, this is important for playing DS games.

The GCW Zero is the easiest to pocket. The 3DS is just a bit too big for a pocket, it does well in a backpack. The S3 by itself fits easily into a pocket, the Game Klip and PS3 controller not so much.

The S3 with a PS3 controller has the best controls of the bunch.

The GCW Zero has the best battery life, about eight hours for me. The 3DS around four and the S3 2-3. It’s difficult to judge the S3 since its hard to use it for nothing else than playing a game for 3+ hours.

NES, Gameboy, and Gameboy Color games: All three devices play these games equally well.

Super Nintendo and Genesis Games: GCW Zero and S3 can emulate these darn near perfectly. The GCW Zero has trouble with SuperFX games such as Star Fox. The 3DS has trouble running graphically intense games at full speed. It works well for RPGs or other games where fast responses are not needed.

Nintendo 64 and Playstation Games:  The S3 is the only one that can emulate these. It does pretty well.

Gameboy Advance Games: All three devices can emulate Gameboy Advance with near perfection.

Nintendo DS Games: The GCW Zero cannot emulate DS and even if it did it doesn’t have a touch screen. The S3 can emulate the DS very well, though its screen will be split into two in order to emulate the DS’ two screens. The 3DS can run DS games natively and perfectly.

Other Consoles: None of the three devices have fast enough hardware to emulate consoles beyond the Nintendo 64/Playstation era. The 3DS can natively play 3DS games though. Consoles older than the NES run well on all three.

What about native games? The S3 has the entire Google Play Store to pick from. The 3DS has the library of 3DS and DS games. The GCW has some not so great Linux games.

Using it for things other than games: Hands down the S3. Being a smart phone its all good. The 3DS has a limited web browser and can watch Youtube. The GCW just plays games.

Which one of the three do I use the most? I use my Nintendo 3DS the most. The screen size, battery life, controls, DS and 3DS game support make it my favorite of the bunch. Its the one I take if I’m going on a trip. The 16bit console support is a bummer but the 3DS and DS support more than make up for it.


Simple Wallet

I’ve been using the Kickstarter funded Simple Wallet for about two months now. I like it well enough to use it daily but it’s not perfect.

The wallet is made of leather with an elastic pocket in front and an elastic band in the back. This gives you two pockets for cards/cash and the band in the back to supposedly hold your phone. The Simple Wallet is slightly longer and taller than a credit card. At this writing the Simple Wallet retails for $24.

What I like

It’s simple. True to it’s name the Simple Wallet doesn’t hold any surprises. It’s got a couple of pockets that are big enough to hold plenty of cards or some cash if you fold it in half.

It’s thin. Not as thin as a Crabby Wallet, but definitely thin enough for me.

The pockets are tight enough that you don’t worry about anything falling out. At the same time cards and cash are easy to remove and put in.

The Simple Wallet has held up perfectly to two months of heavy use. There is no wear and tear at all.

What I don’t like

The Simple Wallet isn’t what I would call pretty.

I don’t get the strap on the back. It’s supposed to hold your phone, but I just don’t get the point.

The price is a little high for some leather and elastic.


I like the Simple Wallet, it lives up to its name and does a good job.

I was asked to give a run down of the XBMC computer I am currently using. It was assembled from parts and is running openELEC.

HTPC XBMC Computer

The case looks good.

My XBMC PC is capable of:

  • Playing 1080i video with no stutter or buffering. (Both local files and files from a Windows file server)
  • Playing 1080i streams of local cable TV channels.
  • Recoding those streams DVR style.
  • Playing 720p streams of premium cable TV channels via USTVNOW. (The 720p limit is from USTVNOW, not the computer)
  • Using my surround sound system for 5.1 sound.
  • Playing older video games from Super Nintendo, NES, Game Boy, Genesis, ect.
  • Throwing some colors on the wall with a Light Pack.

Parts List:

Total Cost: $638.26

Not cheap. You get what you pay for.

Some notes on the hardware:

My previous HTPC was an ASROCK Ion 330. It was prone to overheating. A lot of this was due to the small case size. The CPU fan lay under a spinning hard drive with a 1/4 inch gap. The fan blew hot air onto a hard drive producing its own heat. This was then blown out of the case by a 25mm fan. Because of the cramped quarters I didn’t have any other options for larger fans or moving parts. While the PC never got hot enough to shutdown it did get hot enough to make me worry about.

The case on this XBMC PC is roomy. The fan from the CPU isn’t constricted. It has a 65mm case fan with room for a second. I’m using an SSD drive as they produce little to no heat. The SSD has the added benefit of being silent. The PC as a whole is quiet enough that you cannot hear it without putting your ear near the case. Even under a load it doesn’t get hot enough to spin the fans up. Idle temperature is around 40C, loaded is around 55C.

The CPU has an integrated GPU. It comes with a heat sink and fan in the box. The CPU is overkill for playing videos. I went big with the CPU because someday I plan on emulating N64 and Playstation games. Possibly even Game Cube.

The HDHomeRun is for watching cable TV. If that’s not applicable to you, then no need to buy one.

The lighting arrangement can be had in a DIY kit for $50.


Putting it all together gets you this:

My camera is unable to capture the lighting effect. Here is a video from the vendor showing how it looks.
ADAlight demo from adafruit industries on Vimeo.



Being able to run emulators on an OpenELEC computer can be tricky. It takes a fair bit of knowledge from several different areas to setup. I’m going to try to give a good overview of putting all together into a working system. By the end you’ll have a setup that allows you to play all of your old games from the comfort of your couch.

Something to consider, the build of RetroArch I’m using doesn’t have emulators for a lot of systems. Here is a list of what it can emulate.

I’m going to break this up into sections. I’m going to assume you have OpenELEC installed and working.

Getting ROMs on OpenELEC

Be sure to organize your ROMs into folders based on their console. EG: put your SNES ROMs in a snes folder, put your NES ROMs into a nes folder, and so on.

By far the easiest way to get ROMs onto your OpenELEC computer is to put them onto a flash drive and plug it in. Once plugged in use XBMC to add a new file source pointing to the flash drive.

Go to Settings and then File Manager

Go to Settings and then File Manager

Select Add Media and then Browse

Select Add Media and then Browse

Select Root File System then Media. Your drive will be one of the folder in there. Select it.

Select Root File System then Media. Your drive will be one of the folders in there. Select it.

Once you've selected your flash drive, click OK.

Once you’ve selected your flash drive, click OK.

The file source is now added and your ROMs are now easily accessible by OpenELEC/XBMC.

Getting RetroArch working on OpenELEC

Our hero and savoir, zaggash, has written a RetroArch addon for OpenELEC which makes installing all of the emulators a breeze. First thing we need to do is download a copy of the addon and install it on OpenELEC. Go to Zaggash’s site and download build appropriate for your computer.  For instance I use the Generic build. Take that file and put it on the flash drive from the previous step and then plug the flash drive back into your OpenELEC computer. Now we need to install it.

Go back to System, then select Addon Browser. From there select Install from Zip file. Navigate to the source we created in the previous step and install the emulator.retroarch ZIP file.

Now we need to add another file source that points to RetroArch. Go back to System->File Manager->Add Source->Browse. This time select Home Directory->.xbmc->addons->emulator.retroarch->bin. Call the new source Emulator Bin.

Getting ROM Collection Browser working on OpenELEC

ROM Collection Browser is also available as an addon. It gives you a nice menu in XBMC to launch your ROMS from. You can install it via addon manager without doing anything special.

Once installed start the addon. We’ll need to add your ROMs. Here is how I would do it for Game Boy Advance ROMs.

Start ROM Collection Browser. Hit the Menu button on your remote and select Add Rom Collection->Scrape game info and artwork online->Game Boy Advance. Now we need to select where RetroArch is, open your Emulator Bin source and select retroarch.sh.

Now it will ask you for any arguments RetroArch needs to start. Change it to: vba_next “%ROM%”

Note that vba_next is the core from RetroArch. If you’re adding different game systems the core name will change. See here for a complete list of cores: http://sourceforge.net/p/zaggxbmcaddons/wiki/Core%20List/

Once it is done scrapping the artwork for your games you should be able to launch them with the remote.

Getting a controller to work on OpenELEC

For me, this was the toughest part of the setup. I tried numerous controllers and spent a lot of time banging my head against the wall. In the end I settled on a corded SNES USB controller.

Wireless XBOX 360 controller: An XBOX 360 controller will actually work just by plugging it in, problem is that the drivers included with OpenELEC are not able to control the LED lights on the controller. Where as on an XBOX the lights will go solid in a spot to represent which player you are, on OpenELEC they continue to flash, forever. If you can deal with the flashing its all good. I’ve had thoughts of taking the controller apart and removing the LEDs.

PS3 Dual Shock 3 Sixaxis: I couldn’t get the controller to work either wired or in Bluetooth mode. In both cases the OS detects it as a HID device, but never as a joystick.

Random corded USB controllers: I’ve had good luck with my SNES USB, old Microsoft Sidewinder, and Logitech USB controllers. All of which only needed to be plugged in to work.

Once you’ve made a choice on controllers you have to let RetroArch know about it. You’ll need to SSH into your OpenELEC computer. The login is root and the password is openelec.

Once logged in:

cd .xbmc/addons/emulator.retroarch/bin/

From there follow the prompts to hit the buttons on your controller. If you don’t have a button it asks for, just hit any button. If says anything about not finding a joystick, you’re in trouble.

Once down you’ll get a bunch of lines mapping buttons to action, you’ll want to copy all of this and put it at the bottom of /storage/emulators/retroarch/config/retroarch.cfg

Also at the bottom of your retroarch.cfg file add:

input_enable_hotkey_btn = 6
input_exit_emulator_btn = 7

Replace 6 and 7 with numbers representing the buttons on your controller you want to hit that will exit a ROM you’re playing. On my controller 6 and 7 represent the Select and Start buttons.

… and that’s it. You should now be able to start Rom Collection Browser, find a game with the remote, start it, play it with a controller, then return to XBMC by hitting two buttons on the controller.


Getting the Free Cable addon to work under OpenELEC takes a little bit of command line work. You’ll need to install some Python modules and create some directories on your OpenELEC computer.

Here’s what you need to do to get Free Cable working:

Install the Blue Cop Repository

From that repository, install Free Cable.

Open the configuration for Free Cable and then save it as is.

SSH to your OpenELEC computer. Run the following on the command line:

wget http://www.crummy.com/software/BeautifulSoup/bs4/download/4.3/beautifulsoup4-4.3.2.tar.gz
cd beautifulsoup4-4.3.2/
python setup.py install --prefix=/storage/usr
cp -R /storage/usr/lib/python2.7/site-packages/bs4/ /storage/usr/lib/python2.7/site-packages/beautifulsoup

wget http://deron.meranda.us/python/demjson/dist/demjson-1.6.tar.gz
tar zxvf demjson-1.6.tar.gz
cd demjson-1.6
python setup.py install --prefix=/storage/usr

mkdir /storage/.xbmc/addons/script.module.free.cable.database/
mkdir /storage/.xbmc/addons/script.module.free.cable.database/lib

touch /storage/.config/autostart.sh
chmod 755 /storage/.config/autostart.sh

Once that’s done edit /storage/.config/autostart.sh and add

export PYTHONPATH=$PYTHONPATH:/storage/usr/lib/python2.7/site-packages/

If you already have ‘#!/bin/sh’ in the file, don’t add is again.

Reboot. Free Cable should now work.

I was having trouble keeping hdhomerun_recorder always running under openELEC. Sometimes it wouldn’t start at boot, or sometimes it would randomly stop running, causing my shows not to be recorded. Below is a short Python script I came up with. It runs under CRON every five minutes. If hdhomerun_recorder isn’t running, it starts it. I have not had a problem since.

import os

find = 'hdhomerun_recorder'
start = '/storage/etc/hdhomerun_recorder/start.sh &'

f = os.popen('ps ax | grep -v grep | grep "' + find + '"')
out = f.read()
if not find in out:
  print 'Running: ' + start

What you see here is the act of a desperate man who got sick of trying to make XBMC’s PVR support work. I tried for several days to get tvheadend to work with my HDHomeRun. In the end I gave up and went my way. What you see may be a mess to setup but it works very well for me.

When all setup XBMC will have a directory full or playlist files representing your channels/streams. The playlist files will be named after the channel they represent along with the current and next show that is going to play.

Here is a video to show what I mean:

Quick note on my setup; I have an HDHomeRun receiving QAM channels from Cox cable. These channels come in as by product of the Internet service I receive. Via Cox and the HDHomeRun I receive local network stations. I also have an USTVNOW account for basic cable channels. Why do I use USTVNOW instead of getting basic cable from Cox? USTVNOW is about $10 a month cheaper and receives more channels.

Installation is a crazy mess. I didn’t expect to release this but I figured at the least the USTVNOW streams will be useful to someone.

I did all of this under openElec. XBMCbuntu works. Other Linux based installs should work. Windows will probably work if you install Python and something similar to CRON.


For USTV: Just make sure you have the USTVNOW plugin working. XBMC HUB Article About It

For HD Home Run: Make sure its connected to your network and can view some channels. Have hdhomerun_config working. (Part of libhdhomerun: Download It


  • Download this repo. (Direct link to zip)
  • Unzip it and copy everything into /storage/dean. If you’re the picky sort this is where you begin to change pathnames. For narcissistic reasons I’m going to assume you’ve put everything in /storage/dean.
  • Make a directory: /storage/Streams. This is where all your stream files will go. Add that directory as video source in XBMC.


  • We’re going to add a script to the USTVNOW addon to download a list of channels and turn them into stream files (.strm). We’re going to place this in CRON so it updates itself.
  • Edit /storage/dean/ustvnow_stream_grabber.py and change the email and password variables to your USTVNOW credentials.
  • Move /storage/dean/ustvnow_stream_grabber.py to the directory your USTVNOW addon resides in. For me its /storage/.xbmc/addons/ustvnow/
  • Make sure it works by running /storage/dean/ustvnow.sh. After that you should see a bunch of stream files in /storage/Streams. Each file should represent one of your USTVNOW channels.
  • Add a cron job so that /storage/dean/ustvnow.sh is ran every thirty minutes. Example in /storage/dean/crontab.

Go to your stream video source in XBMC. You should be able to play each file in there.

HDHomeRun Streams

  • We’re going to build stream (.strm) files for each channel your HDHomeRun receives.
  • On a Windows box open up HDHomeRun Setup and look at the tab that shows all of your channels, Digital Cable for me.
  • Write down the channel numbers and what channel they represent. (FOX, ABC, ect)

  • Two options now. Build the stream files by hand or use HDHomeRun Stream Builder to do it for you.
  • If you’re doing it by hand and pretending we’re working on the file for CBS in Fort Smith, AR:
  • Create a file named KFSMDT.strm
  • Open the file up and add this: hdhomerun://103D1F0E-0/tuner0?channel=auto:92&program=1
  • Notice a few things you’ll need to change.
  • 103D1F0E-0 is the ID of my tuner. You’ll need to change it to your tuner’s ID.
  • tuner0 is the first tuner on my HDHomeRun. The second tuner is tuner1. I watch TV on tuner0. I record TV on tuner1.
  • channel=auto:92&program=1 represents CH92 – 1 from HDHomeRun Setup. Change the 92 and the 1 as appropriate for your channels.
  • Save the file and put it in /storage/dean/Streams-default
  • Repeat this for every channel your HDHomeRun receives.
  • HDHomeRun Stream Builder will automate all of this for you, but it is a PITA to setup. (As if all the above hasn’t been)
  • If you don’t care about having the currently playing show in the file name, copy the all the .strm file you made into /storage/Streams and call it done. Just like the USTVNOW streams they should play as if they were any other video file.

Getting the currently playing show to be in the HDHomeRun stream’s file name

  • Theory behind this is that we’re going to use mc2xml to download TV scheduling information, parse it, and rename our stream files using the info.
  • Get mc2xml working for your zip code. There is a copy in /storage/dean/mc2xml-local
  • For me the command line is ./mc2xml -c us -g 72714 -d 72 -f (72714 is my zip code)
  • Have cron run /storage/dean/update_xmltv.sh once a day. Example in /storage/dean/crontab
  • Have cron run /storage/dean/update_streams.sh every thirty minutes. Example in /storage/dean/crontab
  • Now your stream files in /storage/Streams should be all renamed with the current show playing.