From 176c94297bc6dc5b31e3acb115cb5647580f1b67 Mon Sep 17 00:00:00 2001 From: gamer147 Date: Mon, 29 Dec 2025 22:06:12 -0500 Subject: [PATCH] [FA-6] Author's posts seem to work --- Documentation/sample_novel_page.html | 9977 +++++++++++++++++ .../Novelpia/NovelpiaAdapter.cs | 65 +- .../src/lib/components/NovelDetailPage.svelte | 2 +- 3 files changed, 10034 insertions(+), 10 deletions(-) create mode 100644 Documentation/sample_novel_page.html diff --git a/Documentation/sample_novel_page.html b/Documentation/sample_novel_page.html new file mode 100644 index 0000000..ba223af --- /dev/null +++ b/Documentation/sample_novel_page.html @@ -0,0 +1,9977 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 노벨피아 - 웹소설로 꿈꾸는 세상! - 최종보스를 성노예로 샀는데, 집착한다. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

페이지로딩 닫기 +
+ + + + + +
+
+
+
+ + +
+
+
+ +
+ +
+
+ + + + 알림 + + + + 선물함 +
+
+
+
+
+ 메뉴 +
+
+
+
+
+
보유재화
+ +
+
+
+

코인

+
+
+
+

골드코인 +

+

{{ String(Number(mem.mem_coin)).format() }} 코인

+
+ +
+
+
+
+

기타 재화

+
+
+
+

멤버십코인 +

+

{{ String(Number(mem.mem_coin_bonus)).format() }} 코인 + + ({{ mem.mem_temp_coin_enddt }} {{ + String(Number(mem.mem_temp_coin)).format() }}코인 부분 만료) + +

+
+
+

웹툰코인 +

+

{{ String(Number(mem.mem_webtoon_coin)).format() }} 코인 + + ({{mem.mem_webtoon_coin_end_dt}} {{ + String(Number(mem.mem_webtoon_coin)).format() }}코인 부분 만료) + +

+
+
+

북캐시 +

+

{{ String(Number(mem.mem_book_total_point)).format()}} 캐시 + + ({{ String(mem.mem_book_remain_point_end_dt) }} {{ + String(Number(mem.mem_book_remain_point)).format()}}캐시 부분 만료) + +

+
+
+

마일리지

+

{{ String(mem.mem_gacha_mileage).format() }} + 마일리지 +

+
+
+
+
+
+

멤버십코인이란?

+
    +
  • 멤버십 코인은 플러스 멤버십 혜택으로 제공되는 기간 한정 재화로, 웹툰과 북스에서 사용할 수 있습니다.
  • +
  • 기간 중 이용 시 우선 소진되며 유효기간이 지나면 소멸됩니다.
  • +
  • 멤버십 코인의 유효기간은 한 달입니다.
  • +
+
+
+

웹툰코인이란?

+
    +
  • 웹툰에서 회차를 소장할 수 있는 재화입니다.
  • +
  • 웹툰 코인의 유효기간은 한 달입니다.
  • +
+
+
+

북캐시란?

+
    +
  • 북스에서 웹소설을 구매(대여, 소장) 할 수 있는 재화입니다.
  • +
  • 코인으로 북스 상품을 구매할 수 있습니다. (1코인 = 북캐시 100원)
  • +
  • 코인으로 북스 상품 구매하고, 100원 미만의 차액은 북캐시로 적립됩니다.
  • +
  • 보너스 북캐시의 유효기간은 한 달입니다.
  • +
+
+
+

※ 보너스로 지급된 멤버십 코인, 북캐시, 웹툰코인은 기간 한정 재화입니다.

+

※ 보너스 재화는 우선 사용되며, 유효기간이 지나면 소멸됩니다.

+
+
+

마일리지란?

+ +
+
+
+
+
+
+ 일반 + +
+ +
+
+ +

{{ mem.mem_nick }}

+
+
+ +
+
+

지금 첫달 무료로 제한 없는 혜택을 즐겨보세요.

+

PLUS 멤버십 무료로 활성화하기

+
+ + +
+
+
+

지금 첫달 무료로 제한 없는 혜택을 즐겨보세요.

+

본인인증 후 멤버십 무료로 활성화하기

+
+ + +
+
+
+

플러스 멤버십이 활성화 되어 있지 않아요!

+

플러스 멤버십 활성화하기

