What is it.

This pages gives a description and some usage information of a home brew personal video recorder with Electronic Program Guide (EPG). Aim of the project is to record TV programs on a computer using open source software.

The current PVR uses a Hauppauge WinTV PVR USB2 for reception. This is an analog USB receiver that has an onboard MPEG2 encoder. However, as of today the setup is not operational. The Hauppauge card does not work when connected to the beagle USB OTG port. I suspect this is due to a bug in the MUSB driver, as the same setup works like a charm on NSLU2 (which also has an ARM processor).

Aim is to extend the functionality (e.g. support DVB-T and/or DVB-S cards), and update the tvguide stuff. Alternately MythTV could be an option.

How does it work.

The following diagram illustrates the structure of the PVR:

The following components can be identified. (note that recd, timers channels and the recd configuration file have man pages; these are not here but can be made available upon request).

web server

At the top the PVR has a web interface for controlling the PVR. This web interface is served by an Apache server. The static part of the UI (html pages, css style sheets, java script programs, images) resides on the background storage of the system. Everything that is dynamic is provided by the guideclient, which is a C program that is invoked from the html pages using CGI.


The guideclient is responsible for all interaction between the user (who is looking at a page from the web server) and the system itself. It accesses the list of channels, the list of programmed timers and connects to the guideserver for EPG data. Also if the user decides to program a recording, the guideclient updates the timers file and triggers the recording daemon, by sending it a signal

recording daemon

The recording daemon does the actual recording. It reads the timers file and makes a recording when needed. So if the recording daemon sees that a recording should start it writes the video information provided by the USB video device to a file as long as the recording should last. The recording is made using the data format provided by the USB video device. For the WinTV card this is an mpeg2 stream. Once the recording is finished the file is closed. Naming of the file is configurable but typically contains start time, stop time, channel name and program name. This format is specified in the recd config file together with some other options (e.g. the maximum file size; if a recording is larger than the maximum file size it will be split into several files. This feature is there as files > 2GB or 4GB can not be handled by all programs.

Note that the recording daemon caches the contents of the timers file. Therefore if the guideclient changes the timers file, it will send a signal to the recording daemon to inform the daemon about changes, after which the daemon rereads the timers file (and terminates cancelled recordings etc).
Once a recording is complete the timers file will be updated.

The recording daemon is capable to handle multiple tuners.


The EPG data itself is grabbed using xmltv (www.xmltv.org). This data is stored in a file tvguide.xml. As parsing of xml data can be time consuming and the NSLU2 is just a small device, it would take too much time for the guideclient to parse the data upon each invokation. Instead a guideserver has been written. This server also runs on the NSLU2 and remains active. It reads the tvguide.xml file, processes the data (filtering out unneeded channels and metadata), transforms it in a format that is more convenient for rendering and, upon request serves the data to the guideclient.

guide update

Guide update is a process that at regular intervals gets new data and updates tvguide.xml. After doing so the guideserver needs to be restarted. Currently this has only been partially automated as sometimes the xmltv grabber did not provide good data.

Demonstrator Usage notes.

As the PVR itself does not work, the current demo only provides the user interface and does not have the recording daemon.

The PVR UI is tested with firefox 3.0.5 under ubuntu 7.10 and opensuse 11.1; you might want to use F11 to get a full screen display. The UI is authored for a CRT.

The UI of the PVR is authored for use with a remote control. As a remote control has no free moving cursor, the arrow keys are used to steer the cursor. Typically a remote control sends keycodes to the web page which are then handled by javascript to move the cursor etc.

In a browser on a PC (or on the beagle board) the remote control can be mimic-ed by using the keyboard.

key up: will move up in a list
key down: will move down in a list
key right: will move you to the page for the item that has the cursor or will move you to the right in a table.
key left: will move you to the left in a table.
The software was designed to use backspace to go back to the previous screen. This works like a charm under windows (both with IE and firefox), but not on firefox under linux. If you want the back behaviour bound to backspace under linux follow the recipe on this page Alternately use the back button of the browser.

A brief walkthrough of the UI:
Use a web browser to browse to your beagle. When running on the beagle you can also browse to
This brings you to a screen with three entries: status, channels and EPG. You can navigate up and down to select an entry then use cursor right to move into the entry. Note that the full fledged system also has entries to playb back music and to view the image from a webcam. That functionality has been disabled for now.

An overview of the various screens:


This gives a status overview of the device. If a recording is in progress this screen will tell you what is being recorded. Apart from that it will also tell you if an audio CD is being ripped. This functionality is unavailable for now.


This gives a list of channel names. Actually it is the content of the channels file. There are 37 channels in the current demonstrator. The screen itself still requires some work (e.g. channel logo's; maybe a link to the channel website or some info on the channel, better channel names etc etc)


The EPG screen is a now-next EPG giving an overview of what is running now and what is next. Unfortunately I did not have the time go get recent EPG data, so you'll see some old data from 2006 (after that the hard disk of my NSLU2 broke down and I never got to revive it).
You can use the arrow keys to move through the EPG, it will scroll while doing so (you can also use cursor left to go to earlier broadcasts). One word of caution though: do not move into an entry that reads "0000 no transmission". Doing so will crash the guide server. This is a known issue that still needs fixing (actually you should not be able to move into that). If you do so, a few refreshes will get the server up and running again (the client will start the server but there is a timeout before the socket is released by the system).

Pressing F1 (the red button) will toggle the recording status of that program. If a program is marked for recording this is indicated by a red dot. See below for a screenshot

Pressing F3 (the yellow button) will give an overview of all timers that are programmed. Entries can also be deleted from this screen (but note that if you do so and move back to the EPG screen you need to do a refresh manually in order to update the status of the recording marker; again a known issue.
See below for a screenshot:

What next?

- get the receiver working with beagle (my hope is that things work with the host port of rev C)
- Different/more receivers
- lirc support
- improved EPG
Or perhaps move to mythtv.