krz/skunky-art

Alternative privacy frontend for DeviantArt.

clone: git clone https://gitbay.org/krz/skunky-art.git

c39399403e031a8c1ad53969770e4261d2c9e7aa

unsigned

author: lost+skunk <skunky@ebloid.ru> · 2024-09-04T17:22:58Z

отображение ошибок
 TODO.md             |  3 +--
 app/api.go          |  6 +++++-
 app/cache.go        |  1 +
 app/config.go       |  2 +-
 app/parsers.go      |  6 +++++-
 app/router.go       |  8 ++++----
 app/util.go         | 15 +++++++++++++-
 app/wrapper.go      | 59 +++++++++++++++++++++++++++++++++++------------------
 config.example.json |  2 +-
 go.mod              |  3 +--
 go.sum              |  4 ++--
 11 files changed, 74 insertions(+), 35 deletions(-)

diff --git a/TODO.md b/TODO.md
index fbca5d8..01bc524 100644
--- a/TODO.md
+++ b/TODO.md
@@ -5,14 +5,13 @@
 * **Доделать парсинг описания**
 * ~~Реализовать стрипы в ежедневных артах~~ ✔️
 * ~~Исправить баг с навигацией по страницам~~ ✔️
-* Сделать нормальное отображение ошибок
+* ~~Сделать нормальное отображение ошибок~~ ✔️
 * ~~Сделать единицы в конфиге более понятными~~ ✔️
 * Добавить чекер инстанса на работоспособность
 * ~~Добавить просмотр понравившихся артов пользователю~~ ✔️
 * Добавить возможность включить темплейты в бинарник [P]
 * ~~Реализовать миниатюры и оптимизировать CSS под маленькие экраны~~ ✔️
 * Написать Makefile и скрипт для автоматического развёртывания инстанса
-* **Реализовать отображение контента, отличного от картинок (видео, аудио, etc)**
 * Исправить баг с эмоджи, когда некоторые кастомные эмоции могут не отображаться
 * ~~Добавить аргумент &filename, который будет выдавать файл с нормально выглядещем именем~~ ✔️
 * ~~Улучшить систему кеширования: добавить рейтинг для удаления и копирование изображений в ОЗУ~~ ✔️
diff --git a/app/api.go b/app/api.go
index 3d0871c..fdf8270 100644
--- a/app/api.go
+++ b/app/api.go
@@ -58,8 +58,12 @@ func (a API) Random() {
       a.Error("Sorry, butt NSFW on this are disabled, and the instance failed to find a random art without NSFW", 500)
     }
     
-    s, err := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a')
+    s, err, daErr := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a')
     try(err)
+    if daErr.RAW != nil {
+      continue
+    }
+    
     deviation := &s.Results[rand.Intn(len(s.Results))]
     
     if deviation.NSFW && !CFG.Nsfw {
diff --git a/app/cache.go b/app/cache.go
index cbf2432..975fa0a 100644
--- a/app/cache.go
+++ b/app/cache.go
@@ -127,6 +127,7 @@ func InitCacheSystem() {
 					try(os.RemoveAll(fileName))
 				}
 			}
+			
 			if c.MaxSize != 0 && fileInfo.Size() > c.MaxSize {
 				try(os.RemoveAll(fileName))
 			}
diff --git a/app/config.go b/app/config.go
index eff9ee8..745d2f4 100644
--- a/app/config.go
+++ b/app/config.go
@@ -89,7 +89,7 @@ func ExecuteConfig() {
 
 				lifetimeParsed = duration * int64(num)
 			}
-			CFG.Cache.MaxSize /= 1024 ^ 2
+			CFG.Cache.MaxSize *= 1024 ^ 2
 			go InitCacheSystem()
 		}
 		devianter.UserAgent = CFG.UserAgent
diff --git a/app/parsers.go b/app/parsers.go
index 3a318be..b7f15fd 100644
--- a/app/parsers.go
+++ b/app/parsers.go
@@ -9,7 +9,11 @@ import (
 	"golang.org/x/net/html"
 )
 
