Add feature to do bulk downloads, bump version
This commit is contained in:
parent
e699c7ea5d
commit
5d57803799
@ -2,6 +2,10 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [v1.1.0] - 2023-11-25
|
||||
|
||||
- Add feature to bulk add URL's for downloading
|
||||
|
||||
## [v1.0.1] - 2023-11-24
|
||||
|
||||
- Fix crash on migrating a config that had > 1 destinations
|
||||
|
2
main.go
2
main.go
@ -15,7 +15,7 @@ import (
|
||||
|
||||
func main() {
|
||||
versionInfo := &version.Manager{
|
||||
VersionInfo: version.Info{CurrentVersion: "v1.0.1"},
|
||||
VersionInfo: version.Info{CurrentVersion: "v1.1.0"},
|
||||
}
|
||||
log.Printf("Starting gropple %s - https://github.com/tardisx/gropple", versionInfo.GetInfo().CurrentVersion)
|
||||
|
||||
|
91
web/data/templates/bulk.tmpl
Normal file
91
web/data/templates/bulk.tmpl
Normal file
@ -0,0 +1,91 @@
|
||||
{{ define "content" }}
|
||||
|
||||
{{ template "menu.tmpl" . }}
|
||||
|
||||
<div id="layout" class="pure-g pure-u-1" x-data="bulk_create()" >
|
||||
|
||||
<h1>Bulk upload</h1>
|
||||
|
||||
<p class="error" x-show="error_message" x-transition.duration.500ms x-text="error_message"></p>
|
||||
<p class="success" x-show="success_message" x-transition.duration.500ms x-text="success_message"></p>
|
||||
|
||||
<p>Paste URLs here, one per line:</p>
|
||||
|
||||
<textarea x-model="urls" rows="20" cols="80">
|
||||
</textarea>
|
||||
|
||||
<br><br>
|
||||
|
||||
<table class="pure-table" >
|
||||
<tr>
|
||||
<th>profile</th>
|
||||
<td>
|
||||
<select class="pure-input-1-2" x-model="profile_chosen">
|
||||
<option value="">choose a profile</option>
|
||||
{{ range $i := .config.DownloadProfiles }}
|
||||
<option name="{{$i.Name}}">{{ $i.Name }}</option>
|
||||
{{ end }}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>download option</th>
|
||||
<td>
|
||||
<select class="pure-input-1-2" x-model="download_option_chosen">
|
||||
<option value="">no option</option>
|
||||
{{ range $i := .config.DownloadOptions }}
|
||||
<option name="{{$i.Name}}">{{ $i.Name }}</option>
|
||||
{{ end }}
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th> </th>
|
||||
<td>
|
||||
<button class="button-small pure-button" @click="start()">add to queue</button>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
{{ end }}
|
||||
|
||||
{{ define "js" }}
|
||||
<script>
|
||||
function bulk_create() {
|
||||
return {
|
||||
profile_chosen: "",
|
||||
download_option_chosen: "",
|
||||
urls: "",
|
||||
error_message: "",
|
||||
success_message: "",
|
||||
start() {
|
||||
let op = {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({action: 'start', urls: this.urls, profile: this.profile_chosen, download_option: this.download_option_chosen}),
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
};
|
||||
fetch('/bulk', op)
|
||||
.then(response => response.json())
|
||||
.then(response => {
|
||||
console.log(response)
|
||||
if (response.error) {
|
||||
this.error_message = response.error;
|
||||
this.success_message = '';
|
||||
document.body.scrollTop = document.documentElement.scrollTop = 0;
|
||||
} else {
|
||||
this.error_message = '';
|
||||
this.success_message = response.message;
|
||||
this.urls = '';
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{{ end }}
|
@ -7,9 +7,11 @@
|
||||
<li class="pure-menu-item">
|
||||
<a href="/config" class="pure-menu-link">Config</a>
|
||||
</li>
|
||||
<li class="pure-menu-item">
|
||||
<a href="/bulk" class="pure-menu-link">Bulk</a>
|
||||
</li>
|
||||
<li class="pure-menu-item">
|
||||
<a href="https://github.com/tardisx/gropple" class="pure-menu-link">Github</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -13,7 +13,7 @@
|
||||
<select class="pure-input-1-2" x-model="profile_chosen">
|
||||
<option value="">choose a profile</option>
|
||||
{{ range $i := .config.DownloadProfiles }}
|
||||
<option>{{ $i.Name }}</option>
|
||||
<option name="{{$i.Name}}">{{ $i.Name }}</option>
|
||||
{{ end }}
|
||||
</select>
|
||||
</td>
|
||||
@ -24,7 +24,7 @@
|
||||
<select class="pure-input-1-2" x-model="download_option_chosen">
|
||||
<option value="">no option</option>
|
||||
{{ range $i := .config.DownloadOptions }}
|
||||
<option>{{ $i.Name }}</option>
|
||||
<option name="{{$i.Name}}">{{ $i.Name }}</option>
|
||||
{{ end }}
|
||||
</select>
|
||||
</td>
|
||||
|
92
web/web.go
92
web/web.go
@ -55,6 +55,9 @@ func CreateRoutes(cs *config.ConfigService, dm *download.Manager, vm *version.Ma
|
||||
r.HandleFunc("/fetch", fetchHandler(cs, vm, dm))
|
||||
r.HandleFunc("/fetch/{id}", fetchHandler(cs, vm, dm))
|
||||
|
||||
// handle the bulk uploader
|
||||
r.HandleFunc("/bulk", bulkHandler(cs, vm, dm))
|
||||
|
||||
// get/update info on a download
|
||||
r.HandleFunc("/rest/fetch/{id}", fetchInfoOneRESTHandler(cs, dm))
|
||||
|
||||
@ -399,3 +402,92 @@ func fetchHandler(cs *config.ConfigService, vm *version.Manager, dm *download.Ma
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
func bulkHandler(cs *config.ConfigService, vm *version.Manager, dm *download.Manager) func(w http.ResponseWriter, r *http.Request) {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
log.Printf("bulkHandler")
|
||||
|
||||
method := r.Method
|
||||
if method == "GET" {
|
||||
|
||||
t, err := template.ParseFS(webFS, "data/templates/layout.tmpl", "data/templates/menu.tmpl", "data/templates/bulk.tmpl")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
templateData := map[string]interface{}{"config": cs.Config, "Version": vm.GetInfo()}
|
||||
|
||||
err = t.ExecuteTemplate(w, "layout", templateData)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
return
|
||||
|
||||
} else if method == "POST" {
|
||||
type reqBulkType struct {
|
||||
URLs string `json:"urls"`
|
||||
ProfileChosen string `json:"profile"`
|
||||
DownloadOptionChosen string `json:"download_option"`
|
||||
}
|
||||
|
||||
req := reqBulkType{}
|
||||
json.NewDecoder(r.Body).Decode(&req)
|
||||
|
||||
log.Printf("bulk POST request: %#v", req)
|
||||
|
||||
if req.URLs == "" {
|
||||
w.WriteHeader(400)
|
||||
json.NewEncoder(w).Encode(errorResponse{
|
||||
Success: false,
|
||||
Error: "No URLs supplied",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if req.ProfileChosen == "" {
|
||||
|
||||
w.WriteHeader(400)
|
||||
json.NewEncoder(w).Encode(errorResponse{
|
||||
Success: false,
|
||||
Error: "you must choose a profile",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
profile := cs.Config.ProfileCalled(req.ProfileChosen)
|
||||
if profile == nil {
|
||||
w.WriteHeader(400)
|
||||
json.NewEncoder(w).Encode(errorResponse{
|
||||
Success: false,
|
||||
Error: fmt.Sprintf("no such profile: '%s'", req.ProfileChosen),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
option := cs.Config.DownloadOptionCalled(req.DownloadOptionChosen)
|
||||
|
||||
// create the new downloads
|
||||
urls := strings.Split(req.URLs, "\n")
|
||||
count := 0
|
||||
for _, thisURL := range urls {
|
||||
thisURL = strings.TrimSpace(thisURL)
|
||||
if thisURL != "" {
|
||||
newDL := download.NewDownload(thisURL, cs.Config)
|
||||
newDL.DownloadOption = option
|
||||
newDL.DownloadProfile = *profile
|
||||
dm.AddDownload(newDL)
|
||||
dm.Queue(newDL)
|
||||
log.Printf("queued %s", thisURL)
|
||||
count++
|
||||
}
|
||||
}
|
||||
|
||||
w.WriteHeader(200)
|
||||
json.NewEncoder(w).Encode(successResponse{
|
||||
Success: true,
|
||||
Message: fmt.Sprintf("queued %d downloads", count),
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user