Avatar improvements
This commit is contained in:
@ -1,18 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"runtime"
|
||||
"time"
|
||||
|
||||
"github.com/animenotifier/arn"
|
||||
"github.com/fatih/color"
|
||||
"github.com/parnurzeal/gorequest"
|
||||
gravatar "github.com/ungerik/go-gravatar"
|
||||
)
|
||||
|
||||
const (
|
||||
avatarsDirectoryOriginal = "images/avatars/original/"
|
||||
avatarsDirectoryWebP = "images/avatars/webp/"
|
||||
)
|
||||
|
||||
func main() {
|
||||
os.Chdir("../../")
|
||||
|
||||
users, _ := arn.AllUsers()
|
||||
|
||||
usersQueue := make(chan *arn.User)
|
||||
@ -23,6 +26,7 @@ func main() {
|
||||
go func(workerID int) {
|
||||
for user := range usersQueue {
|
||||
<-rateLimiter.C
|
||||
|
||||
if downloadAvatar(user) {
|
||||
makeWebPAvatar(user)
|
||||
user.Avatar = "/+" + user.Nick + "/avatar"
|
||||
@ -39,90 +43,3 @@ func main() {
|
||||
usersQueue <- user
|
||||
}
|
||||
}
|
||||
|
||||
func findAvatar(user *arn.User, dir string) string {
|
||||
testExtensions := []string{".jpg", ".png", ".gif", ".webp", ""}
|
||||
|
||||
for _, testExt := range testExtensions {
|
||||
if _, err := os.Stat(dir + user.ID + testExt); !os.IsNotExist(err) {
|
||||
return user.ID + testExt
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func makeWebPAvatar(user *arn.User) {
|
||||
baseName := findAvatar(user, "../../images/avatars/original/")
|
||||
|
||||
if baseName == "" {
|
||||
return
|
||||
}
|
||||
|
||||
original := "../../images/avatars/original/" + baseName
|
||||
outFile := "../../images/avatars/webp/" + user.ID + ".webp"
|
||||
|
||||
err := convertFileToWebP(original, outFile, 80)
|
||||
|
||||
if err != nil {
|
||||
color.Red("[WebP] " + original + " -> " + outFile)
|
||||
} else {
|
||||
color.Green("[WebP] " + original + " -> " + outFile)
|
||||
}
|
||||
}
|
||||
|
||||
func downloadAvatar(user *arn.User) bool {
|
||||
if user.Email == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
directory := "../../images/avatars/original/"
|
||||
fileName := directory + user.ID
|
||||
|
||||
// Build URL
|
||||
url := gravatar.Url(user.Email) + "?s=560&d=404&r=pg"
|
||||
|
||||
// Skip existing avatars
|
||||
if findAvatar(user, directory) != "" {
|
||||
color.Yellow(url)
|
||||
return true
|
||||
}
|
||||
|
||||
// Download
|
||||
response, data, err := gorequest.New().Get(url).EndBytes()
|
||||
|
||||
if err != nil {
|
||||
color.Red(url)
|
||||
return false
|
||||
}
|
||||
|
||||
contentType := response.Header.Get("content-type")
|
||||
|
||||
if response.StatusCode != 200 {
|
||||
color.Red(url)
|
||||
return false
|
||||
}
|
||||
|
||||
color.Green(url)
|
||||
|
||||
// Determine file extension
|
||||
extension := ""
|
||||
|
||||
switch contentType {
|
||||
case "image/jpeg":
|
||||
extension = ".jpg"
|
||||
case "image/png":
|
||||
extension = ".png"
|
||||
case "image/gif":
|
||||
extension = ".gif"
|
||||
case "image/webp":
|
||||
extension = ".webp"
|
||||
}
|
||||
|
||||
fileName += extension
|
||||
|
||||
// Write to disk
|
||||
ioutil.WriteFile(fileName, data, 0644)
|
||||
|
||||
return true
|
||||
}
|
||||
|
79
jobs/avatars/download.go
Normal file
79
jobs/avatars/download.go
Normal file
@ -0,0 +1,79 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/animenotifier/arn"
|
||||
"github.com/fatih/color"
|
||||
"github.com/parnurzeal/gorequest"
|
||||
gravatar "github.com/ungerik/go-gravatar"
|
||||
)
|
||||
|
||||
func findOriginalAvatar(user *arn.User) string {
|
||||
return arn.FindFileWithExtension(
|
||||
user.ID,
|
||||
avatarsDirectoryOriginal,
|
||||
[]string{
|
||||
".jpg",
|
||||
".png",
|
||||
".gif",
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func downloadAvatar(user *arn.User) bool {
|
||||
if user.Email == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
directory := avatarsDirectoryOriginal
|
||||
fileName := directory + user.ID
|
||||
|
||||
// Build URL
|
||||
url := gravatar.Url(user.Email) + "?s=" + fmt.Sprint(arn.AvatarMaxSize) + "&d=404&r=pg"
|
||||
|
||||
// Skip existing avatars
|
||||
if findOriginalAvatar(user) != "" {
|
||||
color.Yellow(user.Nick)
|
||||
return true
|
||||
}
|
||||
|
||||
// Download
|
||||
response, data, err := gorequest.New().Get(url).EndBytes()
|
||||
|
||||
if err != nil {
|
||||
color.Red(user.Nick)
|
||||
return false
|
||||
}
|
||||
|
||||
contentType := response.Header.Get("content-type")
|
||||
|
||||
if response.StatusCode != 200 {
|
||||
color.Red(user.Nick)
|
||||
return false
|
||||
}
|
||||
|
||||
// Determine file extension
|
||||
extension := ""
|
||||
|
||||
switch contentType {
|
||||
case "image/jpeg":
|
||||
extension = ".jpg"
|
||||
case "image/png":
|
||||
extension = ".png"
|
||||
case "image/gif":
|
||||
extension = ".gif"
|
||||
case "image/webp":
|
||||
extension = ".webp"
|
||||
}
|
||||
|
||||
fileName += extension
|
||||
|
||||
// Write to disk
|
||||
ioutil.WriteFile(fileName, data, 0644)
|
||||
|
||||
color.Green(user.Nick)
|
||||
|
||||
return true
|
||||
}
|
@ -1,40 +1,51 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
_ "image/gif"
|
||||
_ "image/jpeg"
|
||||
_ "image/png"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/chai2010/webp"
|
||||
"github.com/animenotifier/arn"
|
||||
"github.com/fatih/color"
|
||||
"github.com/nfnt/resize"
|
||||
)
|
||||
|
||||
func convertFileToWebP(in string, out string, quality float32) error {
|
||||
f, openErr := os.Open(in)
|
||||
func makeWebPAvatar(user *arn.User) {
|
||||
baseName := findOriginalAvatar(user)
|
||||
|
||||
if openErr != nil {
|
||||
return openErr
|
||||
if baseName == "" {
|
||||
return
|
||||
}
|
||||
|
||||
img, format, decodeErr := image.Decode(f)
|
||||
original := avatarsDirectoryOriginal + baseName
|
||||
outFile := avatarsDirectoryWebP + user.ID + ".webp"
|
||||
|
||||
if decodeErr != nil {
|
||||
return decodeErr
|
||||
err := avatarToWebP(original, outFile, 80)
|
||||
|
||||
if err != nil {
|
||||
color.Red(user.Nick + " [WebP]")
|
||||
} else {
|
||||
color.Green(user.Nick + " [WebP]")
|
||||
}
|
||||
|
||||
fmt.Println(format, img.Bounds().Dx(), img.Bounds().Dy())
|
||||
|
||||
fileOut, writeErr := os.Create(out)
|
||||
|
||||
if writeErr != nil {
|
||||
return writeErr
|
||||
}
|
||||
|
||||
encodeErr := webp.Encode(fileOut, img, &webp.Options{
|
||||
Quality: quality,
|
||||
})
|
||||
|
||||
return encodeErr
|
||||
}
|
||||
|
||||
func avatarToWebP(in string, out string, quality float32) error {
|
||||
img, _, loadErr := arn.LoadImage(in)
|
||||
|
||||
if loadErr != nil {
|
||||
return loadErr
|
||||
}
|
||||
|
||||
// Big avatar
|
||||
saveErr := arn.SaveWebP(img, out, quality)
|
||||
|
||||
if saveErr != nil {
|
||||
return saveErr
|
||||
}
|
||||
|
||||
// Small avatar
|
||||
smallImg := resize.Resize(arn.AvatarSmallSize, 0, img, resize.Lanczos3)
|
||||
saveErr = arn.SaveWebP(smallImg, strings.Replace(out, ".webp", ".small.webp", 1), quality)
|
||||
return saveErr
|
||||
}
|
||||
|
Reference in New Issue
Block a user