add image size and comic title to metadata extraction

This commit is contained in:
2026-04-07 05:33:41 +02:00
parent 5f8bd8b202
commit 2c1626cf5a

View File

@@ -183,8 +183,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
}.sorted { $0.path < $1.path }
for dir in directories {
if !fileManager.fileExists(atPath: dir.appendingPathComponent(metadataFilename).path)
{
if !fileManager.fileExists(atPath: dir.appendingPathComponent(metadataFilename).path) {
getMetadataFromFileName(path: dir)
}
@@ -245,9 +244,24 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
return r
}
func imageSize(at url: URL) -> CGSize? {
guard let source = CGImageSourceCreateWithURL(url as CFURL, nil) else {
return nil
}
guard let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [CFString: Any],
let width = properties[kCGImagePropertyPixelWidth] as? CGFloat,
let height = properties[kCGImagePropertyPixelHeight] as? CGFloat else {
return nil
}
return CGSize(width: width, height: height)
}
func getMetadataFromFileName(path: URL) {
// Beautiful, is it not?
let pattern = "c([0-9]+(?:x[0-9]+)?) \\(v([0-9]+)\\) - p([0-9]+(?:-[0-9]+)?)"
let titlePattern = "^(.*) - c([0-9]+(?:x[0-9]+)?)"
var currentVolume: UInt32! = nil
var currentChapter: (UInt32, UInt32?)!
@@ -265,8 +279,11 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
var currentChapters: [Offset] = []
var currentImages: [Offset] = []
var titleValue: String = ""
do {
let regex = try NSRegularExpression(pattern: pattern)
let titleRegex = try NSRegularExpression(pattern: titlePattern)
let dir = path.appendingPathComponent("images")
let fileURLs = try fileManager.contentsOfDirectory(
@@ -277,6 +294,11 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
let filenames = fileURLs.map { $0.lastPathComponent }.sorted()
for (i, filename) in filenames.enumerated() {
let range = NSRange(filename.startIndex..., in: filename)
if i == 0 {
if let match = titleRegex.firstMatch(in: filename, range: range) {
titleValue = (filename as NSString).substring(with: match.range(at: 1))
}
}
if let match = regex.firstMatch(in: filename, range: range) {
let chapterStr = (filename as NSString).substring(with: match.range(at: 1))
let chapterParts = chapterStr.split(separator: "x", maxSplits: 1)
@@ -292,8 +314,14 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
UInt32(pageParts[0])!, pageParts.count > 1
)
let size = imageSize(at: dir.appendingPathComponent(filename))!
let m_filename = builder.create(string: filename)
let imageMetadata = ImageMetadata.createImageMetadata(&builder, doublePage: doublePage, filenameOffset: m_filename, firstPage: page)
let imageMetadata = ImageMetadata.createImageMetadata(&builder,
doublePage: doublePage,
filenameOffset: m_filename,
firstPage: page,
size: Size(width: UInt32(size.width), height: UInt32(size.height))
)
if currentVolume != nil {
if volume != currentVolume {
@@ -315,7 +343,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
let chaptersOffset = builder.createVector(ofOffsets: currentChapters)
let volumeMetadata = VolumeMetadata.createVolumeMetadata(
&builder,
volume: MetaValue(main: volume ?? 0, bonus: 0),
volume: MetaValue(main: currentVolume, bonus: 0),
titleOffset: volumeTitle,
chaptersVectorOffset: chaptersOffset
)
@@ -370,7 +398,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
let chaptersOffset = builder.createVector(ofOffsets: currentChapters)
let volumeMetadata = VolumeMetadata.createVolumeMetadata(
&builder,
volume: MetaValue(main: volume ?? 0, bonus: 0),
volume: MetaValue(main: volume, bonus: 0),
titleOffset: volumeTitle,
chaptersVectorOffset: chaptersOffset
)
@@ -388,7 +416,7 @@ class ViewController: UIViewController, UIGestureRecognizerDelegate {
print("failed reading image file names")
}
let title = builder.create(string: "")
let title = builder.create(string: titleValue)
let originalLanguage = builder.create(string: "Japanese")
let countryOfOrigin = builder.create(string: "Japan")
let description = builder.create(string: "")
@@ -1238,7 +1266,7 @@ func getGlobalState() -> GlobalState {
if let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
let path = documentsURL.appendingPathComponent("state.json").path
if !fileManager.fileExists(atPath: path) {
GlobalState(comicName: nil)
return GlobalState(comicName: nil)
}
do {
let json = try Data(