krz/devianter

A DeviantArt guest API library for Go.

clone: git clone https://gitbay.org/krz/devianter.git

4487cdcbe9ed2ad4bc661c04600336505054177c

unsigned

author: lost+skunk <skunky@ebloid.ru> · 2024-08-14T16:18:40Z

user favs
 deviantion.go |  2 +-
 misc.go       | 24 +++++++++++++++---------
 user-group.go | 38 ++++++++++++++++++++++++++++++++------
 3 files changed, 48 insertions(+), 16 deletions(-)

diff --git a/deviantion.go b/deviantion.go
index f2a85e6..c7640e8 100644
--- a/deviantion.go
+++ b/deviantion.go
@@ -104,7 +104,7 @@ func UrlFromMedia(m Media, thumb ...int) string {
 	for _, t := range m.Types {
 		if t.T == "fullview" {
 			url.WriteString(m.BaseUri)
-			if m.BaseUri[len(m.BaseUri)-3:] != "gif" && t.W*t.H < 33177600 {
+			if l := len(m.BaseUri); l != 0 && (m.BaseUri[l-3:] != "gif" && t.W*t.H < 33177600) {
 				if len(thumb) != 0 {
 					subtractWidthHeight(thumb[0], &t.W, &t.H)
 				}
diff --git a/misc.go b/misc.go
index 094fe2e..720b4c8 100644
--- a/misc.go
+++ b/misc.go
@@ -88,17 +88,23 @@ func PerformSearch(query string, page int, scope rune, user ...string) (ss Searc
 		buildurl.WriteString("dabrowse/search/all?q=")
 	case 't': // поиск артов по тегам
 		buildurl.WriteString("dabrowse/networkbar/tag/deviations?tag=")
-	case 'g': // поиск артов пользователя или группы
-		if user != nil {
-			buildurl.WriteString("dashared/gallection/search?username=")
-			buildurl.WriteString(user[0])
-			buildurl.WriteString("&type=gallery&order=most-recent&init=true&limit=50&q=")
-		} else {
+	case 'g', 'f': // поиск артов пользователя или группы
+		if user == nil {
 			e = errors.New("missing username (last argument)")
 			return
 		}
+
+		buildurl.WriteString("dashared/gallection/search?username=")
+		buildurl.WriteString(user[0])
+		buildurl.WriteString("&type=")
+		if scope == 'g' {
+			buildurl.WriteString("gallery")
+		} else {
+			buildurl.WriteString("collection")
+		}
+		buildurl.WriteString("&order=most-recent&init=true&limit=50&q=")
 	default:
-		log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag;\n- 'g' - gallery.")
+		log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag;\n- 'g' - gallery\n- 'f' - folders.")
 	}
 
 	buildurl.WriteString(url.QueryEscape(query))
@@ -112,11 +118,11 @@ func PerformSearch(query string, page int, scope rune, user ...string) (ss Searc
 
 	ujson(buildurl.String(), &ss)
 
-	if scope == 'g' {
+	if ss.Results == nil {
 		ss.Results = ss.ResultsGalleryTemp
 	}
 
-	// расчёт, сколько всего страниц по запросу. без токена 417 страниц - максимум
+	// расчёт, сколько всего страниц по запросу. без токена, 417 страниц - максимум
 	totalfloat := int(math.Round(float64(ss.Total / 25)))
 	for x := 0; x < totalfloat; x++ {
 		if x <= 417 {
diff --git a/user-group.go b/user-group.go
index c6b53ee..f1f2af5 100644
--- a/user-group.go
+++ b/user-group.go
@@ -46,10 +46,11 @@ type Gallery struct {
 					Folders struct {
 						HasMore bool
 						Results []struct {
-							FolderId int
-							Size     int
-							Name     string
-							Thumb    Deviation
+							Deviations int `json:"totalItemCount"`
+							FolderId   int
+							Size       int
+							Name       string
+							Thumb      Deviation
 						}
 					}
 
@@ -74,7 +75,7 @@ type Group struct {
 }
 
 // подходит как группа, так и пользователь
-func (s Group) GetGroup() (g GRuser, err error) {
+func (s Group) Get() (g GRuser, err error) {
 	if s.Name == "" {
 		return g, errors.New("missing Name field")
 	}
@@ -83,8 +84,33 @@ func (s Group) GetGroup() (g GRuser, err error) {
 	return
 }
 
+func (s Group) Favourites(page int, all bool, folderid ...int) (g Group) {
+	var url strings.Builder
+
+	if fid := folderid[0]; fid > 0 || all {
+		url.WriteString("dashared/gallection/contents")
+		if all {
+			url.WriteString("?all_folder=true")
+		} else {
+			url.WriteString("?folderid=")
+			url.WriteString(strconv.Itoa(fid))
+		}
+		url.WriteString("&type=collection&")
+	} else {
+		url.WriteString("dauserprofile/init/favourites?deviations_")
+	}
+
+	url.WriteString("limit=50&username=")
+	url.WriteString(s.Name)
+	url.WriteString("&with_subfolders=true&offset=")
+	url.WriteString(strconv.Itoa(page * 50))
+
+	ujson(url.String(), &g.Content)
+	return
+}
+
 // гарелея пользователя или группы
-func (s Group) GetGallery(page int, folderid ...int) (g Group, err error) {
+func (s Group) Gallery(page int, folderid ...int) (g Group, err error) {
 	if s.Name == "" {
 		return g, errors.New("missing Name field")
 	}