#!/tvbin/tivosh
#
# Script:     EditTitle 3.0   04/02/02
# Written by: Netboy, et al.
# For the latest version search www.DealDatabase.com/forum
#
# LJ added an Undelete then Erase option

tvsource $tcl_library/tv/mfslib.tcl 

exec stty erase ^H

proc strim {str} { return [string trim $str "\{\} "] }

proc print_indented_line {s} {
	set i [expr [string first ":" $s]+1]
	puts [string range $s 0 78]
	set s [string range $s 79 end]
	set w [expr 77-$i]
	while { [string length $s] > 0 } {
		puts stdout [string range "                       " 0 $i] nonewline
		puts "[string range $s 0 $w]"
		set s [string range $s [expr $w+1] end] } }

proc fullinfo {fsid} {
	set db [dbopen]
	RetryTransaction {
	try { set rec [db $db openid $fsid] } catch errCode {set rec "N/A"}
	try { set showing [dbobj $rec get Showing] } catch errCode {set showing "N/A"}
	try { set program [dbobj $showing get Program] } catch errCode {set program "N/A"}
	try { set title [strim [dbobj $program get Title]] } catch errCode {set title "N/A"}
	try { set description [strim [dbobj $program get Description]] } catch errCode {set description "N/A"}
	try { set episode [strim [dbobj $program get EpisodeTitle]] } catch errCode {set episode "N/A"}
	try { set startdate [dbobj $rec get StartDate] } catch errCode {set startdate "N/A"}
	try { set stopdate [dbobj $rec get StopDate] } catch errCode {set stopdate "N/A"}
	try { set seltype [dbobj $rec get SelectionType] } catch errCode {set seltype "N/A"}
	try { set expdate [dbobj $rec get ExpirationDate] } catch errCode {set expdate "N/A"}
	try { set exptime [dbobj $rec get ExpirationTime] } catch errCode {set exptime "N/A"}
	try { set score [dbobj $rec get Score] } catch errCode {set score "N/A"}
	try { set starttime [dbobj $rec get StartTime] } catch errCode {set starttime "N/A"}
	try { set stoptime [dbobj $rec get StopTime] } catch errCode {set stoptime "N/A"}
	try { set creason [dbobj $rec get CancelReason] } catch errCode {set creason "N/A"}
	try { set cdate [dbobj $rec get CancelDate] } catch errCode {set cdate "N/A"}
	try { set ddate [dbobj $rec get DeletionDate] } catch errCode {set ddate "N/A"}
	try { set dtime [dbobj $rec get DeletionTime] } catch errCode {set dtime "N/A"}
	try { set estring [dbobj $rec get ErrorString] } catch errCode {set estring "N/A"}
	try { set state [dbobj $rec get State] } catch errCode {set state "N/A"}
	try { set ipath [dbobj $rec get IndexPath] } catch errCode {set ipath "N/A"}
	try { set dur [dbobj $showing get Duration] } catch errCode {set dur "N/A"}
	try { set airdate [dbobj $program get OriginalAirDate] } catch errCode {set airdate "N/A"}
	try { set series [dbobj $program get Series] } catch errCode {set series "N/A"}
	try { set thumb [dbobj $series get ThumbData] } catch errCode {set thumb "N/A"}
	try { set showtype [dbobj $program get ShowType] } catch errCode {set showtype "N/A"}
	try { set stream [dbobj $rec get StreamFileSize] } catch errCode {set stream "N/A"}
	try { set actor [dbobj $program get Actor] } catch errCode {set actor "N/A"}
	try { set writer [dbobj $program get Writer] } catch errCode {set writer "N/A"}
	try { set dir [dbobj $program get Director] } catch errCode {set dir "N/A"}
	try { set year [dbobj $program get MovieYear] } catch errCode {set year "N/A"}
	puts "      (press Enter to continue)"
	gets stdin answer }

	dbclose $db
	puts "Title          : $title"
	print_indented_line "Description    : $description"
	puts "Episode        : $episode"
	print_indented_line "Actors:        : $actor"
	puts "Director:      : $dir"
	puts "Writer:        : $writer"
	puts "MovieYear      : $year"
	puts "StartDate      : $startdate"
	puts "StopDate       : $stopdate"
	puts "StartTime      : $starttime"
	puts "StopTime       : $stoptime"
	puts "ExpirationDate : $expdate"
	puts "ExpirationTime : $exptime"
	puts "DeletionDate   : $ddate"
	puts "DeletionTime   : $dtime"
	puts "CancelDate     : $cdate"
	puts "CancelReason   : $creason"
	puts "ErrorString    : $estring"
	puts "SelectionType  : $seltype"
	puts "ShowType       : $showtype"
	puts "State          : $state"
	puts "Duration       : $dur"
	puts "Score          : $score"
	puts "OriginalAirDate: $airdate"
	puts "ThumbData      : $thumb"
	puts "StreamFileSize : $stream"
	print_indented_line "IndexPath      : $ipath" }


