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}