-func (s skunkyart) ParseComments(c devianter.Comments) string {
+func (s skunkyart) ParseComments(c devianter.Comments, daError devianter.Error) string {
+	if daError.RAW != nil {
+		return "Failed to fetch comments :("
+	}
+
 	var cmmts strings.Builder
 	replied := make(map[int]string)
 
diff --git a/app/router.go b/app/router.go
index 2625374..32488cb 100644
--- a/app/router.go
+++ b/app/router.go
@@ -64,13 +64,13 @@ func Router() {
 
 		var skunky = skunkyart{Version: Release.Version}
 
+		skunky.Args = r.URL.Query()
 		arg := skunky.Args.Get
 		p, _ := strconv.Atoi(arg("p"))
 		
 		skunky.Endpoint = path[1]
 		skunky.API.main = &skunky
 		skunky.Writer = w
-		skunky.Args = r.URL.Query()
 		skunky.BasePath = CFG.URI
 		skunky.QueryRaw = arg("q")
 		skunky.Query = u.QueryEscape(skunky.QueryRaw)
@@ -128,9 +128,9 @@ func Router() {
 					skunky.API.Error("Not Found", 404)
 			}
 
-			// 404
-			default:
-				skunky.ReturnHTTPError(404)
+		// 404
+		default:
+			skunky.ReturnHTTPError(404)
 		}
 	}
 
diff --git a/app/util.go b/app/util.go
index c992466..c698090 100644
--- a/app/util.go
+++ b/app/util.go
@@ -139,6 +139,19 @@ func UrlBuilder(strs ...string) string {
 	return str.String()
 }
 
+func (s skunkyart) Error(dAerr devianter.Error) {
+	s.Writer.WriteHeader(502)
+
+	var msg strings.Builder
+	msg.WriteString(`<html><link rel="stylesheet" href="`)
+	msg.WriteString(UrlBuilder("stylesheet"))
+	msg.WriteString(`" /><h3>DeviantArt error — '`)
+	msg.WriteString(dAerr.Error)
+	msg.WriteString("'</h3></html>")
+
+	wr(s.Writer, msg.String())
+}
+
 func (s skunkyart) ReturnHTTPError(status int) {
 	s.Writer.WriteHeader(status)
 
@@ -203,7 +216,7 @@ func ParseMedia(media devianter.Media, thumb ...int) string {
 		}
 		return UrlBuilder("media", "file", mediaUrl[:dot], mediaUrl[dot+11:], "&filename=", filename)
 	}
-	return mediaUrl
+	return ""
 }
 
 func ConvertDeviantArtUrlToSkunkyArt(url string) (output string) {
diff --git a/app/wrapper.go b/app/wrapper.go
index a3d251b..a2e0fa4 100644
--- a/app/wrapper.go
+++ b/app/wrapper.go
@@ -18,10 +18,15 @@ func (s skunkyart) GRUser() {
 	}
 
 	var g devianter.Group
+	var daError devianter.Error
 	g.Name = s.Query
 	var err error
-	s.Templates.GroupUser.GR, err = g.Get()
+	s.Templates.GroupUser.GR, err, daError = g.Get()
 	try(err)
+	if daError.RAW != nil {
+			s.Error(daError)
+			return
+	}
 
 	group := &s.Templates.GroupUser
 
@@ -63,12 +68,7 @@ func (s skunkyart) GRUser() {
 						group.About.Interests += interest.String()
 					}
 				}
-				group.About.Comments = s.ParseComments(devianter.GetComments(
-					strconv.Itoa(group.GR.Gruser.ID),
-					"",
-					s.Page,
-					4,
-				))
+				group.About.Comments = s.ParseComments(devianter.GetComments(strconv.Itoa(group.GR.Gruser.ID),"",s.Page,4))
 
 			case "cover_deviation":
 				group.About.BGMeta = x.ModuleData.CoverDeviation.Deviation
@@ -98,12 +98,17 @@ func (s skunkyart) GRUser() {
 		}
 
 		if s.Type == 'f' {
-			content = g.Favourites(s.Page, all, folderid)
+			content, daError = g.Favourites(s.Page, all, folderid)
 		} else {
-			content, err = g.Gallery(s.Page, folderid)
+			content, err, daError = g.Gallery(s.Page, folderid)
 			try(err)
 		}
 