proc history {answer} {
		if { $answer == "A" || $answer == "a" } {
			puts "Are You Sure? (There may be a lot of screen output)"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				set db [dbopen]
				puts "Making changes..."
				MfsRubbishTree "/Recording/History"
				RetryTransaction {mfs mkdir "/Recording/History"}
				dbclose $db } }
		if { $answer == "S" || $answer == "s" } {
			puts "Delete History :: Enter FSID:"
			gets stdin id
			if { $id == "" } {return}
			puts "Are You Sure?"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				set db [dbopen]
				puts "Making changes..."
				RubbishObjectByFsId $id
				dbclose $db } } }

proc undelete {id} { 
	set db [dbopen]
	ForeachMfsFile fsid name type "/Recording/Active" "" {
		if { $fsid == $id } {
			RetryTransaction {
			set rec [db $db openid $fsid] 
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]] }
			puts "Undelete: $fsid - $title"
			puts "Are You Sure? (y/n)"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				puts ""
				puts "Making changes...."
				RetryTransaction { 
				set rec [db $db openid $fsid] 
				dbobj $rec set State 4 
				dbobj $rec remove DeletionDate 
				dbobj $rec remove DeletionTime 
				dbobj $rec remove ErrorString 
				dbobj $rec remove CancelReason
				puts "Signaling Tivo to redraw list within the next 60 seconds..."
				event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::RECORDINGS_ON_DISK 0 }
			} else { puts "No Changes Made" } } }
	dbclose $db }

proc del {id} {
	set db [dbopen]
	ForeachMfsFile fsid name type "/Recording/NowShowing" "" {
		if { $fsid == $id } {
			RetryTransaction {
			set rec [db $db openid $fsid] 
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]] }
			puts "Delete: $fsid - $title"
			puts "You will NOT be able to undelete this. Are You Sure? (y/n)"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				RubbishObjectByFsId $id
				puts "Signaling Tivo to redraw list within the next 60 seconds..."
				event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::RECORDINGS_ON_DISK 0
			} else { puts "No Changes Made" } } }
	dbclose $db }

