From fb328daf43e9979f7f0e46337ec9250186b5dd8c Mon Sep 17 00:00:00 2001 From: MymsMan Date: Wed, 21 Oct 2020 17:37:23 +0100 Subject: [PATCH] first commit --- CONTROL/control | 10 + bin/qtube | 56 +++ webif/plugin/qtube/dequeue.jim | 12 + webif/plugin/qtube/go.hook | 3 + webif/plugin/qtube/img/qtube.pdn | Bin 0 -> 48557 bytes webif/plugin/qtube/img/qtube.png | Bin 0 -> 17505 bytes webif/plugin/qtube/img/queuep.png | Bin 0 -> 14753 bytes .../qtube/img/youtube_social_squircle_red.png | Bin 0 -> 2301 bytes webif/plugin/qtube/img/yt_icon_rgb.png | Bin 0 -> 7778 bytes webif/plugin/qtube/index.jim | 70 ++++ webif/plugin/qtube/menu.hook | 7 + webif/plugin/qtube/qtube.jim | 346 ++++++++++++++++++ webif/plugin/qtube/queue.hook | 51 +++ webif/plugin/qtube/queue.jim | 21 ++ webif/plugin/qtube/runnow.jim | 48 +++ webif/plugin/qtube/save.jim | 18 + webif/plugin/qtube/script.js | 101 +++++ webif/plugin/qtube/settings.js | 38 ++ webif/plugin/qtube/status.hook | 7 + webif/plugin/qtube/style.css | 27 ++ webif/plugin/qtube/timelist.jim | 19 + webif/plugin/qtube/toolbar.hook | 3 + 22 files changed, 837 insertions(+) create mode 100644 CONTROL/control create mode 100755 bin/qtube create mode 100755 webif/plugin/qtube/dequeue.jim create mode 100644 webif/plugin/qtube/go.hook create mode 100644 webif/plugin/qtube/img/qtube.pdn create mode 100644 webif/plugin/qtube/img/qtube.png create mode 100644 webif/plugin/qtube/img/queuep.png create mode 100644 webif/plugin/qtube/img/youtube_social_squircle_red.png create mode 100644 webif/plugin/qtube/img/yt_icon_rgb.png create mode 100755 webif/plugin/qtube/index.jim create mode 100644 webif/plugin/qtube/menu.hook create mode 100755 webif/plugin/qtube/qtube.jim create mode 100644 webif/plugin/qtube/queue.hook create mode 100755 webif/plugin/qtube/queue.jim create mode 100755 webif/plugin/qtube/runnow.jim create mode 100755 webif/plugin/qtube/save.jim create mode 100644 webif/plugin/qtube/script.js create mode 100644 webif/plugin/qtube/settings.js create mode 100644 webif/plugin/qtube/status.hook create mode 100644 webif/plugin/qtube/style.css create mode 100755 webif/plugin/qtube/timelist.jim create mode 100644 webif/plugin/qtube/toolbar.hook diff --git a/CONTROL/control b/CONTROL/control new file mode 100644 index 0000000..5c72144 --- /dev/null +++ b/CONTROL/control @@ -0,0 +1,10 @@ +Package: qtube +Priority: optional +Section: misc +Version: 0.1.0-2 +Architecture: mipsel +Maintainer: mymsman +Depends: webif(>=1.4.8), youtube-dl (>=2020.03.24) +Description: Simple webif to queue youtube downloads to run in the Auto process queue + +Tags: http://wiki.hummy.tv/wiki/qtube diff --git a/bin/qtube b/bin/qtube new file mode 100755 index 0000000..86de880 --- /dev/null +++ b/bin/qtube @@ -0,0 +1,56 @@ +#!/mod/bin/jimsh + +source /mod/webif/lib/setup + +require lock system.class ts.class queue.class \ + settings.class plugin + +set loglevel 2 +set logfd stdout +proc log {msg {level 1}} { + if {$level > $::loglevel} return + puts $::logfd "[\ + clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"\ + ] QT([pid])- $msg" + flush $::logfd +} + +set ct [llength $argv] +set optct $($ct-2) + +set url [lindex $argv $($ct -1)] +set optlist [lrange $argv 0 $optct] +set strtk [lsearch $optlist "-start"] +set start [clock seconds] +if {$strtk!=-1} { + # -start specified + + set time [lindex $argv $($strtk +1)] + set optlist [lreplace $optlist $strtk $($strtk +1)] + if {[string is integer -strict $time]} { + set start $time + } else { + catch { + set tstart [clock scan $time -format %H:%M] + if {$tstart<$start} {incr tstart 86400} + set start $tstart + } + + } + + if {$start == 0} {set start [clock seconds]} +} + +if {$optlist == "{}"} {set optlist ""} + +log "Starting URL: $url options: $optlist" 0 + +# queue with system Q +set q [{queue insert} -hold $url qtube] +$q set start $start +$q set args $optlist + +set Qid [$q get id] +$q submit + +log "Queued id: $Qid URL: $url options: $optlist" 0 diff --git a/webif/plugin/qtube/dequeue.jim b/webif/plugin/qtube/dequeue.jim new file mode 100755 index 0000000..6f173a6 --- /dev/null +++ b/webif/plugin/qtube/dequeue.jim @@ -0,0 +1,12 @@ +#!/mod/bin/jimsh + +# DeQueue url from backround queue +package require cgi queue class +source /mod/webif/lib/setup + +httpheader + +puts "DeQueue starting" +set url [cgi_get url -] +::detectads::delete_entry_queue_db $ts + diff --git a/webif/plugin/qtube/go.hook b/webif/plugin/qtube/go.hook new file mode 100644 index 0000000..2292618 --- /dev/null +++ b/webif/plugin/qtube/go.hook @@ -0,0 +1,3 @@ +register_module "qtube" "/plugin/qtube/" +#system plog qtube "gohook mod $module last $lastmodule" + diff --git a/webif/plugin/qtube/img/qtube.pdn b/webif/plugin/qtube/img/qtube.pdn new file mode 100644 index 0000000000000000000000000000000000000000..1903055c98254217731debcfdf6de63d9635fc69 GIT binary patch literal 48557 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�(y{c7u1=E*n)B-eh2 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⪻v%uYoqQcl=JM_;|z*~ihLqZHLY5~lVpjuZ9KkI{~ zU?@T_H8J}|{N98hMb27br|Ux;^CY&;p4L~}348BrxO%KH%;%m1f`EgMNd<(vgdNWq z;z8Rd%@`7V9#28{gX5^wA(#WB3@2-U(M@f>7Su-?zYc{snt&l21~F+6KyXc#3=DcWSwVSj>ZH3 zNb7@V>p1z#0Z`nPVdp9@(vD=(A0(;&OqZ|?IafjR*qm-6##bK_$`2|HdxmM>U45V* znqBvzAI`4B33L@o2bR0dbcA2}ajs&Eg7BTJ*klpT4M(7sj@rDmu5{&9A=R#c@-CVAj4uS6TQLgy+;#MNTCo%N!P|Cr z=Z8==2V-%kyE^qGLYxi6N68A}UO)aoBZqbTHOTGhz8x-r);5-p%LRqt_2FEU^BO2~ zhW!t_@En%#KiSVQ?~J#WxFT3Y3%Te=P~Y#oVA`&)O`tp{x*9ICsWfwF^+uS3iF92# zE~)S<9+kNb=J^lE+aJ*;U-FbRbg+6Zu0oTLQIonD<|Q`;I!8)I`zZ9At5{Jr`ilA~ zzA+>OT;Xc5>q#lX!X~iR(Rd`oJF{OQ(DM)fh)IBe)Q39b^hNgkyYQE1pk}V1*LfEM zknq_>mgEPS*sFG66sCG?of<>jd6SeojHE&U`;O&q1V-+1&ys5t5aAWDnv6BA)^p}m?Ot~6-B+XomY z{3qNMg>slJo@`K;J^d(Yiace2CHlWBat?9JcQCJ1bdi?za~5B z6XwjMw>Cj@u9OCv=6}j5rGI-7(wbK2>wn$8KV9~n#!A{lRNq$USFS zrlV5yF9!#>n4h*_@7UPWk@TyG=GCzxDkAoBG1;lnNnvI*h2*5FvG!=S;?%ax61&{g zgV{^3SwX1iazhx&VT^RP?=%})`;y3H zsDai5~XRRKdfJj%pu19dc-f@*yDDqpPylktU!-`3zQyv>4Q zqgjgfXYwcrlPJ|@A-%t_W$cH@B2$vY`Mz)!m`y$@WFs(Yn=vH`7lIu(f&9c^1i^XH zL9m%-u@O1t`;8T-tsP(VvY;O^iVW@WTH+M>pq#17#oD(-;V@-EgxjQ^Lzo~8g;Jut zC`}rSS`S5oA<06N2$D&pd2e^Nw{fJSWQParIGN zx@j7{s-$T}V2U!N^W*nmm*jq|zB3upa2N6~3rY=F@Kijh6Z2H;p1BY0dC<%&m}<3f z%mlWeeq&hy4`p5cE3$nB7_o{x8*YJ!UOGJPonR_8JZ|l?Ej9iKDNc!~gk!=`Jnv$d zs!p{Irav09k0O?sJR5aAyp{63T`Zgh^+grr03^^lKt|8IKQ*+w$@vmY_xb(5aW2=K za`B;J>f?aZF>)u(I4oj&&OC3tJmsh|kF`gNTFTDlvTh2J3k#+MbF8Y5^LZWWn6iD@ zq|CP)ggSzlJULi}9=-S^@mOd2r5C3?FD?Nt=i2y-!{s^q?oTtHekpyc1D6`A zt!fuwn^bAQ%@*^+T7iFNCvYT8BmU$TpQoy``csZXZ(24(Rru{DmJ?4|Srp?YWtvRw ziSai2rsH*T#?l%U=Q80Y$7Mn(T8Da;h6>iIGPk7&z3*A(xvV?QgUw*A%I;34NxhC` zRU$gBX-unGCYOFB~$+Z_JG9O%ONQo%pwcDJgsS?d~uq14D1ot&bkqJMx zdMirUF@LBGYRTl-CgP;)`uhxv9Y2>r+=E*R4!?6U3z;IHGoLb$pY*U;E`n`i&5a!* zO`JPyR?Uz~`gxY=#Fi~4iNV5NLY&Xk^8_6>EuFxV6US9pVwU;fy@N?jp7u0m&L2H| z$0xp>=Co;PM!#f6J-15kVUy>%k*k0`*kN=M#Zg~jM#lg08}utgPP1072c7`J;OXk; Jvd$@?2>_oJE8zeD literal 0 HcmV?d00001 diff --git a/webif/plugin/qtube/img/queuep.png b/webif/plugin/qtube/img/queuep.png new file mode 100644 index 0000000000000000000000000000000000000000..2685835ed15c104408c9464e0964ea7bec089129 GIT binary patch literal 14753 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 G`Tqsv9GcAl literal 0 HcmV?d00001 diff --git a/webif/plugin/qtube/img/yt_icon_rgb.png b/webif/plugin/qtube/img/yt_icon_rgb.png new file mode 100644 index 0000000000000000000000000000000000000000..3fbe82f8f639a8befd88db8bcb6312940e5e741d GIT binary patch literal 7778 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 +\"qtube YouTube (& BBC iPlayer) download +

