diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..eb4bfe6 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "gomod" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/build_release.pl b/build_release.pl index 6812b6b..d93f764 100755 --- a/build_release.pl +++ b/build_release.pl @@ -7,7 +7,8 @@ open my $fh, "<", "main.go" || die $!; my $version; while (<$fh>) { - $version = $1 if /^const\s+currentVersion.*?"(v[\d\.]+)"/; + # CurrentVersion: "v0.04" + $version = $1 if /CurrentVersion:\s*"(v[\d\.]+)"/; } close $fh; diff --git a/go.mod b/go.mod index 21cef81..61627a6 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/tardisx/gropple go 1.16 -require github.com/gorilla/mux v1.8.0 +require ( + github.com/gorilla/mux v1.8.0 + golang.org/x/mod v0.5.1 +) diff --git a/go.sum b/go.sum index 5350288..78fad6d 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,15 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/main.go b/main.go index 8468dca..c538e31 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ import ( "strconv" "github.com/gorilla/mux" + "github.com/tardisx/gropple/version" ) type download struct { @@ -50,7 +51,7 @@ var defaultArgs = args{ "--newline", } -const currentVersion = "v0.03" +var versionInfo = version.Info{CurrentVersion: "v0.4.0"} //go:embed web var webFS embed.FS @@ -81,7 +82,9 @@ func main() { r := mux.NewRouter() r.HandleFunc("/", HomeHandler) r.HandleFunc("/fetch", FetchHandler) - r.HandleFunc("/fetch/info/{id}", FetchInfoHandler) + r.HandleFunc("/fetch/info", FetchInfoHandler) + r.HandleFunc("/fetch/info/{id}", FetchInfoOneHandler) + r.HandleFunc("/version", VersionHandler) http.Handle("/", r) @@ -93,10 +96,26 @@ func main() { ReadTimeout: 5 * time.Second, } - log.Printf("starting gropple %s - https://github.com/tardisx/gropple", currentVersion) + // check for a new version every 4 hours + go func() { + for { + versionInfo.UpdateGitHubVersion() + time.Sleep(time.Hour * 4) + } + }() + + log.Printf("starting gropple %s - https://github.com/tardisx/gropple", versionInfo.CurrentVersion) log.Printf("go to %s for details on installing the bookmarklet and to check status", address) log.Fatal(srv.ListenAndServe()) +} +func VersionHandler(w http.ResponseWriter, r *http.Request) { + if versionInfo.GithubVersionFetched { + b, _ := json.Marshal(versionInfo) + w.Write(b) + } else { + w.WriteHeader(400) + } } func HomeHandler(w http.ResponseWriter, r *http.Request) { @@ -126,7 +145,7 @@ func HomeHandler(w http.ResponseWriter, r *http.Request) { } -func FetchInfoHandler(w http.ResponseWriter, r *http.Request) { +func FetchInfoOneHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) idString := vars["id"] if idString != "" { @@ -148,15 +167,29 @@ func FetchInfoHandler(w http.ResponseWriter, r *http.Request) { } } +func FetchInfoHandler(w http.ResponseWriter, r *http.Request) { + b, _ := json.Marshal(downloads) + w.Write(b) +} + func FetchHandler(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() - url, present := query["url"] //filters=["color", "price", "brand"] + url, present := query["url"] if !present { - fmt.Fprint(w, "something") + w.WriteHeader(400) + fmt.Fprint(w, "No url supplied") + return } else { + // check the URL for a sudden but inevitable betrayal + if strings.Contains(url[0], address) { + w.WriteHeader(400) + fmt.Fprint(w, "you musn't gropple your gropple :-)") + return + } + // create the record // XXX should be atomic! downloadId++ @@ -177,6 +210,7 @@ func FetchHandler(w http.ResponseWriter, r *http.Request) { go func() { queue(&newDownload) }() + t, err := template.ParseFS(webFS, "web/layout.tmpl", "web/popup.html") if err != nil { panic(err) @@ -185,8 +219,6 @@ func FetchHandler(w http.ResponseWriter, r *http.Request) { if err != nil { panic(err) } - - // fmt.Fprintf(w, "Started DL %d!", downloadId) } } @@ -309,7 +341,7 @@ func updateMetadata(dl *download, s string) { // This means a file has been "created" by merging others // [ffmpeg] Merging formats into "Toto - Africa (Official HD Video)-FTQbiNvZqaY.mp4" - mergedFilename := regexp.MustCompile(`Merging formats into "(.+)$`) + mergedFilename := regexp.MustCompile(`Merging formats into "(.+)"$`) matches = mergedFilename.FindStringSubmatch(s) if len(matches) == 2 { dl.Files = append(dl.Files, matches[1]) diff --git a/version/version.go b/version/version.go new file mode 100644 index 0000000..f2c5dd5 --- /dev/null +++ b/version/version.go @@ -0,0 +1,79 @@ +// Package version deals with versioning of the software +package version + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "log" + "net/http" + + "golang.org/x/mod/semver" +) + +type Info struct { + CurrentVersion string `json:"current_version"` + GithubVersion string `json:"github_version"` + UpgradeAvailable bool `json:"upgrade_available"` + GithubVersionFetched bool `json:"-"` +} + +func (i *Info) UpdateGitHubVersion() error { + i.GithubVersionFetched = false + versionUrl := "https://api.github.com/repos/tardisx/gropple/releases" + resp, err := http.Get(versionUrl) + if err != nil { + log.Fatal("Error getting response. ", err) + } + defer resp.Body.Close() + + b, err := io.ReadAll(resp.Body) + if err != nil { + return fmt.Errorf("failed to read body: %v", err) + } + + type release struct { + HTMLUrl string `json:"html_url"` + TagName string `json:"tag_name"` + Name string `json:"name"` + } + + var releases []release + + err = json.Unmarshal(b, &releases) + if err != nil { + return fmt.Errorf("failed to read unmarshal: %v", err) + } + if len(releases) == 0 { + log.Printf("found no releases on github?") + return errors.New("no releases found") + } + + i.GithubVersion = releases[0].Name + + i.GithubVersionFetched = true + i.UpgradeAvailable = i.canUpgrade() + return nil +} + +func (i *Info) canUpgrade() bool { + if !i.GithubVersionFetched { + return false + } + + log.Printf("We are %s, github is %s", i.CurrentVersion, i.GithubVersion) + + if !semver.IsValid(i.CurrentVersion) { + log.Fatalf("current version %s is invalid", i.CurrentVersion) + } + + if !semver.IsValid(i.GithubVersion) { + log.Fatalf("github version %s is invalid", i.GithubVersion) + } + + if semver.Compare(i.CurrentVersion, i.GithubVersion) == -1 { + return true + } + return false +} diff --git a/web/index.html b/web/index.html index 2b88232..2aa693f 100644 --- a/web/index.html +++ b/web/index.html @@ -1,12 +1,24 @@ {{ define "content" }} -
-

- Drag this bookmarklet: Gropple to your bookmark bar, and click it - on any page you want to grab the video from. -

-
-
+ +
+ +

gropple

+ +

+ Upgrade is available - + you have + and + + is available.

+ +
+

+ Drag this bookmarklet: Gropple to your bookmark bar, and click it + on any page you want to grab the video from. +

+
+ @@ -14,16 +26,21 @@ + + + {{ range $k, $v := .Downloads }} - - - - - - - - - {{ end }}
{{ $v.Id }}{{ range $_, $f := $v.Files }}{{ $f }}
{{ end }}
link{{ $v.State }}{{ $v.Percent }}{{ $v.Eta }}{{ $v.Finished }}
@@ -31,4 +48,34 @@ {{ end }} {{ define "js" }} + {{ end }} \ No newline at end of file diff --git a/web/layout.tmpl b/web/layout.tmpl index 7262813..b3a6678 100644 --- a/web/layout.tmpl +++ b/web/layout.tmpl @@ -13,10 +13,17 @@ height: 100px; overflow:auto; } + footer { + padding-top: 50px; + font-size: 30%; + } {{ template "content" . }} + {{ template "js" . }}