From MythTV Official Wiki
Revision as of 02:25, 19 April 2017 by Steveadeff (talk | contribs) (Parent's Systems)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search


My Life

Electric Power Engineer living in Boston, MA

I can be reached for mythtv purposes at adeffs_dot_mythtv_at_gmail_dot_com.

My Myth Contributions

I don't really code, but I try to be active in bug and feature testing.

This project has been moved to Google Code to make managing it easier. import perl script for adding archived shows to the MythTV Watch Recordings DB or the MythVideo? database (pre-0.22).

I wrote a script for handling my DCT-6200 cable boxes connected via firewire that changes the channel and uses firewire_tester to stabilize the connection before Myth tries to record. This has, over the last two years, allowed me to not fail in recording a single show.

To use, set it up in mythtv-setup as the channel change script. Give it the GUID of the box as shown in mythtv-setup. The script takes two variables, the first being the GUID (which is why you have to specify it) and the second is the channel number (which mythtv automatically feeds it at the end of the command you give it). The script then changes the channel on that GUID and runs firewire_tester. In running firewire_tester it requires that it show the connection is stable twice. If it iterates 10 times it will automatically re-tune the channel, and after 50 attempts total it will send Myth the "failed" result, otherwise it will send Myth the "success" result.

You can change the script to use another channel changer if you require.


GUID=`echo "$1"|sed -r "s/[A-Z]+/\L&/g"`

NODE=`plugreport | grep $GUID | awk '{if (($1 == "Node")  && ($4 == "'"0x$GUID"'
")) print $2}'`
echo "Node: '$NODE'"
echo "Changing to channel $CHANNEL"
6200ch -v -s -g $GUID $CHANNEL
#maybe a pause is needed?
sleep 4

echo "Stabilizing Firewire Connection!..."
#maybe an initial run followed by a verification run?

#initial run
firewire_tester -B -r2 -n$NODE

#while [ "$STABILIZE" != "Broadcast Fix: Success (already stable)" ]
while [ $STABLECOUNT -lt 2 ]
       STABILIZE=`firewire_tester -B -n$NODE|grep "already stable"`
       if [[ "$STABILIZE" != "Broadcast Fix: Success (already stable)" ]]
               echo "Not Stable! Attempt $COUNT"
               if [ $TOTALCOUNT -gt 50 ]
                       echo "FAILED to Stabilize!!"
                       exit 1
               if [ $COUNT -gt 10 ]
                       6200ch -v -s -g $GUID $CHANNEL
                       firewire_tester -B -r2 -n$NODE
               echo $STABILIZE
echo "Stable!"
exit 0

My Systems

I've since moved on from MythTV after moving out of the 5br apartment I lived in with housemates and now use a TiVo Roamio.

Dedicated Back End


Theater Room Frontend

Frontend Theater/Stereo Equipment

Old Speakers:

  • Paradigm Reference Studio(v.2) 40's, Studio CC(v.2) and Titan's for surround

Current Personal Bedroom Equipment

Current Housemate Bedroom Equipment

Parent's Systems

I built a home Myth system for my parents, here's what they have.

Combined Backend/Frontend

Kitchen Frontend

Master Bedroom Frontend

Office Frontend

Guest Bedroom Frontend

Spare (Old Personal Bedroom) Frontend

Spare (Old Housemate Bedroom) Frontend

As used by one of my housemates with his HDTV

Spare (Kitchen) Frontend

System Customizations

Frontend Auto login

For those of us that want to run mythfrontend without a window manager, here is the information the dev's don't want you to see:

disable window manager


assuming lightdm is being used,

echo "manual" | sudo tee -a /etc/init/lightdm.override

The splash screen can cause some problems, so I would suggest you to disable it. Edit the /etc/default/grub file and replace the line GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" with GRUB_CMDLINE_LINUX_DEFAULT="quiet". Then generate a new Grub2 config file,

sudo update-grub


When X starts it looks to the users home directory for the .xinitrc file. There are two options at this point for how to use .xinitrc, one will load a window manager, the other will not.

No Window Manager

For no windowmanager, create/edit the user's .xinitrc and add,

Script.png .xinitrc

xset -dpms s off
xsetroot -solid black
mythfrontend -l /home/mythtv/mythfrontend.log

This will turn off dpms, turn the X default background color black and log to /home/mythtv/mythfrontend.log. These options can, obviously, all be changed.

Also included is an easy way to access mythtv-setup or xterm, just uncomment the appropriate line and comment out the mythfrontend line.

Note that running mythfrontend without a window manager is not a supported configuration. You may run into focus problems when trying to press buttons, enter text and generally use the system. These issues have mostly been fixed in the newer versions of MythTV and many users run this method successfully, especially with Mythbuntu

X11 Remote Keymapping (ie LIRC-less)

ir-keytable or: How I Learned to Stop Worrying about the LIRC Kernel


Control your media player using your existing remote control

MythTV: Use All Buttons of Your Remote Control - Without LIRC


I've become somewhat of a mencoder/BASH scripting guru through my many adventures using it and writing scripts.

HR.HDTV script

I wrote this script to create my own versions of what "the scene" calls HR.HDTV encodes. These look decent on HDTV's up to about 50". Beyond that I highly recommend using x264 at 720p encodes. It may take a lot more processing to get done, but if your TV is that big you'll thank me for recommending it.

So what this script does is convert any 1080i or 720p recording to "HR.HDTV" which is basically a 960x544 resolution file with the original AC3 soundtrack. It will encode to the CD size standard of putting one hour of tv on a CD (ie 44minutes into 700MB, 22minutes into 350MB). It's also a good start to doing other conversions as the options can easily be changes to do things like encode to x264 at 1280x720(hint hint)...

You will need PerlCalc for some math in the script...

# My script to create hr.hdtv encodes.
# This script will perform the following tasks:
# 1. Analyze the original mpeg for
#       a. play length
#       b. audio size
#       c. frame speed (60fps/30fps)
# 2. Calculate final file size (350MB or 700MB)
# 3. Calculate final video size based on final file
#    size and audio size.
# 4. Encode.


#Video Length Calculation
function VideoSizeCalc() {
        audiosize=`pc $audiobitrate/1000*$totalseconds*0.1220703125/1024`
        echo "Audio Size in MB = $audiosize"
#       audiooverhead=`pc $totalseconds*1000/64`
#       videooverhead=`pc 23.976*$totalseconds`
#       totaloverhead=`pc $audiooverhead+$videooverhead`
#       overheadsize=`pc $totaloverhead*$overheadbytes/1024**2`
#       overheadsize=`echo `${overheadsize:0:4}``
#       echo "(DD) Overhead = $overheadsize MB"
        totalseconds=`echo $totalseconds|sed -e 's/\.[0-9]*//'`
#       echo "(DD) Total Seconds = $totalseconds"
        if [ $totalseconds -lt 1800 ]; then
        elif [ $totalseconds -lt 3600 ]; then
                echo "I don't know how to handle this length!"
                exit 1
        echo "Total Size = $totalsize"
#       videosize=`pc $totalsize-$overheadsize-$audiosize` #original formula
        videosize=`pc $totalsize-$audiosize`    # new one since overhead doesn't

                                                #really matter its so small
        videosize=`echo `${videosize:0:3}``
        echo "Videosize = $videosize MB"

function FolderNameClean() {
        input=`echo "$input" | sed -e 's/.[Aa][Vv][Ii]//'`
        input=`echo "$input".XviD-MythTV`

#test for arguements
if [[ -z "@ARGV" ]]; then
        echo "first arguement is the original mpg"
        echo "second arguement is the new folder name, will be used for filename"
        #Reassign variables
        if [[ ! -e $1 ]]; then
                echo "no such input mpg!"
        FolderNameClean $2
        file_name=`echo "$folder_name" | tr A-Z a-z`
        # display arguments
        echo "Original mpeg is: $original_name"
        echo "Folder name will be: $folder_name"
        echo "File name will be: $file_name"

#Grab input file information
echo "Determining total file length..."
totalseconds=`mencoder $original_name -ovc copy -nosound -o /dev/null -quiet 2>&1 | awk '/^Video stream:/{print $10+$10/$12}'`
echo "total seconds = $totalseconds"
audiobitrate=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_AUDIO_BITRATE" | sed -e 's/ID_AUDIO_BITRATE=0//' | grep "ID_AUDIO_BITRATE" | sed -e 's/ID_AUDIO_BITRATE=//'`
echo "audio bitrate = $audiobitrate"
videowidth=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_WIDTH" | sed -e 's/ID_VIDEO_WIDTH=//'`
videoheight=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_HEIGHT" | sed -e 's/ID_VIDEO_HEIGHT=//'`
videofps=`mplayer -vo null -ao null -frames 0 -identify "$original_name" 2>/dev/null | grep "ID_VIDEO_FPS" | sed -e 's/ID_VIDEO_FPS=//'`
videofps=`echo `${videofps:0:2}``
echo "FPS: $videofps"
aspect=`pc $videowidth/$videoheight`
aspect=`echo "$aspect" | tr -s [:digit:]`
echo "Aspect Ratio: $aspect"
#Calculate Video size
sleep 10
videosize=`pc $videosize*1024`
echo "Videosize = $videosize"

if [[ -e "$original_name" ]]; then
        echo start `date +%H:%M`>$file_name.runtime
        if [[ "$videofps" -eq "59" ]]; then
                nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=1:vhq=0:me_quality=5:turbo:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o /dev/null
                nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf decimate=2:1000:1600:.001,scale=960:544 -ofps 24000/1001 -xvidencopts pass=2:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o $file_name.avi
        elif [[ "$videofps" -eq "29" ]]; then
                nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf pullup,softskip,scale=960:544 -ofps 24000/1001 -xvidencopts pass=1:vhq=0:me_quality=5:turbo:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o /dev/null
                nice -n 17 mencoder $original_name -oac copy -ovc xvid -vf pullup,softskip,scale=960:544 -ofps 24000/1001 -xvidencopts pass=2:vhq=0:me_quality=5:quant_type=mpeg:aspect=$aspect:max_bframes=0:bitrate=-$videosize -o $file_name.avi
        echo stop `date +%H:%M`>>$file_name.runtime
        echo "Runtime"
        more $file_name.runtime

NeroAAC in linux

NOTE: Nero recently released a version of their encoder that is linux native, but I haven't updated my script for it since I actually rarely use it now, I've been using dbPowerAmp at work...

Recently Nero released their wonderful AAC encoder for "DOS" (command line app in windows). Since I'm a huge fan of AAC for compressed audio due to its quality I was hoping they'd release a linux version, but as it turns out their windows version was designed to work a-o-k in linux under WINE!

The only caveats I've found is that you need to have the folder where you music ready for conversion is mapped as a drive in Wine. As well, the filenames cannot have any periods in them except for the one that designates the extension (ie is no good but this song is good.flac is fine), which is an issue I know how to solve with a simple perl rename, but have yet to tackle in the script... Other than that, your good to go.

So what I did, is I wrote a script that will convert any format mplayer supports, as well as APE to M4A. Right now I really only have it setup for WAV, FLAC and APE though, but its pretty easy to add other formats. For mplayer supported formats look at the FLAC functions, for formats that require another decoder to get to WAV look at the APE section. This script can also recursively enter folders, so you can rip a whole lot of CD's (using cdparanoia or EAC under WINE of course!) into seperate folders and run this script from their root and it will go into each folder and convert! how handy!

This site has some great info on the encoder, as well as how to encode directly to M4A when ripping with EAC. This is a good guide to do the same in K3B.

This script has two command line options as of now. First it will allow you to delete the original after a successful encode using -e, or you can specify a specific directory with -d.

This script also has some defined options near the top, EncoderDir=~/.wine/drive_c/Program\ Files/Nero QualityLevel="0.8"

EncoderDir is obviously where your neroAACenc.exe file is, and Quality level is a numerical value for the recording quality setting. I don't like compressed audio and find that 0.8 is a good balance for my ears and my desire to keep file sizes down. This equates to about 300Kbps, which is rather large for even the MP3 format, so feel free to change this value for your needs.

For those that used the old Nero encoder with "Quality Levels", here's a quick conversion chart...

Old Presets Quality Levels
Tape -q=0.0
Radio -q=0.1
Internet -q=0.2
Streaming -q=0.3
Normal -q=0.5
Extreme -q=0.6
Audiophile -q=0.8
Transcoding -q=1.0
 EncoderDir=~/.wine/drive_c/Program\ Files/Nero
 function Main() {
         until [ -z "$1" ]
                 echo "Processing parameter of: '$1'"
                 if [ ${1:0:1} = '-' ]; then
                         tmp=${1:1} # Strip off leading '-' . . .
                         parameter=${tmp%%=*} # Extract name.
                         if [ "$parameter" = "e" ]; then
                                 echo "Will erase originals upon successful encode!"
                         if [ "$parameter" = "d" ]; then
                                 echo "Directory taken from command line as: $dir
         echo "Working directory: $directory"
 for dir in $( find -type d )
         cd $dir
         for file in $( find -maxdepth 1 -type f -name '*.flac' -printf '"%f"\n'|
 sort )
                 echo "FLAC format found! Converting \""$file"\"..."
                 rename 's/\.{2,}//' $file
                 file=`echo "$file"|sed 's/\.{2,}//'`
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
                 DecodeMplayerSupported $basename.flac $TEMPFILE
                 EncodeToAAC $basename $TEMPFILE
                 rm -f $TEMPFILE
                 RemoveOriginal $basename flac
                 ls *flac
         for file in $( find -maxdepth 1 -type f -name '*.wav' -printf '"%f"\n'|sort )
                 echo "File "$file" already in Wave format, converting to AAC..."
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
                 EncodeToAAC $basename
                 RemoveOriginal $basename wav
                 ls *wav
         for file in $( find -maxdepth 1 -type f -name '*.ape' -printf '"%f"\n'|sort )
                 echo "APE format found! Converting \""$file"\"..."
                 basename=`echo "$file"|sed 's/\..*//'`
                 basename=`echo "$basename"|sed 's/\"//'`
                 DecodeAPE $basename.ape $TEMPFILE
                 EncodeToAAC $basename $TEMPFILE
                 rm -f $TEMPFILE
                 RemoveOriginal $basename ape
                 ls *ape
         exit 0
 function DecodeAPE() {
         nice -n 17 mac $inputfile $outputfile -d
 function DecodeMplayerSupported() {
         nice -n 17 mplayer -vc null -vo null -ao pcm:file=$outputfile:fast "$inputfile"
 function EncodeToAAC() {
         if [ "$2" ]; then
         echo "File base: $filebase"
         echo "TEMPFILE: $2"
         echo "Input File: $infile"
         echo "Output File: $outfile"
         nice -n 17 wine $EncoderDir/neroAacEnc.exe -q $QualityLevel -if "$infile" -of "$outfile"
         if [ $? -eq 0 ]; then
                 echo "Encode Success!"
 #               mv tmp.m4a "$outfile"
                 echo "Encode Failed!"
 #               rm -f "tmp.m4a"
 #               rm -f "tmp.m4a"
 function DiscoverFormat {
 function RemoveOriginal {
         if [ $opt_e -eq 1 ]; then
                 if [ $success -eq 1 ]; then
                         echo "Removing Original file: $origfile.$extension"
                         rm -f $origfile.$extension
                         echo "Not Removing Original file!"
 Main $@

Custom Schedules

Shouldn't be needed for 0.25 on

The Daily Show

program.title LIKE "%Daily Show%"
AND HOUR(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) > 20
AND WEEKDAY(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) < 4
AND (WEEKDAY(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) = 0
OR program.previouslyshown = 0)

Colbert Report

program.title LIKE "%Colbert Report%"
AND (MINUTE(program.starttime) = 30 OR MINUTE(program.starttime) = 31)
AND HOUR(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) > 20
AND WEEKDAY(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) < 4
AND (WEEKDAY(DATE_SUB(program.starttime, INTERVAL 2 HOUR)) = 0
OR program.previouslyshown = 0)