See Wiki page for a brief description of available options and +and Github Notes for Full reference notes +

+Youtube-dl has a config file at : /mod/etc/youtube-dl.conf + + +" +puts " + + +
Url: + + +
Process options + + +
+" +puts " +

+ + + + + +
+" +puts " +
+
+ +Analysing recording, please wait... +
+
+
+ Still working, please be patient... +
+" diff --git a/webif/plugin/qtube/menu.hook b/webif/plugin/qtube/menu.hook new file mode 100644 index 0000000..f036cfa --- /dev/null +++ b/webif/plugin/qtube/menu.hook @@ -0,0 +1,7 @@ + +menuitem \ + "Queue video download" \ + "/plugin/qtube/img/qtube.png" \ + "/go/qtube" + # "/plugin/qtube/index.jim" + diff --git a/webif/plugin/qtube/qtube.jim b/webif/plugin/qtube/qtube.jim new file mode 100755 index 0000000..a14f6ad --- /dev/null +++ b/webif/plugin/qtube/qtube.jim @@ -0,0 +1,346 @@ +proc ::chasedecrypt::delete_orphans {} { + if {![catch {exec /mod/bin/pgrep -x chaseget }]} {return} + set fl [glob -nocomplain "/mod/tmp/*-inp.ts" "/mod/tmp/*-dec.ts"] + log "orphan file list $fl" 2 + foreach file $fl { + if {![system inuse $file]} { + set bname [file rootname $file] + file delete -force $bname.hmt + file delete -force $bname.nts + file delete -force $file + log "Deleted orphan file $file" + } + } +} + +# Parse command options and apply defaults +proc ::chasedecrypt::checkopts {argv} { + + set ::optlist "" + set ::opt "-h" + set ::debug 0 + set parmerror 0 + + set settings [settings] + + set ::autologlevel [$settings _nval_setting "autolog"] + + # List of options with default values + set optarray { + delorig 0 + misrdsec 0 + delsec 210 } + + # Override default from settings DB + foreach {key defvalue} [array get optarray] { + set ::opts($key) [$settings _nval_setting "chasedecrypt_$key"] + if {$::opts($key)==0} {set ::opts($key) $defvalue} + } + + # Handle text setting for oher options + set otheropts [$settings _tval_setting "chasedecrypt_otheropts"] + + # Parse argument lists + foreach argl [list $otheropts $argv] { + #set ::optlist "" + log "arg list $argl" 2 + for {set ix 0} {$ix < [llength $argl]} {incr ix} { + set arg [lindex $argl $ix] + + #check if option in optarray list + if {[string range $arg 0 0] == "-"} { + set argx [string tolower [string range $arg 1 end]] + if {[dict exists $optarray $argx]} { + incr ix + set val [lindex $argl $ix] + set nval $val + if {$val eq "y"} {set nval 1} + if {$val eq "n"} {set nval 0} + if {![string is double -strict $nval]} { + log "Option $arg value ($val) is not y, n or numeric" 0 + incr ix -1 + set parmerror 1 + continue + } + lappend ::optlist $arg + lappend ::optlist $val + set ::opts($argx) $nval + #puts "found -$argx value $val" + continue + } + } + + # check other options + switch -- $arg { + + -debug - + -d { + set ::debug 1 + set ::loglevel 2 + set ::auto::loglevel 2 + lappend ::optlist $arg + } + + + default { + log "Unrecognized option: $arg" 0 + set parmerror 1 + continue + } + } + + } + } + if {$parmerror} { + log "Parameter errors found" + exit + } + +} + +proc ::chasedecrypt::chancheck {ts} { + # Check recording channel against inclusion list prior to queueing for analysis + set file [$ts get file] + set channel [$ts get channel_name] + + log " ChaseDecrypt: Checking $file ($channel) for inclusion" 0 + + set dir [file dirname $file] + #if {[file exists "$dir/.autonochasedecrypt"]} { + # log " ChaseDecrypt: No Ad-detection folder flag set $file" 0 + # return 0 + #} + + if {![$ts flag "ODEncrypted"]} { + log " ChaseDecrypt: Already decrypted $file" 0 + return 0 + } + + # ignore FlatView directory + set settings [settings] + set fvdir [$settings _tval_setting "fv_dir"] + + if {[file tail $dir] == $fvdir} { + log " ChaseDecrypt: Flat view directory, skipping $file" 0 + return 0 + } + + set decOK 0 + set opts "" + if {![file exists "$dir/.chasedecrypt"]} { + # open and read configuration file + set cf "/mod/etc/chasedecrypt.conf" + + if {![file exists $cf]} { + file copy /mod/webif/plugin/chasedecrypt/default.conf $cf + } + + if {![catch {set fp [open $cf r]}]} { + set clist [split [read $fp] "\n"] + } else { + set clist {} + } + + # Match channel against exclusion list + foreach chan $clist { + if {![string length $chan]} continue + log "Checking exclusion entry: $chan" 2 + if {[string match -nocase $chan $channel]} { + log "Matched inclusion entry $chan" 0 + set decOK 1 + break + } + } + } else { + # Read options from .chasedecrypt file + set decOK 1 + set ado_file "$dir/.chasedecrypt" + set hand [open $ado_file] + set opts [gets $hand] + close $hand + } + + ::chasedecrypt::checkopts $opts + + if {$decOK} { + ::chasedecrypt::chaserun $ts + } else { + log " ChaseDecrypt: $file not eligible for chase decryption" 0 + } +} + + +proc ::chasedecrypt::chaserun {ts} { + # run decryption against currently recording program using dlna helper + set file [$ts get file] + + log "==ChaseDecrypt Chase Run: $file $::optlist" 0 + set retcode "OK" + set retmsg "Unknown = check log" + set qtime 0 + set warning "" + set cropcmd " " + + # Check for and delete any oprhaned files + ::chasedecrypt::delete_orphans + + set statustok [system startop -multiple chasedecrypt $file] + set size [$ts size] + set numAdBreaks 0 + + # set each option from settings/overrides + foreach {key value} [array get ::opts] { + set $key $value + } + + set stime [$ts get start] + set etime [$ts get end] + set ctime [clock seconds] + + # Check file sharing enabled + if {[system param DMS_START_ON]} { + log "Content Sharing Enabled" 2 + } else { + puts "Content Sharing Disabled -cannot decrypt files" + log "Content Sharing Disabled" 0 + return {"FAILED" "Content Sharing Disabled"} + } + + set bname [file rootname [file tail $file]] + set iname "$bname-inp" + set tname "$bname-dec" + set bpath [file dirname $file] + set tpath $bpath + set ipath "/mod/tmp" + #set tpath "/mod/tmp" + set bfile "$file" + set ifile "$ipath/$iname.ts" + set tfile "$tpath/$tname.ts" + set status [$ts get status] + + # Open recording to lock against Auto and Flatten + set recording [open $file r] + if {($stime +$delsec) > $ctime} { + log "Waiting for recording $delsec seconds" 1 + sleep $($stime +$delsec- $ctime) + set ctime [clock seconds] + } + + if {![acquire_lock $file]} { + log "Cannot acquire exclusive lock $file, terminating." 0 + return {"DEFER" "Cannot acquire exclusive lock"} + } + + set start [clock milliseconds] + log "starting" 2 + + # Create links to input in tmp for retrieval + file delete -force "$ipath/$iname.ts" + catch {file link -hard "$ipath/$iname.ts" "[file normalize [file rootname $file].ts]"} + file delete -force "$ipath/$iname.nts" + catch {file link -hard "$ipath/$iname.nts" "[file normalize [file rootname $file].nts]"} + file delete -force "$ipath/$iname.hmt" + catch {file link -hard "$ipath/$iname.hmt" "[file normalize [file rootname $file].hmt]"} + set its [ts fetch $ifile] + + + # Use link for .nts so updates are visble + file delete -force "$tpath/$tname.nts" + catch {file link -hard "$tpath/$tname.nts" "[file normalize [file rootname $file].nts]"} + + # Copy sidecar files and update program title, encryption flag + file copy -force "[file rootname $file].hmt" "$tpath/$tname.hmt" + # Update output hmt to valid, decrypted, ad-detected empty file + set title [$ts get title] + set guidance [$ts get guidance] + exec hmt "-encrypted" "$tpath/$tname.hmt" + exec hmt "-protect" "$tpath/$tname.hmt" + exec hmt "+patch8=0x28c:2" "$tpath/$tname.hmt" + + set ftime [clock format $stime -format "%Y%m%d%H%M.%S"] + exec touch $tfile -t $ftime + set tts [ts fetch $tfile] + #set tfilesize [file size $tfile] ;# Restart point + set tfilesize 0 ;# Silence/nsplice cant handle restart midway so force total file retrieval + + set newtitle [concat $title "-Decrypt"] + exec hmt "+settitle=${newtitle}" "$tpath/$tname.hmt" + + exec /mod/bin/chaseget $ifile $tfilesize > $tfile + + # Delete links to input from /mod/tmp + $its delete + + # Check that complete file has been retrieved & detected + set ts [ts fetch $file] + set tfilesize [file size $tfile] + set filesize [file size $file] + set missing $($filesize -$tfilesize) + set lengtherr 0 + set stime [$ts get start] + set etime [$ts get end] + set durn $($etime-$stime) + set misstime $(round(abs($missing)/($filesize/$durn))) + + # Recopy hmt to get completion details + file copy -force "[file rootname $file].hmt" "$tpath/$tname.hmt" + # Update output hmt to valid, decrypted, nonprotected file + exec hmt "-encrypted" "$tpath/$tname.hmt" + exec hmt "-protect" "$tpath/$tname.hmt" + exec hmt "+settitle=${newtitle}" "$tpath/$tname.hmt" + + set newtitle $title + if {$missing != 0} { + # Length error in decryption + set lengtherr 1 + set warning "Incomplete data retrieval $missing bytes missing ([clock format $misstime -format %T])" + log "$file $warning" 0 + set newtitle "$title -Len err ([clock format $misstime -format %T])" + exec hmt "+settitle=$newtitle" "$tpath/$tname.hmt" + if {$misstime >= $misrdsec} { + # system notify "ChaseDecrypt $file $warning" + } else { + # ignore the problem + set lengtherr 0 + } + } + + if {$lengtherr == 0} { + # All OK (as far as we can tell) + close $recording + + if {$delorig && ![system inuse $file]} { # Delete original file no longer wanted + if {$delorig == 2} { + set del [$ts delete] + log "file $file deleted, code $del" 1 + } else { + set del [safe_delete $file chasedecrypt] + log "$file dustbinned, code $del" 2 + } + if {$del && ![system inuse $tfile]} { # Rename decrypt file to original if not in use + exec hmt "+settitle=$newtitle" "$tpath/$tname.hmt" + ts renamegroup "$tpath/$tname.ts" "$bname" + log "$tname renamed $bname" 1 + } + } else { # Keeping original, dont rename + } + } else { + # Somethings amiss with file length, keep original and delete -dec + if {![system inuse $tfile]} { + [safe_delete $tfile chasedecrypt] + log "$tfile dustbinned" 2 + } + close $recording + } + + #set elapsedSeconds [elapsed $start] + #set elapsedTime [clock format $(round($elapsedSeconds)) -format "%H:%M:%S"] + #log "done...processed $file in ${elapsedSeconds}s $elapsedTime " 0 + log "done...processed $file" 0 + + system endop $statustok + release_lock $file + log "=============================================================" 1 + return +} + diff --git a/webif/plugin/qtube/queue.hook b/webif/plugin/qtube/queue.hook new file mode 100644 index 0000000..6df719d --- /dev/null +++ b/webif/plugin/qtube/queue.hook @@ -0,0 +1,51 @@ + +#source /mod/webif/plugin/qtube/qtube.jim + +alias ::qtube::log ::auto::log +alias ::qtube::elapsed ::auto::elapsed +set ::logfd $::auto::logfd + +proc qlog {msg {level 1}} { + puts $::qlogfd "[\ + clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"\ + ] - $msg" + flush $::qlogfd +} + +proc ::qtube::dequeue {q url} { + + set retcode {"FAILED" "Unknown = check qtube.log"} + set opts [$q get args] + + set ::Qid [$q get id] + set logfile "/mod/tmp/qtube.log" + set ::qlogfd [open $logfile "a+"] + qlog "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" 0 + log "Starting queued download URL $url Options $opts QID $::Qid" 0 + qlog "Starting queued download URL $url Options $opts QID $::Qid" 0 + log "See $logfile for details" 0 + +# Fix to cmd invocation thanks to @/df +# https://hummy.tv/forum/threads/qtube-webif-front-end-for-youtube-dl.8948/page-7#post-139719 + set cmd {youtube --newline} + lappend cmd {*}$opts $url + if {[catch {exec {*}[lmap e $cmd {concat $e}] 2>@$::qlogfd \ + | awk {{print strftime("%d/%m/%Y %H:%M:%S -"), $0; fflush(); }} \ + >@$::qlogfd } msg catchopts] + } { + log "Caught error: $msg" 0 + log "$catchopts" 2 + qlog "Caught error: $msg" 0 + qlog "$catchopts" 2 + set retcode [list "FAILED" "$msg - check qtube.log"] + } else { + log "Completed queued download of $url Options $opts" 0 + qlog "Completed queued download of $url Options $opts" 0 + set retcode {"OK" "Check qtube.log"} + } + + close $::qlogfd + return $retcode +} + +::auto::register qtube 200 diff --git a/webif/plugin/qtube/queue.jim b/webif/plugin/qtube/queue.jim new file mode 100755 index 0000000..dce9529 --- /dev/null +++ b/webif/plugin/qtube/queue.jim @@ -0,0 +1,21 @@ +#!/mod/bin/jimsh + +# Queue url for backround download +package require cgi +source /mod/webif/lib/setup + +#roc log {msg {level 1}} { +# puts "[\ +# clock format [clock seconds] -format "%T"\ +# ] - $msg" +# flush stdout +# + +httpheader + +set url [cgi_get url -] +set queue_time [cgi_get queue_time 0] +set opts [cgi_get opts ''] +#puts "queuing $url $opts" +exec {*}qtube -start $queue_time {*}$opts $url >@stdout + diff --git a/webif/plugin/qtube/runnow.jim b/webif/plugin/qtube/runnow.jim new file mode 100755 index 0000000..9403251 --- /dev/null +++ b/webif/plugin/qtube/runnow.jim @@ -0,0 +1,48 @@ +#!/mod/bin/jimsh + +# Queue url for backround download +package require cgi +source /mod/webif/lib/setup + +proc log {msg {level 1}} { + puts "[\ + clock format [clock seconds] -format "%T"\ + ] - $msg" + flush stdout + + puts $::qlogfd "[\ + clock format [clock seconds] -format "%T"\ + ] - $msg" + flush $::qlogfd +} + +httpheader + +set logfile "/mod/tmp/qtube.log" +set ::qlogfd [open $logfile "a+"] +set url [cgi_get url "http://example.com"] +set opts [cgi_get opts ""] +set sess [clock format [clock seconds] -format "qtube%H%M"] + +log "--------------------------------------------------------------" +log "Starting immediate download of $url Options $opts" +log "Be VERY patient - it can take a couple of minutes for download to start!" +# Fix to cmd invocation thanks to @/df +# https://hummy.tv/forum/threads/qtube-webif-front-end-for-youtube-dl.8948/page-7#post-139719 + #set cmd [list "abduco" "-n" $sess "youtube" "--newline"] + set cmd [list "youtube" "--newline"] + lappend cmd {*}$opts $url + log $cmd + log "{*}[lmap e $cmd {concat $e}]" + if {[catch {exec {*}[lmap e $cmd {concat $e}] \ + | awk {{print strftime("%H:%M:%S -"), $0; fflush(); }} \ + | tee -i -a $logfile \ + >@stdout 2>@1} msg catchopts] + } { + log "Caught error: $msg" + #log "$catchopts" +} else { + log "Completed immediate download of $url Options $opts" +} + +close $::qlogfd diff --git a/webif/plugin/qtube/save.jim b/webif/plugin/qtube/save.jim new file mode 100755 index 0000000..1947526 --- /dev/null +++ b/webif/plugin/qtube/save.jim @@ -0,0 +1,18 @@ +#!/mod/bin/jimsh + +package require cgi +source /mod/webif/lib/setup +require settings.class + +httpheader + + +set delorig [cgi_get chasedecrypt_delorig 0] +set otheropts [cgi_get chasedecrypt_otheropts ""] + +[settings new] _nval_setting "chasedecrypt_delorig" $delorig + +[settings new] _tval_setting "chasedecrypt_otheropts" $otheropts + +puts "Settings saved." + diff --git a/webif/plugin/qtube/script.js b/webif/plugin/qtube/script.js new file mode 100644 index 0000000..0b4826f --- /dev/null +++ b/webif/plugin/qtube/script.js @@ -0,0 +1,101 @@ +var curval = 0; + +$(function() { + + + $('#back').button({ + icons : { + primary : "ui-icon-arrowreturnthick-1-w" + } + }).on('click', function() { + window,history.back(); + }); + + function loaddata(data, isfinal) { + if (isfinal) + $('#results_inner').text(data); + else + $('#results_inner').append(data); + } + + $('#run').button({ + icons : { + primary : "ui-icon-play" + } + }).on('click', function() { + $('#results').removeClass('hidden').show(); + $('.running').slideDown('slow'); + $('#results_inner').empty(); + + $.ajax({ + type : "GET", + url : 'runnow.jim', + data : { + 'url' : $('#url').val() , + 'opts' : $('#opts').val() + }, + progress : loaddata, + progressInterval : 5000, + timeout : 86400000, + success : function(data) { + $('.running').slideUp('slow'); + loaddata(data, true); + loaddata('\n\n=== Done ==='); + }, + error : function(_, _, e) { + if (window.console) + console.log("ajax error"); + $('.running').slideUp('slow'); + alert(e); + } + }); + + }); + + $('#queue').button({ + icons : { + primary : "ui-icon-play" + } + }).on('click', function() { + $('#results').removeClass('hidden').show(); + $('.running').slideDown('slow'); + $('#results_inner').empty(); + + $.ajax({ + type : "GET", + url : 'queue.jim', + data : { + 'url' : $('#url').val() , + 'queue_time': $('#queue_time').val(), + 'opts' : $('#opts').val() + }, + progress : loaddata, + progressInterval : 1000, + timeout : 50000, + success : function(data) { + $('.running').slideUp('slow'); + loaddata(data, true); + loaddata('\n\n=== Check qtube.log later to see download progress ==='); + }, + error : function(_, _, e) { + if (window.console) + console.log("ajax error"); + $('.running').slideUp('slow'); + alert(e); + } + }); + + }); + + + $('#viewqueue').button().click(function() { + window.location = '/diag/queue/'; + }); + + $('#viewlog').button().click(function() { + window.location = '/log/?log=/mod/tmp/qtube.log'; + }); + + + +}); diff --git a/webif/plugin/qtube/settings.js b/webif/plugin/qtube/settings.js new file mode 100644 index 0000000..47e2de9 --- /dev/null +++ b/webif/plugin/qtube/settings.js @@ -0,0 +1,38 @@ +$(function() { + +// cloned from channeldel package - mymsman 150331 + +$('#back').button({ + icons : { + primary : "ui-icon-arrowreturnthick-1-w" + } + }).on('click', function() { + window.location = '/settings/settings.jim' + }); + + +$('.move').button().click(function(e) { + e.preventDefault(); + + $('#chanlist' + ' option:selected').each(function() { + var box = $('#exclist'); + box.val(box.val() + $.trim($(this).val()) + '\n'); + $(this).remove(); + }); +}); + +$('#excsave').ajaxForm({ + target: '#saveresults', + success: function() { + $('#saveresults') + .css('font-style', 'italic') + .show('slow') + .delay(2000) + .fadeOut('slow'); + } +}); + +$('#save').button(); + + +}); diff --git a/webif/plugin/qtube/status.hook b/webif/plugin/qtube/status.hook new file mode 100644 index 0000000..ffaf997 --- /dev/null +++ b/webif/plugin/qtube/status.hook @@ -0,0 +1,7 @@ +register_statusop chasedecrypt "Chase Decrypting-" "/plugin/chasedecrypt/img/chasedecrypt.png" +#Based on +# Icon by Ivan Boyko https://www.iconfinder.com/icons/310307/running_sport_icon +# Creative Commons (Attribution 3.0 Unported) https://creativecommons.org/licenses/by/3.0/ + + + diff --git a/webif/plugin/qtube/style.css b/webif/plugin/qtube/style.css new file mode 100644 index 0000000..c006807 --- /dev/null +++ b/webif/plugin/qtube/style.css @@ -0,0 +1,27 @@ + + +#buttons +{ + margin-top: 5px; +} + + +#results +{ + margin-top: 1em; +} + +#results_inner +{ + margin-top: 1em; + overflow: auto; + white-space: pre; +} + +img.qb +{ + height: 14px; + position: relative; + top: 3px; +} + diff --git a/webif/plugin/qtube/timelist.jim b/webif/plugin/qtube/timelist.jim new file mode 100755 index 0000000..db4ef63 --- /dev/null +++ b/webif/plugin/qtube/timelist.jim @@ -0,0 +1,19 @@ +# Build HTML timeselector option list +proc timelist {sel} { + + puts -nonewline "" + + for {set t 0} {$t <1440} {incr t 30} { + # (mis)use the the fact of 60 sec per min 60 min per hour to format hh:mm, t is min per period + set ft [clock format $t -format %M:%S] + puts -nonewline "" + } +} diff --git a/webif/plugin/qtube/toolbar.hook b/webif/plugin/qtube/toolbar.hook new file mode 100644 index 0000000..1754182 --- /dev/null +++ b/webif/plugin/qtube/toolbar.hook @@ -0,0 +1,3 @@ + +tb "/plugin/qtube/img/qtube.png" "Q Download" "/go/qtube" +