Changes to make the new linter happy

This commit is contained in:
Andreas Mieke 2017-05-22 00:53:22 +02:00
parent 3e9ddbf757
commit 6bf22e4458
14 changed files with 134 additions and 96 deletions

View file

@ -7,6 +7,7 @@ import (
"github.com/BurntSushi/toml" "github.com/BurntSushi/toml"
) )
// Config defines config fields
type Config struct { type Config struct {
DatabaseConnection string DatabaseConnection string
BindAddress string BindAddress string
@ -20,14 +21,17 @@ type Config struct {
Folder Folder Folder Folder
} }
// Folder defines fields for Folder configuration
type Folder struct { type Folder struct {
Folder string Folder string
} }
// Instagram defines fields for Instagram configuration
type Instagram struct { type Instagram struct {
Tag string Tag string
} }
// Twitter defines fields for Twitter configuration
type Twitter struct { type Twitter struct {
ConsumerKey string ConsumerKey string
ConsumerSecret string ConsumerSecret string
@ -36,8 +40,9 @@ type Twitter struct {
Filter []string Filter []string
} }
// Snapchat defines fields for Snapchat configuration
type Snapchat struct { type Snapchat struct {
ApiBase string APIBase string
UserAgent string UserAgent string
UserName string UserName string
GetConversations SnapchatEndpoint GetConversations SnapchatEndpoint
@ -45,19 +50,24 @@ type Snapchat struct {
MarkAsSeen SnapchatEndpoint MarkAsSeen SnapchatEndpoint
} }
// SnapchatEndpoint defines fields for Snapchat endpoint configuration
type SnapchatEndpoint struct { type SnapchatEndpoint struct {
Uuid string UUID string
ClientAuthToken string ClientAuthToken string
RequestToken string RequestToken string
Timestamp string Timestamp string
} }
// C is the config handler
var C Config var C Config
// LoadConfig loads the configuration from given path
func LoadConfig(path string) error { func LoadConfig(path string) error {
_, e := toml.DecodeFile(path, &C) _, e := toml.DecodeFile(path, &C)
return e return e
} }
// WriteConfig writes the configuration to the given path
func WriteConfig(path string) error { func WriteConfig(path string) error {
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
err := toml.NewEncoder(buf).Encode(C) err := toml.NewEncoder(buf).Encode(C)

View file

@ -7,11 +7,13 @@ import (
"git.1750studios.com/AniNite/SocialDragon/config" "git.1750studios.com/AniNite/SocialDragon/config"
"github.com/jinzhu/gorm" "github.com/jinzhu/gorm"
_ "github.com/lib/pq" _ "github.com/lib/pq" // Database backend for GORM
) )
// Service defines the service providers
type Service uint type Service uint
// IDs for the service providers
const ( const (
Snapchat Service = iota Snapchat Service = iota
Twitter Twitter
@ -19,16 +21,19 @@ const (
Folder Folder
) )
// State defines the states a media item can have
type State uint type State uint
// Possible states
const ( const (
Inbox State = iota Inbox State = iota
Approved Approved
Rejected Rejected
) )
type updatecallback func(Item) type updateCallbackT func(Item)
// Item defines the databse model
type Item struct { type Item struct {
ID uint `gorm:"primary_key"` ID uint `gorm:"primary_key"`
CreatedAt time.Time CreatedAt time.Time
@ -43,6 +48,7 @@ type Item struct {
OriginalID string OriginalID string
} }
// User defines the database model
type User struct { type User struct {
ID uint `gorm:"primary_key"` ID uint `gorm:"primary_key"`
CreatedAt time.Time CreatedAt time.Time
@ -55,10 +61,12 @@ type User struct {
Blocked bool Blocked bool
} }
// Db is the database handler
var Db *gorm.DB var Db *gorm.DB
var cb updatecallback var cb updateCallbackT
func InitDb(callback updatecallback) { // InitDb opens and sets up database
func InitDb(callback updateCallbackT) {
cb = callback cb = callback
var err error var err error
Db, err = gorm.Open("postgres", config.C.DatabaseConnection) Db, err = gorm.Open("postgres", config.C.DatabaseConnection)
@ -71,6 +79,7 @@ func InitDb(callback updatecallback) {
Db.AutoMigrate(&Item{}, &User{}) Db.AutoMigrate(&Item{}, &User{})
} }
// AfterSave sends updates over the callback
func (IT *Item) AfterSave(scope *gorm.Scope) (err error) { func (IT *Item) AfterSave(scope *gorm.Scope) (err error) {
go cb(*IT) go cb(*IT)
return return

View file

@ -15,6 +15,7 @@ import (
"git.1750studios.com/AniNite/SocialDragon/database" "git.1750studios.com/AniNite/SocialDragon/database"
) )
// LoadNewFolders loads the content of configured folder to database
func LoadNewFolders() { func LoadNewFolders() {
log.Printf("Loading new folders...") log.Printf("Loading new folders...")
files, _ := ioutil.ReadDir(config.C.Folder.Folder) files, _ := ioutil.ReadDir(config.C.Folder.Folder)
@ -45,6 +46,7 @@ func LoadNewFolders() {
} }
} }
// ImageNameGenerator generates media paths
func ImageNameGenerator(seed string) (string, string) { func ImageNameGenerator(seed string) (string, string) {
seedBytes := []byte(seed) seedBytes := []byte(seed)
sha256Bytes := sha256.Sum256(seedBytes) sha256Bytes := sha256.Sum256(seedBytes)
@ -56,6 +58,6 @@ func ImageNameGenerator(seed string) (string, string) {
} }
ext := strings.Split(seed, ".") ext := strings.Split(seed, ".")
finalPath := folders + hash + "." + ext[len(ext)-1] finalPath := folders + hash + "." + ext[len(ext)-1]
finalUrl := urls + hash + "." + ext[len(ext)-1] finalURL := urls + hash + "." + ext[len(ext)-1]
return finalPath, finalUrl return finalPath, finalURL
} }

View file

@ -15,7 +15,8 @@ import (
"git.1750studios.com/AniNite/SocialDragon/config" "git.1750studios.com/AniNite/SocialDragon/config"
) )
type InstagramListResponse struct { // ListResponse defines the instagram list response
type ListResponse struct {
Tag struct { Tag struct {
Name string `json:"name"` Name string `json:"name"`
ContentAdvisory interface{} `json:"content_advisory"` ContentAdvisory interface{} `json:"content_advisory"`
@ -76,7 +77,8 @@ type InstagramListResponse struct {
} `json:"tag"` } `json:"tag"`
} }
type InstagramPostResponse struct { // PostResponse defines the instagram post response
type PostResponse struct {
Graphql struct { Graphql struct {
ShortcodeMedia struct { ShortcodeMedia struct {
Typename string `json:"__typename"` Typename string `json:"__typename"`
@ -157,8 +159,9 @@ type InstagramPostResponse struct {
} `json:"graphql"` } `json:"graphql"`
} }
func LoadList(token string) (*InstagramListResponse, error) { // LoadList loads the media list of a instagram page
var listResponse InstagramListResponse func LoadList(token string) (*ListResponse, error) {
var listResponse ListResponse
var url string var url string
if token == "" { if token == "" {
url = "https://www.instagram.com/explore/tags/" + config.C.Instagram.Tag + "/?__a=1" url = "https://www.instagram.com/explore/tags/" + config.C.Instagram.Tag + "/?__a=1"
@ -181,8 +184,9 @@ func LoadList(token string) (*InstagramListResponse, error) {
return &listResponse, nil return &listResponse, nil
} }
func LoadPost(code string) (*InstagramPostResponse, error) { // LoadPost loads single post from instagram
var postResponse InstagramPostResponse func LoadPost(code string) (*PostResponse, error) {
var postResponse PostResponse
res, err := GetHTTPResource("https://www.instagram.com/p/" + code + "/?__a=1") res, err := GetHTTPResource("https://www.instagram.com/p/" + code + "/?__a=1")
if err != nil { if err != nil {
return nil, err return nil, err
@ -199,6 +203,7 @@ func LoadPost(code string) (*InstagramPostResponse, error) {
return &postResponse, nil return &postResponse, nil
} }
// ImageNameGenerator generates media paths
func ImageNameGenerator(seed string) (string, string) { func ImageNameGenerator(seed string) (string, string) {
seedBytes := []byte(seed) seedBytes := []byte(seed)
sha256Bytes := sha256.Sum256(seedBytes) sha256Bytes := sha256.Sum256(seedBytes)
@ -209,10 +214,11 @@ func ImageNameGenerator(seed string) (string, string) {
log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err) log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err)
} }
finalPath := folders + hash finalPath := folders + hash
finalUrl := urls + hash finalURL := urls + hash
return finalPath, finalUrl return finalPath, finalURL
} }
// DownloadMedia downloads given media from Instagram
func DownloadMedia(data io.Reader, path string, video bool) (string, error) { func DownloadMedia(data io.Reader, path string, video bool) (string, error) {
if video { if video {
ext := ".mp4" ext := ".mp4"
@ -228,16 +234,15 @@ func DownloadMedia(data io.Reader, path string, video bool) (string, error) {
return "", err return "", err
} }
return ext, nil return ext, nil
} else {
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }

View file

@ -10,6 +10,7 @@ import (
var sem = make(chan byte, 2) var sem = make(chan byte, 2)
var client = &http.Client{} var client = &http.Client{}
// GetHTTPResource gets HTTP resource with Instagram headers
func GetHTTPResource(u string) (*http.Response, error) { func GetHTTPResource(u string) (*http.Response, error) {
sem <- 1 sem <- 1
req, err := http.NewRequest("GET", u, nil) req, err := http.NewRequest("GET", u, nil)

View file

@ -8,6 +8,7 @@ import (
var running bool var running bool
// LoadNewInstas gets new media from Instagram
func LoadNewInstas() { func LoadNewInstas() {
log.Printf("Loading new Instas...") log.Printf("Loading new Instas...")
var count int var count int
@ -32,7 +33,7 @@ func LoadNewInstas() {
log.Printf("Finished looking for new Instas.") log.Printf("Finished looking for new Instas.")
} }
func iterList(list *InstagramListResponse) string { func iterList(list *ListResponse) string {
var token string var token string
for _, image := range list.Tag.Media.Nodes { for _, image := range list.Tag.Media.Nodes {
var count int var count int

View file

@ -15,25 +15,27 @@ import (
"git.1750studios.com/AniNite/SocialDragon/config" "git.1750studios.com/AniNite/SocialDragon/config"
) )
type Conversations struct { // ConversationsT Snapchat conversations
ConversationsResponse []ConversationsResponse `json:"conversations_response"` type ConversationsT struct {
ConversationsResponse []conversationsResponseT `json:"conversations_response"`
} }
type ConversationsResponse struct { type conversationsResponseT struct {
PendingReceivedSnaps []Snap `json:"pending_received_snaps"` PendingReceivedSnaps []snapT `json:"pending_received_snaps"`
} }
type Snap struct { type snapT struct {
Id string `json:"id"` ID string `json:"id"`
Username string `json:"sn"` Username string `json:"sn"`
Movie int `json:"m"` Movie int `json:"m"`
Rotation int `json:"mo"` Rotation int `json:"mo"`
} }
func GetConversations() (*Conversations, error) { // GetConversations returns a list of snapchat conversations
var conversations Conversations func GetConversations() (*ConversationsT, error) {
var conversations ConversationsT
headers := map[string]string{ headers := map[string]string{
"X-Snapchat-UUID": config.C.Snapchat.GetConversations.Uuid, "X-Snapchat-UUID": config.C.Snapchat.GetConversations.UUID,
"X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetConversations.ClientAuthToken, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetConversations.ClientAuthToken,
} }
data := map[string]string{ data := map[string]string{
@ -59,13 +61,14 @@ func GetConversations() (*Conversations, error) {
return &conversations, nil return &conversations, nil
} }
func GetBlob(snap Snap) (string, error) { // GetBlob downloads the given snap
func GetBlob(snap snapT) (string, error) {
headers := map[string]string{ headers := map[string]string{
"X-Snapchat-UUID": config.C.Snapchat.GetBlob.Uuid, "X-Snapchat-UUID": config.C.Snapchat.GetBlob.UUID,
"X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetBlob.ClientAuthToken, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.GetBlob.ClientAuthToken,
} }
data := map[string]string{ data := map[string]string{
"id": snap.Id, "id": snap.ID,
"req_token": config.C.Snapchat.GetBlob.RequestToken, "req_token": config.C.Snapchat.GetBlob.RequestToken,
"timestamp": config.C.Snapchat.GetBlob.Timestamp, "timestamp": config.C.Snapchat.GetBlob.Timestamp,
"username": config.C.Snapchat.UserName, "username": config.C.Snapchat.UserName,
@ -74,18 +77,19 @@ func GetBlob(snap Snap) (string, error) {
if err != nil { if err != nil {
return "", err return "", err
} }
name, uname := ImageNameGenerator(snap.Id) name, uname := imageNameGenerator(snap.ID)
defer res.Body.Close() defer res.Body.Close()
ext, err := RotateImage(snap, res.Body, name) ext, err := rotateImage(snap, res.Body, name)
if err != nil { if err != nil {
return "", err return "", err
} }
return uname + ext, nil return uname + ext, nil
} }
func MarkAsSeen(snap Snap, screenshotted bool) error { // MarkAsSeen marks the given snap as seen, optionally screenshotted
func MarkAsSeen(snap snapT, screenshotted bool) error {
headers := map[string]string{ headers := map[string]string{
"X-Snapchat-UUID": config.C.Snapchat.MarkAsSeen.Uuid, "X-Snapchat-UUID": config.C.Snapchat.MarkAsSeen.UUID,
"X-Snapchat-Client-Auth-Token": config.C.Snapchat.MarkAsSeen.ClientAuthToken, "X-Snapchat-Client-Auth-Token": config.C.Snapchat.MarkAsSeen.ClientAuthToken,
} }
data := map[string]string{ data := map[string]string{
@ -94,9 +98,9 @@ func MarkAsSeen(snap Snap, screenshotted bool) error {
"username": config.C.Snapchat.UserName, "username": config.C.Snapchat.UserName,
} }
if screenshotted { if screenshotted {
data["json"] = "{\"" + snap.Id + "\":{\"t\":1467469712.44128,\"replayed\":0,\"c\":1,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}" data["json"] = "{\"" + snap.ID + "\":{\"t\":1467469712.44128,\"replayed\":0,\"c\":1,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}"
} else { } else {
data["json"] = "{\"" + snap.Id + "\":{\"t\":1467469712.44128,\"replayed\":0,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}" data["json"] = "{\"" + snap.ID + "\":{\"t\":1467469712.44128,\"replayed\":0,\"stack_id\":\"E437851F-2AA8-4C6C-AE11-5FB49FBF93C0\",\"sv\":0,\"es_id\":\"cssek-0::TgcQVwLCU3kHIEj+o6s2CQ==:QTm2VyfemhN5owtHmVuMpik4hwFNz4gSpUQ9D9zlWxatYA==\"}}"
} }
res, err := GetHTTPResource("/bq/update_snaps", headers, data) res, err := GetHTTPResource("/bq/update_snaps", headers, data)
if err != nil { if err != nil {
@ -106,7 +110,7 @@ func MarkAsSeen(snap Snap, screenshotted bool) error {
return nil return nil
} }
func ImageNameGenerator(seed string) (string, string) { func imageNameGenerator(seed string) (string, string) {
seedBytes := []byte(seed) seedBytes := []byte(seed)
sha256Bytes := sha256.Sum256(seedBytes) sha256Bytes := sha256.Sum256(seedBytes)
hash := hex.EncodeToString(sha256Bytes[:]) hash := hex.EncodeToString(sha256Bytes[:])
@ -116,11 +120,11 @@ func ImageNameGenerator(seed string) (string, string) {
log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err) log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err)
} }
finalPath := folders + hash finalPath := folders + hash
finalUrl := urls + hash finalURL := urls + hash
return finalPath, finalUrl return finalPath, finalURL
} }
func RotateImage(snap Snap, data io.Reader, path string) (string, error) { func rotateImage(snap snapT, data io.Reader, path string) (string, error) {
if snap.Movie != 0 { if snap.Movie != 0 {
ext := ".mp4" ext := ".mp4"
blob, err := ioutil.ReadAll(data) blob, err := ioutil.ReadAll(data)
@ -135,29 +139,28 @@ func RotateImage(snap Snap, data io.Reader, path string) (string, error) {
return "", err return "", err
} }
return ext, nil return ext, nil
} else {
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
switch snap.Rotation {
case 1:
image = imaging.Rotate180(image)
break
case 2:
image = imaging.Rotate90(image)
break
case 3:
image = imaging.Rotate270(image)
break
default:
break
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
switch snap.Rotation {
case 1:
image = imaging.Rotate180(image)
break
case 2:
image = imaging.Rotate90(image)
break
case 3:
image = imaging.Rotate270(image)
break
default:
break
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }

View file

@ -14,13 +14,14 @@ import (
var sem = make(chan byte, 2) var sem = make(chan byte, 2)
var client = &http.Client{} var client = &http.Client{}
// GetHTTPResource makes HTTP request with snapchat headers
func GetHTTPResource(u string, headers map[string]string, data map[string]string) (*http.Response, error) { func GetHTTPResource(u string, headers map[string]string, data map[string]string) (*http.Response, error) {
sem <- 1 sem <- 1
form := url.Values{} form := url.Values{}
for key, value := range data { for key, value := range data {
form.Set(key, value) form.Set(key, value)
} }
req, err := http.NewRequest("POST", config.C.Snapchat.ApiBase+u, strings.NewReader(form.Encode())) req, err := http.NewRequest("POST", config.C.Snapchat.APIBase+u, strings.NewReader(form.Encode()))
if err != nil { if err != nil {
log.Fatalf("FAT HTTP - Failed to create new Request: %+v", err) log.Fatalf("FAT HTTP - Failed to create new Request: %+v", err)
<-sem <-sem

View file

@ -6,6 +6,7 @@ import (
"git.1750studios.com/AniNite/SocialDragon/database" "git.1750studios.com/AniNite/SocialDragon/database"
) )
// LoadNewSnaps loads all new snaps from snapchat
func LoadNewSnaps() { func LoadNewSnaps() {
log.Print("Loading new Snaps...") log.Print("Loading new Snaps...")
cons, err := GetConversations() cons, err := GetConversations()
@ -16,7 +17,7 @@ func LoadNewSnaps() {
for _, con := range cons.ConversationsResponse { for _, con := range cons.ConversationsResponse {
for _, snap := range con.PendingReceivedSnaps { for _, snap := range con.PendingReceivedSnaps {
var count int var count int
if database.Db.Model(database.Item{}).Where("original_id = ?", snap.Id).Count(&count); count > 0 { if database.Db.Model(database.Item{}).Where("original_id = ?", snap.ID).Count(&count); count > 0 {
break break
} }
var US database.User var US database.User
@ -27,17 +28,17 @@ func LoadNewSnaps() {
US.Blocked = false US.Blocked = false
database.Db.Create(&US) database.Db.Create(&US)
} }
log.Printf("Found new Snap %s from %s", snap.Id, snap.Username) log.Printf("Found new Snap %s from %s", snap.ID, snap.Username)
uname, err := GetBlob(snap) uname, err := GetBlob(snap)
if err != nil { if err != nil {
log.Printf("Can't load snap %s: %+v", snap.Id, err) log.Printf("Can't load snap %s: %+v", snap.ID, err)
return return
} }
log.Printf("Loaded snap %s, location %s!", snap.Id, uname) log.Printf("Loaded snap %s, location %s!", snap.ID, uname)
var IT database.Item var IT database.Item
IT.UserID = US.ID IT.UserID = US.ID
IT.IsVideo = snap.Movie != 0 IT.IsVideo = snap.Movie != 0
IT.OriginalID = snap.Id IT.OriginalID = snap.ID
IT.Path = uname IT.Path = uname
IT.Service = database.Snapchat IT.Service = database.Snapchat
if US.Blocked { if US.Blocked {
@ -48,7 +49,7 @@ func LoadNewSnaps() {
database.Db.Create(&IT) database.Db.Create(&IT)
err = MarkAsSeen(snap, false) err = MarkAsSeen(snap, false)
if err != nil { if err != nil {
log.Printf("Could not mark snap %s as seen: %+v", snap.Id, err) log.Printf("Could not mark snap %s as seen: %+v", snap.ID, err)
return return
} }
} }

View file

@ -34,6 +34,7 @@ func wsHandler(w http.ResponseWriter, r *http.Request) {
} }
} }
// SendUpdate sends the content of IT to all connected webcosckets, gets called by database handler.
func SendUpdate(IT database.Item) { func SendUpdate(IT database.Item) {
for i, socket := range sockets { for i, socket := range sockets {
err := socket.WriteJSON(IT) err := socket.WriteJSON(IT)

View file

@ -5,7 +5,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type Stats struct { type statsT struct {
Count struct { Count struct {
Items struct { Items struct {
Inbox uint Inbox uint
@ -72,7 +72,7 @@ func rejectSnap(c *gin.Context) {
} }
func stats(c *gin.Context) { func stats(c *gin.Context) {
var ST Stats var ST statsT
database.Db.Model(database.Item{}).Where("state = ?", database.Inbox).Count(&ST.Count.Items.Inbox) database.Db.Model(database.Item{}).Where("state = ?", database.Inbox).Count(&ST.Count.Items.Inbox)
database.Db.Model(database.Item{}).Where("state = ?", database.Approved).Count(&ST.Count.Items.Approved) database.Db.Model(database.Item{}).Where("state = ?", database.Approved).Count(&ST.Count.Items.Approved)
database.Db.Model(database.Item{}).Where("state = ?", database.Rejected).Count(&ST.Count.Items.Rejected) database.Db.Model(database.Item{}).Where("state = ?", database.Rejected).Count(&ST.Count.Items.Rejected)

View file

@ -14,6 +14,7 @@ import (
"git.1750studios.com/AniNite/SocialDragon/config" "git.1750studios.com/AniNite/SocialDragon/config"
) )
// MediaNameGenerator generates paths for media
func MediaNameGenerator(seed string) (string, string) { func MediaNameGenerator(seed string) (string, string) {
seedBytes := []byte(seed) seedBytes := []byte(seed)
sha256Bytes := sha256.Sum256(seedBytes) sha256Bytes := sha256.Sum256(seedBytes)
@ -24,10 +25,11 @@ func MediaNameGenerator(seed string) (string, string) {
log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err) log.Fatalf("FAT Could not create ContentDirectory, error: %+v", err)
} }
finalPath := folders + hash finalPath := folders + hash
finalUrl := urls + hash finalURL := urls + hash
return finalPath, finalUrl return finalPath, finalURL
} }
// DownloadMedia downloads media from tweet
func DownloadMedia(data io.Reader, path string, video bool) (string, error) { func DownloadMedia(data io.Reader, path string, video bool) (string, error) {
if video { if video {
ext := ".mp4" ext := ".mp4"
@ -43,16 +45,15 @@ func DownloadMedia(data io.Reader, path string, video bool) (string, error) {
return "", err return "", err
} }
return ext, nil return ext, nil
} else {
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }
ext := ".jpg"
image, err := imaging.Decode(data)
if err != nil {
return "", err
}
err = imaging.Save(image, path+ext)
if err != nil {
return "", err
}
return ext, nil
} }

View file

@ -10,6 +10,7 @@ import (
var sem = make(chan byte, 2) var sem = make(chan byte, 2)
var client = &http.Client{} var client = &http.Client{}
// GetHTTPResource makes HTTP request
func GetHTTPResource(u string) (*http.Response, error) { func GetHTTPResource(u string) (*http.Response, error) {
sem <- 1 sem <- 1
req, err := http.NewRequest("GET", u, nil) req, err := http.NewRequest("GET", u, nil)

View file

@ -11,6 +11,7 @@ import (
var stream *twitter.Stream var stream *twitter.Stream
// LoadNewTweets loads new tweets. Endless loop!
func LoadNewTweets() error { func LoadNewTweets() error {
log.Printf("Loading new tweets...") log.Printf("Loading new tweets...")
conf := oauth1.NewConfig(config.C.Twitter.ConsumerKey, config.C.Twitter.ConsumerSecret) conf := oauth1.NewConfig(config.C.Twitter.ConsumerKey, config.C.Twitter.ConsumerSecret)
@ -113,6 +114,7 @@ func LoadNewTweets() error {
return nil return nil
} }
// Stop stops the LoadNewTweets endless loop
func Stop() { func Stop() {
log.Printf("Stopping twitter stream...") log.Printf("Stopping twitter stream...")
stream.Stop() stream.Stop()