proc change {id} {
	set db [dbopen]
	ForeachMfsFile fsid name type "/Recording/NowShowing" "" {
		if { $fsid == $id } {
			RetryTransaction {
			set rec [db $db openid $fsid]
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]]
			set description [strim [dbobj $program get Description]]
			set episode [strim [dbobj $program get EpisodeTitle]]
			set startdate [clock format [expr [dbobj $rec get StartDate] * 86400] -format "%1m/%1d"]
			set stopdate [clock format [expr [dbobj $rec get StopDate] * 86400] -format "%1m/%1d"]

			set starttime [clock format [dbobj $rec get StartTime] -format "%I:%M %p"]
			set stoptime [clock format [dbobj $rec get StopTime] -format "%I:%M %p"]

			set seltype [strim [dbobj $rec get SelectionType]] }
			puts "Fsid          : $fsid"
			print_indented_line "Title         : $title"
			print_indented_line "Description   : $description" 
			puts "Episode       : $episode"
			puts "StartDate     : $startdate"
			puts "StartTime GMT : $starttime"
			puts "StopDate      : $stopdate"
			puts "StopTime GMT  : $stoptime"
			puts "SelectionType : $seltype"
			set new_title ""
			set newdesc ""
			set newep ""
			set newstart ""
			set newsttime ""
			set newstop ""
			set newsptime ""
			set newtype ""
			puts ""
			puts "Enter New Title (press Enter to keep current):"
			gets stdin new_title
			puts "Enter New Description (or enter):"
			gets stdin newdesc
			puts "Enter New Episode (or enter):"
			gets stdin newep
			puts "Enter New StartDate in MM/DD format (or enter):"
			gets stdin newstart
			set newstart2 [expr [clock scan $newstart] / 86400]
			puts "Enter New StartTime in 00:00 PM (or enter):"
			gets stdin newsttime
			set newsttime2 [clock scan "1/1/70 $newsttime"]
			puts "Enter New StopDate in MM/DD format (or enter):"
			gets stdin newstop
			set newstop2 [expr [clock scan $newstop] / 86400]
			puts "Enter New StopTime in 00:00 PM (or enter):"
			gets stdin newsptime
			set newsptime2 [clock scan "1/1/70 $newsptime"]
			puts "Enter New SelectionType (3=Normal 5=Manual or enter)"
			gets stdin newtype
			puts ""
			puts "Update: $fsid - $title - with changes:"
			puts "Title         : $new_title"
			puts "Description   : $newdesc"
			puts "Episode       : $newep"
			if { $newstart != "" } {puts "StartDate     : [clock format [expr $newstart2 * 86400] -format "%1m/%1d"]"
			} else {puts "StartDate     : $newstart"}
			if { $newsttime != "" } {puts "StartTime GMT : [clock format $newsttime2 -format "%I:%M %p"]"
			} else {puts "StartTime     : $newsttime"}
			if { $newstop != "" } {puts "StopDate      : [clock format [expr $newstop2 * 86400] -format "%1m/%1d"]"
			} else {puts "StopDate      : $newstop"}
			if { $newsptime != "" } {puts "StopTime GMT  : [clock format $newsptime2 -format "%I:%M %p"]"
			} else {puts "StopTime      : $newsptime"}
			puts "SelectionType : $newtype"
			puts "Are You Sure? (y/n)"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				puts ""
				puts "Making changes...."
				RetryTransaction {
				set rec [db $db openid $fsid]
				set showing [dbobj $rec get Showing]
				set program [dbobj $showing get Program]
				if { $new_title != "" } { dbobj $program set Title $new_title }
				if { $newdesc != "" } { dbobj $program set Description $newdesc }
				if { $newep != "" } { dbobj $program set EpisodeTitle $newep }
				if { $newstart != "" } { dbobj $rec set StartDate $newstart2 }
				if { $newsttime != "" } { dbobj $rec set StartTime $newsttime2 }
				if { $newstop != "" } { dbobj $rec set StopDate $newstop2 }
				if { $newsptime != "" } { dbobj $rec set StopTime $newsptime2 }
				if { $newtype != "" } { dbobj $rec set SelectionType $newtype }
				puts "Signaling Tivo to redraw list within the next 60 seconds..."
				event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::RECORDINGS_ON_DISK 0 }
			} else { puts "No Changes Made" } } }
	dbclose $db }

