diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..1e11b18 Binary files /dev/null and b/.DS_Store differ diff --git a/Info.plist b/Info.plist new file mode 100644 index 0000000..4572688 --- /dev/null +++ b/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSSupportsOpeningDocumentsInPlace + + UIFileSharingEnabled + + UILaunchScreen + + + diff --git a/Sources/App/TagMasterApp.swift b/Sources/App/TagMasterApp.swift new file mode 100644 index 0000000..fd6105e --- /dev/null +++ b/Sources/App/TagMasterApp.swift @@ -0,0 +1,10 @@ +import SwiftUI + +@main +struct TagMasterApp: App { + var body: some Scene { + WindowGroup { + MainImportView() + } + } +} diff --git a/Sources/Models/Track.swift b/Sources/Models/Track.swift new file mode 100644 index 0000000..788e844 --- /dev/null +++ b/Sources/Models/Track.swift @@ -0,0 +1,25 @@ +import Foundation +import SwiftUI + +struct Track: Identifiable, Hashable { + let id = UUID() + var originalURL: URL? + var songName: String = "" + var trackNumber: String = "" + var discNumber: String = "" +} + +struct BatchMetadata { + var artist: String = "" + var album: String = "" + var albumArtist: String = "" + var composer: String = "" + var grouping: String = "" + var genre: String = "Speech" + var year: String = "" + var compilation: Bool = false + var rating: Int = 0 + var bpm: String = "" + var comments: String = "" + var coverArt: UIImage? = nil +} diff --git a/Sources/ViewModels/EditorViewModel.swift b/Sources/ViewModels/EditorViewModel.swift new file mode 100644 index 0000000..97b6ff2 --- /dev/null +++ b/Sources/ViewModels/EditorViewModel.swift @@ -0,0 +1,58 @@ +import SwiftUI +import UniformTypeIdentifiers + +@MainActor +class EditorViewModel: ObservableObject { + @Published var batchData = BatchMetadata() + @Published var tracks: [Track] = [] + @Published var isProcessing = false + @Published var shareZipURL: URL? + + // Simulating the import process + func importFiles() { + // In reality, you'd use a UIDocumentPickerViewController or ZIPFoundation to extract + tracks = [ + Track(songName: "Preface", trackNumber: "1", discNumber: "1"), + Track(songName: "Chapter 1", trackNumber: "2", discNumber: "1") + ] + } + + func exportAndZip() async { + isProcessing = true + + // 1. Create staging directory + let fm = FileManager.default + let tempDir = fm.temporaryDirectory.appendingPathComponent(UUID().uuidString) + try? fm.createDirectory(at: tempDir, withIntermediateDirectories: true) + + // 2. Save Cover Art + if let cover = batchData.coverArt, let data = cover.jpegData(compressionQuality: 0.8) { + let coverURL = tempDir.appendingPathComponent("cover.jpg") + try? data.write(to: coverURL) + } + + // 3. Process, Rename, and Move Files + // Format: [Disc]-[Track]-[Songname].[ext] + for track in tracks { + let safeSong = track.songName.replacingOccurrences(of: "/", with: "-") + let dNum = track.discNumber.isEmpty ? "01" : String(format: "%02d", Int(track.discNumber) ?? 1) + let tNum = track.trackNumber.isEmpty ? "01" : String(format: "%02d", Int(track.trackNumber) ?? 1) + + let filename = "\(dNum)-\(tNum)-\(safeSong).flac" // Defaulting to flac for demo + let destinationURL = tempDir.appendingPathComponent(filename) + + // Here you would write the ID3 metadata to the file using AVAssetExportSession or ID3TagEditor + // and copy it to the destinationURL. + try? "Simulated Audio Data".write(to: destinationURL, atomically: true, encoding: .utf8) + } + + // 4. Zip the folder + let zipURL = fm.temporaryDirectory.appendingPathComponent("\(batchData.album.isEmpty ? "Export" : batchData.album).zip") + // NOTE: Use ZIPFoundation here to zip `tempDir` to `zipURL` + // try? fm.zipItem(at: tempDir, to: zipURL) + + // 5. Present Share Sheet + self.shareZipURL = zipURL + self.isProcessing = false + } +} diff --git a/Sources/Views/EditorView.swift b/Sources/Views/EditorView.swift new file mode 100644 index 0000000..5259606 --- /dev/null +++ b/Sources/Views/EditorView.swift @@ -0,0 +1,101 @@ +import SwiftUI + +struct EditorView: View { + @ObservedObject var viewModel: EditorViewModel + @State private var showingImagePicker = false + + var body: some View { + Form { + Section(header: Text("Album Artwork")) { + HStack { + Spacer() + Button(action: { showingImagePicker = true }) { + if let img = viewModel.batchData.coverArt { + Image(uiImage: img) + .resizable() + .scaledToFit() + .frame(width: 150, height: 150) + .cornerRadius(8) + } else { + ZStack { + RoundedRectangle(cornerRadius: 8) + .fill(Color(uiColor: .systemGray5)) + .frame(width: 150, height: 150) + Image(systemName: "photo") + .font(.largeTitle) + .foregroundColor(.gray) + } + } + } + Spacer() + } + } + + Section(header: Text("Batch Metadata (Applies to all)")) { + TextField("Artist", text: $viewModel.batchData.artist) + TextField("Album", text: $viewModel.batchData.album) + TextField("Album Artist", text: $viewModel.batchData.albumArtist) + TextField("Composer", text: $viewModel.batchData.composer) + TextField("Grouping", text: $viewModel.batchData.grouping) + TextField("Genre", text: $viewModel.batchData.genre) + TextField("Year", text: $viewModel.batchData.year) + .keyboardType(.numberPad) + Toggle("Compilation (Various Artists)", isOn: $viewModel.batchData.compilation) + TextField("BPM", text: $viewModel.batchData.bpm) + .keyboardType(.numberPad) + TextField("Comments", text: $viewModel.batchData.comments) + } + + Section(header: Text("Individual Track Data")) { + ForEach($viewModel.tracks) { $track in + VStack(alignment: .leading) { + TextField("Song Name", text: $track.songName) + .font(.headline) + HStack { + TextField("Disc", text: $track.discNumber) + .keyboardType(.numberPad) + .frame(width: 50) + Text("-") + TextField("Track", text: $track.trackNumber) + .keyboardType(.numberPad) + .frame(width: 50) + } + } + .padding(.vertical, 4) + } + } + } + .navigationTitle("Edit Tags") + .navigationBarTitleDisplayMode(.inline) + .toolbar { + ToolbarItem(placement: .navigationBarTrailing) { + Button("Export ZIP") { + Task { + await viewModel.exportAndZip() + } + } + .disabled(viewModel.isProcessing) + } + } + .sheet(item: Binding( + get: { viewModel.shareZipURL.map { ShareURL(url: $0) } }, + set: { if $0 == nil { viewModel.shareZipURL = nil } } + )) { shareItem in + ShareSheet(activityItems: [shareItem.url]) + } + } +} + +// Helpers for ShareSheet mapping +struct ShareURL: Identifiable { + let id = UUID() + let url: URL +} + +struct ShareSheet: UIViewControllerRepresentable { + var activityItems: [Any] + func makeUIViewController(context: Context) -> UIActivityViewController { + UIActivityViewController(activityItems: activityItems, applicationActivities: nil) + } + func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {} +} diff --git a/Sources/Views/MainImportView.swift b/Sources/Views/MainImportView.swift new file mode 100644 index 0000000..c189593 --- /dev/null +++ b/Sources/Views/MainImportView.swift @@ -0,0 +1,33 @@ +import SwiftUI + +struct MainImportView: View { + @StateObject private var viewModel = EditorViewModel() + @State private var showEditor = false + + var body: some View { + NavigationStack { + VStack { + Button(action: { + viewModel.importFiles() + showEditor = true + }) { + VStack(spacing: 20) { + Image(systemName: "plus.circle.fill") + .font(.system(size: 80)) + Text("Import Zip or Audio Files") + .font(.title2.bold()) + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background(Color(uiColor: .secondarySystemBackground)) + .cornerRadius(20) + .padding() + } + .buttonStyle(PlainButtonStyle()) + } + .navigationTitle("TagMaster") + .navigationDestination(isPresented: $showEditor) { + EditorView(viewModel: viewModel) + } + } + } +} diff --git a/TagMaster.xcodeproj/project.pbxproj b/TagMaster.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8e493a3 --- /dev/null +++ b/TagMaster.xcodeproj/project.pbxproj @@ -0,0 +1,364 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 24699FE22C1CA273526A7F00 /* EditorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A4967029EB9623BF8EBFB96 /* EditorView.swift */; }; + 532F02E8FD3A3DDB7638F3AC /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = 81BAF38189EA665DB7F0ADAB /* ZIPFoundation */; }; + 64F9CE5F7F9E849ABC2F28F4 /* EditorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B7584CD1B4714CC0B3623E9 /* EditorViewModel.swift */; }; + A671247AA2BF3958E48DF509 /* MainImportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF4E016D299B195D23A439A6 /* MainImportView.swift */; }; + D48515953E1ECE08E1B7A2C5 /* Track.swift in Sources */ = {isa = PBXBuildFile; fileRef = 705426259912E57439983143 /* Track.swift */; }; + E35AC07D26043CDE632C77DF /* TagMasterApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33185AC1D011C5790AAEABB0 /* TagMasterApp.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 07ADE7E4792A98BE9F5320D7 /* TagMaster.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = TagMaster.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1B7584CD1B4714CC0B3623E9 /* EditorViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorViewModel.swift; sourceTree = ""; }; + 33185AC1D011C5790AAEABB0 /* TagMasterApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagMasterApp.swift; sourceTree = ""; }; + 5A4967029EB9623BF8EBFB96 /* EditorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorView.swift; sourceTree = ""; }; + 705426259912E57439983143 /* Track.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Track.swift; sourceTree = ""; }; + AF4E016D299B195D23A439A6 /* MainImportView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainImportView.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B3ED9C41320B3AD23AF5D522 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 532F02E8FD3A3DDB7638F3AC /* ZIPFoundation in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0786FC0C08BCC999BB96B678 /* Sources */ = { + isa = PBXGroup; + children = ( + F33C92270C13063431683668 /* App */, + 0F968F602B9E056E487855D5 /* Models */, + CD8A4F908E22769095D6D1C1 /* ViewModels */, + 3F8F1037C6A6B2A66BA14992 /* Views */, + ); + path = Sources; + sourceTree = ""; + }; + 0A7DD76DBB4B7EAA5B1B4AC9 = { + isa = PBXGroup; + children = ( + 0786FC0C08BCC999BB96B678 /* Sources */, + 25A98F3E183C554DE4B67719 /* Products */, + ); + sourceTree = ""; + }; + 0F968F602B9E056E487855D5 /* Models */ = { + isa = PBXGroup; + children = ( + 705426259912E57439983143 /* Track.swift */, + ); + path = Models; + sourceTree = ""; + }; + 25A98F3E183C554DE4B67719 /* Products */ = { + isa = PBXGroup; + children = ( + 07ADE7E4792A98BE9F5320D7 /* TagMaster.app */, + ); + name = Products; + sourceTree = ""; + }; + 3F8F1037C6A6B2A66BA14992 /* Views */ = { + isa = PBXGroup; + children = ( + 5A4967029EB9623BF8EBFB96 /* EditorView.swift */, + AF4E016D299B195D23A439A6 /* MainImportView.swift */, + ); + path = Views; + sourceTree = ""; + }; + CD8A4F908E22769095D6D1C1 /* ViewModels */ = { + isa = PBXGroup; + children = ( + 1B7584CD1B4714CC0B3623E9 /* EditorViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; + F33C92270C13063431683668 /* App */ = { + isa = PBXGroup; + children = ( + 33185AC1D011C5790AAEABB0 /* TagMasterApp.swift */, + ); + path = App; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 18ACF1B0C27495AAC68C7CAA /* TagMaster */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00F5581FF005FF871219AA58 /* Build configuration list for PBXNativeTarget "TagMaster" */; + buildPhases = ( + 7661FCEF871A1C63D84D5E3B /* Sources */, + B3ED9C41320B3AD23AF5D522 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = TagMaster; + packageProductDependencies = ( + 81BAF38189EA665DB7F0ADAB /* ZIPFoundation */, + ); + productName = TagMaster; + productReference = 07ADE7E4792A98BE9F5320D7 /* TagMaster.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 9AAB891F0987F221E77E4124 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1430; + TargetAttributes = { + }; + }; + buildConfigurationList = C1F95098F10215ED6A4E23FC /* Build configuration list for PBXProject "TagMaster" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + Base, + en, + ); + mainGroup = 0A7DD76DBB4B7EAA5B1B4AC9; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 9880C46838452B5EDADB700D /* XCRemoteSwiftPackageReference "ZIPFoundation" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 25A98F3E183C554DE4B67719 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 18ACF1B0C27495AAC68C7CAA /* TagMaster */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 7661FCEF871A1C63D84D5E3B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 24699FE22C1CA273526A7F00 /* EditorView.swift in Sources */, + 64F9CE5F7F9E849ABC2F28F4 /* EditorViewModel.swift in Sources */, + A671247AA2BF3958E48DF509 /* MainImportView.swift in Sources */, + E35AC07D26043CDE632C77DF /* TagMasterApp.swift in Sources */, + D48515953E1ECE08E1B7A2C5 /* Track.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 52C32149D75AB7B208D76A21 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "$(inherited)", + "DEBUG=1", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 78B34E92D87A643D256811CF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.tagmaster.TagMaster; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 79A8CED0E92065580A7A6599 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + INFOPLIST_FILE = Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.tagmaster.TagMaster; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E0AF33C424E9B8F35E9A248E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00F5581FF005FF871219AA58 /* Build configuration list for PBXNativeTarget "TagMaster" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 79A8CED0E92065580A7A6599 /* Debug */, + 78B34E92D87A643D256811CF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + C1F95098F10215ED6A4E23FC /* Build configuration list for PBXProject "TagMaster" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 52C32149D75AB7B208D76A21 /* Debug */, + E0AF33C424E9B8F35E9A248E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 9880C46838452B5EDADB700D /* XCRemoteSwiftPackageReference "ZIPFoundation" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/weichsel/ZIPFoundation.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.9.19; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 81BAF38189EA665DB7F0ADAB /* ZIPFoundation */ = { + isa = XCSwiftPackageProductDependency; + package = 9880C46838452B5EDADB700D /* XCRemoteSwiftPackageReference "ZIPFoundation" */; + productName = ZIPFoundation; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 9AAB891F0987F221E77E4124 /* Project object */; +} diff --git a/TagMaster.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TagMaster.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/TagMaster.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TagMaster.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/TagMaster.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..e314e45 --- /dev/null +++ b/TagMaster.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "b26c070fd1f0b029780331f3cefa3909a6d58ea6b3ae242bffe49d6011fe06fe", + "pins" : [ + { + "identity" : "zipfoundation", + "kind" : "remoteSourceControl", + "location" : "https://github.com/weichsel/ZIPFoundation.git", + "state" : { + "revision" : "22787ffb59de99e5dc1fbfe80b19c97a904ad48d", + "version" : "0.9.20" + } + } + ], + "version" : 3 +} diff --git a/TagMaster.xcodeproj/project.xcworkspace/xcuserdata/dallasgroot.xcuserdatad/UserInterfaceState.xcuserstate b/TagMaster.xcodeproj/project.xcworkspace/xcuserdata/dallasgroot.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..1745ff3 Binary files /dev/null and b/TagMaster.xcodeproj/project.xcworkspace/xcuserdata/dallasgroot.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TagMaster.xcodeproj/xcuserdata/dallasgroot.xcuserdatad/xcschemes/xcschememanagement.plist b/TagMaster.xcodeproj/xcuserdata/dallasgroot.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..594910e --- /dev/null +++ b/TagMaster.xcodeproj/xcuserdata/dallasgroot.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + TagMaster.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/generate.sh b/generate.sh old mode 100644 new mode 100755 diff --git a/project.yml b/project.yml new file mode 100644 index 0000000..b6f3645 --- /dev/null +++ b/project.yml @@ -0,0 +1,22 @@ +name: TagMaster +options: + bundleIdPrefix: com.tagmaster + deploymentTarget: + iOS: "17.0" +targets: + TagMaster: + type: application + platform: iOS + sources: [Sources] + info: + path: Info.plist + properties: + UILaunchScreen: {} + UIFileSharingEnabled: true + LSSupportsOpeningDocumentsInPlace: true + dependencies: + - package: ZIPFoundation +packages: + ZIPFoundation: + url: https://github.com/weichsel/ZIPFoundation.git + from: 0.9.19