summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorlost+skunk <[email protected]>2024-09-02 11:16:54 +0300
committerlost+skunk <[email protected]>2024-09-02 11:16:54 +0300
commit14645842643c4e5fa542def715ac1629e182388c (patch)
tree80da1c9b891ce8b4f2393311f36f4530176366af /app
parent2f8c35ba322e3c8c6e0bff8f7818d4eedf002928 (diff)
downloadskunky-art-14645842643c4e5fa542def715ac1629e182388c.tar.gz
skunky-art-14645842643c4e5fa542def715ac1629e182388c.tar.bz2
skunky-art-14645842643c4e5fa542def715ac1629e182388c.zip
instance list update
Diffstat (limited to 'app')
-rw-r--r--app/api.go34
-rw-r--r--app/cache.go31
-rw-r--r--app/parsers.go6
-rw-r--r--app/router.go10
-rw-r--r--app/util.go9
-rw-r--r--app/wrapper.go6
6 files changed, 72 insertions, 24 deletions
diff --git a/app/api.go b/app/api.go
new file mode 100644
index 0000000..ddc67c1
--- /dev/null
+++ b/app/api.go
@@ -0,0 +1,34 @@
+package app
+
+import (
+ "math/rand"
+ "strings"
+
+ "git.macaw.me/skunky/devianter"
+)
+
+type API struct {
+ skunkyartLink *skunkyart
+}
+
+func (a API) sendMedia(d *devianter.Deviation) {
+ mediaUrl, name := devianter.UrlFromMedia(d.Media)
+
+ var filename strings.Builder
+ filename.WriteString(`filename="`)
+ filename.WriteString(name)
+ filename.WriteString(`"`)
+ a.skunkyartLink.Writer.Header().Add("Content-Disposition", filename.String())
+
+ if len(mediaUrl) != 0 {
+ mediaUrl = mediaUrl[21:]
+ dot := strings.Index(mediaUrl, ".")
+ a.skunkyartLink.DownloadAndSendMedia(mediaUrl[:dot], mediaUrl[dot+11:])
+ }
+}
+
+func (a API) Random() {
+ s, err := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a')
+ try(err)
+ a.sendMedia(&s.Results[rand.Intn(len(s.Results))])
+}
diff --git a/app/cache.go b/app/cache.go
index 6506cfc..cbf2432 100644
--- a/app/cache.go
+++ b/app/cache.go
@@ -26,9 +26,11 @@ func (s skunkyart) DownloadAndSendMedia(subdomain, path string) {
url.WriteString(subdomain)
url.WriteString(".wixmp.com/")
url.WriteString(path)
- url.WriteString("?token=")
- url.WriteString(s.Args.Get("token"))
-
+ if t := s.Args.Get("token"); t != "" {
+ url.WriteString("?token=")
+ url.WriteString(t)
+ }
+
var response []byte
switch {
@@ -40,17 +42,18 @@ func (s skunkyart) DownloadAndSendMedia(subdomain, path string) {
if tempFS[fileName] == nil {
tempFS[fileName] = &file{}
}
- f := *tempFS[fileName]
mx.Unlock()
- if f.Content != nil {
- f.Score += 2
+ if tempFS[fileName].Content != nil {
+ response = tempFS[fileName].Content
+ tempFS[fileName].Score += 2
+ break
} else {
file, err := os.Open(filePath)
if err != nil {
if dwnld := Download(url.String()); dwnld.Status == 200 && dwnld.Headers["Content-Type"][0][:5] == "image" {
- f.Content = dwnld.Body
- try(os.WriteFile(filePath, f.Content, 0700))
+ response = dwnld.Body
+ try(os.WriteFile(filePath, response, 0700))
} else {
s.ReturnHTTPError(dwnld.Status)
return
@@ -58,11 +61,16 @@ func (s skunkyart) DownloadAndSendMedia(subdomain, path string) {
} else {
file, e := io.ReadAll(file)
try(e)
- f.Content = file
+ response = file
}
go func() {
defer restore()
+
+ mx.RLock()
+ tempFS[fileName].Content = response
+ mx.RUnlock()
+
for {
time.Sleep(1 * time.Minute)
@@ -77,11 +85,6 @@ func (s skunkyart) DownloadAndSendMedia(subdomain, path string) {
}
}()
}
-
- mx.Lock()
- tempFS[fileName] = &f
- mx.Unlock()
- response = f.Content
case CFG.Proxy:
dwnld := Download(url.String())
if dwnld.Status != 200 {
diff --git a/app/parsers.go b/app/parsers.go
index f93c18d..3a318be 100644
--- a/app/parsers.go
+++ b/app/parsers.go
@@ -82,8 +82,9 @@ func (s skunkyart) DeviationList(devs []devianter.Deviation, allowAtom bool, con
for i, l := 0, len(devs); i < l; i++ {
data := &devs[i]
- if preview, fullview := ParseMedia(data.Media, data.Title, 320), ParseMedia(data.Media, data.Title); !(data.NSFW && !CFG.Nsfw) {
+ if preview, fullview := ParseMedia(data.Media, 320), ParseMedia(data.Media); !(data.NSFW && !CFG.Nsfw) {
if allowAtom && s.Atom {
+ s.Writer.Header().Add("Content-type", "application/atom+xml")
id := strconv.Itoa(data.ID)
listContent.WriteString(`<entry><author><name>`)
listContent.WriteString(data.Author.Username)
@@ -183,6 +184,7 @@ type text struct {
To int
}
+// переписать весь этот пиздец нахуй
func ParseDescription(dscr devianter.Text) string {
var parsedDescription strings.Builder
TagBuilder := func(content string, tags ...string) string {
@@ -286,7 +288,7 @@ func ParseDescription(dscr devianter.Text) string {
parsedDescription.WriteString(`<a href="`)
parsedDescription.WriteString(ConvertDeviantArtUrlToSkunkyArt(d.Url))
parsedDescription.WriteString(`"><img width="50%" src="`)
- parsedDescription.WriteString(ParseMedia(d.Media, d.Title))
+ parsedDescription.WriteString(ParseMedia(d.Media))
parsedDescription.WriteString(`" title="`)
parsedDescription.WriteString(d.Author.Username)
parsedDescription.WriteString(" - ")
diff --git a/app/router.go b/app/router.go
index 35550f8..2bcaf41 100644
--- a/app/router.go
+++ b/app/router.go
@@ -83,13 +83,15 @@ func Router() {
}
skunky.Endpoint = path[1]
+ skunky.API.skunkyartLink = &skunky
// пути
switch skunky.Endpoint {
default:
skunky.ReturnHTTPError(404)
+
case "":
- w.Write(open("html/index.htm"))
+ skunky.ExecuteTemplate("index.htm", "html", &CFG.URI)
case "post":
skunky.Deviation(path[2], path[3])
case "search":
@@ -120,6 +122,12 @@ func Router() {
w.Write(open("css/skunky.css"))
case "favicon.ico":
w.Write(open("images/logo.png"))
+
+ case "api":
+ switch path[2] {
+ case "random":
+ skunky.API.Random()
+ }
}
}
diff --git a/app/util.go b/app/util.go
index 8e8ef6e..71e7d89 100644
--- a/app/util.go
+++ b/app/util.go
@@ -63,6 +63,8 @@ type skunkyart struct {
BasePath, Endpoint string
Query, QueryRaw string
+ API API
+
Templates struct {
About struct {
Proxy bool
@@ -182,13 +184,12 @@ func Download(urlString string) (d Downloaded) {
}
/* PARSING HELPERS */
-func ParseMedia(media devianter.Media, filename string, thumb ...int) string {
- mediaUrl := devianter.UrlFromMedia(media, thumb...)
+func ParseMedia(media devianter.Media, thumb ...int) string {
+ mediaUrl, filename := devianter.UrlFromMedia(media, thumb...)
if len(mediaUrl) != 0 && CFG.Proxy {
mediaUrl = mediaUrl[21:]
dot := strings.Index(mediaUrl, ".")
-
- return UrlBuilder("media", "file", mediaUrl[:dot], mediaUrl[dot+11:], "&filename=", url.QueryEscape(filename))
+ return UrlBuilder("media", "file", mediaUrl[:dot], mediaUrl[dot+11:], "&filename=", filename)
}
return mediaUrl
}
diff --git a/app/wrapper.go b/app/wrapper.go
index e0e5054..f78d8c8 100644
--- a/app/wrapper.go
+++ b/app/wrapper.go
@@ -74,7 +74,7 @@ func (s skunkyart) GRUser() {
case "cover_deviation":
group.About.BGMeta = x.ModuleData.CoverDeviation.Deviation
group.About.BGMeta.Url = ConvertDeviantArtUrlToSkunkyArt(group.About.BGMeta.Url)
- group.About.BG = ParseMedia(group.About.BGMeta.Media, group.About.BGMeta.Title)
+ group.About.BG = ParseMedia(group.About.BGMeta.Media)
case "group_admins":
var htm strings.Builder
for _, z := range x.ModuleData.GroupAdmins.Results {
@@ -122,7 +122,7 @@ func (s skunkyart) GRUser() {
folders.WriteString(`<a href="`)
folders.WriteString(ConvertDeviantArtUrlToSkunkyArt(x.Thumb.Url))
folders.WriteString(`"><img loading="lazy" src="`)
- folders.WriteString(ParseMedia(x.Thumb.Media, x.Thumb.Title))
+ folders.WriteString(ParseMedia(x.Thumb.Media))
folders.WriteString(`" title="`)
folders.WriteString(x.Thumb.Title)
folders.WriteString(`"></a>`)
@@ -185,7 +185,7 @@ func (s skunkyart) Deviation(author, postname string) {
}
// время публикации
post.StringTime = post.Post.Deviation.PublishedTime.UTC().String()
- post.Post.IMG = ParseMedia(post.Post.Deviation.Media, post.Post.Deviation.Title)
+ 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)