5 Commits

6 changed files with 104 additions and 4 deletions

View File

@@ -4,6 +4,11 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
## [v0.5.1] - 2021-10-25
- Add note about adblockers potentially blocking the popup
- Make it possible to refresh the popup window without initating a new download
## [v0.5.0] - 2021-10-01
- No more command line options, all configuration is now app-managed

View File

@@ -119,7 +119,7 @@ func (dl *Download) updateDownload(r io.Reader) {
func (dl *Download) updateMetadata(s string) {
// [download] 49.7% of ~15.72MiB at 5.83MiB/s ETA 00:07
etaRE := regexp.MustCompile(`download.+ETA +(\d\d:\d\d)`)
etaRE := regexp.MustCompile(`download.+ETA +(\d\d:\d\d(?::\d\d)?)$`)
matches := etaRE.FindStringSubmatch(s)
if len(matches) == 2 {
dl.Eta = matches[1]

62
download/download_test.go Normal file
View File

@@ -0,0 +1,62 @@
package download
import "testing"
func TestUpdateMetadata(t *testing.T) {
newD := Download{}
// first time we spot a filename
newD.updateMetadata("[download] Destination: Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f401.mp4")
if len(newD.Files) != 1 || newD.Files[0] != "Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f401.mp4" {
t.Fatalf("incorrect Files:%v", newD.Files)
}
// eta's might be xx:xx:xx or xx:xx
newD.updateMetadata("[download] 0.0% of 504.09MiB at 135.71KiB/s ETA 01:03:36")
if newD.Eta != "01:03:36" {
t.Fatalf("bad long eta in dl\n%v", newD)
}
newD.updateMetadata("[download] 0.0% of 504.09MiB at 397.98KiB/s ETA 21:38")
if newD.Eta != "21:38" {
t.Fatalf("bad short eta in dl\n%v", newD)
}
// added a new file, now we are tracking two
newD.updateMetadata("[download] Destination: Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f140.m4a")
if len(newD.Files) != 2 || newD.Files[1] != "Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f140.m4a" {
t.Fatalf("incorrect Files:%v", newD.Files)
}
// merging
newD.updateMetadata("[ffmpeg] Merging formats into \"Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.mp4\"")
if len(newD.Files) != 3 || newD.Files[2] != "Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.mp4" {
t.Fatalf("did not find merged filename")
t.Fatalf("%v", newD.Files)
}
// deletes
// TODO. Not sure why I don't always see the "Deleting original file" messages after merge -
// maybe a youtube-dl fork thing?
}
// [youtube] wi7Agv1M6PY: Downloading webpage
// [info] Writing video description metadata as JSON to: Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.info.json
// [download] Destination: Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f401.mp4
// [download] 0.0% of 504.09MiB at 135.71KiB/s ETA 01:03:36
// [download] 0.0% of 504.09MiB at 397.98KiB/s ETA 21:38
// [download] 0.0% of 504.09MiB at 918.97KiB/s ETA 09:22
// [download] 0.0% of 504.09MiB at 1.90MiB/s ETA 04:25
// ..
// [download] 99.6% of 504.09MiB at 8.91MiB/s ETA 00:00
// [download] 100.0% of 504.09MiB at 9.54MiB/s ETA 00:00
// [download] 100% of 504.09MiB in 01:00
// [download] Destination: Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.f140.m4a
// [download] 0.0% of 4.64MiB at 155.26KiB/s ETA 00:30
// [download] 0.1% of 4.64MiB at 457.64KiB/s ETA 00:10
// [download] 0.1% of 4.64MiB at 1.03MiB/s ETA 00:04
// ..
// [download] 86.2% of 4.64MiB at 10.09MiB/s ETA 00:00
// [download] 100.0% of 4.64MiB at 10.12MiB/s ETA 00:00
// [download] 100% of 4.64MiB in 00:00
// [ffmpeg] Merging formats into "Halo Infinite Flight 4K Gameplay-wi7Agv1M6PY.mp4"

29
main.go
View File

@@ -23,7 +23,7 @@ var downloads []*download.Download
var downloadId = 0
var conf *config.Config
var versionInfo = version.Info{CurrentVersion: "v0.5.0"}
var versionInfo = version.Info{CurrentVersion: "v0.5.1"}
//go:embed web
var webFS embed.FS
@@ -55,6 +55,7 @@ func main() {
r.HandleFunc("/", homeHandler)
r.HandleFunc("/config", configHandler)
r.HandleFunc("/fetch", fetchHandler)
r.HandleFunc("/fetch/{id}", fetchHandler)
// info for the list
r.HandleFunc("/rest/fetch", fetchInfoRESTHandler)
@@ -241,6 +242,32 @@ func fetchInfoRESTHandler(w http.ResponseWriter, r *http.Request) {
func fetchHandler(w http.ResponseWriter, r *http.Request) {
// if they refreshed the popup, just load the existing object, don't
// create a new one
vars := mux.Vars(r)
idString := vars["id"]
idInt, err := strconv.ParseInt(idString, 10, 32)
if err == nil && idInt > 0 {
for _, dl := range downloads {
if dl.Id == int(idInt) {
t, err := template.ParseFS(webFS, "web/layout.tmpl", "web/popup.html")
if err != nil {
panic(err)
}
templateData := map[string]interface{}{"dl": dl, "config": conf}
err = t.ExecuteTemplate(w, "layout", templateData)
if err != nil {
panic(err)
}
return
}
}
}
query := r.URL.Query()
url, present := query["url"]

View File

@@ -17,6 +17,9 @@
Drag this bookmarklet: <a href="{{ .BookmarkletURL }}">Gropple</a> to your bookmark bar, and click it
on any page you want to grab the video from.
</p>
<p>
Please note that some adblockers may prevent the bookmarklet from opening the popup window.
</p>
</div>
<table class="pure-table">
@@ -78,4 +81,4 @@
}
}
</script>
{{ end }}
{{ end }}

View File

@@ -30,11 +30,11 @@
{{ define "js" }}
<script>
function popup() {
history.replaceState(null, '', ['/fetch/{{ .dl.Id }}'])
return {
eta: '', percent: 0.0, state: '??', filename: '', finished: false, log :'',
profile_chosen: null,
watch_profile() {
console.log('will wtch profile');
this.$watch('profile_chosen', value => this.profile_chosen(value))
},
update_profile(name) {
@@ -57,6 +57,9 @@
this.eta = info.eta;
this.percent = info.percent + "%";
this.state = info.state;
if (this.state != 'choose profile') {
this.profile_chosen = true;
}
this.finished = info.finished;
if (info.files && info.files.length > 0) {
this.filename = info.files[info.files.length - 1];