From 086814cafa5b2e9e5b4ede70dcf29362ec8953b1 Mon Sep 17 00:00:00 2001 From: df Date: Tue, 10 Nov 2020 14:04:20 +0000 Subject: [PATCH 01/91] Add thumbnail viewer to Manage Bookmarks --- webif/html/browse/bookmarks/index.jim | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/webif/html/browse/bookmarks/index.jim b/webif/html/browse/bookmarks/index.jim index b12c9372..fae94b7f 100755 --- a/webif/html/browse/bookmarks/index.jim +++ b/webif/html/browse/bookmarks/index.jim @@ -15,6 +15,10 @@ set erfile [string map {' \\'} $rfile] set len [$ts duration 1] +set start -1 +set incr 1 +set limit $(1-$start) + puts " } - exit } # Otherwise, for a general file. -puts " +if {$type ne "ts"} { + puts " @@ -269,20 +270,29 @@ puts " - +" +} + +set hasffmpeg 0 +if {$type ne "ts" || ("ODEncrypted" ni $flags && $url eq "") } { + puts " - -
File
Size $sz
Info Loading...
-" +" + set hasffmpeg 1 +} +puts " + + " -set url "/browse/ffmpeg.jim?file=[cgi_quote_url $file]" -puts { } - +} diff --git a/webif/html/browse/play.jim b/webif/html/browse/play.jim new file mode 100755 index 00000000..3eb8dc37 --- /dev/null +++ b/webif/html/browse/play.jim @@ -0,0 +1,62 @@ +#!/mod/bin/jimsh + +package require cgi +source /mod/webif/lib/setup +require system.class +require ts.class + +set file [cgi_get file] +set urlbase [cgi_get base ""] +set duration [cgi_get duration 1] +set fmts [split [cgi_get fmts ""] ","] +set vc [cgi_get vc ""] + +# Default to just downloading the raw file. +set url $file + +# Prefer to use DLNA server ... (necessary if encrypted) +set dlna [system dlnaurl $url $urlbase] +if {[llength $dlna]} { + set url [lindex $dlna 0] +} elseif {[regexp {^(https?://(.+:.*@)?[[:alnum:].]+(:[[:digit:]]+)?)/} $urlbase x y]} { + set url "$y$url" +} else { + set url "http://[system ip]$url" +} + +if {[file extension $file] in {.ts .TS}} { + if {![catch {set ts [ts fetch $file]}] && $ts != 0} { + set duration [$ts duration 1] + } +} + +set file [file tail $file] +set playlist [file tempfile "[env "TMPDIR" [env "TMP" "/tmp"]]/playXXXXXX"] +set pl "" +try { + set pl [open $playlist w] + $pl puts "#EXTM3U" + $pl puts "#EXTINF:$duration,$file" + $pl puts "#PLAYLIST:$file" + $pl puts $url +} finally { + if {$pl ne ""} { + $pl close + } +} + +httpheader "application/x-mpegurl" 0 [list \ + "Content-Disposition" "attachment; filename=\"[file rootname $file].m3u\"" \ + "Content-Length" "[file size $playlist]" \ + ] +set pl "" +try { + set pl [open $playlist r] + $pl copyto stdout +} finally { + if {$pl ne ""} { + $pl close + } +} +catch {file delete $playlist} + diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js index 5269fa00..2ed094f9 100755 --- a/webif/html/browse/script.js +++ b/webif/html/browse/script.js @@ -787,12 +787,14 @@ $('img.doopt').contextMenu( // Disable items which are not yet implemented. $('#optmenu').disableContextMenuItems('#title'); -var $buttons = { - "Close" : function() {$(this).dialog('close');} -}; -var $buttonsp = $.extend( - {"Play" : function() { doplay(); }}, - $buttons); +var $buttons = [ + { id: 'close', + text: 'Close', + click: function() {$(this).dialog('close');}}, + { id: 'play', + text: 'Play', + click: function() { doplay(this); }} +]; // Create reusable dialogue. var $dialog = $('#dialogue').dialog({ @@ -806,16 +808,47 @@ var $dialog = $('#dialogue').dialog({ 'Retrieving data...'); } }); -function doplay() +function doplay(it) { var file = $dialog.attr('file'); var type = $dialog.attr('type'); - disableall(); + var duration = 0; + var fmts = ""; + var vc = "" + var ff = $('#ffmpeg')[0]; + + if (ff) { + /* extract duration, container and video codec from ffmpeg output */ + ff = ff.innerHTML; + var match = /Duration:\s+([0-9.:]+),/.exec(ff); + if (match && match[1]) + duration = (new Date('1970-01-01T' + match[1] + 'Z')).getTime()/1000; + match = /Input #0,\s+([-A-Za-z0-9_,]+),\s/.exec(ff); + if (match && match[1]) fmts = match[1]; + match = /Stream #.+\sVideo:\s+([-A-Za-z0-9_]+)\s/.exec(ff); + if (match && match[1]) vc = match[1]; + } - window.location = '/play/play.jim?' + - 'dir=' + encodeURIComponent(dir) + - '&file=' + encodeURIComponent(file); + fmts = /mp4|webm/.exec(fmts); + if (fmts && fmts[0]) + vc = /h264|av1|vp9/.exec(vc); + else + vc = null; + + if (vc && vc[0]) { + /* base on page address to handle client on external network, etc */ + var hh = new URL(file, window.location.href); + window.location = hh.href; + } else { + window.location = '/browse/play.jim?' + + 'dir=' + encodeURIComponent(dir) + + '&base=' + encodeURI(window.location.hostname) + + '&duration=' + duration + + '&file=' + encodeURIComponent(file); + } + + $(it).dialog('close'); } // Bind dialogue open to filenames. @@ -834,11 +867,9 @@ $('a.bf').click(function(e) { $dialog.attr('file', file); $dialog.attr('type', type); - if (type == 'ts' && - (opt.attr('odencd') == 0 || opt.attr('dlna') == 1)) - $dialog.dialog("option", "buttons", $buttonsp); - else - $dialog.dialog("option", "buttons", $buttons); + if (!(type == 'ts' && + (opt.attr('odencd') == 0 || opt.attr('dlna') == 1))) + $('#play').button('disable'); $dialog.dialog('open'); }); From 7964145677c638f2dd161b0e5440a267ec2c1b36 Mon Sep 17 00:00:00 2001 From: df Date: Mon, 15 Mar 2021 16:37:13 +0000 Subject: [PATCH 14/91] Don't play HTML5 media in the WebIf Browse Files window --- webif/html/browse/script.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js index 2ed094f9..be4a9bf1 100755 --- a/webif/html/browse/script.js +++ b/webif/html/browse/script.js @@ -839,7 +839,7 @@ function doplay(it) if (vc && vc[0]) { /* base on page address to handle client on external network, etc */ var hh = new URL(file, window.location.href); - window.location = hh.href; + window.open(hh.href, 'WebIf_Player'); } else { window.location = '/browse/play.jim?' + 'dir=' + encodeURIComponent(dir) + From 4845a4b0cfe78ca762ed69105185101f4fb122be Mon Sep 17 00:00:00 2001 From: df Date: Tue, 13 Apr 2021 12:58:20 +0000 Subject: [PATCH 15/91] Add Download button --- webif/html/browse/file.jim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/webif/html/browse/file.jim b/webif/html/browse/file.jim index 04c227cd..66752481 100755 --- a/webif/html/browse/file.jim +++ b/webif/html/browse/file.jim @@ -282,6 +282,10 @@ if {$type ne "ts" || ("ODEncrypted" ni $flags && $url eq "") } { " set hasffmpeg 1 +} elseif {$type eq "ts" && $url ne ""} { + puts { } } puts " @@ -292,7 +296,7 @@ if {$hasffmpeg} { puts { } } From c8f51adfaacde53f5477f7ce533e0daaeab58acb Mon Sep 17 00:00:00 2001 From: df Date: Fri, 16 Apr 2021 10:29:27 +0000 Subject: [PATCH 16/91] Add Download button --- webif/html/browse/script.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js index be4a9bf1..daf00756 100755 --- a/webif/html/browse/script.js +++ b/webif/html/browse/script.js @@ -10,7 +10,7 @@ var plugins = { dmenu_prepare: {} }; -// pattern matches directory path prefix +// pattern matches directory path prefix and suffix var pathre = /.*\/|\.[^.]*$/g; // IDs of size, img elements for folders use RFC4648 s5 encoding of name @@ -808,6 +808,15 @@ var $dialog = $('#dialogue').dialog({ 'Retrieving data...'); } }); +/* insert button-like Download link before Play */ +$('#play').before(function(i){ + var dl = document.createElement('a'); + dl.setAttribute('class', this.className); + dl.id = this.id + 'DL'; + dl.innerHTML = 'Download'; + return dl; +}); + function doplay(it) { var file = $dialog.attr('file'); @@ -864,12 +873,18 @@ $('a.bf').click(function(e) { type: type }); - $dialog.attr('file', file); - $dialog.attr('type', type); + if (type == 'ts') { + if (opt.attr('odencd') != 0) { + /* encrypted: link to be enabled once populated */ + $('#playDL').disable(); + /* ... but if no DLNA never Play */ + if (opt.attr('dlna') != 1) $('#play').disable(); + } + } else { + /* generic: enable Play once media file is parsed */ + $('#play').disable(); + } - if (!(type == 'ts' && - (opt.attr('odencd') == 0 || opt.attr('dlna') == 1))) - $('#play').button('disable'); $dialog.dialog('open'); }); From 8bbc28d3c259892defe6bf7a2986f647cf4a2882 Mon Sep 17 00:00:00 2001 From: df Date: Fri, 16 Apr 2021 10:32:20 +0000 Subject: [PATCH 17/91] Add Download button --- webif/html/browse/style.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/webif/html/browse/style.css b/webif/html/browse/style.css index d2e2fa38..93e63e4c 100644 --- a/webif/html/browse/style.css +++ b/webif/html/browse/style.css @@ -35,3 +35,13 @@ input.uint8_t width: 6ch; } +/* a link that looks like a button */ +button + a.ui-button +{ + margin-right: 0.4em; +} +.ui-button:link +{ + background-color: rgb(254, 206, 47) !important; +} + From 243dfdd59542f548f06ec4f2faedfd123adbe083 Mon Sep 17 00:00:00 2001 From: df Date: Sat, 17 Apr 2021 01:55:33 +0000 Subject: [PATCH 18/91] Fix quoting and escaping of JS fragments NB jQuery $('#id') in a string looks like an [expr ...] to Jim! --- webif/html/browse/file.jim | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/webif/html/browse/file.jim b/webif/html/browse/file.jim index 66752481..9ef4f5c8 100755 --- a/webif/html/browse/file.jim +++ b/webif/html/browse/file.jim @@ -283,9 +283,10 @@ if {$type ne "ts" || ("ODEncrypted" ni $flags && $url eq "") } { " set hasffmpeg 1 } elseif {$type eq "ts" && $url ne ""} { - puts { } + puts [format { + } $url] } puts " @@ -293,10 +294,9 @@ puts " if {$hasffmpeg} { set url "/browse/ffmpeg.jim?file=[cgi_quote_url $file]" - puts { -} + puts [format { + } $url] } From 8b795a0a7d845b4fabffb28b88acd62e7cea7d25 Mon Sep 17 00:00:00 2001 From: df Date: Sat, 17 Apr 2021 12:09:25 +0000 Subject: [PATCH 19/91] Fix quoting and escaping of JS fragments --- webif/html/browse/file.jim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webif/html/browse/file.jim b/webif/html/browse/file.jim index 9ef4f5c8..17527bf2 100755 --- a/webif/html/browse/file.jim +++ b/webif/html/browse/file.jim @@ -297,6 +297,6 @@ if {$hasffmpeg} { puts [format { } $url] } From bf838ed5e4a19f16d9e97ac7238e5e40718121a8 Mon Sep 17 00:00:00 2001 From: df Date: Sat, 17 Apr 2021 13:42:50 +0000 Subject: [PATCH 20/91] Add Download button --- webif/html/browse/script.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js index daf00756..765afb7d 100755 --- a/webif/html/browse/script.js +++ b/webif/html/browse/script.js @@ -873,16 +873,22 @@ $('a.bf').click(function(e) { type: type }); + $('#playDL').attr('download', file.replace(/.*\//, '')); + if (type == 'ts') { if (opt.attr('odencd') != 0) { /* encrypted: link to be enabled once populated */ $('#playDL').disable(); /* ... but if no DLNA never Play */ if (opt.attr('dlna') != 1) $('#play').disable(); + } else { + /* link unencrypted file directly */ + $('#playDL').attr('href', file); } } else { /* generic: enable Play once media file is parsed */ $('#play').disable(); + $('#playDL').attr('href', file); } $dialog.dialog('open'); From da7d07a891b030c93abf230a58fd70ade2b1f682 Mon Sep 17 00:00:00 2001 From: df Date: Sat, 17 Apr 2021 14:13:04 +0000 Subject: [PATCH 21/91] Add Download button --- webif/html/browse/script.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webif/html/browse/script.js b/webif/html/browse/script.js index 765afb7d..11bb2cde 100755 --- a/webif/html/browse/script.js +++ b/webif/html/browse/script.js @@ -873,6 +873,9 @@ $('a.bf').click(function(e) { type: type }); + $dialog.attr('file', file); + $dialog.attr('type', type); + $('#playDL').attr('download', file.replace(/.*\//, '')); if (type == 'ts') { From 49a7e430cf6df5c2a2b908bc220aa5c91da1952f Mon Sep 17 00:00:00 2001 From: df Date: Wed, 19 May 2021 13:06:28 +0100 Subject: [PATCH 22/91] Fix incorrectly constructed query list to restore purging completed entries A constant list included an item that needed to be evaluated. --- webif/lib/queue.class | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webif/lib/queue.class b/webif/lib/queue.class index 59715a02..1a178000 100644 --- a/webif/lib/queue.class +++ b/webif/lib/queue.class @@ -146,7 +146,7 @@ proc {queue dbqueryl} {query_list {txn_mode ""}} { proc {queue startup} {{days 7}} { if {$days == 0} { set days 7 } - return [queue dbqueryl { { { + return [queue dbqueryl [list { { update queue set status = 'INTERRUPTED', log = 'Job will be retried automatically.', @@ -163,12 +163,12 @@ proc {queue startup} {{days 7}} { update queue set status = 'PENDING' where status = 'DEFER' - } } { { + } } [list { delete from queue where status in ('COMPLETE', 'FAILED') and submitted < %s } [expr [clock seconds] - 86400 * $days] - } } ] + ] ] ] } proc {queue fetch} {file action} { From 519f771859cc77074d41cf77c3ac0d47167fed2f Mon Sep 17 00:00:00 2001 From: prpr Date: Sat, 14 Nov 2020 01:17:07 +0000 Subject: [PATCH 23/91] Fix thumbnail generation --- webif/lib/ts.class | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/webif/lib/ts.class b/webif/lib/ts.class index 34087cf2..de181780 100644 --- a/webif/lib/ts.class +++ b/webif/lib/ts.class @@ -354,13 +354,14 @@ ts method mkbmps {{offset 0}} { ts method mkbmp {{offset 0} {ext ""}} { set bfile [file rootname $file] - set cmd [list /mod/bin/ffmpeg -loglevel fatal -ss $offset -i $file \ - -frames 1 -pix_fmt argb -vf vflip -s 140x78 "$bfile$ext.bmp"] - if {[catch { exec {*}$cmd } msg]} { - puts "ERROR: $msg" - return 0 - } - return 1 + set bmpfile "$bfile$ext.bmp" + set cmd [list /mod/bin/ffmpeg -loglevel fatal -ss $offset -i $file \ + -frames 1 -pix_fmt argb -vf vflip -s 140x78 -y $bmpfile] + catch { exec {*}$cmd } + if {![catch { file stat $bmpfile stbmp }]} { + if {[dict get $stbmp size] != 0} { return 1 } + } + return 0 } ts method mkthm {{offset 0}} { From 1b11be6827952d5ff42f146031352fdfb68f6a7d Mon Sep 17 00:00:00 2001 From: prpr Date: Sat, 14 Nov 2020 01:25:46 +0000 Subject: [PATCH 24/91] Fix the ****ing formatting in this stupid editor --- webif/lib/ts.class | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/webif/lib/ts.class b/webif/lib/ts.class index de181780..b998d93f 100644 --- a/webif/lib/ts.class +++ b/webif/lib/ts.class @@ -354,14 +354,14 @@ ts method mkbmps {{offset 0}} { ts method mkbmp {{offset 0} {ext ""}} { set bfile [file rootname $file] - set bmpfile "$bfile$ext.bmp" - set cmd [list /mod/bin/ffmpeg -loglevel fatal -ss $offset -i $file \ - -frames 1 -pix_fmt argb -vf vflip -s 140x78 -y $bmpfile] - catch { exec {*}$cmd } - if {![catch { file stat $bmpfile stbmp }]} { - if {[dict get $stbmp size] != 0} { return 1 } - } - return 0 + set bmpfile "$bfile$ext.bmp" + set cmd [list /mod/bin/ffmpeg -loglevel fatal -ss $offset -i $file \ + -frames 1 -pix_fmt argb -vf vflip -s 140x78 -y $bmpfile] + catch { exec {*}$cmd } + if {![catch { file stat $bmpfile stbmp }]} { + if {[dict get $stbmp size] != 0} { return 1 } + } + return 0 } ts method mkthm {{offset 0}} { From 567d1426133f1d864eb909e92c16547245924df7 Mon Sep 17 00:00:00 2001 From: prpr Date: Mon, 19 Oct 2020 16:05:12 +0000 Subject: [PATCH 25/91] Prevent raw utf8 display https://hummy.tv/forum/threads/webif-web-interface-1-4-x.7712/post-135917 --- webif/html/browse/rename.jim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/webif/html/browse/rename.jim b/webif/html/browse/rename.jim index 618f46bf..1e3a07ae 100755 --- a/webif/html/browse/rename.jim +++ b/webif/html/browse/rename.jim @@ -26,6 +26,9 @@ if {[file isdirectory $file]} { set new [string map {"\n" ""} [ string trim [cgi_get "rename_$attr"]]] set old [$ts get $attr] + if {$attr eq "title" || $attr eq "synopsis"} { + set new "\025$new" + } if {$new ne $old} { if {$attr eq "guidance" || [string length $new] > 0} { From 67e71691eb4ad5346e8aef0abe67824de323e7ea Mon Sep 17 00:00:00 2001 From: df Date: Sun, 18 Oct 2020 14:53:23 +0000 Subject: [PATCH 26/91] Retry access in case the settings database is locked Create `settings::_safer_query` class proc to allow 5 tries with 1s delay; use it for `_nval_setting` and `_tval_setting` methods --- webif/lib/settings.class | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/webif/lib/settings.class b/webif/lib/settings.class index 05361dd5..4251fa6f 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -54,6 +54,21 @@ class settings { rtschedule 0 } +proc {settings _safer_query} { queryText args } { + global settingsdb + # allow 5 (too many?) tries with 1s (too long?) delay to get access + for {set lockCnt 5} {} {sleep 1} { + try { + $settingsdb query $queryText {*}$args + } on error {msg opts} { + if {[string first "database is locked" $msg] >= 0 && [incr lockCnt -1] > 0} { + continue + } + return {*}$opts $msg + } + } +} + settings method hostname {{name ""}} { if {$name == ""} { # Get @@ -104,11 +119,10 @@ settings method smtp_server {{server ""}} { } settings method _nval_setting {name {val -1}} { - global settingsdb if {$val == -1} { # Get - set res [$settingsdb query " + set res [settings::_safer_query " select nval from settings where name = '$name' "] @@ -118,7 +132,7 @@ settings method _nval_setting {name {val -1}} { return 0 } else { # Set - $settingsdb query " + settings::_safer_query " replace into settings(name,nval) values('$name', $val) " @@ -127,11 +141,10 @@ settings method _nval_setting {name {val -1}} { } settings method _tval_setting {name {val -1} {def 0}} { - global settingsdb if {$val eq "-1"} { # Get - set res [$settingsdb query " + set res [settings::_safer_query " select tval from settings where name = '$name' "] @@ -141,7 +154,7 @@ settings method _tval_setting {name {val -1} {def 0}} { return $def } else { # Set - $settingsdb query " + settings::_safer_query " replace into settings(name,tval) values('$name', '%s') " $val From 3981bbd37e1fa3f18c1b09e17cb74e1884d80f05 Mon Sep 17 00:00:00 2001 From: df Date: Sun, 18 Oct 2020 15:48:07 +0000 Subject: [PATCH 27/91] Retry access in case the settings database is locked --- webif/lib/settings.class | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/webif/lib/settings.class b/webif/lib/settings.class index 4251fa6f..5b561850 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -56,10 +56,11 @@ class settings { proc {settings _safer_query} { queryText args } { global settingsdb + # allow 5 (too many?) tries with 1s (too long?) delay to get access - for {set lockCnt 5} {} {sleep 1} { + for {set lockCnt 5} {true} {sleep 1} { try { - $settingsdb query $queryText {*}$args + return [$settingsdb query $queryText {*}$arg] } on error {msg opts} { if {[string first "database is locked" $msg] >= 0 && [incr lockCnt -1] > 0} { continue @@ -122,7 +123,7 @@ settings method _nval_setting {name {val -1}} { if {$val == -1} { # Get - set res [settings::_safer_query " + set res [settings _safer_query " select nval from settings where name = '$name' "] @@ -132,7 +133,7 @@ settings method _nval_setting {name {val -1}} { return 0 } else { # Set - settings::_safer_query " + settings _safer_query " replace into settings(name,nval) values('$name', $val) " @@ -144,7 +145,7 @@ settings method _tval_setting {name {val -1} {def 0}} { if {$val eq "-1"} { # Get - set res [settings::_safer_query " + set res [settings _safer_query " select tval from settings where name = '$name' "] @@ -154,7 +155,7 @@ settings method _tval_setting {name {val -1} {def 0}} { return $def } else { # Set - settings::_safer_query " + settings _safer_query " replace into settings(name,tval) values('$name', '%s') " $val From 13f3b1cccebd6ceeec0ce7f1794201f8d0e31d1c Mon Sep 17 00:00:00 2001 From: df Date: Sun, 18 Oct 2020 19:19:26 +0000 Subject: [PATCH 28/91] Raise the "database locked" error from caller context --- webif/lib/settings.class | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/webif/lib/settings.class b/webif/lib/settings.class index 5b561850..fa74b117 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -62,8 +62,14 @@ proc {settings _safer_query} { queryText args } { try { return [$settingsdb query $queryText {*}$arg] } on error {msg opts} { - if {[string first "database is locked" $msg] >= 0 && [incr lockCnt -1] > 0} { - continue + if {[string first "database is locked" $msg] >= 0} { + if {[incr lockCnt -1] > 0} { + continue + } else { + # raise error from caller + set msg "Persistently unable to access Settings: database locked" + incr opts(-level) + } } return {*}$opts $msg } From 42d03e25c682d91b79f3f91f549e5088c34d7910 Mon Sep 17 00:00:00 2001 From: df Date: Mon, 19 Oct 2020 11:44:53 +0000 Subject: [PATCH 29/91] Change to 0.5s, doubling for 4 tries --- webif/lib/settings.class | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webif/lib/settings.class b/webif/lib/settings.class index fa74b117..ac7c6d51 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -57,8 +57,8 @@ class settings { proc {settings _safer_query} { queryText args } { global settingsdb - # allow 5 (too many?) tries with 1s (too long?) delay to get access - for {set lockCnt 5} {true} {sleep 1} { + # allow 4 tries from 0.5s delay, doubling, to get access + for {set lockCnt 4; set delay 0.5} {true} {sleep $delay; set delay $(2*$delay)} { try { return [$settingsdb query $queryText {*}$arg] } on error {msg opts} { From b9787a0a9f9dc6265c3d1d081734e287c54886e7 Mon Sep 17 00:00:00 2001 From: df Date: Tue, 20 Oct 2020 18:34:19 +0000 Subject: [PATCH 30/91] Retry access in case the settings database is locked --- webif/lib/settings.class | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webif/lib/settings.class b/webif/lib/settings.class index ac7c6d51..f5edda2d 100644 --- a/webif/lib/settings.class +++ b/webif/lib/settings.class @@ -60,7 +60,7 @@ proc {settings _safer_query} { queryText args } { # allow 4 tries from 0.5s delay, doubling, to get access for {set lockCnt 4; set delay 0.5} {true} {sleep $delay; set delay $(2*$delay)} { try { - return [$settingsdb query $queryText {*}$arg] + return [$settingsdb query $queryText {*}$args] } on error {msg opts} { if {[string first "database is locked" $msg] >= 0} { if {[incr lockCnt -1] > 0} { From 569bff9d601dc8258fe974852680db8b137f7f89 Mon Sep 17 00:00:00 2001 From: HummyPkg Date: Sun, 13 Dec 2020 23:24:12 +0000 Subject: [PATCH 31/91] Release 1.4.8-11 --- CONTROL/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTROL/control b/CONTROL/control index 8a5bd65c..cc40996e 100644 --- a/CONTROL/control +++ b/CONTROL/control @@ -1,7 +1,7 @@ Package: webif Priority: optional Section: web -Version: 1.4.8-10 +Version: 1.4.8-11 Architecture: mipsel Maintainer: af123@hpkg.tv Depends: tcpfix,webif-channelicons(>=1.1.27),lighttpd(>=1.4.39-1),jim(>=0.79),jim-pack(>=0.79),jim-oo(>=0.77),jim-sqlite3(>=0.77),jim-cgi(>=0.7-2),jim-binary(>=0.76),service-control(>=2.3),busybox(>=1.20.2-1),lsof(>=4.87),epg(>=1.2.8),hmt(>=2.0.10),ssmtp,cron-daemon(>=1.18.3-3),at(>=3.1.18),anacron,trm(>=1.1),openssl-command,nicesplice,id3v2,file,rsvsync(>=1.1.13),webif-charts(>=1.2-1),stripts(>=1.4.2),tmenu(>=1.21-2),ffmpeg(>=2.8),id3v2,multienv(>=1.6),tcpping(>=1.1),e2fsprogs,wireless-tools(>=29-1),dbupdate,recmon(>=2.0.7),hwctl,nugget(>=0.98),sqlite3(>=3.15.1),jim-xconv,zip(>=3.0-1),wget From 6814880b40cc73f11d075cd69e5833c3a23b0243 Mon Sep 17 00:00:00 2001 From: df Date: Fri, 1 Jan 2021 22:33:14 +0000 Subject: [PATCH 32/91] Understand Part/Pt. as a synonym for episode --- webif/lib/ts.class | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webif/lib/ts.class b/webif/lib/ts.class index b998d93f..9b164cee 100644 --- a/webif/lib/ts.class +++ b/webif/lib/ts.class @@ -697,6 +697,14 @@ ts method extract_numbers {} { regexp -nocase -- {S\.*(\d+),?\s*Ep\.?\s*(\d+)(/(\d+))?} $synopsis \ x seriesnum episodenum x episodetot + # (Part 5/10) + # (Pt. 5/10) + # (Part 5 of 10) + # (Pt. 5 of 10) + # (Pt5) + regexp -nocase -- {P(art|t\.?)\s*(\d+)\s*(of|/)?\s*(\d+)?} $synopsis \ + x x episodenum x episodetot + foreach v {seriesnum episodenum episodetot} { if {[set $v] eq ""} { set $v 0 From 959aa9f8e67190359b8f0ac7008f5c6f060e5bac Mon Sep 17 00:00:00 2001 From: df Date: Fri, 11 Dec 2020 11:18:58 +0000 Subject: [PATCH 33/91] Avoid displaying negative free space --- webif/html/diskspace/diskspace.jim | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/webif/html/diskspace/diskspace.jim b/webif/html/diskspace/diskspace.jim index d21b767c..5cd88c8d 100755 --- a/webif/html/diskspace/diskspace.jim +++ b/webif/html/diskspace/diskspace.jim @@ -9,6 +9,11 @@ lassign [system diskspace 1] size used perc free fperc tsrbuf tsrused set tsrreserve $($tsrbuf - $tsrused) # Adjust values to account for the TSR reserve set free $($free - $tsrreserve) +# In case the reserve has been over-committed +if {$free < 0)} { + # avoid displaying negative free, or used > available + set free 0 +} set used $($size - $free) set dbs 0 From 6d0b1deebec5e4572cb4264e622e094b8f2fb089 Mon Sep 17 00:00:00 2001 From: df Date: Thu, 31 Dec 2020 12:13:52 +0000 Subject: [PATCH 34/91] Banish extraneous ) --- webif/html/diskspace/diskspace.jim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webif/html/diskspace/diskspace.jim b/webif/html/diskspace/diskspace.jim index 5cd88c8d..58e98e34 100755 --- a/webif/html/diskspace/diskspace.jim +++ b/webif/html/diskspace/diskspace.jim @@ -10,7 +10,7 @@ set tsrreserve $($tsrbuf - $tsrused) # Adjust values to account for the TSR reserve set free $($free - $tsrreserve) # In case the reserve has been over-committed -if {$free < 0)} { +if {$free < 0} { # avoid displaying negative free, or used > available set free 0 } From 0d99a7b24de79b36273becb1aaa456de82182c0e Mon Sep 17 00:00:00 2001 From: HummyPkg Date: Mon, 18 Jan 2021 22:59:51 +0000 Subject: [PATCH 35/91] Update tvdb XML parsing utility --- webif/lib/bin/tvdb | Bin 14996 -> 15608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/webif/lib/bin/tvdb b/webif/lib/bin/tvdb index 57925b8c6b115128216352207db22f56caadeb05..f4237bfaf77c3b03ef30e86e5a69ee4f9f1cba3f 100755 GIT binary patch delta 4505 zcmb7IeQZ8yn@_8@xFchq}7%ovda9L5CvW$^uQ z4Ez{#p8VkS4&_SB5X?YI3O1238GRp26`*I0I$N)xq0{P`h&xM2TLnldp}qO;+0n(rKh2{b&1jKMrsxn#mWU{GB!_$VDEhgvfW zkV8#N^#28OsgO=qu>fO#1Y(%Sa5=rEm(kju0bcR z5quqR%7WX0XDzq@deaMd5RVp&$pr>u`+<`dd>J@l!BsFgWWf`V4_I&?%JAiZbI({=5ISP5og2%w0&EobV zfKez+TNJ(r-lPRrK%TVV7;vJV=j84!-M{~p-o3A~{+<2(`@X-E`d9h~E*;JNosf&2 zSJ5#(&c81C3Y9Bk0d45)C=4@aep}#M{D|akw{rFRw!k{6(Ad2d?E0varEDs@M!Oxy zLdqtvjBGQEDp&Z2(l_$vBAXL;)7JukO?ke-hv7#5TzH$mDzR1kVWNno)7$*xqT-A( zrDHxK{(49enOE5gdoPcWRq3%xX9u?M)ltabpmCjR8=FtZQIngs@u8!Jzd1}-1ZD$1 zJBqWjgXX2e!y55oOzfD8bS5=+oqv>9F2a@1;R=aK?Q!Ji8kvt_+I;w^v8)s3XsNDj zI_yj>o`-%WXw?Xs#-w8=VHQya+4YGU_TGedE@{goVJraK6CrjJG-K$y*bHGln!m2L z#jen?%2YNz;bJ%8y4VqKd_mLLjeyE#0^U%Zd80Zz!B6IwZScBuCNNPeVml1)%o%%D zn(?wZqnYg}$*hy{p@Hef(XFu=PJHGOnayLvd7hCo)|oWN0_)P?%czUpF#PwrcCZkC zUv{}_-iG6u302D5%v%FzvFUGD+~(&B>M-6emr29W%dzMM4IOvEf6|+^rye!RrvAtheVMDP zD;znjQzP3e&pU;AcFQ`l(815iZijtg=948WRu+5#4r0y3Yj``h%*v+!)5^8NN`8J- zaKmrD)Qv}KEi2KHDJL_B=dqg2>N8@c9L82t4!w$*lM9RVZm*^sF4Y-dq|;IOES<^! zp#$Gx`QyTXkTjlZMNvrswt`XimoYb*<;px>aAZjwsr@%&7V#` zRdsfi3ndMXl&O<3m({fvRoXI4@@vq*KTYnP}s^WVDK9r0$< z$!V{htL08%(uhMZ?~_h6zo6x!)=n+t{dRdsN`Olh2(H#COc}EHT3I>;zH>o)WbJVI z>rV41%+x~?8u^As%pc(0?gQSGsK|6yx!66UV#b?0HGNTbd);e!+AS@!H3eIeVar?b zmXPAtDk=+aVs_V8nmvoznaE-_@MPTqSopZ6Y}qPz7sVudUJ~x`Pd#paz*DlSF&iBn z@b{bfo1Q-jW0VZ%v8;f1SEx-mGbcXF$>hQ8DPmJ;`IvuFxkk8bq*Yc+91ohiv}quB zty!(K;1h%zMW{hkEggwEvvpLoysA;v3>b5VRDD@>+4-C*qY|mAf-Nf)V6bIr0rsq< z+OtTNs%pN)sH#wSrK)oA%T+zu@Kj9}ZjrNv6jFB>r#p78hD~VMEGNnhIz13!MUIl*`e8u4Zae*K7%hDO}ap@{|7If$!)M~$jay(L7mo3U$wMuq0 zUwa<4_^GFye_53$TrfxPq}B_0honp~9+LQHb$%`fU5@)<#s3pt8|<{VGMC2V!7(9t z>5Jg+1yMP+>@`x)YYW8qzw2xCs_Nal4?b7D7bWbks$T!?L*LvE&LQIXd;15TBmQd# z_Z`5%-#f5xKlOVEq2Go6(#D2PJ0EWD8l+nqU6ko^h8G7=rloKe&w{2wlOVGtF;0Mn zKm(vSs2ik%LLh1?dWFWIxdz?1o6Mr022FyJpaf{BLEmEBBjNzvARQC}QB%XFE$L_MxYT!>amMpp4TpohQPTFg75vJ^+2=yrSTV>7zpa&8D26W~yd>G+Z+WaEAPte_NntmVNC_eGTVD;l<@f&E_U=crS(T~EF3w=3ihz9f#*)SccYYbrrFWL;@M88!Qq6xhU zY!D(_g5y?@1zTYA_C&3;_r`AB}vTJi`z>r&~pO0so+qXiR(n)EY=7+^!!Y?so3@VFyI7n zbK}nk{jt>Ye9pmCvmx?rJl`=17nLVaap)A@6%#&y!*bo>?WF{7$l|bjh5Z8j74by5 zH3NSG3Ksq?@LZiE%>^uwjndlhh4E|IL z{}6g%;RVozUW28)*Gb{Rgj#cBZ~?fnY#?&b&s+Gnp)XtbJ@Ar+>##3ccoMu|;aq{a zI-eBcAOzXEK#14DGZx+n2V)j~7J9?N_d_4I@E4%hEc_a{YT@69y{K_|*1mqS1(Jmx z1LDf_I}Coq!n?ueE&L?x$`<~0=t~y7>6w)L%bY3;zq$v$_f7E%%3X~=1$ZwnOhf+)kGs9& z;?7bASsv2Q=3X-QY8Qqo2^;u{X?zOPJTI5bqj+rkppesr)NoN37wO;5HW^!4*A$p! zHJcqz{Y+=~_|&Fnk}sLdI^d3%8mXqDL1^n|U|$JXGXv%^+td=kQDTW%O}snnUntrt zNjMpX@7ajB3|unpz2Xvcnr+(H_L@z_>&u_T%hyvUaDNO2yxHpe+wJE4O}K0On|0UrH&VCzyPISEUpAw4n?36vX0v-0oAWBi zt+a%tlay%bb|Lp>uE#KMJ0wAxYVj&~a?^Nn(-C^TCCnxA=ay*O-q^6NOO?ka#L$#q z%LsqO5ZCCyh7NhrN#ESiW#{LXjnNaWKWsc28_~8(EXYr-lPMq9va!; zZG5q2SMf34n6C-itP|tdX^*%v?T;H`25!CN_jnqoYPLN2vz~VM40g%uEbs38rVeR} zPJ4Xv*%)2&^tsEiG2KxOgttaKQ*=|aT#nNR?E~(`_{v}s9YN_F zo!=Cre8+A@Pwdk1UtKRC-#)tA5m$O3;gT#+qH~zEKnG2CDoPwuhbcYX`J=Xft*JaQ zty&&wXq&2DJalAZ-hW+I*H&KE_ss$tO$_VCeR+3x1t0LU7k-qwpBFbDrR!a)be*Iv zK6eHlMppH31RiSfU?;vjX5aRC9$4vUJs!XIq%=>1{thZ?Ep0!qM#hDjOAO&-SDfWq zkxBB0>5g_rI?k2pxL38K`A+Ro4PU9x*()ij^&EW7=>LryER|Lwf1tZDpBT|E@QV?s z)i-bEIKtnK@OzMQeF61HvQed($k7KXb|g8h zk3CRt_p0BjTIH{-Sgtp&*1ed$ch%Vkv6JO`KjKqqYV$$5yM=3>t9IpT+57Crx*xAr z?$vI!I=WLIX+2!4?og1<>E2)Uu9cj(9F-Ei<)97G5E;>y#(Yu@t)qR>VLBHrNWF6( zkNr-P7xE7rZ!{cleos3Rkz(Oy2v>WK>fih46ia-I#0a+jei~&Zk zF=8G{H4qgL477zF!#rBfqvs=J3E-n*0pKHH7RUhHaK|CHv{4!**EXMAj?%hqU4cxK zsVpxpEiIW=_=x~~;p5BOR5Lxjt;>eMd9JM-HT$`1+vX+dc{;Vjrxa~i5{I-bT>;~p zr-}>FR=Tyr*U0%ACHFwky!4h8A&LR|#6XwAd&=|(k)cBaK0CZ3t@NFNfTG2asTeDM z4Mi@AFp~7wfq=boA0~Ncz&?e$)KrqTU^s)}Op?Yiy zTjXW>(@vi~k6TwhMIXVYfZ?$ewWmWex*>E=_0wT=ul3V+)9?ZPTmAHQI^=z;Ux+^- L7qy1dwAua(41!n- From eac48493267c40885d3b04cc24e6def344535ae2 Mon Sep 17 00:00:00 2001 From: HummyPkg Date: Mon, 18 Jan 2021 23:00:37 +0000 Subject: [PATCH 36/91] Update version --- CONTROL/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTROL/control b/CONTROL/control index cc40996e..3dd73fd3 100644 --- a/CONTROL/control +++ b/CONTROL/control @@ -1,7 +1,7 @@ Package: webif Priority: optional Section: web -Version: 1.4.8-11 +Version: 1.4.9 Architecture: mipsel Maintainer: af123@hpkg.tv Depends: tcpfix,webif-channelicons(>=1.1.27),lighttpd(>=1.4.39-1),jim(>=0.79),jim-pack(>=0.79),jim-oo(>=0.77),jim-sqlite3(>=0.77),jim-cgi(>=0.7-2),jim-binary(>=0.76),service-control(>=2.3),busybox(>=1.20.2-1),lsof(>=4.87),epg(>=1.2.8),hmt(>=2.0.10),ssmtp,cron-daemon(>=1.18.3-3),at(>=3.1.18),anacron,trm(>=1.1),openssl-command,nicesplice,id3v2,file,rsvsync(>=1.1.13),webif-charts(>=1.2-1),stripts(>=1.4.2),tmenu(>=1.21-2),ffmpeg(>=2.8),id3v2,multienv(>=1.6),tcpping(>=1.1),e2fsprogs,wireless-tools(>=29-1),dbupdate,recmon(>=2.0.7),hwctl,nugget(>=0.98),sqlite3(>=3.15.1),jim-xconv,zip(>=3.0-1),wget From 42619e6555dbdbd7498ba9b0dc1958b264098d9a Mon Sep 17 00:00:00 2001 From: HummyPkg Date: Mon, 18 Jan 2021 23:05:01 +0000 Subject: [PATCH 37/91] Add to episode parsing tests --- webif/lib/test/episode | 5 +++++ webif/lib/ts.class | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/webif/lib/test/episode b/webif/lib/test/episode index aeb7f768..333ef7dd 100755 --- a/webif/lib/test/episode +++ b/webif/lib/test/episode @@ -18,6 +18,11 @@ foreach {sample expected} { {(S8, Ep2)} {S8E2/0} {(S4 Ep22/24)} {S4E22/24} {23/27.} {S0E23/27} + {Part 5/10} {S0E5/10} + {Pt. 5/10} {S0E5/10} + {Part 5 of 10} {S0E5/10} + {Pt. 5 of10} {S0E5/10} + {Pt5} {S0E5/0} } { set ts [ts new "synopsis {$sample}"] $ts episode_name diff --git a/webif/lib/ts.class b/webif/lib/ts.class index 9b164cee..b9b6ee2b 100644 --- a/webif/lib/ts.class +++ b/webif/lib/ts.class @@ -698,7 +698,7 @@ ts method extract_numbers {} { x seriesnum episodenum x episodetot # (Part 5/10) - # (Pt. 5/10) + # (Pt. 5/10) # (Part 5 of 10) # (Pt. 5 of 10) # (Pt5) From 1a08892868deb13dae804e43d4b2e35104cb932e Mon Sep 17 00:00:00 2001 From: df Date: Wed, 11 Nov 2020 12:19:32 +0000 Subject: [PATCH 38/91] Allow minimum width for cut plan Also * add ID for estimated time row * make the