From 2c1626cf5a5b42a4e08d3d255232e7b8d04a4e1c Mon Sep 17 00:00:00 2001 From: Vegard Matthey Date: Tue, 7 Apr 2026 05:33:41 +0200 Subject: [PATCH] add image size and comic title to metadata extraction --- ImageViewer/ViewController.swift | 42 ++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/ImageViewer/ViewController.swift b/ImageViewer/ViewController.swift index 2147f07..18e12a6 100644 --- a/ImageViewer/ViewController.swift +++ b/ImageViewer/ViewController.swift @@ -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(