From ad72f6ceb1ae1d9aff2fe68c8255b9cce8a64778 Mon Sep 17 00:00:00 2001 From: hummypkg Date: Wed, 4 Sep 2013 23:20:59 +0000 Subject: [PATCH] 1.0.5 --- CONTROL/control | 2 +- webif/plugin/sweeper/auto.hook | 188 ++++++++++++++++++++++++++++++++- 2 files changed, 188 insertions(+), 2 deletions(-) diff --git a/CONTROL/control b/CONTROL/control index c3d8831..65cb26d 100644 --- a/CONTROL/control +++ b/CONTROL/control @@ -1,7 +1,7 @@ Package: sweeper Priority: optional Section: misc -Version: 1.0.4 +Version: 1.0.5 Architecture: mipsel Maintainer: af123@hummypkg.org.uk Depends: webif(>=1.0.5-3) diff --git a/webif/plugin/sweeper/auto.hook b/webif/plugin/sweeper/auto.hook index c945a72..7708a0f 100644 --- a/webif/plugin/sweeper/auto.hook +++ b/webif/plugin/sweeper/auto.hook @@ -68,6 +68,11 @@ proc ::sweeper::duration {ts dur} { return [::sweeper::intcomp [$ts duration] $dur] } +proc ::sweeper::hour {ts str} { + set hour [clock format [$ts get start] -format "%H"] + return [::sweeper::intcomp $hour $str] +} + proc ::sweeper::schedduration {ts dur} { return [::sweeper::intcomp [$ts get scheddur] $dur] } @@ -102,6 +107,16 @@ proc ::sweeper::genre {ts genre} { return 0 } +proc ::sweeper::lock {ts g} { + if {$g} { + log "Locked recording." 0 + $ts lock + } else { + log "Unlocked recording." 0 + $ts unlock + } +} + ###################################################################### proc ::sweeper::action {ts cmds} { @@ -139,6 +154,97 @@ proc ::sweeper::action {ts cmds} { } return 1 } + default { + log "Unknown action '$cmd'" 0 + } + } + return 0 +} + +proc ::sweeper::find {root target orig} { + set dustbin [system dustbin 1] + foreach e [readdir -nocomplain $root] { + regsub -all -- {//} "$root/$e" "/" entry + if {![file isdirectory $entry]} continue + if {[string match {\[*} $e]} continue + if {$e eq $dustbin} continue + if {$entry eq $orig} continue + + if {$e eq $target} { return $entry } + set ret [::sweeper::find $entry $target $orig] + if {$ret ne ""} { return $ret } + } + return "" +} + +proc ::sweeper:folder_merge {src dst} { + log "Moving recordings from $src to $dst" 0 + foreach e [readdir -nocomplain $src] { + if {![string match {*.ts} $e]} continue + set entry "$src/$e" + + if {[catch {set ts [ts fetch $entry]} msg} { + log "Error reading TS file, $msg" 0 + continue + } + + if {$ts == "0"} { + log "Invalid TS file." 0 + continue + } + + if {[$ts inuse]} { + log "Recording in use." 2 + continue + } + + foreach f [$ts fileset] { + log " ....... $f" + file rename $f "$dst/[file tail $f]" + } + } + file delete "$src/.series" + if {[catch {file delete $src} msg]} { + log "Failed to remove directory: $msg" 0 + } + if {$dst ni $::sweeper::recalc} { + lappend ::sweeper::recalc $dst + } +} + +proc ::sweeper::folder_action {ts cmds} { + global root + + lassign $cmds cmd rest + + set folder [file dirname [$ts get file]] + set lfolder [file tail $folder] + + log "FOLDER ACTION: $cmd\($rest) @\[$folder]" 2 + + switch $cmd { + preserve { return 1 } + fileundercreate - + fileunder { + if {![file isdirectory "$root/$rest"]} { + log " ... No such directory $root/$rest" 2 + return 1 + } + log " - searching for $lfolder under $root/$rest" 2 + set target [::sweeper::find $root/$rest $lfolder $folder] + log " = $target" 2 + if {$target eq "" || ![file isdirectory $target]} { + log "Did not find directory." 2 + if {$cmd ne "fileundercreate"} { return 1 } + log "Creating..." 2 + set target "$root/$rest/$lfolder" + system mkdir_p $target + } + ::sweeper:folder_merge $folder $target + } + default { + log "Unknown action '$cmd'" 0 + } } return 0 } @@ -148,10 +254,19 @@ proc ::sweeper::runrule {ts rule} { if {[string index $rule 0] eq "#" || [llength $rule] < 2} { return 0 } + set folder 0 + if {[lindex $rule 0] eq "folder"} { + set folder 1 + set rule [lrange $rule 1 end] + } while {[llength $rule] > 1} { set rule [lassign $rule cmd arg] log " $cmd\($arg)" 2 - set ret [::sweeper::$cmd $ts $arg] + if {$folder && [exists -proc ::sweeper::folder_$cmd]} { + set ret [::sweeper::folder_$cmd $ts $arg] + } else { + set ret [::sweeper::$cmd $ts $arg] + } if {$cmd eq "action"} { return $ret } if {!$ret} { log " Nomatch" 2 @@ -174,6 +289,11 @@ proc ::sweeper::apply {dir cf} { set rules [split [read $fp] "\n"] $fp close + set runfolder 0 + foreach rule $rules { + if {[lindex $rule 0] eq "folder"} { incr runfolder } + } + log "Sweep scan starting for $dir" 2 foreach e [readdir -nocomplain $dir] { @@ -199,10 +319,76 @@ proc ::sweeper::apply {dir cf} { } foreach rule $rules { + if {[lindex $rule 0] eq "folder"} continue + if {[string index $rule 0] eq "#" || \ + [llength $rule] < 2} continue if {[::sweeper::runrule $ts $rule]} break } } + if {$runfolder > 0} { + log "" 2 + log " -- FOLDER RULES --" 2 + log "" 2 + set dustbin [system dustbin 1] + foreach e [readdir -nocomplain $dir] { + set entry "$dir/$e" + if {![file isdirectory $entry]} continue + if {[string match {\[*} $e]} continue + if {$e eq $dustbin} continue + + log "+ Sweeper processing folder $entry" 2 + + if {![file exists "$entry/.series"]} { + log "Not series folder." 2 + continue + } + + set ts 0 + foreach de [readdir -nocomplain $entry] { + set dentry "$entry/$de" + if {[file isdirectory $dentry]} { + set ts 0 + break + } + if {$ts ne "0"} continue + if {![string match {*.ts} $dentry]} continue + + log " --- Considering $dentry" 2 + + if {[catch {set ts [ts fetch $dentry]} msg} { + log "Error reading TS file, $msg" 2 + continue + } + + if {$ts == "0"} { + log "Invalid TS file." 2 + continue + } + + if {[$ts inuse]} { + log "Recording in use." 2 + set ts 0 + continue + } + break + } + + if {$ts == "0"} { + log "No usable recordings in folder." 2 + continue + } + + foreach rule $rules { + if {[string index $rule 0] eq "#" || \ + [llength $rule] < 2} continue + if {[lindex $rule 0] ne "folder"} continue + if {[::sweeper::runrule $ts $rule]} break + } + + } + } + foreach dir $::sweeper::recalc { ts resetnew "$::root/$dir" }