Previous section   Next section

Hack 92 Discovering Your Favorite Writers, Producers, and Directors

figs/moderate.giffigs/hack92.gif

Do you tend to favor the work of a particular director? Do the words of a particular writer keep you riveted to the screen? Chances are that you haven't given your favorite creatives much thought. Thankfully, TiVo keeps track of them for you.

A variation on [Hack #91], let's give a little credit to the creatives—the writers, producers, and directors—while at the same time learning a little more Tcl.

The Code

#!/tvbin/tivosh

global creatives
proc addcreative { c type } {
    global creatives
    foreach epcreative $c {
       set slashpos [string first "|" $epcreative]
       set repcreative \
            "[string range $epcreative 0 [expr $slashpos - 1]],"[RETURN]
        set repcreative \ 
            "$repcreative [string range $epcreative [expr $slashpos + 1][RETURN]
            end]"   
        set repcreative \
            "$repcreative | $type"
         lappend creatives $repcreative 
}

}

# open the database
set db [dbopen]

# pull out the first 50 recorded shows from the database
set recdir "/Recording/NowShowingByTitle"
RetryTransaction {
    set files [mfs scan $recdir -count 50]
    }

set creatives { }
while { [llength $files] > 0 } {
    # iterate through the shows we extracted
    foreach rec $files {
        # grab the FSID of the program from the list
        set fsid [lindex $rec 0]

        RetryTransaction {
            # get the object that represents this recording and the
            # object that represents this episode.  wrap it in 
            # a catch just in case
            # it doesn't work
            set recordingobj [db $db openid $fsid]
            set episodeobj [dbobj [dbobj $recordingobj get Showing] get Program]

            # pull out the list of writers, directors, and producers of the
            # shows.  none of these are guaranteed to be here
            set epwriters [dbobj $episodeobj get Writer]
            set epdirectors [dbobj $episodeobj get Director]
            set epproducers [dbobj $episodeobj get ExecProducer]
            }

        # add all those creatives to a list to work with
        addcreative $epwriters "Writer"
        addcreative $epdirectors "Director"
        addcreative $epproducers "ExecProducer"
    }

    # and grab the next 49 television shows[RETURN]
    set lastName [lindex [lindex $files end] 1]
    RetryTransaction {
        set files [mfs scan $recdir -start $lastName -count 50]
    }
    if { $lastName == [lindex [lindex $files 0] 1] } {
        set files [lrange $files 1 end]
    }
}

# create a new list called fcreatives that is the frequency count
# of the creatives on the shows we have watched
set fcreatives { }
foreach l $creatives {
    if ![ info exists a($l) ] { 
        set a($l) 0 
    }
    incr a($l) 
}
foreach i [ array names a ] {
    lappend fcreatives [list $i $a($i)]
}

# and let's quickly alphabetically sort then print the list
set fcreatives [lsort -index 0 $fcreatives]
foreach fcreative $fcreatives {
    puts "[lindex $fcreative 0] | [lindex $fcreative 1]"
}

Save the code as creatives.tcl in TiVo's /var/hack/bin directory and make it executable:

bash-2.02# chmod 755 /var/hack/bin/creatives.tcl

Running the Hack

Run the script from TiVo's command line Section 3.3:

bash-2.02# /var/hack/bin/creatives.tcl 
Babbit, Jamie | Director | 1
Beeman, Greg | Director | 1
Berlanti, Greg | ExecProducer | 15
Berman, Rick | ExecProducer | 1
Braga, Brannon | Writer | 1
Bruckheimer, Jerry | ExecProducer | 1
Camp, Brandon | ExecProducer | 1
Cochran, Bob | ExecProducer | 1
Fattore, Gina | Writer | 5
Foy, John | ExecProducer | 1
Fricke, Anna | Writer | 3
Friedman, Maggie | Writer | 3
Garcia, Liz | Writer | 1
Gereghty, Bill | Director | 1
Gough, Al | Writer | 1
Gough, Alfred | ExecProducer | 4
Jackson, Joshua | Director | 1
Kapinos, Tom | Writer | 3
Kowalski, Peter | Director | 1
Kroll, Jon | ExecProducer | 1
Lange, Michael | Director | 3
Leahy, Janet | Writer | 1
Leder, Mimi | ExecProducer | 1
Marshall, James | Director | 1
McNeill, Robbie | Director | 2
Millar, Miles | ExecProducer | 4
Millar, Miles | Writer | 1
Moore, Jason | Director | 1
Nash, Bruce | ExecProducer | 1
Nelson, Todd | ExecProducer | 1
...

To capture your list of favorite writers, producers, and directors as a pipe-delimited text file, use the > redirect symbol and supply the name of a file to which to write. For example, sending output to a file called creatives.out in the /var/out directory would look like this:

bash-2.02# /var/hack/bin/creatives.tcl > /var/out/creatives.out

Take note that people can be listed under more than one role, and they can also be listed more than once for a given role. Take a look at Miles Millar; he was credited four times as an Executive Producer and once as a writer. If we gather enough of this information over time, we can create our own Internet Movie Database (http://www.imdb.com) from our television listings alone.


  Previous section   Next section
Top