+
+ +
+
+
+
+ 보유 재화 +
+
+
+
코인 +
+
{{ + String(Number(mem.mem_coin)).format() }}
+
+
+
마일리지 +
+
{{ + String(Number(mem.mem_gacha_mileage)).format() }} +
+
+
+
멤버십 + 코인
+
{{ + String(Number(mem.mem_coin_bonus)).format() }}
+
+ +
+
북캐시 +
+
{{ + String(Number(mem.mem_book_total_point)).format()}} +
+
+
+
+
+ + +
+
+
+
+ +

작품 관리하기

+
+ +
+
+ + +
+
+ + +
+ +
+
+
+
+
+
+
+ +
+ + +
+
+
+
+ +
+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+ 메뉴 +
+
+ +
+
+
+ +
+
+
보유재화
+ +
+
+
+

코인

+
+ +
+
+

골드코인

+

{{ String(Number(mem.mem_coin)).format() }} 코인

+
+ +
+
+
+
+

기타 재화

+
+
+
+

멤버십코인

+

{{ String(Number(mem.mem_coin_bonus)).format() }} 코인 + + ({{ mem.mem_temp_coin_enddt }} {{ String(Number(mem.mem_temp_coin)).format() }}코인 부분 만료) + +

+
+
+

웹툰코인

+

+ {{ String(Number(mem.mem_webtoon_coin)).format() }} 코인 + + ({{mem.mem_webtoon_coin_end_dt}} {{ String(Number(mem.mem_webtoon_coin)).format() }}코인 + 부분 만료) + +

+
+
+

북캐시

+

+ {{ String(Number(mem.mem_book_total_point)).format()}} 캐시 + + ({{ String(mem.mem_book_remain_point_end_dt) }} {{ + String(Number(mem.mem_book_remain_point)).format()}}캐시 부분 만료) + +

+
+
+

마일리지

+

{{ String(Number(mem.mem_gacha_mileage)).format() }} 마일리지 +

+
+
+
+
+
+

멤버십코인이란?

+
    +
  • 멤버십 코인은 플러스 멤버십 혜택으로 제공되는 기간 한정 재화로, 웹툰과 북스에서 사용할 수 있습니다.
  • +
  • 기간 중 이용 시 우선 소진되며 유효기간이 지나면 소멸됩니다.
  • +
  • 멤버십 코인의 유효기간은 한 달입니다.
  • +
+
+
+

웹툰코인이란?

+
    +
  • 웹툰에서 회차를 소장할 수 있는 재화입니다.
  • +
  • 웹툰 코인의 유효기간은 한 달입니다.
  • +
+
+
+

북캐시란?

+
    +
  • 북스에서 웹소설을 구매(대여, 소장) 할 수 있는 재화입니다.
  • +
  • 코인으로 북스 상품을 구매할 수 있습니다. (1코인 = 북캐시 100원)
  • +
  • 코인으로 북스 상품 구매하고, 100원 미만의 차액은 북캐시로 적립됩니다.
  • +
  • 보너스 북캐시의 유효기간은 한 달입니다.
  • +
+
+
+

※ 보너스로 지급된 멤버십 코인, 북캐시, 웹툰코인은 기간 한정 재화입니다.

+

※ 보너스 재화는 우선 사용되며, 유효기간이 지나면 소멸됩니다.

+
+
+

마일리지란?

+ +
+
+
+
+
+
+
+ 일반 + +
+ +
+
+ +

{{ mem.mem_nick }}

+
+
+ +
+
+

지금 첫달 무료로 제한 없는 혜택을 즐겨보세요.

+

PLUS 멤버십 무료로 + 활성화하기

+
+ + +
+
+
+

지금 첫달 무료로 제한 없는 혜택을 즐겨보세요.

+

본인인증 후 멤버십 무료로 + 활성화하기

+
+ + +
+
+
+

플러스 멤버십이 활성화 되어 있지 않아요!

+

플러스 멤버십 활성화하기

+
+ +
+
+
+
+ 보유 재화 +
+
+
+
코인
+
+ {{ String(Number(mem.mem_coin)).format() + }} +
+
+
+
마일리지
+
+ {{ + String(Number(mem.mem_gacha_mileage)).format() }} +
+
+
+
멤버십 코인
+
+ {{ String(Number(mem.mem_coin_bonus)).format() + }} +
+
+ +
+
북캐시
+
{{ + String(Number(mem.mem_book_total_point)).format()}}
+
+
+
+
+ + +
+
+
+
+ +

