# 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 !!! ****
proc slotfree {seconds duration chan} {
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 "title=\"Slot may be free; could not find any records.\"" "slotfree.png"]"
}
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 "title=\"$slotfull scheduled:\n$reason\"" "conflict[expr {$slotfull > 4 ? "4" : "$slotfull"}].png"]"
} else {
if { ($foundlaterrec == 1) || ([llength $recs] != 2) } {
return "[img "title=\"No recordings currently scheduled in this slot.\"" "slotfree.png"]"
} else {
return "[img "title=\"Slot may be free ;) Send LJ this error message: E$foundearlierrec$foundlaterrec:$recstartdate:$recstarttime:$slotenddate:$slotendtime\"" "slotfree.png"]"
}
}
}
proc action_thumbs { chan objectid env } {
global db
set fsid ""
eval $env
puts $chan [html_start "Modify Thumbs"]
if { $fsid == "" } {
set ethmblabels "3 2 1 0 -1 -2 -3 Unset"
set ethmbvals "3 2 1 0 -1 -2 -3 -999"
set thmblabels "3 2 1 0 -1 -2 -3"
set thmbvals "3 2 1 0 -1 -2 -3"
if {[string index $objectid 0] == "/"} {
set objectid [string range $objectid 1 end]
}
RetryTransaction {
set series [db $db openid $objectid]
set title [strim [dbobj $series get Title]]
set score [dbobj $series get ThumbData]
}
puts $chan [h2 $title]
if { $score == "" } {
puts $chan "No Thumb Rating Currently Set"
set numthumbs 1
set thumbtype "Not"
} else {
set thumbdata [ReadableThumbs $score]
scan $thumbdata "%s %d %d" thumbtype numthumbs thumbconf
puts $chan [html_table_start "" "" ""]
puts $chan [tr "ALIGN=CENTER" [th "COLSPAN=3" "Current Setting"]]
puts $chan [tr "ALIGN=CENTER" [th "Thumbs"] [th "Type"] [th "Confidence"]]
puts $chan [tr "ALIGN=CENTER" [td $numthumbs] [td $thumbtype] [td $thumbconf]]
puts $chan [html_table_end]
}
puts $chan [html_form_start "POST" "/thumbs" "name=\"setthumbs\""]
puts $chan [html_table_start "" "" ""]
if { $thumbtype == "Explicit" || $thumbtype == "Implied" } {
puts $chan [tr "" [td "Set Explicit Thumb Rating: "] [td "width=30%" [html_form_select "newthmb" $ethmbvals $ethmblabels $numthumbs]]]
} else {
puts $chan [tr "" [td "Set Explicit Thumb Rating: "] [td "width=30%" [html_form_select "newthmb" $thmbvals $thmblabels $numthumbs]]]
}
puts $chan [html_table_end]
puts $chan [html_form_input "hidden" "fsid" $objectid]
puts $chan [html_form_input "hidden" "orgthmb" $numthumbs]
puts $chan [html_form_input "hidden" "title" $title]
puts $chan [html_form_input "hidden" "thumbtype" $thumbtype]
puts $chan [html_form_input "submit" "submit" "Set"]
puts $chan [html_form_end]
} else {
set thumbsdir15 "/Preference/a/15"
set thumbsdir16 "/Preference/a/16"
puts $chan [h2 $title]
if { $thumbtype == "Explicit" && $orgthmb == $newthmb } {
puts $chan "Thumbs Already Explicitly Set To $newthmb ;)"
} else {
if { $newthmb == -999 } {
RetryTransaction {
set series [db $db openid $fsid]
set serverid [dbobj $series get ServerId]
dbobj $series set ThumbData "0x10000000"
set thmbrec [db $db open "$thumbsdir15/$serverid"]
dbobj $thmbrec markasrubbish
regsub -all {[^a-zA-Z0-9]} $title "" titlesearch
set thm16rec [lindex [get_fsidbyprefix "$thumbsdir16" "$titlesearch"] 0]
if { $thm16rec != "" } {
set thmbrec [db $db openid $thm16rec]
puts $chan "
(You have previously recorded this series)
"
dbobj $thmbrec markasrubbish
}
}
# Supress events for versions >=6 -- rbautch
if {$::version < 6} {
event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::VIEWER_PREFERENCES $serverid
}
puts $chan "
Thumbs Now Unset"
} else {
switch -- $newthmb {
3 {set xthmbval "0x100303ff"}
2 {set xthmbval "0x100302ff"}
1 {set xthmbval "0x100301ff"}
0 {set xthmbval "0x100300ff"}
-1 {set xthmbval "0x1003ffff"}
-2 {set xthmbval "0x1003feff"}
-3 {set xthmbval "0x1003fdff"}
}
scan $xthmbval %x thmbval
RetryTransaction {
set series [db $db openid $fsid]
set serverid [dbobj $series get ServerId]
dbobj $series set ThumbData $thmbval
if { [catch {set thmbrec [db $db open "$thumbsdir15/$serverid"]}] != 1 } {
set Version [dbobj $thmbrec get Version]
dbobj $thmbrec set Version [expr $Version + 1]
dbobj $thmbrec set Thumbsness $thmbval
regsub -all {[^a-zA-Z0-9]} $title "" titlesearch
set thm16rec [lindex [get_fsidbyprefix "$thumbsdir16" "$titlesearch"] 0]
if { $thm16rec != "" } {
set thmbrec [db $db openid $thm16rec]
puts $chan "
(You have previously recorded this series)
"
set Version [dbobj $thmbrec get Version]
dbobj $thmbrec set Version [expr $Version + 1]
dbobj $thmbrec set Thumbsness $thmbval
}
} else {
set thmbrec [db $db create PrefsElement]
dbobj $thmbrec set Type 15
dbobj $thmbrec set IntKeyValue 1
dbobj $thmbrec set Viewer a
dbobj $thmbrec set Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec set StringKeyValue $serverid
dbobj $thmbrec set Item $series
dbobj $thmbrec set Thumbsness $thmbval
if { $::version >= 3 } {
regsub -all {[^a-zA-Z0-9]} $title "" titlesearch
set thm16rec [lindex [get_fsidbyprefix "$thumbsdir16" "$titlesearch"] 0]
if { $thm16rec != "" } {
set thmbrec [db $db openid $thm16rec]
puts $chan "
(You have previously recorded this series)
"
set Version [dbobj $thmbrec get Version]
dbobj $thmbrec set Version [expr $Version + 1]
dbobj $thmbrec set Thumbsness $thmbval
}
} else {
set norerec [lindex [get_fsidbyprefix "/Recording/NoReRecord" "[expr $serverid + 1]:"] 0]
if { $norerec != "" } {
set norerec [db $db openid $norerec]
puts $chan "
(You have previously recorded this series)
"
set noshow [dbobj $norerec get Showing]
set progid [dbobj $noshow gettarget Program]
set progiddb [dbobj $noshow get Program]
set progid [string range $progid 0 [expr [string first "/" $progid] - 1]]
set thmbrec [db $db create PrefsElement]
dbobj $thmbrec set Version 1
dbobj $thmbrec set Type 16
dbobj $thmbrec set IntKeyValue $progid
dbobj $thmbrec set Viewer a
dbobj $thmbrec set Thumbsness $thmbval
dbobj $thmbrec set Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec add Vector 0
dbobj $thmbrec set StringKeyValue $title
dbobj $thmbrec set Item $progiddb
}
}
}
}
# Supress events for versions >=6 -- rbautch
if {$::version < 6} {
event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::VIEWER_PREFERENCES $serverid
}
puts $chan "
Thumbs Value Set To $newthmb"
}
}
}
}
proc get_thumbimagelj {score} {
set thumbdata [ReadableThumbs $score]
scan $thumbdata "%s %d %d" thumbtype numthumbs thumbconf
if {$thumbtype == "Predicted"} {
switch -- $numthumbs {
-3 {set imagenum 14}
-2 {set imagenum 15}
-1 {set imagenum 16}
1 {set imagenum 17}
2 {set imagenum 18}
3 {set imagenum 19}
default {set imagenum -1}
}
} else {
switch -- $numthumbs {
-3 {set imagenum 9}
-2 {set imagenum 6}
-1 {set imagenum 4}
1 {set imagenum 12}
2 {set imagenum 2}
3 {set imagenum 7}
default {set imagenum -1}
}
}
return "$imagenum $thumbconf"
}