[FA-6] Author's posts seem to work
This commit is contained in:
9977
Documentation/sample_novel_page.html
Normal file
9977
Documentation/sample_novel_page.html
Normal file
File diff suppressed because it is too large
Load Diff
@@ -133,6 +133,9 @@ 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<ChapterMetadata> chapters = new List<ChapterMetadata>();
|
||||
@@ -169,16 +172,24 @@ public class NovelpiaAdapter : ISourceAdapter
|
||||
page++;
|
||||
}
|
||||
|
||||
// Wrap all chapters in a single "Main Story" volume
|
||||
novel.Volumes = new List<VolumeMetadata>
|
||||
// Add Author's Posts volume if there are any
|
||||
if (authorsPosts.Count > 0)
|
||||
{
|
||||
new VolumeMetadata
|
||||
novel.Volumes.Add(new VolumeMetadata
|
||||
{
|
||||
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<ChapterMetadata> ParseAuthorsPosts(string novelHtml)
|
||||
{
|
||||
var posts = new List<ChapterMetadata>();
|
||||
|
||||
// Find the notice_table section
|
||||
var noticeTableMatch = Regex.Match(novelHtml,
|
||||
@"(?s)<table[^>]*class=""notice_table[^""]*""[^>]*>(.*?)</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 <b>
|
||||
// HTML structure: <td ... onclick="...location='/viewer/3330612';"><b>Title</b>
|
||||
var postMatches = Regex.Matches(tableContent,
|
||||
@"onclick=""[^""]*location='/viewer/(\d+)'[^""]*""[^>]*><b>([^<]+)</b>");
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -707,7 +707,7 @@
|
||||
/>
|
||||
|
||||
<!-- Chapter link (if not cover) -->
|
||||
{#if !currentImage.isCover && currentImage.volumeOrder && currentImage.chapterOrder}
|
||||
{#if !currentImage.isCover && currentImage.volumeOrder != null && currentImage.chapterOrder}
|
||||
<a
|
||||
href="/novels/{novelId}/volumes/{currentImage.volumeOrder}/chapters/{currentImage.chapterOrder}"
|
||||
class="text-white/80 hover:text-white text-sm inline-flex items-center gap-1 mt-3"
|
||||
|
||||
Reference in New Issue
Block a user