작품 관리하기

+
+ +
+
+ + +
+
+ + +
+ +
+

앱 종료하기

+
+
+
+
+ +
+
+
+
+

떠나지 않으셨군요, 회원님!
감사합니다😚

+

멤버십 해지 예약이 취소되었습니다.

+
+ +
+
+
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + +
+
+ +
최종보스를 성노예로 샀는데, 집착한다.
+
+

+ 작가명 + + 서레이 +

+

+ PLUS + 독점 + 완결 + + + + + + +

+
+
+
+

조회554,286

+

추천21,289

+
+
+

+ 인생픽 + 공개전 + +

+
+
+ +
+
+

+ #판타지 + #하렘 + #천재 + #집착 + #후회 + #피폐 + #성장 + #청혼 + #순애 + #근친 +

+

+ +나만의태그 추가 +

+
+
+
+

선호선호5,680

+

알람알람688 +

+

회차회차71회차 +

+
+
최종보스를 성노예로 샀는데, 나에게 집착한다. 강제로 살리고 청혼을 할 정도로.
+
+
+ +
+
+
+
+ + +
+
+

+ #판타지 + #하렘 + #천재 + #집착 + #후회 + #피폐 + #성장 + #청혼 + #순애 + #근친 +

+

+ +나만의태그 추가 +

+
+
+
+

선호선호5,680

+

알람알람688

+

회차회차71회차

+
+
+
+ 최종보스를 성노예로 샀는데, 나에게 집착한다. 강제로 살리고 청혼을 할 정도로.
+ +더보기 +
+
+
+
+ +
+
+

+ +

+

+ + 첫 화 무료보기 +

+
+
+ +
+ +
+
+
+ +

+ [ + + ] + 공유하기 +

+
+ + + + + + + + + + + + + + +
+ 주소 복사하기 +

링크복사

+
+ +
+ 주소 복사하기 +

더보기

+
+
+
+
+ + +
+
+ 우수 리뷰 + 더보기 +
+ +
+
+
+
+
+
+ + + + + + +
+ + + + + + + + + + + + + +
+ +
+ + + +
+ + + + +
+ + + + + + + + + + + + + + + + +
+ + +
회차리스트 +
+
+ 첫화부터 + +
+
+ +

작가티콘

+
+
+
+
+
+ +

작가티콘

+
+ +
+ 첫화부터 + +
+
+
+
작가 후원
+
+
+
+
+ + 내 누적 후원 코인 + +
+
+ 0 코인 +
+
+ + + + + +
+
+ 작가후원하기 +
+
+
+ + + + + + +
+
+ 최근 30일
+
+
+ 누적 후원
+
+ + + + + + + + + + + + +
후원된 내역이 없습니다.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+
추천 작품
+
+ + + + + + + + + +
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
차기작! 공?지
+
+ + +   461회    1개    5회  + + +
+
+ 공지시간
24.03.02 +
+
+
곧 50회차 기념 Q&A!!! +
+
+ + +   351회    40개    11회  + + +
+
+ 공지시간
24.01.20 +
+
+
J컵 성치녀.
+
+ + +   8,383회    26개    56회  + + +
+
+ 공지시간
24.01.05 +
더보기 (8)
+
+ +
+
+
+ + + +
+
+ + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ +
+
+ +
+
후원 혜택
+
+
+
+ ·후원 휘장 + + +
+
+
후원 휘장이란? x
+

해당 작가님께 후원을 하실수록 휘장의 등급이 올라갑니다. 작품에 댓글을 달면서 휘장을 뽐내보세요!

+

※ 해당 후원 휘장은 후원한 작가님의 작품 댓글에서만 노출됩니다.