+		if daError.RAW != nil {
+			s.Error(daError)
+			return
+		}
+
 		if folderid > 0 || (s.Type == 'f' && all) {
 			group.Gallery.List = s.DeviationList(content.Content.Results, true, DeviationList{
 				More: content.Content.HasMore,
@@ -172,19 +177,26 @@ func (s skunkyart) Deviation(author, postname string) {
 		return
 	}
 
+	var err devianter.Error
 	post := &s.Templates.Deviation
 
 	id := id_search[len(id_search)-1]
-	post.Post = devianter.GetDeviation(id, author)
+	post.Post, err = devianter.GetDeviation(id, author)
+	if err.RAW != nil {
+		s.Error(err)
+		return
+	}
+
+	if post.Post.Comments.Total <= 50 {
+		post.Post.Comments.Cursor = ""
+	}
 
 	if post.Post.Deviation.TextContent.Excerpt != "" {
 		post.Post.Description = ParseDescription(post.Post.Deviation.TextContent)
 	} else {
 		post.Post.Description = ParseDescription(post.Post.Deviation.Extended.DescriptionText)
 	}
-	// время публикации
-	post.StringTime = post.Post.Deviation.PublishedTime.UTC().String()
-	post.Post.IMG = ParseMedia(post.Post.Deviation.Media)
+
 	for _, x := range post.Post.Deviation.Extended.RelatedContent {
 		if len(x.Deviations) != 0 {
 			post.Related += s.DeviationList(x.Deviations, false)
@@ -203,17 +215,19 @@ func (s skunkyart) Deviation(author, postname string) {
 		post.Tags += tag.String()
 	}
 
-	if post.Post.Comments.Total <= 50 {
-		post.Post.Comments.Cursor = ""
-	}
-
 	post.Comments = s.ParseComments(devianter.GetComments(id, post.Post.Comments.Cursor, s.Page, 1))
+	post.StringTime = post.Post.Deviation.PublishedTime.UTC().String()
+	post.Post.IMG = ParseMedia(post.Post.Deviation.Media)
 
 	s.ExecuteTemplate("deviantion.htm", "html", &s)
 }
 
 func (s skunkyart) DD() {
-	dd := devianter.GetDailyDeviations(s.Page)
+	dd, err := devianter.GetDailyDeviations(s.Page)
+	if err.RAW != nil {
+			s.Error(err)
+			return
+	}
 	var strips strings.Builder
 	for _, x := range dd.Strips {
 		strips.WriteString(`<h3 class="`)
@@ -243,12 +257,13 @@ func (s skunkyart) Search() {
 	}
 
 	var err error
+	var daError devianter.Error
 	ss := &s.Templates.Search
 	switch s.Type {
 	case 'a', 't':
-		ss.Content, err = devianter.PerformSearch(s.Query, s.Page, s.Type)
+		ss.Content, err, daError = devianter.PerformSearch(s.Query, s.Page, s.Type)
 	case 'g', 'f':
-		ss.Content, err = devianter.PerformSearch(s.Query, s.Page, s.Type, s.Args.Get("usr"))
+		ss.Content, err, daError = devianter.PerformSearch(s.Query, s.Page, s.Type, s.Args.Get("usr"))
 	case 'r': // скраппер, поскольку девиантартовцы зажопили гостевое API для поиска групп
 		var (
 			usernames = make(map[int]string)
@@ -297,6 +312,10 @@ func (s skunkyart) Search() {
 		return
 	}
 	try(err)
+	if daError.RAW != nil {
+		s.Error(daError)
+		return
+	}
 
 	if s.Type != 'r' {
 		ss.List = s.DeviationList(ss.Content.Results, false, DeviationList{
diff --git a/config.example.json b/config.example.json
index 5397722..f4909a7 100644
--- a/config.example.json
+++ b/config.example.json
@@ -5,7 +5,7 @@
         "enabled": true,
         "path": "cache",
         "lifetime": null,
-        "max-size": 1024,
+        "max-size": 200,
         "update-interval": 5
     },
     "static-path": "static",
diff --git a/go.mod b/go.mod
index a3cbd52..3cda61a 100644
--- a/go.mod
+++ b/go.mod
@@ -2,8 +2,7 @@ module skunkyart
 
 go 1.18
 
-replace git.macaw.me/skunky/devianter v0.2.5 => /home/skunk/projects/devianter
 require (
-	git.macaw.me/skunky/devianter v0.2.5
+	git.macaw.me/skunky/devianter v0.2.6-0.20240904171839-b3c99749f133
 	golang.org/x/net v0.27.0
 )
diff --git a/go.sum b/go.sum
index 8e79784..323fd90 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,4 @@
-git.macaw.me/skunky/devianter v0.2.5 h1:aAc6CG/ghvG130Ob7gGUdK4IV3MSeCD5t3QIJjto1M0=
-git.macaw.me/skunky/devianter v0.2.5/go.mod h1:ZLn527xBlnpXrUB1B8z/MhyeiWVK4nPWjyfnhWOE8Is=
+git.macaw.me/skunky/devianter v0.2.6-0.20240904171839-b3c99749f133 h1:ziutYUyDmdbsptR8Lj4lNmZUxfgwGsNbHM1mO9ATph8=
+git.macaw.me/skunky/devianter v0.2.6-0.20240904171839-b3c99749f133/go.mod h1:ZLn527xBlnpXrUB1B8z/MhyeiWVK4nPWjyfnhWOE8Is=
 golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
 golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=