Tivo Character Logo

Ian's TiVo upgrade diary and notes


This document lists the steps that I followed when I installed my own personal UK TiVo, and it grows as I add new features or "hacks".
Please note however that the links and instructions provided are for the versions of tools/files that I used, and may well not be the latest ones available. Note also that all information is provided without warranty and that you the user assume full responsibility if you decide to follow any of the steps or information provided in this document.

Having got that out of the way, I hope that you find this document useful and that it makes your own TiVo upgrades easier.
You don't have to, but if you want to thank me then feel free to send me something from my Amazon Wish List

This document lists the steps that I took to upgrade my TiVo, add network connectivity, and install various hacks and self-written code ports. The mirror Local Mirror icons point to a local personal-usage mirror of the various files, I'm not making the mirror publicly available as all of the files are retrievable from the author's sites or forum threads referenced. But if a site dies then I have an archive version of the file.

Currently it includes the following sections :-

Stage 1 - Upgrade internal hard disk from 40Gb to 120Gb

Please note, if you are trying to upgrade your UK TiVo and are using a disk that is greater than 120Gb then the steps below will not work as you will need to use a version of the MFSTools CD which handles larger drives.

- Firstly I read and inwardly digested the "Hinsdale HowTo", located at Local Mirror

- Next I reviewed the posts at the UK TiVo communities forums, my key requirement was silence (the TiVo lives in the lounge which is often used for meditation and other things which need complete silence). After working through various suggestions from people, I decided on a Samsung Spinpoint SV1203N - a 120Gb, 5400 rpm drive with Acoustic management which is supposed to make the whole drive near-silent. I ordered one of these, from WhisperTec UK.

- The drive arrived, and I installed it into a spare PC to test. I downloaded Samsung's HUtil test from Mirror and ran it on the drive. The drive failed two of the tests! I RMA'd it, 10 days later I got a replacement - not impressive so far... The replacement was plugged into the spare PC, I ran HUTil, set the drive's Acoustic Management Mode (AMM) to "Quiet" and ran the diagnostic test. It passed! I let it run a full surface scan for about 90 minutes, which also passed, and then for the sake of paranoia repeated the whole test again, which it again passed.

- Next I grabbed the MFSTools boot CD from Mirror and the MFSTools boot floppy from Mirror as backup, burned the iso onto a CDR and dd'd the floppy image onto a floppy disk.

- Before powering off the TiVo to pull the old drive, I checked System Information and the capacity was shown as 11h55m best/40h31m basic.

- I Powered off the TiVo and then...

- Undid the 3 screws at back of TiVo (with a Torx 10 bit)
- Slid the top of the casing back an inch then lifted upwards - this is not easy the first time! While the top is off, be careful of the uncovered PSU unit...
- Disconnected the IDE lead/Power lead.
- Disconnected the hard drive bracket, by removing the 2 Torx 10 screws near to the front of drive.
- Slid the Quantum drive+bracket downwards to remove it from the holding slots.
- Removed the Quantum drive from the bracket, by unscrewing the 4 Torx 15 screws.

