Browse Source

split by category

kPherox 4 years ago
parent
commit
64b64f836e
2 changed files with 132 additions and 31 deletions
  1. 107 4
      emoji-pack.go
  2. 25 27
      masto-emoji-pack.go

+ 107 - 4
emoji-pack.go

@@ -2,6 +2,12 @@ package main
 
 import (
 	"encoding/json"
+
+	"io"
+	"net/http"
+	"net/url"
+	"os"
+	"path/filepath"
 )
 
 type EmojiPack struct {
@@ -19,10 +25,10 @@ type EmojiPackMetadata struct {
 }
 
 func NewEmojiPack() EmojiPack {
-	e := EmojiPack{}
-	e.Files = map[string]string{}
-	e.Metadata = EmojiPackMetadata{}
-	return e
+	p := EmojiPack{}
+	p.Files = map[string]string{}
+	p.Metadata = EmojiPackMetadata{}
+	return p
 }
 
 func (p *EmojiPack) SetFiles(es Emojis) {
@@ -34,3 +40,100 @@ func (p *EmojiPack) SetFiles(es Emojis) {
 func (p *EmojiPack) Json() ([]byte, error) {
 	return json.Marshal(p)
 }
+
+type EmojiResult struct {
+	Shortcode string
+	File      string
+	Error     error
+}
+
+func (p *EmojiPack) GenerateEmojiPack(outputDir string) error {
+	if _, err := os.Stat(outputDir); os.IsNotExist(err) {
+		if err = mkdir(outputDir); err != nil {
+			return err
+		}
+	}
+
+	c := make(chan EmojiResult, 30)
+	limitCh := make(chan struct{}, 20)
+	defer close(c)
+	defer close(limitCh)
+
+	for code, ru := range p.Files {
+		go downloadEmojiFile(outputDir, code, ru, c, limitCh)
+	}
+
+	files := map[string]string{}
+	for i := 0; i < len(p.Files); i++ {
+		result := <-c
+		if result.Error != nil {
+			continue
+		}
+		files[result.Shortcode] = result.File
+	}
+	p.Files = files
+
+	// generate pack.json
+	f, err := os.Create(filepath.Join(outputDir, "pack.json"))
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+
+	b, err := p.Json()
+	if err != nil {
+		return err
+	}
+
+	_, err = f.Write(b)
+	return err
+}
+
+func mkdir(name string) error {
+	err := os.Mkdir(name, 0777)
+	if os.IsNotExist(err) {
+		mkdir(filepath.Dir(name))
+		return os.Mkdir(name, 0777)
+	}
+	return err
+}
+
+func downloadEmojiFile(outputDir string, shortcode string, fileUrl string, result chan EmojiResult, limit chan struct{}) {
+	limit <- struct{}{}
+
+	r := EmojiResult{
+		Shortcode: shortcode,
+	}
+
+	var u *url.URL
+	u, r.Error = url.Parse(fileUrl)
+	if r.Error != nil {
+		<-limit
+		result <- r
+		return
+	}
+
+	var resp *http.Response
+	resp, r.Error = http.Get(u.String())
+	if r.Error != nil {
+		<-limit
+		result <- r
+		return
+	}
+	defer resp.Body.Close()
+
+	r.File = filepath.Base(u.String())
+
+	var f *os.File
+	f, r.Error = os.Create(filepath.Join(outputDir, r.File))
+	if r.Error != nil {
+		<-limit
+		result <- r
+		return
+	}
+	defer f.Close()
+
+	_, r.Error = io.Copy(f, resp.Body)
+	<-limit
+	result <- r
+}

+ 25 - 27
masto-emoji-pack.go

@@ -2,13 +2,12 @@ package main
 
 import (
 	"fmt"
-	"os"
 	"path/filepath"
 )
 
 type Result struct {
 	Server string
-	Emojis Emojis
+	Output []string
 	Error  error
 }
 
@@ -26,10 +25,10 @@ func main() {
 		if r := <-c; r.Error != nil {
 			fmt.Println(r.Error)
 		} else {
-			fmt.Printf("Success: %s, emoji count: %d\n", r.Server, len(r.Emojis))
-			//for _, e := range r.Emojis {
-			//    fmt.Printf("%s, %s, %s\n", e.Shortcode, e.Url, e.Category)
-			//}
+			fmt.Printf("Success: %s\n", r.Server)
+			for _, name := range r.Output {
+				fmt.Println(name)
+			}
 		}
 	}
 }
@@ -38,39 +37,38 @@ func saveEmojiList(domain string, opts Options, c chan Result) {
 	r := Result{
 		Server: domain,
 	}
-	r.Emojis, r.Error = NewEmojiList(domain)
-	if r.Error != nil {
-		c <- r
-		return
-	}
 
-	p := NewEmojiPack()
-	p.SetFiles(r.Emojis)
-
-	var b []byte
-	b, r.Error = p.Json()
+	var es Emojis
+	es, r.Error = NewEmojiList(domain)
 	if r.Error != nil {
 		c <- r
 		return
 	}
 
-	// opts.OutputDir
 	out := filepath.Join(opts.OutputDir, domain)
 
-	if _, err := os.Stat(out); os.IsNotExist(err) {
-		os.Mkdir(out, 0777)
-	}
-	var f *os.File
-	f, r.Error = os.Create(filepath.Join(out, "pack.json"))
-	if r.Error != nil {
+	if !opts.Split {
+		p := NewEmojiPack()
+		p.SetFiles(es)
+		r.Error = p.GenerateEmojiPack(out)
+		r.Output = append(r.Output, out)
 		c <- r
 		return
 	}
 
-	_, r.Error = f.Write(b)
-	if r.Error != nil {
-		c <- r
-		return
+	var ces = map[string]Emojis{}
+	for _, e := range es {
+		ces[e.Category] = append(ces[e.Category], e)
+	}
+
+	for c, es := range ces {
+		p := NewEmojiPack()
+		p.SetFiles(es)
+		dir := filepath.Join(out, c)
+		if err := p.GenerateEmojiPack(dir); err != nil {
+			r.Error = err
+		}
+		r.Output = append(r.Output, dir)
 	}
 
 	c <- r