proc todoch {id} {
	set db [dbopen]
	ForeachMfsFile fsid name type "/Recording/Active" "" {
		if { $fsid == $id } {
			RetryTransaction {
			set rec [db $db openid $fsid]
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]]
			set description [strim [dbobj $program get Description]]
			set episode [strim [dbobj $program get EpisodeTitle]] }
			puts "Fsid          : $fsid"
			print_indented_line "Title         : $title"
			print_indented_line "Description   : $description" 
			puts "Episode       : $episode"
			set new_title ""
			set newdesc ""
			set newep ""
			puts ""
			puts "Enter New Title (press Enter to keep current):"
			gets stdin new_title
			puts "Enter New Description (or enter):"
			gets stdin newdesc
			puts "Enter New Episode (or enter):"
			gets stdin newep
			puts ""
			puts "Update: $fsid - $title - with changes:"
			puts "Title         : $new_title"
			puts "Description   : $newdesc"
			puts "Episode       : $newep"
			puts "Are You Sure? (y/n)"
			gets stdin answer
			if { $answer == "Y" || $answer == "y" } {
				puts ""
				puts "Making changes...."
				RetryTransaction {
				set rec [db $db openid $fsid]
				set showing [dbobj $rec get Showing]
				set program [dbobj $showing get Program]
				if { $new_title != "" } { dbobj $program set Title $new_title }
				if { $newdesc != "" } { dbobj $program set Description $newdesc }
				if { $newep != "" } { dbobj $program set EpisodeTitle $newep }
				puts "Signaling Tivo to redraw list within the next 60 seconds..."
				event send $TmkEvent::EVT_DATA_CHANGED $TmkDataChanged::RECORDINGS_ON_DISK 0 }
			} else { puts "No Changes Made" } } }
	dbclose $db }

proc dellist {location st} {
	set count 1
	set db [dbopen]
	ForeachMfsFile fsid name type $location "" {
		if { $type == "tyDb" } {
			RetryTransaction {
			set rec [db $db openid $fsid]
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]]
			if {[catch {set state [dbobj $rec get State]}]} { set state "" } }
			if {$state == $st && $title != "TiVo Service Data"} {
			print_indented_line "Title      : $title"
			puts "Fsid       : $fsid" 
			if {$count == 8} {
				puts "      (Enter to continue - or (R)eturn to go back)"
				gets stdin pause
				if {$pause == "r" || $pause == "R"} {return}
				set count 0 }
		puts ""
		set count [expr $count + 1] } } }
	puts "      (press Enter to continue)"
	gets stdin answer
	dbclose $db }