+
+
+
※ 누적 코인에 따른 후원 휘장 등급 안내
+
나무 휘장 : 누적 코인 10코인 +
+
강철 휘장 : 누적 코인 100코인 +
+
적색 휘장 : 누적 코인 500코인 +
+
은 휘장 : 누적 코인 1,000코인 +
+
황금 휘장 : 누적 코인 5,000코인 +
+
+
+
+
+
+ + + + + +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+ 코인 더 후원시, 강철휘장 획득! +
+
+
+
+
+
+
+
전달하실 코인
+
+
+ 코인 +
+
+
+1
+
+10
+
+50
+
+100
+
+1,000
+
+
+
+
+
전달하실 메세지
+ + +
+ + +
+ + + +
+
+
+ + +
+
+
+
+
+ +
+
+ 후원이 완료 되었습니다 +
+
+
+
+
+
닫기
+
후원내역
+
+
+ +
+
+ 후원창 닫기 +
+
+
+ +
+ +
+ 을 획득했습니다!
+ 댓글에서 휘장을 자랑해보세요. +
+
+
+
닫기
+
+
+ + + + + + + + + +
+ + + +
+ + +
+
+
+
+
+
+
+
+ +
+
+ 보유열람권 +
+
+
+
+
+ + +
+
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + +
+
+ +
+
+
+ + +
+
+
+
+

최근 본 작품

+

+

+
+
+
+
+
+
+ +
+
+ + + +
+
+
+
+ SNS 계정으로 1초만에 + 가입하기 +
+
+
+ +
+ + + + + +
+

추천인코드

+ +
+ + +
+ + +
+
+
+ + + + + + + + +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+

+

+
+ +
+

+

북스

+
+ +
+
+ + + +
+
+
+

+ + +

+

알림

+
+
+

+

최근기록

+
+
+
+ + + \ No newline at end of file diff --git a/FictionArchive.Service.NovelService/Services/SourceAdapters/Novelpia/NovelpiaAdapter.cs b/FictionArchive.Service.NovelService/Services/SourceAdapters/Novelpia/NovelpiaAdapter.cs index ad8a56f..9906992 100644 --- a/FictionArchive.Service.NovelService/Services/SourceAdapters/Novelpia/NovelpiaAdapter.cs +++ b/FictionArchive.Service.NovelService/Services/SourceAdapters/Novelpia/NovelpiaAdapter.cs @@ -132,7 +132,10 @@ public class NovelpiaAdapter : ISourceAdapter { novel.SourceTags.Add(tag); } - + + // Author's posts (from notice_table in the page HTML) + var authorsPosts = ParseAuthorsPosts(novelData); + // Chapters uint page = 0; List chapters = new List(); @@ -169,16 +172,24 @@ public class NovelpiaAdapter : ISourceAdapter page++; } - // Wrap all chapters in a single "Main Story" volume - novel.Volumes = new List + // Add Author's Posts volume if there are any + if (authorsPosts.Count > 0) { - new VolumeMetadata + novel.Volumes.Add(new VolumeMetadata { - Order = 1, - Name = "Main Story", - Chapters = chapters - } - }; + Order = 0, + Name = "Author's Posts", + Chapters = authorsPosts + }); + } + + // Main Story volume + novel.Volumes.Add(new VolumeMetadata + { + Order = 1, + Name = "Main Story", + Chapters = chapters + }); return novel; } @@ -251,4 +262,40 @@ public class NovelpiaAdapter : ISourceAdapter } return await image.Content.ReadAsByteArrayAsync(); } + + private List ParseAuthorsPosts(string novelHtml) + { + var posts = new List(); + + // Find the notice_table section + var noticeTableMatch = Regex.Match(novelHtml, + @"(?s)]*class=""notice_table[^""]*""[^>]*>(.*?)"); + if (!noticeTableMatch.Success) + return posts; + + var tableContent = noticeTableMatch.Groups[1].Value; + + // Find all td elements with onclick containing viewer URL and extract title from + // HTML structure: Title + var postMatches = Regex.Matches(tableContent, + @"onclick=""[^""]*location='/viewer/(\d+)'[^""]*""[^>]*>([^<]+)"); + + uint order = 1; + foreach (Match match in postMatches) + { + string viewerId = match.Groups[1].Value; + string title = WebUtility.HtmlDecode(match.Groups[2].Value.Trim()); + + posts.Add(new ChapterMetadata + { + Revision = 0, + Order = order, + Url = $"https://novelpia.com/viewer/{viewerId}", + Name = title + }); + order++; + } + + return posts; + } } \ No newline at end of file diff --git a/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte b/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte index 63ab147..3358740 100644 --- a/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte +++ b/fictionarchive-web-astro/src/lib/components/NovelDetailPage.svelte @@ -707,7 +707,7 @@ /> - {#if !currentImage.isCover && currentImage.volumeOrder && currentImage.chapterOrder} + {#if !currentImage.isCover && currentImage.volumeOrder != null && currentImage.chapterOrder}