/
entry.go
116 lines (97 loc) · 2.15 KB
/
entry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package main
import (
"io/ioutil"
"log"
"mime"
"path"
"os"
"regexp"
"strings"
)
type Entry struct {
Name string
Image string
Video string
IsYoutube bool
IsVimeo bool
}
func countImages(entries []Entry) int {
cnt := 0
for _, entry := range entries {
if entry.Image != "" {
cnt++
}
}
return cnt
}
func countVideos(entries []Entry) int {
cnt := 0
for _, entry := range entries {
if entry.Video != "" {
cnt++
}
}
return cnt
}
func listEntries() []Entry {
fileinfos, err := ioutil.ReadDir("content")
if err != nil {
log.Fatal(err)
}
var entries []Entry
var entry Entry
for i, fileinfo := range fileinfos {
name := filenameWithoutExtension(fileinfo.Name())
if entry.Name != "" && entry.Name != name {
entries = append(entries, entry)
entry = Entry{}
}
entry.Name = name
mimeType := mime.TypeByExtension(path.Ext(fileinfo.Name()))
isImage := strings.HasPrefix(mimeType, "image")
isVideo := strings.HasPrefix(mimeType, "video")
isText := strings.HasPrefix(mimeType, "text")
filename := "content/" + fileinfo.Name()
if isImage {
entry.Image = filename
} else if isVideo {
entry.Video = filename
} else if isText && fileinfo.Size() <= 2000 {
if entry.Video, err = readURLFromFile(filename); err != nil {
continue
}
if entry.IsYoutube, err = regexp.Match(`.*youtube\.com\/.+`, []byte(entry.Video)); err != nil {
continue
} else if !entry.IsYoutube {
if entry.IsVimeo, err = regexp.Match(`.*vimeo\.com\/.+`, []byte(entry.Video)); err != nil {
continue
}
} else if !entry.IsYoutube && !entry.IsVimeo {
continue
}
} else {
continue
}
// It's the last file so just append the current entry
if i == len(fileinfos) - 1 {
entries = append(entries, entry)
}
}
return entries
}
func filenameWithoutExtension(filename string) string {
ext := path.Ext(path.Base(filename))
return filename[:len(filename) - len(ext)]
}
func readURLFromFile(filename string) (string, error) {
file, err := os.Open(filename)
if err != nil {
return "", err
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
return "", err
}
return string(data), nil
}