proc tinfo {} {
	puts "1)  Current Temperature"
	puts "2)  Mounts"
	puts "3)  IoPorts"
	puts "4)  Interrupts"
	puts "5)  Devices"
	puts "6)  Stat"
	puts "7)  Modules"
	puts "8)  CpuInfo"
	puts "9)  Linux Version"
	puts "10) UpTime"
	puts "11) Meminfo"
	puts "12) Current Processes List"
	gets stdin answer
	puts ""
	if {$answer == "1"} { puts "TiVo Temp: [exec cat /proc/therm]" }
	if {$answer == "2"} { puts "TiVo Mounts:"
		puts [exec cat /proc/mounts] }
	if {$answer == "3"} { puts "TiVo IoPorts:"
		puts [exec cat /proc/ioports]" }
	if {$answer == "4"} { puts "TiVo Interrupts:"
		puts [exec cat /proc/interrupts]" }
	if {$answer == "5"} { puts "TiVo Devices:"
		puts [exec cat /proc/devices]" }
	if {$answer == "6"} { puts "TiVo Stat:"
		puts [exec cat /proc/stat]" }
	if {$answer == "7"} { puts "TiVo Modules:"
		puts [exec cat /proc/modules]" }
	if {$answer == "8"} { puts "TiVo CpuInfo:"
		puts [exec cat /proc/cpuinfo]" }
	if {$answer == "9"} { puts "TiVo Linux Version:"
		puts [exec cat /proc/version]" }
	if {$answer == "10"} { puts "TiVo UpTime: [exec cat /proc/uptime]" }
	if {$answer == "11"} { puts "TiVo MemInfo:"
		puts [exec cat /proc/meminfo]" }
	if {$answer == "12"} { puts "TiVo Processes:"
		puts [exec ps x]" }
	puts "      (press Enter to continue)"
	gets stdin answer }
## add kmsg info, carefully

proc list {location} {
	set count 1
	set db [dbopen]
	ForeachMfsFile fsid name type $location "" {
		if { $type == "tyDb" } {
			RetryTransaction {
			set rec [db $db openid $fsid]
			set showing [dbobj $rec get Showing]
			set program [dbobj $showing get Program]
			set title [strim [dbobj $program get Title]] }
			print_indented_line "Title      : $title"
			puts "Fsid       : $fsid" 
			if {$count == 8} {
				puts "      (Enter to continue - or (R)eturn to go back)"
				gets stdin pause
				if {$pause == "r" || $pause == "R"} {return}
				set count 0 }
		puts ""
		set count [expr $count + 1] } }
	puts "      (press Enter to continue)"
	gets stdin answer
	dbclose $db }

# Execution starts here
set done "false"
puts ""
puts ""
while { $done != "true" } {
	set id ""
	puts { 
________________________________
(Q)uit / H(e)lp

List   : (R)ecordings
       : (D)eleted Programs
       : Recording (H)istory
       : (T)oDo
Info   : (C)hange Recording Info
       : Change ToDo (L)isting
       : (F)sid Info
       : Tivo (I)nfo
Delete : Recordin(g)
       : (A)ll History
       : (S)pecific History
       : (U)ndelete Recording
       : U(n)delete then Erase [LJ]

Enter Command:  ________________ }
	gets stdin command
	if { $command == "e" || $command == "E" } {
		puts {

List   : Recordings            - Lists all programs in Now Playing
       : Deleted Programs      - Lists recently deleted programs
       : Recording History     - Lists recording history
       : To Do                 - Lists future recordings in To Do
Info   : Change Recording Info - Rename titles/episodes of programs
       : Change ToDo Listing   - Rename titles/episodes of future programs
       : Fsid Info             - Info on a specific Fsid
       : Tivo Info             - Info on your Tivo
Delete : Recording             - Delete a program from Now Playing
       : All History           - Deletes all programs from history listing
       : Specific History      - Deletes a program from history listing
       : Undelete Recording    - Restores a deleted program
       : Undelete then Erase   - Undeletes a deleted program then Erases it

  :: See EditTitle3.0.txt for more detailed info ::

      (press Enter to continue)}
		gets stdin command
		continue }
	if { $command == "D" || $command == "d" } { dellist "/Recording/Active" "5"
		continue }
	if { $command == "R" || $command == "r" } { list "/Recording/NowShowing"
		continue }
	if { $command == "H" || $command == "h" } { list "/Recording/History"
		continue }
	if { $command == "T" || $command == "t" } { dellist "/Recording/Active" "6"
		continue }
	if { $command == "q" || $command == "Q" } { set done "true"
		break }
	if { $command == "a" || $command == "A" } { history $command
		continue }
	if { $command == "s" || $command == "S" } { history $command
		continue }
	if { $command == "i" || $command == "I" } { tinfo
		continue }
	if { $command == "f" || $command == "F" } { puts "Fsid Info :: Enter FSID:"
		gets stdin id
		if { $id != "" } { fullinfo $id }
		continue }
	if { $command == "c" || $command == "C" } { puts "Change Program Info :: Enter FSID:"
		gets stdin id
		if { $id != "" } { change $id }
		continue }
	if { $command == "l" || $command == "L" } { puts "Change ToDo Info :: Enter FSID:"
		gets stdin id
		if { $id != "" } { todoch $id }
		continue }
	if { $command == "g" || $command == "G" } { puts "Delete :: Enter FSID:"
		gets stdin id
		if { $id != "" } { del $id }
		continue }
	if { $command == "u" || $command == "U" } { puts "UnDelete :: Enter FSID:"
		gets stdin id
		if { $id != "" } { undelete $id }
		continue }
	if { $command == "test" } { list "/Recording/Active"
		continue }
	if { $command == "n" || $command == "N" } { puts "UnDelete then Erase :: Enter FSID:"
		gets stdin id
		if { $id != "" } { undelete $id }
		if { $id != "" } { del $id }
		continue }
      }

# Done.

