# utilities taken from ui.itcl and lj_utils.itcl
# added initialization code for globals used within ui
proc get_verbose_title { program episodic mrgeptitlenum } {
# Non episodic programmes - return "Not An Episode"
# No episode number or title - return "No Episode Title"
# Episode number only - return "ep xxx"
# Title only - return title no quotes, see comments above.
# if merge=1, Episode number and title - return "ep xxx,
"
if { $episodic == 1 } {
set eptitle ""
set epnumstring ""
set eptitleraw [strim [dbobj $program get EpisodeTitle]]
#only retrieve episode number if it'll be used
if { $eptitleraw == "" || $mrgeptitlenum == 1 } {
set epnumraw [strim [dbobj $program get EpisodeNum]]
# get episode number from tmsid if needed
if { $epnumraw == "" } {
if {[set tmsid [dbobj $program get TmsId]] != ""} {
regsub -all {^0+} [string range $tmsid 8 11] {} epnumraw
}
}
if { $epnumraw != "" } {
append epnumstring "Episode " $epnumraw
}
}
if { $mrgeptitlenum == 1 && $epnumstring != "" && $eptitleraw != "" } {
# merge requested title and number available
append eptitle $epnumstring ", " $eptitleraw
} elseif { $eptitleraw == "" && $epnumstring != "" } {
# no title, but a number. Better than nothing.
set eptitle $epnumstring
} elseif { $eptitleraw != "" } {
# title
append eptitle $eptitleraw
} else {
# no title or number!
set eptitle "No Episode Title"
}
} else {
set eptitle "Not an Episode"
}
return $eptitle
}
proc desc_show {inp_desc} {
if { $::conf(DescriptionShow) == 1 && $inp_desc != "" } {
set desctext [html_encode $inp_desc]
regsub -all {\"} $desctext {\"} desctext
set desctext " $desctext"
} else {
set desctext ""
}
return $desctext
}
proc UIGetCancelReason { item } {
return [lindex {{Switched To Live TV} {Recorded A Different Showing} {Stayed On Live TV} {Internal Error} {Power Was Off} Expired {Got A Better Suggestion} {Demo Mode} {Unexpected Conflict} {User Requested Recording} {User Requested Season Pass} {Explicitly Deleted} {Channel Lineup Changed} {Program Guide Changed} {Recorder Emergency} {User Cancelled Season Pass} {Fuzzies Turned Off} {Fuzzy Stopped Early} Unknown {Program Source Conflict} {Converted Live Cache} {Live Cache Only Successful} {Program Source Disk Conflict} {Explicitly Deleted From To Do} {Program Source Modified} {Not Authorized} {No Re-record} {No Signal} {Max Recordings Exceeded} {Capture Request Expired} {No Signal Tuner One} {No Signal Tuner Two} {Max Recordings Now Showing} {Video Manager Denied Tuner}} $item]
}
proc alt_showing {tofind_tmsid tofind_fsid {servid ""}} {
global db
if {$servid != ""} {
set id "A[string trimleft [string range $servid 1 end] 0]:"
logit id
set ll {}
ForeachMfsFile fsid name type "/Recording/NoReRecord" $id {
if [PrefixMatches $id $name] {
RetryTransaction {
set obj [db $db openid $fsid]
set show [dbobj $obj gettarget Showing]
}
return [list "todo" $show]
}
}
}
if {$tofind_tmsid==""} {return ""}
set showings [get_programshowings $tofind_fsid 1]
foreach showing $showings {
set seconds [lindex $showing 0]
set stationfsid [lindex $showing 1]
set date [expr $seconds / 86400]
set time [expr $seconds % 86400]
set timestr [format "%05d" $time]
ForeachMfsFile recfsid name type "/Recording/Active" "4:$date:$timestr:" {
RetryTransaction {
set rec [db $db openid $recfsid]
set show [dbobj $rec get Showing]
set prog [dbobj $show get Program]
set id [dbobj $prog get TmsId]
if {$id == $tofind_tmsid} {
return "todo [dbobj $show fsid]/[dbobj $show subobjid]"
}
}
}
}
# Also check if it's in Now Showing
ForeachMfsFile recfsid name type "/Recording/TmsId" "$tofind_tmsid:" {
RetryTransaction {
set rec [db $db openid $recfsid]
set show [dbobj $rec get Showing]
return "nowshowing [dbobj $show fsid]/[dbobj $show subobjid]"
}
}
return ""
}
proc RecConflicts { recfsid showing2start showing2end } {
global db
RetryTransaction {
set rec [db $db openid $recfsid]
set showing1 [dbobj $rec get Showing]
set showing1realstart [expr [dbobj $showing1 get Date] * 86400 + [dbobj $showing1 get Time]]
set showing1start [expr $showing1realstart - [defaultval 0 [dbobj $rec get StartPadding]]]
set showing1end [expr $showing1realstart + [dbobj $showing1 get Duration] + [defaultval 0 [dbobj $rec get EndPadding]]]
if { (($showing1start >= $showing2start) && ($showing1start < $showing2end)) ||
(($showing1end > $showing2start) && ($showing1end <= $showing2end)) ||
(($showing1start <= $showing2start) && ($showing1end >= $showing2end))} {
if {$::version >= 3} {
set recbeh [dbobj $rec get RecordingBehavior]
set seltype [dbobj $recbeh get PresentationBehavior]
} else {
set seltype [dbobj $rec get SelectionType]
}
if { $seltype == 6 } {
return 1
} else {
return 2
}
} else {
return 0
}
}
}
proc RecConflictsList { showingstart showingend } {
global db
set cancellist {}
set cancellistsug {}
for {set i -1} {$i <= 1} {incr i} {
set date [expr $showingstart / 86400 + $i]
ForeachMfsFile fsid name type "/Recording/Active" "4:$date:" {
set skip 0
if { [scan name "4:%d:%d:" scandate scantime] == 2 } {
regsub {^0+([1-9])} $scantime {\1} scantime
set scansecs [expr $scandate * 86400 + $scantime]
if {$scansecs < [expr $showingstart - 86400]} {
set skip 1
}
if {$scansecs > $showingend} {
return [list $cancellist $cancellistsug]
}
}
if {!$skip} {
set conflicts [RecConflicts $fsid $showingstart $showingend]
if { $conflicts == 1 } {
lappend cancellistsug $fsid
} elseif { $conflicts == 2 } {
lappend cancellist $fsid
}
}
}
}
return [list $cancellist $cancellistsug]
}
proc GetConflictsList { showingfsid startearlysecs endlatesecs } {
global db
RetryTransaction {
if { [regexp {([0-9]*)/(.*)} $showingfsid junk fsid subobjid] } {
set showing [db $db openid $fsid $subobjid]
} else {
set showing [db $db openid $showingfsid]
}
set date [dbobj $showing get Date]
set time [dbobj $showing get Time]
set duration [dbobj $showing get Duration]
set showingstart [expr $date * 86400 + $time]
set showingend [expr $showingstart + $duration + $endlatesecs]
set showingstart [expr $showingstart - $startearlysecs]
}
set cancellists [RecConflictsList $showingstart $showingend]
set cancellist [lindex $cancellists 0]
return $cancellist
}
# Channel 4
# Guide 11
# Name 3
proc DeleteTodoRec { 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]
if { $state != 6 } {
return 0
} else {
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
}
# LJ's Utilities module.
#
# Based very heavily on other parts of TiVoWeb!
#
# LJ @ http://www.tivocommunity.com/
#
# 29Dec02 11:48 v1.0 Slotfree module.
# 30Dec02 17:30 v2.0 New search code; return icon with conflict details.
# 30Dec02 22:38 v2.1 Show conflict.png instead of broken link for conflicts.
# 30Dec02 23:20 v2.2 Shorter tooltips!
# 31Dec02 13:26 v2.3 Show four different icons for conflicts.
# 01Jan03 17:24 v2.4 Different icon for a free slot; ignore suggestions when deciding if a slot is free; remove alt text.
# 25Jan03 16:50 v3.0 Add thumbs modification module.
# 16Feb03 15:38 v3.1 Add get_thumbimagelj - standard proc, but also returns confidence value.
# 23Feb03 10:50 v3.2 Scan for existing PrefsElement before creating a new one.
# 18May03 15:34 v3.3 Add logic for Type 16 thumbs data.
# 16Aug03 19:43 v3.4 Include currently recording programme (if any) in slotfree calculation.
# 31Jan04 10:04 v3.5 Fixes a bug in the thumbs module when reseting thumbs. Thanks Adlopa!
# **** REMOVE /n FROM TOOLTIP !!! ****
# modified to use lists and return confid if needed -- btux9
proc get_thumbimage {score {xtra 0}} {
set thumbdata [ReadableThumbs $score]
scan $thumbdata "%s %d %d" thumbtype numthumbs confid
set n [expr $numthumbs+3]
if {$thumbtype == "Predicted"} {
set imagenum [lindex {14 15 16 -1 17 18 19} $n]
} else {
set imagenum [lindex {9 6 4 -1 12 2 7} $n]
}
if {$xtra} {return [list $imagenum $confid]} else { return $imagenum }
}
proc slotfree {seconds duration {chan 0}} {
global db
global images
set slotstartdate [expr $seconds / 86400]
set slotstarttime [expr $seconds - ($slotstartdate * 86400)]
set slotenddate [expr ($seconds + $duration) / 86400]
set slotendtime [expr ($seconds + $duration) - ($slotenddate * 86400)]
set foundearlierrec 0
set foundlaterrec 0
set slotfull 0
set reason ""
set recs [mfs scan "/Recording/Active" -start "3:[expr $slotstartdate - 1]:" -count 2]
scan [lindex [lindex $recs 0] 1] "%d:%d:%d:%d" rectype recstartdate recstarttime recfsid
scan [lindex [lindex $recs 1] 1] "%d:%d:%d:%d" dummy recstartdate recstarttime recfsid
set lasttest [lindex [lindex $recs 0] 1]
if {[info exists recstartdate] == 0} {
return [img slotfree.png "Slot may be free; could not find any records." "width=\"20\" height=\"20\""]
}
while { [expr ($recstartdate * 86400) + $recstarttime] < $seconds } {
set recs [mfs scan "/Recording/Active" -start "[lindex [lindex $recs 1] 1]" -count 2]
if { [llength $recs] < 2 } {
break
}
scan [lindex [lindex $recs 1] 1] "%d:%d:%d:%d" dummy recstartdate recstarttime recfsid
set lasttest [lindex [lindex $recs 0] 1]
set foundearlierrec 1
}
while { $lasttest != "" } {
set recs [mfs scan "/Recording/Active" -start $lasttest -count 2]
set lasttest [lindex [lindex $recs 1] 1]
scan [lindex [lindex $recs 0] 1] "%d:%d:%d:%d" dummy recstartdate recstarttime recfsid
if { $recstartdate > $slotenddate } {
set foundlaterrec 1
break
}
if { ($recstartdate == $slotenddate) && ($recstarttime >= $slotendtime) } {
set foundlaterrec 1
break
}
set rec [db $db openid $recfsid]
set rectype [dbobj $rec get SelectionType]
if { $rectype == 6 } {
continue
}
set startpad [dbobj $rec get StartPadding]
set endpad [dbobj $rec get EndPadding]
set showing [dbobj $rec get Showing]
set recdur [dbobj $showing get Duration]
set recend [expr ($recstartdate * 86400) + $recstarttime + $startpad + $endpad + $recdur]
set recenddate [expr $recend / 86400]
set recendtime [expr $recend - ($recenddate * 86400)]
if { $recenddate < $slotstartdate } {
set foundearlierrec 1
continue
}
if { ($recenddate == $slotstartdate) && ($recendtime <= $slotstarttime) } {
set foundearlierrec 1
continue
}
incr slotfull 1
set recstartsecs [expr ($recstartdate * 86400) + $recstarttime]
if {$::lang == "en"} {
set starttimestr [ftime $recstartsecs "%H:%M"]
} else {
set starttimestr [ftime $recstartsecs "%l:%M %P"]
}
set recendsecs [expr $recend]
if {$::lang == "en"} {
set endtimestr [ftime $recendsecs "%H:%M"]
} else {
set endtimestr [ftime $recendsecs "%l:%M %P"]
}
set station [dbobj $showing get Station]
set recchannel [dbobj $station get CallSign]
set program [dbobj $showing get Program]
set recseries [dbobj $program get Title]
# \n or " " here:
set reason "$reason$starttimestr-$endtimestr $recchannel: $recseries.\n"
}
set reason [string trimright $reason]
regsub -all {\{} $reason "" reason
regsub -all {\}} $reason "" reason
if { $slotfull > 0 } {
# \n or " " here:
return [img conflict[expr {$slotfull > 4 ? "4" : "$slotfull"}].png "$slotfull scheduled:\n$reason" "width=\"20\" height=\"20\""]
} else {
if { ($foundlaterrec == 1) || ([llength $recs] != 2) } {
return [img slotfree.png "No recordings currently scheduled in this slot." "width=\"20\" height=\"20\""]
} else {
return [img slotfree.png "Slot may be free ;) Send LJ this error message: E$foundearlierrec$foundlaterrec:$recstartdate:$recstarttime:$slotenddate:$slotendtime" "width=\"20\" height=\"20\""]
}
}
}
# replaced get_thumbimagelj with a modified get_thumbimage --btux9