Related novels

This commit is contained in:
VnPower
2024-02-25 08:45:16 +07:00
parent 65e08f66da
commit 8b00751505
7 changed files with 110 additions and 70 deletions
+6
View File
@@ -121,3 +121,9 @@ func GetNovelURL(id string) string {
return fmt.Sprintf(base, id)
}
func GetNovelRelatedURL(id string, limit int) string {
base := "https://www.pixiv.net/ajax/novel/%s/recommend/init?limit=%d"
return fmt.Sprintf(base, id, limit)
}
+2 -3
View File
@@ -9,8 +9,8 @@ import (
"sync"
"time"
session "codeberg.org/vnpower/pixivfe/v2/core/user"
http "codeberg.org/vnpower/pixivfe/v2/core/http"
session "codeberg.org/vnpower/pixivfe/v2/core/user"
"github.com/goccy/go-json"
"github.com/gofiber/fiber/v2"
)
@@ -342,7 +342,7 @@ func GetArtworkByID(c *fiber.Ctx, id string, full bool) (*Illust, error) {
sort.Slice(recent[:], func(i, j int) bool {
left := recent[i].ID
right := recent[j].ID
return numberGreaterThan(left,right)
return numberGreaterThan(left, right)
})
illust.RecentWorks = recent
}()
@@ -366,7 +366,6 @@ func GetArtworkByID(c *fiber.Ctx, id string, full bool) (*Illust, error) {
var err error
comments, err := GetArtworkComments(c, id)
if err != nil {
println("here")
cerr <- err
return
}
+23 -1
View File
@@ -3,8 +3,8 @@ package core
import (
"time"
session "codeberg.org/vnpower/pixivfe/v2/core/user"
http "codeberg.org/vnpower/pixivfe/v2/core/http"
session "codeberg.org/vnpower/pixivfe/v2/core/user"
"github.com/goccy/go-json"
"github.com/gofiber/fiber/v2"
)
@@ -101,3 +101,25 @@ func GetNovelByID(c *fiber.Ctx, id string) (Novel, error) {
return novel, nil
}
func GetNovelRelated(c *fiber.Ctx, id string) ([]NovelBrief, error) {
var novels struct {
List []NovelBrief `json:"novels"`
}
// hard-coded value, may change
URL := http.GetNovelRelatedURL(id, 100)
response, err := http.UnwrapWebAPIRequest(c.Context(), URL, "")
if err != nil {
return novels.List, err
}
response = session.ProxyImageUrl(c, response)
err = json.Unmarshal([]byte(response), &novels)
if err != nil {
return novels.List, err
}
return novels.List, nil
}
+8 -2
View File
@@ -19,9 +19,15 @@ func NovelPage(c *fiber.Ctx) error {
return err
}
related, err := core.GetNovelRelated(c, id)
if err != nil {
return err
}
// todo: passing ArtWorkData{} here will not work. maybe lowercase?
return c.Render("pages/novel", fiber.Map{
"Novel": novel,
"Title": novel.Title,
"Novel": novel,
"NovelRelated": related,
"Title": novel.Title,
})
}
+65
View File
@@ -0,0 +1,65 @@
<div class="novel-card">
<div class="novel-detail">
<div class="novel-cover">
<a href="/novel/{{ .ID }}">
<img src="{{ .CoverURL }}" alt="{{ .Title }}" />
</a>
</div>
<div class="novel-metadata">
<a href="/novel/{{ .ID }}">
<div class="novel-title">
{{ .Title }}
</div>
</a>
<small><span>{{ .WordCount }} word(s)</span>&nbsp;<span>{{ floor: .ReadingTime / 60 }} min</span></small>
<a href="/users/{{ .UserID }}">
<div class="novel-author">
<img src="{{ .UserAvatar }}" alt="{{ .UserName }}" />
<span>{{ .UserName }}</span>
</div>
</a>
<p class="novel-description">{{ raw: .Description }}</p>
<div class="illust-tags">
{{ if .AiType == 2 }}
<span class="illust-tag">
<span class="illust-tag-name" id="highlight">AI-generated</span>
</span>
{{ end }}
{{ if .IsOriginal }}
<span class="illust-tag">
<span class="illust-tag-name">Original</span>
</span>
{{ end }}
{{ if .Genre != "0" }}
<span class="illust-tag">
<span class="illust-tag-name">{{ novelGenre: .Genre }}</span>
</span>
{{ end }}
{{ range .Tags }} {{ if isEmphasize(.) }}
<span class="illust-tag">
<span class="illust-tag-name" id="highlight">{{ . }}</span>
</span>
{{ else }}
<span class="illust-tag">
<span class="illust-tag-translation"
><a href="/tags/{{ escapeString(.) }}">#{{ . }}</a></span
>
</span>
{{ end }} {{ end }}
</div>
<div class="illust-tags">
<span class="illust-tag-attr">
<img src="/assets/heart-solid.png" alt="Bookmarks" />
{{ .Bookmarks }}
</span>
<span class="illust-tag-attr">
<img src="/assets/calendar.png" alt="Date" />
{{ parseTime: .CreateDate }}
</span>
</div>
</div>
</div>
</div>
+5
View File
@@ -62,4 +62,9 @@
<div class="novel-content">
{{ raw: renderNovel(Novel.Content) }}
</div>
<div class="novel-container">
{{ range NovelRelated }}
{{ include "components/novel-tn" . }}
{{ end }}
</div>
</div>
+1 -64
View File
@@ -14,70 +14,7 @@
</div>
<div class="novel-container">
{{ range Novels }}
<div class="novel-card">
<div class="novel-detail">
<div class="novel-cover">
<a href="/novel/{{ .ID }}">
<img src="{{ .CoverURL }}" alt="{{ .Title }}" />
</a>
</div>
<div class="novel-metadata">
<a href="/novel/{{ .ID }}">
<div class="novel-title">
{{ .Title }}
</div>
</a>
<small><span>{{ .WordCount }} word(s)</span>&nbsp;<span>{{ floor: .ReadingTime / 60 }} min</span></small>
<a href="/users/{{ .UserID }}">
<div class="novel-author">
<img src="{{ .UserAvatar }}" alt="{{ .UserName }}" />
<span>{{ .UserName }}</span>
</div>
</a>
<p class="novel-description">{{ raw: .Description }}</p>
<div class="illust-tags">
{{ if .AiType == 2 }}
<span class="illust-tag">
<span class="illust-tag-name" id="highlight">AI-generated</span>
</span>
{{ end }}
{{ if .IsOriginal }}
<span class="illust-tag">
<span class="illust-tag-name">Original</span>
</span>
{{ end }}
{{ if .Genre != "0" }}
<span class="illust-tag">
<span class="illust-tag-name">{{ novelGenre: .Genre }}</span>
</span>
{{ end }}
{{ range .Tags }} {{ if isEmphasize(.) }}
<span class="illust-tag">
<span class="illust-tag-name" id="highlight">{{ . }}</span>
</span>
{{ else }}
<span class="illust-tag">
<span class="illust-tag-translation"
><a href="/tags/{{ escapeString(.) }}">#{{ . }}</a></span
>
</span>
{{ end }} {{ end }}
</div>
<div class="illust-tags">
<span class="illust-tag-attr">
<img src="/assets/heart-solid.png" alt="Bookmarks" />
{{ .Bookmarks }}
</span>
<span class="illust-tag-attr">
<img src="/assets/calendar.png" alt="Date" />
{{ parseTime: .CreateDate }}
</span>
</div>
</div>
</div>
</div>
{{ include "components/novel-tn" . }}
{{ end }}
</div>
<div class="pagination">