This commit is contained in:
Justin Hawkins 2021-09-24 20:00:08 +09:30
commit ce49bd5177
2 changed files with 73 additions and 13 deletions

View File

@ -8,7 +8,7 @@ A web service and bookmarklet to download videos with a single click.
* a passing familiarity with the command line * a passing familiarity with the command line
* youtube-dl (plus any of its required dependencies, like ffmpeg) * youtube-dl (plus any of its required dependencies, like ffmpeg)
* golang compiler * golang compiler (if you'd like to build from source)
## Build ## Build
@ -25,20 +25,55 @@ Binaries are available at https://github.com/tardisx/gropple/releases
With no arguments, it will listen on port 6283 and use an address of 'http://localhost:6283'. With no arguments, it will listen on port 6283 and use an address of 'http://localhost:6283'.
The address must be specified so that the bookmarklet can refer to the correct The address must be specified so that the bookmarklet can refer to the correct
host when it is not running on your local machine. You may also need to specify host if it is not running on your local machine. You may also need to specify
a different address if you are running it behind a proxy server or similar. a different address if you are running it behind a proxy server or similar.
## Using ## Using
Bring up `http://localhost:6283` (or your chosen address) in your browser. You should see a link to the bookmarklet at the top of the screen, and the list of downloads (currently empty). Bring up `http://localhost:6283` (or your chosen address) in your browser. You
should see a link to the bookmarklet at the top of the screen, and the list of
downloads (currently empty).
Drag the bookmarklet to your favourites bar, or otherwise bookmark it as you see fit. Drag the bookmarklet to your favourites bar, or otherwise bookmark it as you
see fit.
Whenever you are on a page with a video you would like to download, simply click the bookmarklet. Whenever you are on a page with a video you would like to download, simply
click the bookmarklet.
A popup window will appear, the download will start on the your gropple server and the status will be shown in the window. A popup window will appear, the download will start on the your gropple server
and the status will be shown in the window.
You may close this window at any time without stopping the download, the status of all downloads is available on the index page. You may close this window at any time without stopping the download, the status
of all downloads is available on the index page.
## Using an alternative downloader
The default downloader is youtube-dl. It is possible to use a different downloader
via the `-dl-cmd` command line option.
While `gropple` will use your `PATH` to find the executable, you may also want
to specify a full path instead.o
So, for instance, to use `youtube-dlc` instead of `youtube-dl` and specify the
full path:
`gropple -dl-cmd /home/username/bin/youtube-dlc`
Note that this is only the path to the executable. If you need to change the
command arguments, see below.
## Changing the youtube-dl arguments
The default arguments passed to `youtube-dl` are:
* `--newline` (needed to allow gropple to properly parse the output)
* `--write-info-json` (optional, but provides information on the download in the corresponding .json file)
* `-f` and `bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best` (choose the type of video `youtube-dl` will download)
These are customisable on the command line for `gropple`. For example, to duplicate these default options, you would
do:
`gropple -dl-args '--newline' -dl-args '--write-info-json' -dl-args '-f' -dl-args 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best`
## TODO ## TODO

37
main.go
View File

@ -39,18 +39,45 @@ var downloadPath = "./"
var address string var address string
var dlCmd = "youtube-dl"
type args []string
var dlArgs = args{}
var defaultArgs = args{
"--write-info-json",
"-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"--newline",
}
const currentVersion = "v0.02" const currentVersion = "v0.02"
//go:embed web //go:embed web
var webFS embed.FS var webFS embed.FS
func (i *args) Set(value string) error {
*i = append(*i, strings.TrimSpace(value))
return nil
}
func (i *args) String() string {
return strings.Join(*i, ",")
}
func main() { func main() {
var port int var port int
flag.IntVar(&port, "port", 6283, "port to listen on") flag.IntVar(&port, "port", 6283, "port to listen on")
flag.StringVar(&address, "address", "http://localhost:6283", "address for the service") flag.StringVar(&address, "address", "http://localhost:6283", "address for the service")
flag.StringVar(&downloadPath, "path", "", "path for downloaded files - defaults to current directory") flag.StringVar(&downloadPath, "path", "", "path for downloaded files - defaults to current directory")
flag.StringVar(&dlCmd, "dl-cmd", "youtube-dl", "downloader to use")
flag.Var(&dlArgs, "dl-args", "arguments to the downloader")
flag.Parse() flag.Parse()
if len(dlArgs) == 0 {
dlArgs = defaultArgs
}
r := mux.NewRouter() r := mux.NewRouter()
r.HandleFunc("/", HomeHandler) r.HandleFunc("/", HomeHandler)
r.HandleFunc("/fetch", FetchHandler) r.HandleFunc("/fetch", FetchHandler)
@ -164,13 +191,11 @@ func FetchHandler(w http.ResponseWriter, r *http.Request) {
} }
func queue(dl *download) { func queue(dl *download) {
cmdSlice := []string{}
cmdSlice = append(cmdSlice, dlArgs...)
cmdSlice = append(cmdSlice, dl.Url)
cmd := exec.Command( cmd := exec.Command(dlCmd, cmdSlice...)
"youtube-dl",
"--write-info-json",
"-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best",
"--newline", dl.Url,
)
cmd.Dir = downloadPath cmd.Dir = downloadPath
stdout, err := cmd.StdoutPipe() stdout, err := cmd.StdoutPipe()