krz/devianter
A DeviantArt guest API library for Go.
clone: git clone https://gitbay.org/krz/devianter.git
v0.3.1: misc.go · raw
1package devianter
2
3import (
4 "errors"
5 "log"
6 "math"
7 "net/url"
8 "strconv"
9 "strings"
10)
11
12/* AVATARS AND EMOJIS */
13func AEmedia(name string, t rune) (string, error) {
14 if len(name) < 2 {
15 return "", errors.New("name must be specified")
16 }
17 // список всех возможных расширений
18 var extensions = [3]string{
19 ".jpg",
20 ".png",
21 ".gif",
22 }
23 // надо
24 name = strings.ToLower(name)
25
26 // построение ссылок. билдер потому что он быстрее обычного сложения строк.
27 var b strings.Builder
28 switch t {
29 case 'a':
30 b.WriteString("https://a.deviantart.net/avatars-big/")
31 name_without_dashes := strings.ReplaceAll(name, "-", "_")
32 b.WriteString(name_without_dashes[:1])
33 b.WriteString("/")
34 b.WriteString(name_without_dashes[1:2])
35 b.WriteString("/")
36 case 'e':
37 b.WriteString("https://e.deviantart.net/emoticons/")
38 b.WriteString(name[:1])
39 b.WriteString("/")
40 default:
41 log.Fatalln("Invalid type.\n- 'a' -- avatar;\n- 'e' -- emoji.")
42 }
43 b.WriteString(name)
44
45 // проверка ссылки на доступность
46 for x := 0; x < len(extensions); x++ {
47 req := request(b.String() + extensions[x])
48 if req.Status == 200 {
49 return req.Body, nil
50 }
51 }
52
53 return "", errors.New("user not exists")
54}
55
56/* DAILY DEVIATIONS */
57type DailyDeviations struct {
58 HasMore bool
59 Strips []struct {
60 Codename, Title string
61 TitleType string
62 Deviations []Deviation
63 }
64 Deviations []Deviation
65}
66
67func GetDailyDeviations(page int) (dd DailyDeviations, err Error) {
68 err = ujson("dabrowse/networkbar/rfy/deviations?page="+strconv.Itoa(page), &dd)
69 return
70}
71
72/* SEARCH */
73type Search struct {
74 Total int `json:"estTotal"`
75 Pages int // only for 'a' and 'g' scope.
76 HasMore bool
77 Results []Deviation `json:"deviations"`
78 ResultsGalleryTemp []Deviation `json:"results"`
79}
80
81func PerformSearch(query string, page int, scope rune, user ...string) (ss Search, daError Error, err error) {
82 var buildurl strings.Builder
83
84 // о5 построение ссылок.
85 switch scope {
86 case 'a': // поиск артов по названию
87 buildurl.WriteString("dabrowse/search/all?q=")
88 case 't': // поиск артов по тегам
89 buildurl.WriteString("dabrowse/networkbar/tag/deviations?tag=")
90 case 'g', 'f': // поиск артов пользователя или группы
91 if user == nil {
92 err = errors.New("missing username (last argument)")
93 return
94 }
95
96 buildurl.WriteString("dashared/gallection/search?username=")
97 buildurl.WriteString(user[0])
98 buildurl.WriteString("&type=")
99 if scope == 'g' {
100 buildurl.WriteString("gallery")
101 } else {
102 buildurl.WriteString("collection")
103 }
104 buildurl.WriteString("&order=most-recent&init=true&limit=50&q=")
105 default:
106 log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag;\n- 'g' - gallery\n- 'f' - folders.")
107 }
108
109 buildurl.WriteString(url.QueryEscape(query))
110 if scope != 'g' { // если область поиска не равна поиску по группам, то активируется этот код
111 buildurl.WriteString("&page=")
112 } else { // иначе вместо страницы будет оффсет и страница умножится на 50
113 buildurl.WriteString("&offset=")
114 page = 50 * page
115 }
116 buildurl.WriteString(strconv.Itoa(page))
117
118 daError = ujson(buildurl.String(), &ss)
119
120 if ss.Results == nil {
121 ss.Results = ss.ResultsGalleryTemp
122 }
123
124 // расчёт, сколько всего страниц по запросу. без токена, 417 страниц - максимум
125 totalfloat := int(math.Round(float64(ss.Total / 25)))
126 for x := 0; x < totalfloat; x++ {
127 if x <= 417 {
128 ss.Pages = x
129 }
130 }
131
132 return
133}