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