From fa4fb82dc45f032282d62b016244ec9d12e5e358 Mon Sep 17 00:00:00 2001 From: Sebastian Winkler Date: Sat, 8 Oct 2016 13:06:47 +0200 Subject: [PATCH] implements downloading of imgur albums --- main.go | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 5aefb08..b15a4c6 100644 --- a/main.go +++ b/main.go @@ -21,24 +21,32 @@ import ( ) var ( - ChannelWhitelist map[string]string - BaseDownloadPath string - RegexpUrlTwitter *regexp.Regexp - RegexpUrlTistory *regexp.Regexp - RegexpUrlGfycat *regexp.Regexp - RegexpUrlInstagram *regexp.Regexp - RegexpUrlImgurGifv *regexp.Regexp + ChannelWhitelist map[string]string + BaseDownloadPath string + RegexpUrlTwitter *regexp.Regexp + RegexpUrlTistory *regexp.Regexp + RegexpUrlGfycat *regexp.Regexp + RegexpUrlInstagram *regexp.Regexp + RegexpUrlImgurGifv *regexp.Regexp + RegexpUrlImgurAlbum *regexp.Regexp ) const ( - VERSION string = "1.5" - RELEASE_URL string = "https://github.com/Seklfreak/discord-image-downloader-go/releases/latest" + VERSION string = "1.6" + RELEASE_URL string = "https://github.com/Seklfreak/discord-image-downloader-go/releases/latest" + IMGUR_CLIENT_ID string = "a39473314df3f59" ) type GfycatObject struct { GfyItem map[string]string } +type ImgurAlbumObject struct { + Data []struct { + Link string + } +} + func main() { fmt.Printf("discord-image-downloader-go version %s\n", VERSION) fmt.Printf("Go to %s to get the latest release.\n", RELEASE_URL) @@ -100,6 +108,12 @@ func main() { fmt.Println("Regexp error", err) return } + RegexpUrlImgurAlbum, err = regexp.Compile( + `^http(s?):\/\/imgur\.com\/a\/[A-Za-z0-9]+$`) + if err != nil { + fmt.Println("Regexp error", err) + return + } var dg *discordgo.Session if cfg.Section("auth").HasKey("token") { @@ -180,6 +194,12 @@ func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) { fmt.Println("imgur gifv url failed, ", iFoundUrl, ",", err) continue } + } else if RegexpUrlImgurAlbum.MatchString(iFoundUrl) { + err := handleImgurAlbumUrl(iFoundUrl, downloadPath) + if err != nil { + fmt.Println("imgur album url failed, ", iFoundUrl, ",", err) + continue + } } else { // Any other url downloadFromUrl(iFoundUrl, @@ -237,7 +257,20 @@ func handleImgurGifvUrl(url string, folder string) error { url = strings.Replace(url, ".gifv", "", -1) downloadFromUrl(url, "", folder) return nil +} +func handleImgurAlbumUrl(url string, folder string) error { + afterLastSlash := strings.LastIndex(url, "/") + albumId := url[afterLastSlash+1:] + headers := make(map[string]string) + headers["Authorization"] = "Client-ID " + IMGUR_CLIENT_ID + imgurAlbumObject := new(ImgurAlbumObject) + getJsonWithHeaders("https://api.imgur.com/3/album/"+albumId+"/images", imgurAlbumObject, headers) + fmt.Printf("[%s] Found imgur album url: %s\n", time.Now().Format(time.Stamp), url) + for _, v := range imgurAlbumObject.Data { + downloadFromUrl(v.Link, "", folder) + } + return nil } func getJson(url string, target interface{}) error { @@ -250,6 +283,23 @@ func getJson(url string, target interface{}) error { return json.NewDecoder(r.Body).Decode(target) } +func getJsonWithHeaders(url string, target interface{}, headers map[string]string) error { + client := &http.Client{} + req, _ := http.NewRequest("GET", url, nil) + + for k, v := range headers { + req.Header.Set(k, v) + } + + r, err := client.Do(req) + if err != nil { + return err + } + defer r.Body.Close() + + return json.NewDecoder(r.Body).Decode(target) +} + func filenameFromUrl(dUrl string) string { base := path.Base(dUrl) parts := strings.Split(base, "?")