2019-10-17 22:25:11 +02:00
|
|
|
//
|
|
|
|
// NNW3ImportController.swift
|
|
|
|
// NetNewsWire
|
|
|
|
//
|
|
|
|
// Created by Brent Simmons on 10/14/19.
|
|
|
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import AppKit
|
|
|
|
import Account
|
|
|
|
|
|
|
|
struct NNW3ImportController {
|
|
|
|
|
|
|
|
/// Import NNW3 subscriptions if they exist.
|
|
|
|
/// Return true if Subscriptions.plist was found and subscriptions were imported.
|
|
|
|
static func importSubscriptionsIfFileExists(account: Account) -> Bool {
|
|
|
|
guard let subscriptionsPlistURL = defaultFileURL else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if !FileManager.default.fileExists(atPath: subscriptionsPlistURL.path) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
NNW3ImportController.importSubscriptionsPlist(subscriptionsPlistURL, into: account)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Run an NSOpenPanel and import subscriptions (if the user chooses to).
|
|
|
|
static func askUserToImportNNW3Subscriptions(window: NSWindow) {
|
|
|
|
chooseFile(window)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private extension NNW3ImportController {
|
|
|
|
|
|
|
|
/// URL to ~/Library/Application Support/NetNewsWire/Subscriptions.plist
|
|
|
|
static var defaultFileURL: URL? {
|
|
|
|
guard let applicationSupportURL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first else {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
let folderURL = applicationSupportURL.appendingPathComponent("NetNewsWire", isDirectory: true)
|
|
|
|
return folderURL.appendingPathComponent("Subscriptions.plist", isDirectory: false)
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Import Subscriptions.plist file. Convert to OPML and then import into specified Account.
|
|
|
|
static func importSubscriptionsPlist(_ subscriptionsPlistURL: URL, into account: Account) {
|
|
|
|
guard let opmlURL = convertToOPMLFile(subscriptionsPlistURL: subscriptionsPlistURL) else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
account.importOPML(opmlURL) { result in
|
|
|
|
try? FileManager.default.removeItem(at: opmlURL)
|
|
|
|
switch result {
|
|
|
|
case .success:
|
|
|
|
break
|
|
|
|
case .failure(let error):
|
|
|
|
NSApplication.shared.presentError(error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Run the NSOpenPanel. On success, import subscriptions to the selected account.
|
|
|
|
static func chooseFile(_ window: NSWindow) {
|
|
|
|
let accessoryViewController = NNW3OpenPanelAccessoryViewController()
|
|
|
|
|
|
|
|
let panel = NSOpenPanel()
|
|
|
|
panel.canDownloadUbiquitousContents = true
|
|
|
|
panel.canResolveUbiquitousConflicts = true
|
|
|
|
panel.canChooseFiles = true
|
|
|
|
panel.allowsMultipleSelection = false
|
|
|
|
panel.canChooseDirectories = false
|
|
|
|
panel.resolvesAliases = true
|
|
|
|
panel.directoryURL = NNW3ImportController.defaultFileURL
|
|
|
|
panel.allowedFileTypes = ["plist"]
|
|
|
|
panel.allowsOtherFileTypes = false
|
|
|
|
panel.accessoryView = accessoryViewController.view
|
|
|
|
panel.isAccessoryViewDisclosed = true
|
|
|
|
panel.title = NSLocalizedString("Choose a Subscriptions.plist file:", comment: "NNW3 Import")
|
|
|
|
|
|
|
|
panel.beginSheetModal(for: window) { modalResult in
|
|
|
|
guard modalResult == .OK, let subscriptionsPlistURL = panel.url else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
guard let account = accessoryViewController.selectedAccount else {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
AppDefaults.importOPMLAccountID = account.accountID
|
|
|
|
|
|
|
|
NNW3ImportController.importSubscriptionsPlist(subscriptionsPlistURL, into: account)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Convert Subscriptions.plist on disk to a temporary OPML file.
|
|
|
|
static func convertToOPMLFile(subscriptionsPlistURL url: URL) -> URL? {
|
|
|
|
guard let document = NNW3Document(subscriptionsPlistURL: url) else {
|
|
|
|
return nil
|
|
|
|
}
|
2020-01-14 05:20:20 +01:00
|
|
|
let opml = document.OPMLString(indentLevel: 0)
|
2019-10-17 22:25:11 +02:00
|
|
|
|
|
|
|
let opmlURL = FileManager.default.temporaryDirectory.appendingPathComponent("NNW3.opml")
|
|
|
|
do {
|
|
|
|
try opml.write(to: opmlURL, atomically: true, encoding: .utf8)
|
|
|
|
} catch let error as NSError {
|
|
|
|
NSApplication.shared.presentError(error)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
return opmlURL
|
|
|
|
}
|
|
|
|
}
|