- Next I connected the old Quantum drive and the new Samsung drive to the spare PC (which already had its own IDE drive and an IDE CDROM drive). This took far more time than it should have due to BIOS and cable wierdness on the (pre-2000 BIOS'd) spare PC that I was using. In terms of connections and settings,
  I left the current spare PC Windows/Linux system disk as primary IDE master (hda) (First IDE, first connector).
  I jumpered the new Samsung TiVo drive as primary slave and connected it up (hdb) (First IDE, second connector).
  The old TiVo drive was already be jumpered master, I connected this as secondary IDE master (hdc) (Second IDE, first connector).
  I jumpered the IDE CDROM drive as secondary slave and connected it up (hdd) (Second IDE, second connector).

- I booted from the mfstools CD.

- The BIOS and Linux boot process reported the old TiVo Quantum drive as being sized 10Mb, i.e. locked, but mfstools automatically unlocked it.

- Checking the Linux boot log showed that all 3 drives had been correctly recognised now.

(If the size of hdc was reported as 10Mb still then I could have tried changing the BIOS detection for the drive from 'auto' to 'normal'. If it was still reported
 as 10Mb then I could have downloaded qunlock from Mirror and then copied it to a DOS floppy, booted from the floppy and used the command "QUNLOCK 2" to unlock it - then rebooted from the CDROM).

- Hit Enter once or twice to get to the bash prompt.

- Backup the old drive to the spare PC's current system drive.

$ mkdir /mnt/dos
$ mount /dev/hda1 /mnt/dos
$ mfsbackup -l 32 -6so /mnt/dos/tivo.bak /dev/hdc

(This takes a backup of the system,passes,thumbs,config,etc, but NOT programs. -s = Shrink backup set, -6 = Compression level 6, -o = Set output file)

This process started at 13:37 and ended at 13:42, i.e. took 5 minutes (this was on a 900MHz Pentium Pro).

mfsbackup said
"Source drive is 39 hours"
"Destination will be 39 hours"
"Uncompressed size = 1031Mb"

The tivo.bak file produced was around 323Mb

- Copy the entire old drive contents - programs and all - to the new drive

$ mfsbackup -Tao - /dev/hdc | mfsrestore -s 127 -xzpi - /dev/hdb

(Assumes existing TiVo A drive as Secondary Master and new larger upgrade A drive as Primary Slave, -a backup everything, -T backup all streams, -o output file -s set swap file size in meg, -i input file, -x expand,  -z zero out unused partitions, -p optimise partition layout)

This process started at 13:43 and ended at 15:00, i.e. took 97 minutes. MFSTools said that it had copied 32 Gb.

mfstools displayed the new drive size as "New size = 127 hours (88 more)". This made me a bit concerned, but the TiVo does correctly display the new size as 135 hours - presumably there's a short int limit somewhere in mfstools display code.

- Power down, disconnect old and new TiVo drives. Pack old drive away in storage.

- Rejumper new TiVo drive to Master

- Attach to drive bracket and replace in TiVo

- Boot TiVo

- Checking System information shows capacity as
  38h55m Best / 135h21m Basic

- Power off TiVo and replace lid. This was probably the hardest part !!

- After this I let the new drive bed in for a week or so. I enabled back doors after this and saw that my uptime had been 7 days, i.e. no reboots. With my old Quantum drive I'd been seeing reboots once a day or two, so this was an improvement...

Stage 2 - Install Cachecard

- I ordered a Cachecard from, and a stick of 512MB PC133 value Ram from

- I downloaded the Cachecard drivers. The SiliconDust forum at points to the newest Cachecard drivers, which were at Mirror. I extracted the contents of the zip file to a floppy disk.

- I downloaded the NIC install CD image from Mirror and burned it to a CDR.

- Note, the above two items are what I did, this was when the Cachecard drivers were released on a seperate zipfile. For each release, Jafa now builds a bootable ISO with the drivers on it, so you just need to browse to the Silicon Dust forum at, find the latest "Driver Release" thread and, grab the ISO and burn it to a CDR.

- I went through the now familiar process of opening up the TiVo, and pulling the drive.

- The TiVo drive was installed into my spare PC as secondary master (it could have been anything EXCEPT primary master).

- I booted off the NIC install CD, and hit Enter twice.

$ mkdir /mnt/fd0
$ mount -t vfat /dev/fd0 /mnt/fd0
$ cd /mnt/fd0
$ chmod +x nic_install
$ ./nic_install cachecard

If you use the Cachecard drivers which come in the bootable ISO version then you can skip the first four line above, i.e. you just need to boot from the CD and do the "./nic_install cachecard" command.

- nic_install asked for permission to disable initrd, I said "yes".

- The Cachecard installer defaulted to IP= and GW=

- I used option 5 from the menu to change the IP to and GW to

- I double checked that the daily call was set to 'network'.

- I used option 0 to save changes and exit, this then copied the Cachecard drivers to the TiVo system disk

- I answered "Yes" to nic_install's request to allow it to clear the log file.

- I put the TiVo drive back in the TiVo.

- Next I installed the cachecard and RAM. Oh ... my ... god !! Was this hard or what!! This was probably the hardest card installation that I've done in 20+ years of building computers, the space is very limited and for those of us with big hands its not easy to gain leverage enough to get the card to seat squarely on the motherboard. In the end I....

  • Detwisted the two twist-tie motherboard closers around the card.
  • Put a flat-blade screwdriver into the INNER RING of the rubber foot near the Cachecard area and levered, this popped out the inner foot stand plug.
  • Used two old credit cards behind the back of the cachecard to gain enough traction to pull it onto the edge connector (i.e. I had the cachecard side of the TiVo facing away from me).
  • Levered the right hand side home, and the left hand side afterwards.

Without a doubt this was the hardest card installation I ever did!!

- Putting in the 512Mb RAM stick was a breeze in comparison...

- Powered up the TiVo.

- The red light on the Cachecard lit, indicating that the memory  is being accessed. Shortly afterwards the SiliconDust drivers displayed a splash screen, and then tested out the Cachecard's RAM.

- Bootup now takes an extra minute or two.

- Once it had booted I checked that was pingable, found that it was.

- I then telnetted into the Tivo and got a bash prompt. I quit.

- Yay me!

Stage 3 - Installing basic utilities

- Telnet into TiVo and do

$ mkdir /var/hack

Firstly I installed essential utilities (ls,etc)

Grabbed Steve Jenkin's pre-done tarball from Mirror
FTP'd it to the TiVo (into /tmp).

$ cd /var/hack
$ mv /tmp/tivobin.tgz .
$ gzip -d tivobin.tgz
$ cpio -idu -H tar <tivobin.tar
$ mv tivo-bin bin
$ cd /var/hack/bin
$ chmod 755 *
$ ./ls
(LS works ok)

Next I created a .profile to set the PATH to include /var/hack/bin

$ cd /
$ mount -o remount,rw /
$ echo 'export PATH=$PATH:/var/hack:/var/hack/bin' >.profile
$ mount -o remount,ro /
$ sync

To test this, I kept the telnet session open (just in case) and launched a new telnet session to the TiVo.

$ echo $PATH

To make the mount/remount steps easier, I did

$ cd /var/hack
$ mkdir scripts
$ cd scripts
$ cat >
#! /bin/bash
mount -o remount,ro / && echo "File system is now READ ONLY." || echo "Remount Failed!"
$ cat >
#! /bin/bash
mount -o remount,rw / && echo "File system is now READ/WRITE." || echo "Remount Failed!"
$ chmod 755 *.sh
$ ./
$ cd /
$ cat >>.profile
alias rw='/var/hack/scripts/'
alias ro='/var/hack/scripts/'

This means that I can now make the root file-system read-write by typing "rw", make changes, and then return it to read-only by typing "ro"

- Grabbed more useful utilities from Mirror and copied them to /var/hack/bin. Specifically...
cfLocal Mirror, lsattrLocal Mirror, micro_httpdLocal Mirror, netstatLocal Mirror, psLocal Mirror,  tnlitedLocal Mirror, tracerouteLocal Mirror, vmstatLocal Mirror, chattrLocal Mirror, lsofLocal Mirror, micro_inetdLocal Mirror, pingLocal Mirror, topLocal Mirror, uptimeLocal Mirror, wLocal Mirror

$ cd /var/hack/bin
$ chmod 755 *

tnlited, ping, and uptime were superceeded by TiVo/SiliconDust binaries so I renamed them to *.new to stop them from being used.

- Added

PS1='TiVo: {\w} % '
to .profile, so that I know I'm telnetted into the TiVo...
$ rw
$ echo "PS1='TiVo: {\w} %' >>/.profile
$ ro

- Grabbed less-s1 and unzip-s1 from Mirror Mirror

Ftp unzip-s1.gz to /var/hack/bin, telnet to tivo

$ cd /var/hack/bin
$ gzip -d unzip-s1.gz
$ mv unzip-s1 unzip
$ chmod 755 unzip
Ftp less-378-s1.tar.gz to /, telnet to tivo
$ cd
$ gzip -d less-378-s1.tar.gz
$ cpio -i -H tar --make-directories </less-378-s1.tar
$ rm /less-378-s1.tar
$ rw
$ echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/var/hack/lib' >>.profile
$ ro
$ less /etc/rc.d/rc.sysinit

- Grabbed tivo series 1 tar from Mirror

ftp'd to tivo into /var/hack/bin

$ cd /var/hack/bin
$ mv tar.bin tar
$ chmod 755 tar

- Grabbed elvis and sed/awk/grep from Mirror Mirror

ftp'd both files to /var/hack/tmp, and telnetted to tivo

$ cd /var/hack/tmp
$ gzip -d grep*gz
$ tar -xvf grep-awk-sed_Tivo-1.tar
$ cd grep-awk-sed_Tivo-1
$ mv *grep ../../bin
$ mv *sed ../../bin
$ mv *awk ../../bin
$ cd ..
$ rm -rf grep-awk-sed_Tivo*
$ gzip -d elvis*gz
$ tar -xvf elvis-1.4_Tivo-1.tar
$ cd elvis-1-4_Tivo-1
$ chmod 755 elvis
$ mv elvis /var/hack/bin
$ cd /var/hack
$ tar -xvf ./tmp/elvis-1.4_Tivo-1/terminfo.tar
$ export TERMINFO=/var/hack/terminfo
$ rw
$ elvis /.profile

(Add the above 'export TERMINFO=/var/hack/terminfo' line to /.profile)

$ ro
$ rm -rf /var/hack/tmp/elvis*
$ cd /var/hack/bin
$ ln -s mawk awk

- Grabbed smartctl.gzLocal Mirror from or
ftp'd smartctl.gz to tivo:/var/hack/bin
telnet tivo

$ cd /var/hack/bin
$ gzip -d smartctl
$ chmod 755 smartctl
$ ./smartctl -a /dev/hda

Phew, that's it for "basic utilities" !

Stage 4 - Graphical utilities

Grabed Graham's bugfixed 1.1 jpegwriter, from Mirror
Grabed Newtext2osd from Mirror
Grabed osdmngr from Mirror
(Note, osdwriter which the above use is part of the base TiVo os code, in /tvbin)
Unpack them all and ftp to tivo:/var/hack/bin ; newtext2osd, jpegwriter
telnet tivo

$ cd /var/hack/bin
$ chmod 755 newtext2osd jpegwriter

Grabed Mirror from
Unpacked it
ftp screen-3.9.8/screen to tivo:/var/hack/bin/
ftp lib-tivo/, lib-tivo/, lib-tivo/ to tivo:/var/hack/lib/
ftp etc/screenrc to tivo:/var/hack/
telnet tivo

$ chmod 755 /var/hack/bin/screen

Grabbed tivovbi-1.03.zipLocal Mirror from
Unpacked it
ftp tivovbi/tivovbi to tivo:/var/hack/bin
telnet tivo

$ chmod 755 /var/hack/bin/tivovbi
$ tivovbi -xtc
to show closed-captions

Grabbed SendKey.zipLocal Mirror from "SendKey" from
Unpacked it
ftp SendKey to tivo:/var/hack/scripts/
telnet tivo

$ chmod 755 /var/hack/scripts/SendKey
$ SendKey tivo 0 1 2 3 <etc>
See /tvlib/tcl/tv/sendkey.tcl for key codes

Stage 5 - Network utilities

Grabbed mailfile3.zipLocal Mirror from
Unpacked it
ftp mailfile.tcl to tivo:/var/hack/scripts/
telnet tivo

$ cd /var/hack/scripts
$ chmod 755 mailfile.tcl
$ elvis mailfile.tcl
set mailserver <my SMTP server's IP>;               # the IP address of your ISP's SMTP server
set domain <my domain>;            # your domain
set sender "<my email address>";  # Your email
$ echo 'Hello there' >/tmp/test.file
$ ./mailfile.tcl /tmp/test.file "This is the subject" <my email address>

Grabbed nfs-kernelmod_TiVo25-1.tar.gzLocal Mirror from
Unpacked it
ftp nfs-tivo25.o to tivo:/var/hack/lib/
telnet tivo

$ insmod /var/hack/lib/nfs-tivo25.o
$ mount -t nfs /var/hack/mountdir
Add "insmod /var/hack/lib/nfs-tivo25.o" to /etc/

Grabbed tivosmb.tar.gzLocal Mirror (samba) from
Unpacked it
ftp smbd, nmbd,smb.conf to tivo:/var/hack/lib/

$ telnet tivo
$ rw
$ mv /var/hack/lib/smb.conf /etc/rc.d/
$ elvis /etc/rc.d/smb.conf
(Make changes as needed)
$ ro
$ chmod 755 /var/hack/lib/smbd
$ chmod 755 /var/hack/lib/nmbd
$ /var/hack/lib/smbd -D
$ /var/hack/lib/nmbd -D
These both bitched about missing libraries, to workaround this for the short term, I did the tacky steps of ....
$ cd /var/hack/lib/
$ cp -p
$ cp -p
$ cp -p
My /etc/rc.d/smb.conf reads...
interfaces =
workgroup = WORKGROUP
netbios name = TIVO
security = share
guest account = root
hosts allow =
encrypt passwords = no
path = /var
guest only = yes
guest ok = yes
writable = yes
read only = no
browsable = yes

Lastly, I added "/var/hack/lib/smbd -D" and "/var/hack/lib/nmbd -D" to

To fix the tacky hack above, once I was sure that samba was working I built a dummy library - See for details of this.
ftp to tivo:/var/hack/lib/

$ cd /var/hack/lib
$ rm; ln -s
$ rm; ln -s
$ rm; ln -s
and then restarted smbd and nmbd

Grabbed Mirror from
Unpacked it
ftp Libresolv-0.1/bins/* to tivo:/var/hack/tmp
$ telnet tivo

$ mv /var/hack/bin/ to /var/hack/lib/
$ ln -s /var/hack/lib/ /var/hack/lib/
$ mv /etc/resolv.conf /etc/resolv.conf.old
$ mv resolv.conf /etc
$ elvis /etc/resolv.conf
(update to have IPs of nameservers)
$ cd /var/hack/bin
$ mv arp arp.notresolving
$ mv hostname hostname.notresolving
$ mv netstat netstat.notresolving
$ mv rarp rarp.notresolving
$ mv traceroute traceroute.notresolving
$ mv ../tmp/* .

Stage 6 - Cron - See also my TiVo cron guide for more information on setting up cron on the TiVo.

Grabbed cron-3.0pl1_TiVo-2.tar.gzLocal Mirror from
ftp it to tivo:/var/hack
telnet tivo

$ cd /var/hack
$ gzip -dc cron-3.0pl1_TiVo-2.tar.gz | tar -xvf -
$ cd cron-3.0pl1_TiVo-2
$ chmod 755 cron
$ sh ./
$ mv cron ../bin
$ mv crontab /var/hack/etc/crontab
$ cd /var/hack
$ rm -rf cron-3.0pl1_TiVo-2
$ /var/hack/bin/cron &

Add "/var/hack/bin/cron &" to /etc/rc.d/

Stage 7 - TivoWeb

Grab TivoWeb from Mirror
Grab UK UI fule from Mirror or Mirror (and rename to remove the 0s)
Grab UKGenres from Mirror
Unpack to ui.tcl
ftp tivo

$ cd /var/hack
$ mkdir tivoweb-tcl
$ put tivoweb-tcl-1.9.4.tar.gz
$ put ui.itcl
$ put ukgenre.js
$ quit

telnet tivo

$ cd /var/hack
$ gzip -dc tivoweb-tcl-1.9.4.tar.gz | tar -xvf -
$ rm tivoweb-tcl-1.9.4.tar.gz
$ cd tivoweb-tcl
$ mv ukgenre.js ukgenre.js.old
$ mv ../ukgenre.js .
$ cd modules
$ mv ui.itcl ui.itcl.old
$ mv ../../ui.itcl .
$ cd ../..
$ /var/hack/tivoweb-tcl/tivoweb
Browse to http://tivo/

See TiVoWeb main menu, yay!


Grab blue.cssLocal Mirror, jwhowa.cssLocal Mirror, daynight2.cssLocal Mirror, TivoComm.cssLocal Mirror, TivoForum.cssLocal Mirror from
Grab orvi-1.zipLocal Mirror from via
Grab RedBook.zipLocal Mirror ,GreenBook.zipLocal Mirror ,BlueBook.zipLocal Mirror ,BlackBook.zipLocal Mirror
from (""Local Mirror) and unpack them.
Grab office.zipLocal Mirror from the same thread, and unpack it.
ftp them into /var/hack/tivoweb-tcl/
Restart TivoWeb

Add password and set default theme

telnet tivo
$ cd /var/hack/tivoweb-tcl
$ cp -p tivoweb.cfg tivoweb.cfg.default
$ elvis tivoweb.cfg
Username = userid
Password = password
Theme = daynight

Add nice favicon.ico...

Grab favicon.icoLocal Mirror from Steve Jenkins at
ftp to tivo:/var/hack/tivoweb-tcl/images/
Grab LJay's favicon.itclLocal Mirror module from (
ftp to tivo:/var/hack/tivoweb-tcl/modules/
Quick Restart Tivoweb

Add Whats-On "Grid" plugin

telnet tivo
$ cd /var/hack/tivoweb-tcl/images/
$ mv recycle1.png recycle1.png.default
$ exit
Grab grid_1v01.zipLocal Mirror from
Unpack it it into a temporary directory
FTP grid1_v01.itcl to tivo:/var/hack/tivoweb-tcl/modules/
FTP grid.css to tivo:/var/hack/tivoweb-tcl/
FTP *.png to tivo:/var/hack/tivoweb-tcl/images/

Do a TivoWeb quick reload
Test "Grid" option on main TivoWeb menu. It all works fine, but takes about 25 seconds to build a 3-day grid...

Add Showcase plugin

Grab showcase.itclLocal Mirror from
ftp to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb quick reload
Test from main menu.

Add "Search with rating", "Whats On" and "Now Playing with Sort and Folders" plugins

Grab searchadv.itclLocal Mirror, whatson.itclLocal Mirror, and folders.itclLocal Mirror from
ftp to tivo:/var/hack/tivoweb-tcl/modules/
Grab lj_utils.itclLocal Mirror v3.5 from
ftp to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb quick reload
Test from main menu.
Create a "Favourites Channel" favchan file via
telnet tivo
$ echo '26 26 30 33 37 101 102 103 104 105 106 107 109 110 112 113
118 124 125 127 128 130 163 164 175 289 301 302 303 304 305 306 307 308
309 310 311 327 501 507 525 528 551 552 553 554 555 558 559 560 561 562
564 565 582 583' >/var/hack/favchan

Add Sanderton's DigiGuide checker

Register on digiguide
Browse to<my_digiguide_id>&email=<my_email>
Grab the URL listed under "Start iSiloX on the PC, open a new file and go to...." which in my case is<my_email>&wu=<my_digiguide_id>
extract the bit after wu=
Change the digiguide myHandheld settings, by browsing to and make sure no program listing details are shown on any genre
(Personalise your Handheld Settings)

Grab digiguide0.1.zipLocal Mirror from
Unpack digiguide.tcl
ftp to tivo:/var/hack/tivoweb-tcl/modules/
telnet tivo
$ cd /var/hack/tivoweb-tcl/modules/
$ elvis digiguide.tcl
Edit these two lines...
        set email "<my_email>" ;# Your DigiGuide log in e-mail add
        set digiguideid "<my_digiguide_id>" ;# You Digiguide login id as embedded in the
and save the file.
Do a Tivo Web quick reload
Running the module barfed with a time format parse error where the TCL interpreter was trying to parse an empty string.
To debug it, I added these lines after

        set html [read $web]
        close $web

set zzzz "/tmp/zzzz"
set fileId [open $zzzz "w"]
puts -nonewline $fileId $html
close $fileId

Running the module and browsing /tmp/zzzz showed

HTTP/1.1 302 Redirect
Server: Microsoft-IIS/5.0
Date: Sat, 02 Oct 2004 16:32:16 GMT

Ah! has changed IP address. To fix this I changed
set web [socket 80]
set web [socket 80]

and everything works ok now :)

Install the DisplayText plugin

Grab displaytext.tarLocal Mirror from
ftp displaytext.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install JpegWriter plugin

Grab jpeg.zipLocal Mirror from
ftp jpeg.itcl to tivo:/var/hack/tivoweb-tcl/modules
telnet tivo
$ mkdir /var/hack/pics
$ cd /var/hack/tivoweb-tcl/modules/
$ elvis jpeg.itcl
"exec text2osd -bg 255 255 255 /dev/null"
"exec newtext2osd -bg 255 255 255 /dev/null"
"exec /var/hack/pics/jpegwriter"
"exec /var/hack/bin/jpegwriter"

Made loads of code fixes, as the default version doesn't properly list/parse out the jpeg filenames. See my fixed versionLocal Mirror

Install LJAY's Wishlists plugin

Grab wishlists.v1.4.zipLocal Mirror from
ftp wishlists.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install Sanderton's Reorder Season Passes plugin

Grab reorder.zipLocal Mirror from
Unzip it
ftp reorder.js to tivo:/var/hack/tivoweb-tcl/
ftp reorder.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install ManualRecord plugin

Grab manrec_0.1.2.zipLocal Mirror from
Unzip it
ftp manrec.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install Sanderton's NewEpisodes plugin

Grab newepisodes0.2.zipLocal Mirror from
Unzip it
ftp newepisodes.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install Tivo Season Pass/Settings backup plugin

Grab tivoweb-backup-1_00_0013.tar.gzLocal Mirror from
$ gzip -d tivoweb-backup-1_00_0013.tar.gz
Unpack the tar archive
ftp backup.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install ChannelGrid plugin

Grab channelgrid_0.0.2.zipLocal Mirror from
ftp channelgrid.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

This caused my TiVo to reboot! I've rolled it out for now...

Install Sanderton's DailyMail

Grab dailymail.zipLocal Mirror from
Unzip it
ftp dailymail.tcl to tivo:/var/hack/
$ telnet tivo
$ cd /var/hack
$ chmod 755 dailymail.tcl
$ elvis dailymail.tcl
Change the settings at the top of the file so that they are
set mailserver <my_smtp_server_ip> ;# the IP address of your ISP's SMTP server
set domain <my_domain> ;# your domain
set recipient <my_email> ;# the email address to send to
set sender "tivo@$domain" ;# set to be a vailid e-mail address if your ISP requi
set hoursahead 36 ;# number of hours ahead to look for enclosed info
set version3 false ;# change to true if you are on v3
set uktivo true ;# change to false if you are a colonial

Grab LJ's summerzone.shLocal Mirror script from
ftp to tivo:/var/hack/scripts
$ telnet tivo
$ cd /var/hack/scripts
$ gzip
$ chmod 755
Add to /var/hack/etc/crontab
15 7 * 1-3,10-12 * /var/hack/ && /var/hack/dailymail.tcl &
15 6 * 3-10 * /var/hack/ || /var/hack/dailymail.tcl &
to get DailyMail to run at 7:15 regardless of if timezone is BST or GMT

(Without I had the following within /var/hack/etc/crontab
"6 15 * * 0 /var/hack/dailymail.tcl &" to /var/hack/etc/crontab to get DailyMail run at 7:15
  (note hour difference due to DST))

Install Sanderton's DailyMail_Jazz

Grab dailymail_v0.35.6_beta.zipLocal Mirror from or
Unpack it

ftp dailymail/dailymail.cfg to tivo:/var/hack/
ftp dailymail/dailymail_jazz.tcl to tivo:/var/hack/
ftp tivoweb-modules/controlpadding.itcl to tivo:/var/hack/tivoweb-tcl/modules/ (even tho I'm not using EndPad for now)
ftp tivoweb-modules/managedailymail.itcl to tivo:/var/hack/tivoweb-tcl/modules/

On, mkdir /usr/local/apache/

scp -p images/* to

On tivo, elvis /var/hack/dailymail.cfg


set mailserver "<my_smtp_server_ip>"
set domain "<my_domain">
set receipient "<my_email>"
set version3 false
set uktivo true
set endpadinstalled false
set reddotinstalled false
set tivowebplususer false
set dmailHoursahead 48
set dmailShowSuggestions true
set mailcheckingon true
set dmailLinksOn true
set graphicson true
set endpadstatus false
set reddotstatus false
set spacebarrequired true
set emailsendrequired true
set htmlfilerequired true
set yankspeak false
set dmailTivoURL ""
set dmailGraphicsURL ""
$ chmod +x dailymail_jazz.itcl
Do a TivoWeb full restart

$ cat >>/var/hack/
export TIVOSH_POOLSIZE=3244032
/var/hack/dailymail_jazz.tcl > /var/hack/dailymail_jazz.out 2>&1

Add to /var/hack/etc/crontab

20 7 * 1-3,10-12 * /var/hack/scripts/ && /var/hack/ &
20 6 * 3-10 * /var/hack/scripts/ || /var/hack/ &

Install GuideChecker module

Grab gdchecker-v1.01.zipLocal Mirror from
Unzip it
ftp *.png to tivo:/var/hack/tivoweb-tcl/images/
ftp gdchecker.itcl to tivo:/var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install Schedule module

Grab schedule-0.0.3.zipLocal Mirror from
Unpack it
ftp *.css to tivo:var/hack/tivoweb-tcl/
ftp *.png to tivo:var/hack/tivoweb-tcl/images/
ftp *.itcl to tivo:var/hack/tivoweb-tcl/modules/
Do a TivoWeb Quick Reload

Install new "Aerialplug" logos

Grab aerialplug_logos_6.1.zipLocal Mirror logos from
  or for the older release ones
Grab Sanderton's loadlogos.1.1.zipLocal Mirror from
telnet tivo
$ mkdir /var/hack/logos
$ exit
ftp to tivo:/var/hack/logos
ftp unzip to tivo:/var/hack/logos
$ telnet tivo
$ cd /var/hack/logos
$ unzip aerialplug_logos_6
$ unzip
$ chmod 755 loadlogos.tcl
$ ./loadlogos.tcl /var/hack/logos

Do a FULL reload of TivoWeb. This crashed my TiVo ! :( I let it reboot....

Browse to http://tivo/logos/ and check for missing/wrong assignments.

I was missing...
S2 logo for NATGEO NATG1

Some of these I didn't like, so I removed all user-uploaded logos via the deletelogos.tcl
script inside sanderton's

telnet tivo
$ cd /var/hack/logos
$ chmod 755 deletelogos.tcl
$ ./deletelogos.tcl

then did a reboot of the TiVo. This left me with default TiVo-supplier logos for
I was missing assignments for many channels now.
This is to be sorted out still...

Make TivoWeb run automatically on startup

$ mount -o remount,rw /
$ echo "/var/hack/tivoweb-tcl/tivoweb" >> /etc/rc.d/
$ chmod 700 /etc/rc.d/
$ mount -o remount,ro /

Add the HackMan plugin

Grab hackman-V4.0.0.zipLocal Mirror from

Unzip it
ftp modules/hacman.itcl to tivo:/var/hack/tivoweb-tcl/modules/
ftp images/* to tivo:/var/hacak/tivoweb-tcl/images/
(altbootbutton.png brownbutton.png greenbutton.png rebootbutton.png
backdoorbutton.png bufferbutton.png killbutton.png redbutton.png
bootbutton.png conflictbootbutton.png nobootbutton.png xPluszbutton.png)
telnet tivo
$ mkdir /var/hack/tivoweb-tcl/bin_ppc
ftp bin_ppc/SendKey and bin-ppc/find to tivo:/var/hack/tivoweb-tcl/bin_ppc/
$ telnet tivo
$ chmod +x /var/hack/tivoweb-tcl/bin_ppc/*

Do a quick restart of TivoWeb

Add the HackMan plugin

Grab HiGuide 0.5a betaLocal Mirror from

Unzip it
ftp higuide.itcl to tivo:/var/hack/tivoweb-tcl/modules/
ftp NewEpisode.png to tivo:/var/hacak/tivoweb-tcl/images/
telnet tivo

Do a quick restart of TivoWeb

TivoWeb stuff I haven't installed as there is no real benefit (for me that is)...

Sanderton's Dual Tivo ResolutionLocal Mirror - (no point, don't have two TiVos...)
Sanderton's StartUpEdLocal Mirror - (I do this manually)
LJay's modified httpd-tt.tclLocal Mirror from (no point, my firewalls are locked down)
MoviesearchLocal Mirror from - too beta/unstable for me

Utilities I haven't installed as there is no real benefit (for me that is)...

AutospaceLocal Mirror free space indicator from - Too Eye-Candy for me.
Gaim2TivoLocal Mirror from - I Don't use GAIM any more now that I have Trillian
BufferHackLocal Mirror from - Happy with the default Buffers
GetWeatherLocal Mirror from - USian
madplayLocal Mirror from - No need to play MP3s on TiVo, wants anyway
tictactivoLocal Mirror from No need for it.

Stage 8 - Video Extraction

I've tried various tools to extract and convert TiVo recordings into MPEGs and DVDs, currently my tools of choice are MFS_FTP, TyShow, TyTools, and Nero. There are three areas involved in TY video extraction

  1. Stream transfer - I use MFS_FTP, MfsStreamWeb, and the TServer that comes with TyTools.
  2. Stream playing - I use TyShow and mplayer-TiVo
  3. Stream re-encoding, to MPEG or DVD - I used TyStudio originally, but now use TyTools.


Grab mfs_ftp_1.2.9p.tar.zipLocal Mirror from and
Unzip it
ftp mfs_ftp.tar to tivo:/var/
telnet tivo
$ cd /var
$ tar -xvf mfs_ftp.tar
(Ignore errors about "tar: mfs_ftp/ftp: Cannot lchown to uid 0 gid 0: Function not implemented")
$ rm mfs_ftp.tar
$ /var/mfs_ftp/mfs_ftp.tcl
By default the FTP daemon listens to port 3105

Add "/var/mfs_ftp/mfs_ftp.tcl" to /etc/

FTPing to the TiVo on port 3105 now lets me log into mfs_ftp. CDing to the txt/xml directory allows retrieval of program information in plain text or XML format, and CDing into the /ty directory allows the retrieval of .ty streams. For example

$ ftp tivo 3105
Connected to tivo. 220 Mfs_Ftp ver 1.2.9p - {sock16} from "" Name (tivo:winuser): 331 User name okay, need password. Password: 230 Running in TiVo Mode. Remote system type is UNIX. ftp> ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for file list. dr--r--r-- 1 0 0 1024 Jan 01 1972 tmf dr--r--r-- 1 0 0 1024 Jan 01 1972 ty dr--r--r-- 1 0 0 1024 Jan 01 1972 ty+ dr--r--r-- 1 0 0 1024 Jan 01 1972 xml dr--r--r-- 1 0 0 1024 Jan 01 1972 txt dr--r--r-- 1 0 0 1024 Jan 01 1972 bat dr--r--r-- 1 0 0 1024 Jan 01 1972 asx -r--r--r-- 1 0 0 0 May 31 19:00 phoenix.txt -r--r--r-- 1 0 0 0 May 31 19:00 shutdown.txt 226 Transfer complete. ftp> ftp> cd txt 250 Directory change successful. ftp> dir 200 PORT command successful. 150 Opening ASCII mode data connection for file list. .... -rwxr-xr-x 1 0 0 3138 Feb 03 10:00 {The Real Da Vinci Code}{2005-02 -03}{}{10.00 PM Thu Feb 03, 2005}{C4}.txt .... ftp> type image ftp> get "{The Real Da Vinci Code}{2005-02-03}{}{10.00 PM Thu Feb 03}{C4}.txt ftp> cd .. ftp> cd xml ftp> get "{The Real Da Vinci Code}{2005-02-03}{}{10.00 PM Thu Feb 03}{C4}.xml ftp> cd .. ftp> cd ty ftp> get "{The Real Da Vinci Code}{2005-02-03}{}{10.00 PM Thu Feb 03}{C4}.ty ftp> quit $ more The*.txt {The Real Da Vinci Code}{2005-02-03}{}{10.00 PM Thu Feb 03, 2005}{C4} -776 Meg The success of Dan Brown's fictional story about the Holy Grail, and whether its historical claims stand up to the scrutiny of historians. ... $ more The*.xml <?xml version="1.1" tivoversion="2.5.5-01-1-023"?>
<Object type="Recording" id="_top">
<SubObject type="RecordingPart" id="Part">

As you'll notice, the filenames are quite long (and full of characters that aren't on everyone's keyboard). So despite normally being a command-line user, I've started using the excellent FileZilla Windows graphical FTP client to transfer .ty files over to my media-editing PC.


Originally I used the TiVo-supporting modified TiVo-mplayer to play .ty streams, as this can play local .ty files retrieved via MFS_FTP and ty files streamed directly from the TiVo.

My TiVo is connected via a WGE101 wireless bridge (B and G-mode capable), but an ME101 AP which is only 802.11B capable. 11Mbps just can't cut it handle real-time streaming from the TiVo, and so I drag .ty files off of it via FTP. For reference though, here's what I did to get TiVo-MPlayer working in streaming mode...

- Grab Tivo MPlayer from

  • (v 0.19 source)
  • Mirror (v 0.16 cygwin binary)
  • Mirror (v 0.16 windows installer)
- I'm already a Cygwin user, so I unzipped and copied mplayer.exe to my cygwin home directory. Had I not been a Cygwin user then I would just have run the -windowsinstaller.exe version.

- To run MPlayer and stream directly from the TiVo requires that the TiVo have the server process running, so ...

- Grab vserver-1.2.tar.gzLocal Mirror from

- Unpack it, and do

ftp vserver/vserver-ppc-s1-exec to tivo:/var/hack/extraction/ and rename it to "vserver"
$ telnet tivo
$ chmod 755 /var/hack/extraction/vserver
$ /var/hack/extraction/vserver &
(vserver listens on port 8074)

Add "/var/hack/extraction/vserver" to /etc/

To list and stream a program directly from the TiVo to my PC, I did ...
$ mplayer -quiet -cache 8192 tivo://
This shows the FSIDs (file IDs) of ty files
[   1418865][12][Lara Croft Tomb Raid][(null)

$ mplayer -cache 8192 tivo://
This plays the above file with FSID 1418865.

The mplayer syntax is ... mplayer [options] [url|path/]filename

Basic options: (complete list in the man page)
 -vo <drv[:dev]>  select video output driver & device ('-vo help' for a list)
 -ao <drv[:dev]>  select audio output driver & device ('-ao help' for a list)
 -ss <timepos>    seek to given (seconds or hh:mm:ss) position
 -nosound         do not play sound
 -fs              fullscreen playback (or -vm, -zoom, details in the man page)
 -x <x> -y <y>    set display resolution (for use with -vm or -zoom)
 -sub <file>      specify subtitle file to use (also see -subfps, -subdelay)
 -playlist <file> specify playlist file
 -vid x -aid y    select video (x) and audio (y) stream to play
 -fps x -srate y  change video (x fps) and audio (y Hz) rate
 -pp <quality>    enable postprocessing filter (details in the man page)
 -framedrop       enable frame dropping (for slow machines)

Basic keys: (complete list in the man page, also check input.conf)
 <-  or  ->       seek backward/forward 10 seconds
 up or down       seek backward/forward  1 minute
 pgup or pgdown   seek backward/forward 10 minutes
 < or >           step backward/forward in playlist
 p or SPACE       pause movie (press any key to continue)
 q or ESC         stop playing and quit program
 + or -           adjust audio delay by +/- 0.1 second
 o                cycle OSD mode:  none / seekbar / seekbar+timer
 * or /           increase or decrease PCM volume
 z or x           adjust subtitle delay by +/- 0.1 second
 r or t           adjust subtitle position up/down, also see -vop expand

Next I installed the MFSStreamWeb module into TiVoWeb, this is another method of grabbing TY streams - this time via the browser.


Grab Local Mirr
or from
Unzip it
$ telnet tivo
$ mkdir /var/hack/extraction/
$ exit
ftp ./mfsstream to tivo:/var/hack/extraction/
ftp ./tyhttp* to tivo:/var/hack/extraction/
$ telnet tivo
$ chmod 755 /var/hack/extraction/*
$ exit
ftp ./modules/* to tivo:/var/hack/tivoweb-tcl/modules/
$ telnet tivo
$ cd /var/hack/tivoweb-tcl/modules/
$ elvis mfsstream.cfg
(Check, and leave everything as defaults. Specifically leave "port:" set to 2000
$ /var/hack/extraction/tyhttpd 2000 4 >> /dev/null &
Do a quick restart of TivoWeb

Add "/var/hack/extraction/tyhttpd 2000 4 >> /dev/null &" to /etc/


I still use mplayer-tivo when streaming from the TiVo to Linux, however under Windows I stopped using mplayer-tivo and switched to Windows Media Player and TyShow.


- Grab Mirror from
- Unpack the whole rar file into a temporary directory
- Run the register.bat file.
This installs codecs so that any media player (for example Windows Media Player) should now be able to play .ty files directly without any format conversion.


Initially I started doing MPEG conversions for DVD using TyStudio. TyStudio and TyTools are both powerful .ty conversion utilities, TyStudio is far quicker to get to grips with but now I use TyTools for two reasons
- It can do good frame-accurate (FAE) editing, so I can trim clips and remove commercials right down to the frame level
- It has an inbuilt tool for creating DVD menus with buttons and backgrounds.


To install TyStudio I :-

- Grabbed TyStudio 0.50b2 for WindowsLocal Mirror and LinuxLocal Mirror from

- Grabbed TyServer 0.50b2 for the TiVoLocal Mirror from

The TiVo TyServer allows you to pull files directly from the TiVo into TyStudio's editor. I don't use this, I just ftp the ty files over, but if you do want to use the TyServer then see the TyServer installation file.

- Run the setup.exe file.

To edit a stream, I ftp the .ty file over to my PC, and then

- Run TyStudio's editor.exe

- Click on "Click here to load a local .ty file", and pick the .ty file from wherever you FTP'd onto.

- TyStudio will index the file (for an hour of video, this takes about 45 seconds on a 900MHz Pentium). Apparently the advantage of TyServer is that it pre-indexes all of the files on the TiVo and so this stage gets skipped.

- Use menu Tools|Options|Encoding Defaults|Video - Set it to "DVD"

- Use menu Tools|Options|Encoding Defaults|Audio - Set to "48000 (DVD)"

- The menu Tools|Options|File Locations lets you set the paths for .ty files, output files, and (if you use TyServer) the IP address of your TiVo.

You will now be ready to edit your TY stream, and then transcode it to MPEG. You'll certainly want to trim any content before the start of the program, and after the end, i.e. where the TiVo has started recording early and/or run on past the program end, and might want to remove commercials. This is where you do both of these.

- To move through the stream, you can click on the < and > buttons to play backwards and forwards, and the || button to stop play.

- To fast-forward or move to the stream end, use the >> and >| buttons. Likewise the << and |< buttons to move fast-backwards or to the start of the stream.

- To make a cut, i.e. remove a section of the stream (e.g. an advert), you need to mark a start and an end cut point. To do this...

- Move to the start point where you want to cut FROM, and click on "Cut Start"

- Move to the end point where you want to cut UP TO and click on "Cut Stop"

After doing that, in the top right hand side of the editor window you should see a cut entry looking like

Cut Start <nnnnnnn> <>
Cut End   <nnnnnnn> <>

where "nnnnnnn" is a frame number, and "" is a time value within the stream.

- You need a end-point for each start cut point, else you cut to end of file. Likewise you need a start-point for each end cut point else you cut from the start of the file.

- The menu File|Save as Image - allows you to save the current frame image to a PNG or BMP file for making DVD covers.

- When you are done marking cut points, click on File|Process to produce a DVD-ready MPEG.


TyTool is what I'm currently use to create DVDs. The notes that follow are still alpha-level and incomplete..


To install TyTool I :-

- Grabbed TyTool9r18.zipLocal Mirror and Cygwin-2-20-04.zipLocal Mirrorfrom

- Created "C:\Program Files\TyTools" and copied the two zip files there.

- Unpacked and into the directory.

- Within the TyTool zip archive there is a subdirectory called "TSERVER_Series1" which contains two files; "NowShowing.tcl" and "tserver".

- ftp these files over to the TiVo, I created a subdirectory on my TiVo called /var/hack/extraction.

- telnet tivo

$ cd /var/hack/extraction        (or wherever)
$ chmod +x NowShowing.tcl
$ chmod +x tserver

- Run the TyTool9r18.exe within the TyTools subdirectory. This launches the TyTool shell

- Under the "Server" menu, click on "Set Execute String".
- Enter the fully qualified (i.e. including path) filename of the tserver binary, followed by "-s and the fully qualified filename of the NowShowing.tcl script" then click "Ok".
For example, I copied the binary and script into /var/hack/extraction and so my "Execute String" looks like this :-

/var/hack/extraction/tserver -s /var/hack/extraction/NowShowing.tcl

- Under the "Server" menu, click on "Set TIVO Shell Prompt". Enter the prompt that is displayed when you first telnet into your TiVo. Then click "Ok".
When I telnet into my TiVo the command prompt looks like this "TiVo: {/var/tmp} %" and so I specify this (without the quotes) as my Shell Prompt.

- You only need to set the Shell Prompt and Execute String once, they are saved across future TyTools sessions.

- Type the IP address of your TiVo into the "Tivo Address:" box

- Type the local working path (into which you want TiVo streams to be stored) into the "Local Dir:" box.

Similarly, the TiVo IP address and working path are stored across sessions and so you don't need to enter them each time.

- Ensure that the audio type (Options|Audio) is set to 5 for DVD ("48@192").

Alll being well, you should now be able to launch the tserver process...

- Under the "Server" menu, click on "Start tserver". You should see a small window appear showing the output from the tserver process, all being well this should show "Doing the Lowest PriorityFix" and "Waiting for an incoming connection!"

Using TyTool

There are six steps to turning a .ty stream into a DVD via TyTool.

  1. Transferring the stream from the TiVo to the PC
  2. Parsing it and splittig into video and audio components
  3. Making a key file
  4. Editing the key file/stream and trimming it (plus removing adverts if necessary)
  5. Multiplexing the streams into a DVD "VOB" file
  6. Creating the DVD.

1 - Transferring a stream

In the same way as for TyStudio, you can manually transfer TiVo streams over via ftp and mfs_ftp on the TiVo, or you can use the "tserver" transfer tool that is built into TyTool. Initially I was ftp'ing streams over manually, but I moved to using tserver for two reasons :-

  1. I found a small transfer performance increase. My TiVo is on the wireless side of a wired+wireless network, and so the extraction throughput is pretty much limited by the wireless AP anyway, but I found that with tserver I averaged 0.55MB/s versus 0.51MB/s via ftp+mfs_ftp
  2. A couple of times mfs_ftp locked up and I had to kill its process, resulting in a rebooting TiVo.

To transfer via tserver :-

- If you don't already have it running, run TyTool9r18.exe, and start the tserver process via the menu option.

- You will see blank window area titled "Now Playing:"

- Click on the "Refresh" button under this window.

- After a couple of seconds you should see a list of available programs.

- Click on and highlight one (or more) of them.

- Click on the "Get" button which is under the second, grey-background, blank area which is beneath the stream list.

- TyStudio will transfer the selected stream(s) into the "Local Dir" path.

Time-wise, I'm not a good measuring-stick case by any means - as my TiVo is behind a wireless bridge and my media-editing PC is on the wired side of a wireless AP - and so I only get about 0.55MB/s, meaning that a 660Mb (35 minute, basic quality ) stream takes approximately 18.55 minutes to transfer, and a 3500Mb (95 minute, high quality) stream takes approximately 98 minutes to transfer.

2 - Parsing (splitting) a stream file

The next step is parse (split) the .ty stream file, into video and audio components. To do this :-

- Double-check that the audio setting is mode 5 (DVD)

- Click on the "Parse File" button.

- Select one or more .ty files

- Click on "Ok"

This will split each .ty stream file into video (".m2v") and audio (".m2a") streams.

On a 900Mhz Pentium 3 with 256Mb RAM, this takes approximately <nnn> minutes for a <nnnn> Mb stream, i.e. <oooo> Mb/s. At the end of this stage you will have in your working directory :-

  • The .ty stream
  • The .m2v stream
  • The .m2a stream.

Size-wise, as an example an initial .ty file of <nnnnn> bytes gets turned into an m2v stream of <nnnnn> bytes and an m2a stream of <nnnnn> bytes.

3 - Making a Key file

The next stage is to make a "key" file, this is required by the TyTool stream editor, and you will need to do it to make cuts in your stream. To make the key file for a stream :-

- Click on Menu|File|Make Key file

- Pick the .ty stream(s)

- Click on "Ok".

This creates a .key file which will be used in the next stage.

On a 900Mhz Pentium 3 with 256Mb RAM, this takes approximately <nnn> minutes for a <nnnn> Mb stream, i.e. <oooo> Mb/s.

At the end of this stage you will have in your working directory :-

  • The .ty stream
  • The .m2v stream
  • The .m2a stream
  • The .key file

As an example of the output file size, a .ty file of <nnnn> bytes creates a .key file of <nnnn> bytes.

4 - Editing the stream


5 - Producing a DVD "VOB" file (multiplexing)

TBD. This stage turns the split streams into a single DVD "VOB" file, creates a Chapter ".chp" file, and at the same time makes any cuts that you created in the above editing stage. To multiplex the files, click on "File|pppppppppp", click the "....." option, select one or more .ty files, and click "Ok".

On a 900Mhz Pentium 3 with 256Mb RAM, this takes approximately <nnn> minutes for a <nnnn> Mb stream, i.e. <oooo> Mb/s. Size-wise, a .ty file of <nnnn> bytes, after trimming produces a .vob file of <nnnn> bytes.

At the end of this stage you will have in your working directory :-

  • The .ty stream
  • The .m2v stream
  • The .m2a stream
  • The .key file
  • The .cut file
  • The .vob file
  • The .chp file

If you are short on disk space then you can now remove the .ty file, the .m2a file, the .m2v file, the .key file, and the .cut file (the .vob and .chp files are the most important things). (Need to check on removal order and .chp file creation stage).

6 - Creating a DVD file-system


Notes to be completed ......

Hard disk recovery

On the 28th December I was woken up in the night by a power cut (my answerphone announces the time-of-day loudly after a power cycle). I got up to check the freezer and stuff, and found the lounge TiVo rebooting and the Cachecard drivers doing their tests. Just before they completed, the power dropped out and flicked back on again (gee thanks power company!) and the Cachecard drivers splashed up the "Possible hard disk failure" warning during the TiVo's reboot. Oh great!

Sure enough /var/log/kernel showed

kernel: cachectl: Caching.... 0% ....IDE: calling handler with dma_running,
  kernel: IDE: read command for sector 77519400 bailed with DMA running
hda: unexpected_intr: status=0x59 { DriveReady SeekComplete DataRequest Error}
hda: unexpected_intr: error=0x40 { UncorrectableError }, secCnt=2, LBAsect=10410542
kernel: Stopping immediate on Ide
kernel: hda: tivo_dma_intr_direct: status=0x59 { DriveReady SeekComplete DataRequest Error }
kernel: hda: tivo_dma_intr_direct: error=0x40 { UncorrectableError }, secCnt=2, LBAsect=10410542

which would seem like a pretty definitive disk sector error. I played a couple of recordings, and looked for any more errors. Nothing else showed up in subsequent log lines, and more interestingly smartctl showed no errors having been logged.

So I pulled the drive and put it in a spare PC then let Samsung's HUtil run a full surface scan on it. 54 minutes later it completed without errors, and sure enough there was still nothing logged in the SMART logs/statistics. To retest it I then booted Linux on that box and did a

dd if=/dev/hdc of=/dev/null bs=512

which again worked fine and completed ~53 minutes later without any errors. So fingers crossed maybe I dodged a bullet there I thought. My thoughts at the time were that either... (a) The drive's SMART statistics are not telling the truth and the drive remapped a bad sector, (b) There was no error and either the kernel or Cachecard drivers flagged a phantom, or (c) There was a soft sector error - the ECC bits were bad due to an in-progress write on that sector when the power dropped, and a subsequent write rewrote the sector correctly. Go figure!

But then a few weeks later, I had to kill a wedged mfs_ftp and it caused the TiVo to reboot. The Cachecard drivers picked up the same error, same sector, but SMART still showed nothing. At this point I was still unsure if it was a real or phantom error, as I've generally trusted SMART implementations in the past.

The TiVo seemed to run without any problems, barring the error warning on bootup, and so I left it alone. But then a month or so later I started getting random lockups when recordings were in-progress, the kernel log showing that the TiVo was basically looping attempting to write to that same sector. So I ordered an identical Samsung Spinpoint from Mark at Whispertec which arrived a couple of days later.

The old and new drive were slightly different firmware versions but had the same drive geometry, and so rather than using mfsdump/mfsrestore I decided to dd the data over. I figured that regular dd was just going to die halfway and so I'd need to use dd_rescue.

I put the old TiVo drive into a spare Linux pc as primary-slave (hdb) and the new one in as secondary-master (hdc) and booted up, checking that the drives and their sizes had been correctly probed. Then I turned on DMA on both drives by doing

$ hdparm -d1 /dev/hdb; hdparm -d1 /dev/hdc

Next I grabbed a copy of dd_rescueLocal Mirror from, unpacked the tarball, and did :-

$ ./configure
$ make
$ make install

To copy the drive, I then did :-

$ ./dd_rescue -B 1b -b 2M -A -v -l /tmp/tivo.log /dev/hdb /dev/hdc

This started off very nicely and was using a 2MB block size ("-b 2M"), and I was seeing a copy rate of 20MB/s - but then it hit the error sector and slowed down due to falling back to a 512 byte ("-B 1b") and due to retrying the bad sector. It eventually stablizied at 3M/s, slower than I'd hoped for but by that time it was half way through the copy and so there didn't seem to be any point in stopping and restarting it to try and speed things up. In the end it took just over 7 hours to copy the 120Gb drive. The output (summarized to show just the first of the 16 retries) is below.

dd_rescue: (info): about to transfer 0.0 kBytes from /dev/hdb to /dev/hdc
dd_rescue: (info): blocksizes: soft 2097152, hard 512
dd_rescue: (info): starting positions: in 0.0k, out 0.0k
dd_rescue: (info): Logfile: tivo.log, Maxerr: 0
dd_rescue: (info): Reverse: no , Trunc: no , interactive: no
dd_rescue: (info): abort on Write errs: no , spArse write: never
dd_rescue: (info): about to transfer 0.0 kBytes from /dev/hdb to /dev/hdc
dd_rescue: (info): about to transfer 0.0 kBytes from /dev/hdb to /dev/hdc
dd_rescue: (info): blocksizes: soft 2097152, hard 512
dd_rescue: (info): blocksizes: soft 2097152, hard 512
dd_rescue: (info): starting positions: in 0.0k, out 0.0k
dd_rescue: (info): starting positions: in 0.0k, out 0.0k
dd_rescue: (info): Logfile: tivo.log, Maxerr: 0
dd_rescue: (info): Logfile: tivo.log, Maxerr: 0
dd_rescue: (info): Reverse: no , Trunc: no , interactive: no
dd_rescue: (info): Reverse: no , Trunc: no , interactive: no
dd_rescue: (info): abort on Write errs: no , spArse write: never
dd_rescue: (info): abort on Write errs: no , spArse write: never
dd_rescue: (info): ipos: 38758400.0k, opos: 38758400.0k, xferd: 38758400.0k
errs: 0, errxfer: 0.0k, succxfer: 38758400.0k
+curr.rate: 18107kB/s, avg.rate: 22967kB/s, avg.load: 62.7% dd_rescue: (info): ipos: 38759680.0k, opos: 38759680.0k, xferd: 38759680.0k
* errs: 0, errxfer: 0.0k, succxfer: 38759680.0k
+curr.rate: 35985kB/s, avg.rate: 22967kB/s, avg.load: 62.7%
dd_rescue: (warning): /dev/hdb (38759680.0k): Input/output error! dd_rescue: (info): ipos: 117245952.0k, opos: 117245952.0k, xferd: 117245952.0k
errs: 16, errxfer: 8.0k, succxfer: 117245944.0k
+curr.rate: 2953kB/s, avg.rate: 4164kB/s, avg.load: 0.7%
dd_rescue: (info): /dev/hdb (117246528.0k): EOF
Summary for /dev/hdb -> /dev/hdc:
dd_rescue: (info): ipos: 117246528.0k, opos: 117246528.0k, xferd: 117246528.0k
errs: 16, errxfer: 8.0k, succxfer: 117246520.0k
+curr.rate: 21759kB/s, avg.rate: 4164kB/s, avg.load: 0.7%

I powered down, put the new drive into the TiVo, and powered it up. It booted, TiVo-guy slid down his slide, and I successfully played a couple of recordings.

Next I wanted to run an mfscheck command, but I couldn't telnet into the TiVo (this turned out to be a dodgy CAT5 f-f connector on the cable), so I left it alone while I ate dinner. Ten minutes later, I came back to find the TiVo displaying its GSOD (Green Screen of Death) display. I wasn't too surprised, as I was expecting some sort of fallout from the sector that couldn't be copied (dd_rescue would have written zeros to that sector on the new drive instead of the original data).

35 minutes later, TiVo rebooted and came back to life. Looking at the kernel log, the failure that brought it down and forced the GSOD was

May 26 16:18:57 (none) FsNodeScanner[127]: Scanner hit inode with bad primary and secondary CRCs
May 26 16:18:57 (none) last message repeated 7 times
May 26 16:18:59 (none) DbGc[127]: saying 822 isn't garbage 'cuz never visited it!
May 26 16:19:04 (none) DbGc[127]: saying 1894861 isn't garbage 'cuz never visited it!
May 26 16:19:05 (none) DbGc[127]: saying 1954864 isn't garbage 'cuz never visited it!
May 26 16:25:56 (none) FsNodeTable[127]: Inode page 130244 has bad CRC in primary
May 26 16:25:56 (none) FsNodeTable[127]: Inode page 130244 has bad CRC in secondary
May 26 16:25:57 (none) FsVolume[127]: Assert failed: 0 at fsnodetable.C line 807
 in int FsNodeTable::GetPage(long unsigned int, class FsBuffer *&)
May 26 16:25:59 (none) TmkAssertionFailure[127]: 0 (int FsNodeTable::GetPage(long unsigned int,
   class FsBuffer *&), line 807 (fsnodetable.C))
May 26 16:25:59 (none) dbgc-mcp[127]: Tmk Fatal Error: Thread dbgc-mcp <127> died due to signal -2

which was pretty-much to be expected given that empty-sector. After this, I sorted out the Ethernet connection, telnetted into the TiVo and did a :-

TiVo: {/} % /tvbin/mfscheck
EventSwitcher stopped
mfscheck scan begins
Checking reference counts
  All reference counts are OK.
  mfscheck scan ends
  mfscheck: 0 fatal errors, 0 severe errors, 0 warnings.
You must manually restart the EventSwitcher

I then rebooted the TiVo and so far (fingers crossed) all seems well.

General notes

Still todo.....

MFSExtractTivoWeb (TivoWeb module) -
DisplayStream (Windows debugging app) from
ty2mpeg from

TivoApp (OBSOLETE) src/bins from
TyStudio (OBSOLETE) from
TYTools FAQ at
TYTool(s) from

Tivoweb Modules
  Sanderton  EndPad -

EpisodeTracker from
Hackman from

Channel Remap -
RunScript2 -
TivoWeb WAP -
RSSFeed -

Graphic stuff
slideshow -

TivoTitle from
EditTitle3 from
No Red Dots or Missed Channel Changes - (irblast/noreddot)
DelManual from
Blocklist from

MRTG (LJay) from
Whatson/playing PHP scripts from
Default to 30second-skip patch -
WebPHP from
Tivo Telnet Control Center -
TCS from


For cross-compilation on spare linux box (debian woody),

$ adduser tivodev
$ cd /home/tivodev
$ wget Mirror
$ bzip2 -dc usr.local.powerpc-tivo.tar.bz2 | tar -xvf -
$ mv ./usr/local/tivo /usr/local
$ cat >helloworld.c
int main (int argc, char **argv)
    printf("Hello from your TiVo\n");
$ /usr/local/tivo/bin/gcc -o helloworld helloworld.c
$ ls -l helloworld*
-rwxr-xr-x    1 root     root        38207 Sep 23 15:35 helloworld
-rw-r--r--    1 root     root           81 Sep 23 15:34 helloworld.c

Grab libtivohack from Mirror, unpack
$ mv libtivohack.a /usr/local/tivo/lib/

Grab and

Build a dummy library routine

The stock TiVo nmbd/smbd wanted various library routines, e.g.<n> - where they had been built
for a D1 TiVo. The UK 2.5.5 won't load them, even through the routines in them aren't used. So I built a
dummy library containing one routine - void dummy() that does nothing. Source code, .a and .so files are
available at

Port Jeff Lawson's datapipe to TiVo


Port Matt Johnston's Dropbear SSH server TiVo


Valid HTML 4.01!