# Conflict resolution between two networked TiVos using using a modified version of # Christopher R. Wingert's manrec.itcl on the other TiVo # Version 0.1 # Chris Gunn, 2004 # Adapted from Stuart Anderton's confres.itcl # Big chunks 'repurposed' from various TiVoWeb modules # # 27/04/2006 - v0.2 [Patch] - Remembers the last remote tivo # Displays correctly under Firefox # # Starting procedure, gets address of remote TiVo proc action_confresManual {chan path env} { global source_dir set todotypelabels "Conflicts {Adjacent Different Channels}" set todotypevals "History Active" set todotype "History" set remote_tivo "tivo1" # Load any settings found in the configuration file if {[file exists $source_dir/modules/confresManual.cfg]} { catch {source $source_dir/modules/confresManual.cfg} } puts $chan [html_start "Conflict Resolver"] puts $chan "Attempt to schedule conflicts on a second TiVo" puts $chan [html_form_start "GET" "/findconfsManual"] puts $chan [html_table_start "" "" ""] puts $chan [tr "" [td "Remote TiVo to find recording space on: "] [td [html_form_text 1 35 "tivoname" "$remote_tivo"]]] puts $chan [tr "" [td "Number of days ahead to look: "] [td [html_form_text 1 35 "daysahead" "7"]]] puts $chan [tr "" [td "ToDo type to schedule"] [td [html_form_select "todotype" $todotypevals $todotypelabels $todotype]]] puts $chan [tr "" [td "Show resolved conflicts"] [td [html_form_checkbox "showresolved" ""]]] puts $chan [tr "" [td ""] [td [html_form_input "submit" "Save" "Next"]]] puts $chan [html_table_end] puts $chan [html_form_end] puts $chan [html_end] } # Find unresolved conflicts and pass them to other TiVo proc action_findconfsManual {chan path env} { global db global tzoffset global remote_tivo global source_dir eval $env set conflicts {} set othertivourl "http://$tivoname/manrec" puts $chan [html_start "Conflict Resolver Manual Recording"] # nothing is sent when checkboxes aren't checked if {[catch {if {$showresolved == "on"} {}}] == 1} { set showresolved "off" } if {$todotype == "Active"} { puts $chan "Found the following shows in adjacent time slots on different channels:" } else { puts $chan "Found the following unresolved conficts:" } puts $chan [html_table_start "" "" ""] puts $chan [tr "" [td "Title"] [td "Channel"] [td "Date"] [td "Quality     Force if conflict"] [td ""]] set recqual 75 set mr_qualvals "0 40 75 100" set mr_quallabs "Basic Medium High Best" set yesnolabels "Yes No" set yesnovals "1 0" set forcerecord 0 set remote_tivo "tivo1" # Load any settings found in the configuration file if {[file exists $source_dir/modules/confresManual.cfg]} { catch {source $source_dir/modules/confresManual.cfg} } if {$remote_tivo != $tivoname} { set fd [open "$source_dir/modules/confresManual.cfg" w] puts $fd {#} puts $fd {# The name or IP address of the remote TiVo} puts $fd {#} puts $fd "set remote_tivo \"$tivoname\"" puts $fd {#} puts $fd {# The default recording quality (must be 0, 40, 75 or 100)} puts $fd {#} puts $fd "set recqual \"$recqual\"" close $fd } set prevendtime 0 set prevcallsign 0 set prevrow "" ForeachMfsFile fsid name type "/Recording/$todotype" "" { set recdate [split $name ":"] if {$todotype == "Active"} { set datepos 2 set timepos 1 } else { set datepos 1 set timepos 0 } regsub {^(-?)0+([1-9])} [lindex $recdate $datepos] {\1\2} thetime set rectime [expr [lindex $recdate $timepos] * 86400 + $thetime ] if {$rectime > [expr [clock seconds] + $daysahead * 86400]} { break } if {$rectime > [clock seconds]} { RetryTransaction { set rec [db $db openid $fsid ] set creason [dbobj $rec get CancelReason] set errorstring [dbobj $rec get ErrorString] set showing [dbobj $rec get Showing] set duration [dbobj $showing get Duration] set station [dbobj $showing get Station] set callsign [dbobj $station get CallSign] set program [dbobj $showing get Program] set title [dbobj $program get Title] set title [string trim $title "{}"] set id [dbobj $program get TmsId] set id2 [dbobj $program fsid] set description [dbobj $program get Description] set description [string trim $description "{}"] set episodetitle [dbobj $program get EpisodeTitle] set episodetitle [string trim $episodetitle "{}"] set rating 0 # rating is messing up display when there is no rating table on other TiVo # uncomment if you want ratings and it works on your TiVo # set rating [dbobj $showing get TvRating] } set resolvederror "{Transfered to another TiVo original time was $rectime duration was $duration}" if {$errorstring != $resolvederror || $showresolved == "on"} { if {$errorstring != $resolvederror && [string first "Transfered to another TiVo original time was" $errorstring] > -1 } { set schedulechanged "
(Schedule has changed)" } else { set schedulechanged "" } if {$errorstring == $resolvederror && $showresolved == "on"} { set schedulechanged "
(Resolved)" } if {$prevcallsign == 0} { set prevcallsign callsign } if {$todotype == "Active" || $creason == 20 || $schedulechanged != ""} { set alt [alt_showing $id $id2] if {$todotype == "Active" || $alt == "" || $schedulechanged != ""} { set showbutton 0 if {($todotype == "Active" && $rectime == $prevendtime && $callsign != $prevcallsign) || $creason == 20 || $schedulechanged != ""} { set showbutton 1 } #adjust for timezone set starttime [expr $rectime + $tzoffset] set endtime [expr $starttime + $duration] set strdelbutton [td "[html_form_start "GET" "/delresolvedconf"] [html_form_hidden "conflict" $fsid] [html_form_hidden "rectime" $rectime] [html_form_hidden "duration" $duration] [html_form_hidden "tivoname" $tivoname] [html_form_hidden "daysahead" $daysahead] [html_form_hidden "todotype" $todotype] [html_form_hidden "showresolved" $showresolved] [html_form_input "submit" "submit" "Delete"] [html_form_end]"] set wodatetz [expr $starttime / 86400] set wodatetz [expr $wodatetz * 86400] set wotimetz [expr ($starttime - $wodatetz) / 3600 ] set womin [expr ($starttime - $wodatetz - ($wotimetz * 3600)) / 60 ] set woduration [expr $duration / 60] set strrecbutton [td "[html_form_start "GET" $othertivourl] [html_form_hidden "titlestr" $title] [html_form_hidden "episodetitlestr" $episodetitle] [html_form_hidden "descriptionstr" $description] [html_form_hidden "chnsel" ""] [html_form_hidden "callsign" $callsign] [html_form_hidden "wodatetz" $wodatetz] [html_form_hidden "wotimetz" $wotimetz] [html_form_hidden "womin" $womin] [html_form_hidden "durationstr" $woduration] [html_form_hidden "ratingstr" $rating] [html_form_hidden "repeat" "once"] [html_form_select "recqual\" style=\"width:11ex" $mr_qualvals $mr_quallabs $recqual] [html_form_select "forcerecord\" style=\"width:8ex" $yesnovals $yesnolabels $forcerecord] [html_form_input "submit" "submit" "Record"] [html_form_end]"] set strrow [tr "" "[td "$title $schedulechanged"] [td $callsign] [td "[clock format $starttime -format {%a %1d %1b %H:%M}] - [clock format $endtime -format %H:%M]"] $strrecbutton $strdelbutton" ] unset strrecbutton strdelbutton if {$showbutton == 1 || $schedulechanged != ""} { if {$prevrow != ""} { puts $chan $prevrow } puts $chan $strrow set prevrow "" } else { if {$prevrow == ""} { puts $chan [tr "" [td " "] [td " "] [td " "] [td " "] [td " "]] puts $chan [tr "" [td " "] [td " "] [td " "] [td " "] [td " "]] } set prevrow $strrow } set prevendtime [expr $rectime + $duration] set prevcallsign $callsign } } } } } puts $chan [html_table_end] puts $chan [html_end] } proc action_delresolvedconf {chan path env} { eval $env puts $chan [html_start "Delete Resolved Conflict"] puts $chan "Deleting conflict..." set success [DeleteCanceledTodoRec $conflict 20 "Transfered to another TiVo original time was $rectime duration was $duration"] if {$success == 1 } { puts $chan "Done" } else { puts $chan "There was a problem deleting the conflict." } puts $chan [html_form_start "GET" "/findconfsManual"] puts $chan [html_form_hidden "tivoname" $tivoname] puts $chan [html_form_hidden "daysahead" $daysahead] puts $chan [html_form_hidden "todotype" $todotype] puts $chan [html_form_hidden "showresolved" $showresolved] puts $chan [html_form_input "submit" "Save" "Back to unresolved conficts"] puts $chan [html_form_end] puts $chan [html_end] } proc DeleteCanceledTodoRec { recfsid cancelreason errorstring } { global db set canceldate [expr [clock seconds] / 86400] set canceltime [expr [clock seconds] % 86400] RetryTransaction { set rec [db $db openid $recfsid] set state [dbobj $rec get State] dbobj $rec set CancelReason $cancelreason dbobj $rec set CancelDate $canceldate dbobj $rec set CancelTime $canceltime dbobj $rec set ErrorString $errorstring dbobj $rec set State 2 } return 1 } register_module "confresManual" "Conflict Resolve" "Schedule conflicts on another TiVo using Manual Recording"