krz/devianter
A DeviantArt guest API library for Go.
clone: git clone https://gitbay.org/krz/devianter.git
v0.2.0: deviantion.go · raw
1package devianter
2
3import (
4 "encoding/json"
5 "strconv"
6 "strings"
7 timelib "time"
8)
9
10// хрень для парсинга времени публикации
11type time struct {
12 timelib.Time
13}
14
15func (t *time) UnmarshalJSON(b []byte) (err error) {
16 if b[0] == '"' && b[len(b)-1] == '"' {
17 b = b[1 : len(b)-1]
18 }
19 t.Time, err = timelib.Parse("2006-01-02T15:04:05-0700", string(b))
20 return
21}
22
23// самая главная структура для поста
24type Deviation struct {
25 Title, Url, License string
26 PublishedTime time
27 ID int `json:"deviationId"`
28
29 NSFW bool `json:"isMature"`
30 AI bool `json:"isAiGenerated"`
31 DD bool `json:"isDailyDeviation"`
32
33 Author struct {
34 Username string
35 }
36 Stats struct {
37 Favourites, Views, Downloads int
38 }
39 Media Media
40 Extended struct {
41 Tags []struct {
42 Name string
43 }
44 OriginalFile struct {
45 Type string
46 Width int
47 Height int
48 Filesize int
49 }
50 DescriptionText Text
51 RelatedContent []struct {
52 Deviations []Deviation
53 }
54 }
55 TextContent Text
56}
57
58// её выпердыши
59type Media struct {
60 BaseUri string
61 Token []string
62 Types []struct {
63 T string
64 H, W int
65 }
66}
67
68type Text struct {
69 Excerpt string
70 Html struct {
71 Markup, Type string
72 }
73}
74
75// структура поста
76type Post struct {
77 Deviation Deviation
78 Comments struct {
79 Total int
80 Cursor string
81 }
82
83 ParsedComments []struct {
84 Author string
85 Posted time
86 Replies, Likes int
87 }
88
89 IMG, Description string
90}
91
92// преобразование урла в правильный
93func UrlFromMedia(m Media) string {
94 var url strings.Builder
95 for _, t := range m.Types {
96 if t.T == "fullview" {
97 url.WriteString(m.BaseUri)
98 if m.BaseUri[len(m.BaseUri)-3:] != "gif" && t.W*t.H < 33177600 {
99 url.WriteString("/v1/fit/w_")
100 url.WriteString(strconv.Itoa(t.W))
101 url.WriteString(",h_")
102 url.WriteString(strconv.Itoa(t.H))
103 url.WriteString("/")
104 url.WriteString("image")
105 url.WriteString(".gif")
106 }
107 if len(m.Token) > 0 {
108 url.WriteString("?token=")
109 url.WriteString(m.Token[0])
110 }
111 }
112 }
113 return url.String()
114}
115
116// для работы функции нужно ID поста и имя пользователя.
117func DeviationFunc(id string, user string) Post {
118 var st Post
119 ujson(
120 "dadeviation/init?deviationid="+id+"&username="+user+"&type=art&include_session=false&expand=deviation.related&preload=true",
121 &st,
122 )
123
124 st.IMG = UrlFromMedia(st.Deviation.Media)
125
126 // базовая обработка описания
127 txt := st.Deviation.TextContent.Html.Markup
128 if len(txt) > 0 && txt[1] == '{' {
129 var description struct {
130 Blocks []struct {
131 Text string
132 }
133 }
134
135 json.Unmarshal([]byte(txt), &description)
136 for _, a := range description.Blocks {
137 txt = a.Text
138 }
139 }
140
141 st.Description = txt
142
143 return st
144}