Skip to content

Commit face0ca

Browse files
committed
Mark directory as downloaded if all files in it have been downloaded
Add retry duration flag and update README
1 parent 5bef0d7 commit face0ca

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ mego [-l SPEED] [-s] MEGA_LINK... LIST_PATH...
2929
3030
-l uint speed limit passed to megadl as --limit-speed
3131
-s silent mode. do not pipe megadl's stdout nor stderr
32+
-r interval between two retries
3233
```
3334

3435
NB: The whole content of a *list file* is read and kept in memory. Every time a file is downloaded, the content of the *list file* will be overwritten. So please do not use a *list file* as a queue during execution.

main.go

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package main
22

33
import (
4+
"bytes"
45
"flag"
56
"fmt"
7+
"io"
68
"io/ioutil"
79
"log"
810
"os"
@@ -17,9 +19,11 @@ const (
1719
)
1820

1921
var (
20-
speedFlag = flag.Uint("l", 0, "speed limit passed to megadl as --limit-speed")
21-
silentFlag = flag.Bool("s", false, "silent mode. do not pipe megadl's stdout nor stderr")
22-
linkRegex = regexp.MustCompile(`^(?:https?://)?mega\.nz/#.+$`)
22+
speedFlag = flag.Uint("l", 0, "speed limit passed to megadl as --limit-speed")
23+
silentFlag = flag.Bool("s", false, "silent mode. do not pipe megadl's stdout nor stderr")
24+
intervalFlag = flag.Duration("r", retryInterval, "interval between two retries")
25+
26+
linkRegex = regexp.MustCompile(`^(?:https?://)?mega\.nz/#.+$`)
2327
)
2428

2529
var (
@@ -34,18 +38,40 @@ func isValidLink(link string) bool {
3438
func downloadRepeat(link string) {
3539
for !downloadCommand(link) {
3640
errLogger.Printf("Download of \"%s\" failed, waiting %s before retrying.\n", link, retryInterval.String())
37-
time.Sleep(retryInterval)
41+
time.Sleep(*intervalFlag)
3842
}
3943

4044
outLogger.Printf("Download of \"%s\" done.\n", link)
4145
}
4246

4347
func downloadCommand(link string) bool {
4448
cmd := exec.Command("megadl", fmt.Sprintf("--limit-speed=%d", *speedFlag), link)
45-
if !*silentFlag {
46-
cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
49+
50+
var errBuff bytes.Buffer
51+
if *silentFlag {
52+
cmd.Stderr = &errBuff
53+
} else {
54+
cmd.Stdout = os.Stdout
55+
cmd.Stderr = io.MultiWriter(os.Stderr, &errBuff)
56+
}
57+
58+
err := cmd.Run()
59+
if err != nil {
60+
logs := strings.Split(strings.TrimSpace(errBuff.String()), "\n")
61+
if len(logs) == 0 {
62+
return false
63+
}
64+
65+
for _, line := range logs {
66+
if !strings.HasPrefix(line, "ERROR: File already exists at ") {
67+
return false
68+
}
69+
}
70+
71+
return true
4772
}
48-
return cmd.Run() == nil
73+
74+
return false
4975
}
5076

5177
func downloadFromFilesList(path string) {
@@ -71,7 +97,7 @@ func downloadFromFilesList(path string) {
7197
// Download each links in list.
7298
for i, link := range links {
7399
if link[0] == '#' {
74-
errLogger.Printf("Skipping \"%s\".\n", link)
100+
errLogger.Printf("Skipping \"%s\".\n", link[1:])
75101
continue
76102
}
77103

@@ -106,5 +132,5 @@ func main() {
106132
}
107133
}
108134

109-
outLogger.Println("All downloads done.")
135+
outLogger.Println("All download(s) done.")
110136
}

0 commit comments

Comments
 (0)