|
@@ -25,7 +25,6 @@ import UIKit
|
|
|
import CoreLocation
|
|
|
import NextcloudKit
|
|
|
import Photos
|
|
|
-import Queuer
|
|
|
|
|
|
class NCAutoUpload: NSObject {
|
|
|
@objc static let shared: NCAutoUpload = {
|
|
@@ -34,6 +33,8 @@ class NCAutoUpload: NSObject {
|
|
|
}()
|
|
|
|
|
|
private var endForAssetToUpload: Bool = false
|
|
|
+ private let appDelegate = UIApplication.shared.delegate as? AppDelegate
|
|
|
+ private let applicationState = UIApplication.shared.applicationState
|
|
|
|
|
|
// MARK: -
|
|
|
|
|
@@ -49,9 +50,10 @@ class NCAutoUpload: NSObject {
|
|
|
completion(0)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
- self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUpload, log: "Init Auto Upload") { items in
|
|
|
- completion(items)
|
|
|
+ DispatchQueue.global().async {
|
|
|
+ self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUpload, log: "Init Auto Upload") { items in
|
|
|
+ completion(items)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -60,15 +62,13 @@ class NCAutoUpload: NSObject {
|
|
|
|
|
|
NCAskAuthorization.shared.askAuthorizationPhotoLibrary(viewController: viewController) { hasPermission in
|
|
|
guard hasPermission else { return }
|
|
|
- #if !EXTENSION
|
|
|
let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_create_full_upload_")
|
|
|
NCContentPresenter.shared.showWarning(error: error, priority: .max)
|
|
|
NCActivityIndicator.shared.start()
|
|
|
- #endif
|
|
|
- self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUploadAll, log: log) { _ in
|
|
|
- #if !EXTENSION
|
|
|
- NCActivityIndicator.shared.stop()
|
|
|
- #endif
|
|
|
+ DispatchQueue.global().async {
|
|
|
+ self.uploadAssetsNewAndFull(viewController: viewController, selector: NCGlobal.shared.selectorUploadAutoUploadAll, log: log) { _ in
|
|
|
+ NCActivityIndicator.shared.stop()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -79,109 +79,102 @@ class NCAutoUpload: NSObject {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- DispatchQueue.global().async {
|
|
|
-
|
|
|
- let autoUploadPath = NCManageDatabase.shared.getAccountAutoUploadPath(urlBase: account.urlBase, account: account.account)
|
|
|
- var metadatas: [tableMetadata] = []
|
|
|
+ let autoUploadPath = NCManageDatabase.shared.getAccountAutoUploadPath(urlBase: account.urlBase, account: account.account)
|
|
|
+ var metadatas: [tableMetadata] = []
|
|
|
|
|
|
- self.getCameraRollAssets(viewController: viewController, account: account, selector: selector, alignPhotoLibrary: false) { assets in
|
|
|
- guard let assets = assets, !assets.isEmpty else {
|
|
|
- NKCommon.shared.writeLog("[INFO] Automatic upload, no new assets found [" + log + "]")
|
|
|
- completion(0)
|
|
|
- return
|
|
|
- }
|
|
|
- NKCommon.shared.writeLog("[INFO] Automatic upload, new \(assets.count) assets found [" + log + "]")
|
|
|
- // Create the folder for auto upload & if request the subfolders
|
|
|
- if !NCNetworking.shared.createFolder(assets: assets, selector: selector, useSubFolder: account.autoUploadCreateSubfolder, account: account.account, urlBase: account.urlBase) {
|
|
|
- #if !EXTENSION
|
|
|
- if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
- let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_error_createsubfolders_upload_")
|
|
|
- NCContentPresenter.shared.showError(error: error, priority: .max)
|
|
|
- }
|
|
|
- #endif
|
|
|
- return completion(0)
|
|
|
+ self.getCameraRollAssets(viewController: viewController, account: account, selector: selector, alignPhotoLibrary: false) { assets in
|
|
|
+ guard let assets = assets, !assets.isEmpty else {
|
|
|
+ NKCommon.shared.writeLog("[INFO] Automatic upload, no new assets found [" + log + "]")
|
|
|
+ completion(0)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ NKCommon.shared.writeLog("[INFO] Automatic upload, new \(assets.count) assets found [" + log + "]")
|
|
|
+ // Create the folder for auto upload & if request the subfolders
|
|
|
+ if !NCNetworking.shared.createFolder(assets: assets, selector: selector, useSubFolder: account.autoUploadCreateSubfolder, account: account.account, urlBase: account.urlBase) {
|
|
|
+ if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
+ let error = NKError(errorCode: NCGlobal.shared.errorInternalError, errorDescription: "_error_createsubfolders_upload_")
|
|
|
+ NCContentPresenter.shared.showError(error: error, priority: .max)
|
|
|
}
|
|
|
+ return completion(0)
|
|
|
+ }
|
|
|
|
|
|
- self.endForAssetToUpload = false
|
|
|
+ self.endForAssetToUpload = false
|
|
|
|
|
|
- for asset in assets {
|
|
|
+ for asset in assets {
|
|
|
|
|
|
- var livePhoto = false
|
|
|
- var session: String = ""
|
|
|
- guard let assetDate = asset.creationDate else { continue }
|
|
|
- let assetMediaType = asset.mediaType
|
|
|
- var serverUrl: String = ""
|
|
|
- let fileName = CCUtility.createFileName(asset.value(forKey: "filename") as? String, fileDate: assetDate, fileType: assetMediaType, keyFileName: NCGlobal.shared.keyFileNameAutoUploadMask, keyFileNameType: NCGlobal.shared.keyFileNameAutoUploadType, keyFileNameOriginal: NCGlobal.shared.keyFileNameOriginalAutoUpload, forcedNewFileName: false)!
|
|
|
- let formatter = DateFormatter()
|
|
|
- formatter.dateFormat = "yyyy"
|
|
|
- let yearString = formatter.string(from: assetDate)
|
|
|
- formatter.dateFormat = "MM"
|
|
|
- let monthString = formatter.string(from: assetDate)
|
|
|
+ var livePhoto = false
|
|
|
+ var session: String = ""
|
|
|
+ guard let assetDate = asset.creationDate else { continue }
|
|
|
+ let assetMediaType = asset.mediaType
|
|
|
+ var serverUrl: String = ""
|
|
|
+ let fileName = CCUtility.createFileName(asset.value(forKey: "filename") as? String, fileDate: assetDate, fileType: assetMediaType, keyFileName: NCGlobal.shared.keyFileNameAutoUploadMask, keyFileNameType: NCGlobal.shared.keyFileNameAutoUploadType, keyFileNameOriginal: NCGlobal.shared.keyFileNameOriginalAutoUpload, forcedNewFileName: false)!
|
|
|
+ let formatter = DateFormatter()
|
|
|
+ formatter.dateFormat = "yyyy"
|
|
|
+ let yearString = formatter.string(from: assetDate)
|
|
|
+ formatter.dateFormat = "MM"
|
|
|
+ let monthString = formatter.string(from: assetDate)
|
|
|
|
|
|
- if asset.mediaSubtypes.contains(.photoLive) && CCUtility.getLivePhoto() {
|
|
|
- livePhoto = true
|
|
|
- }
|
|
|
+ if asset.mediaSubtypes.contains(.photoLive) && CCUtility.getLivePhoto() {
|
|
|
+ livePhoto = true
|
|
|
+ }
|
|
|
|
|
|
- if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
- session = NKCommon.shared.sessionIdentifierUpload
|
|
|
- } else {
|
|
|
- if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto == false {
|
|
|
- session = NCNetworking.shared.sessionIdentifierBackground
|
|
|
- } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo == false {
|
|
|
- session = NCNetworking.shared.sessionIdentifierBackground
|
|
|
- } else if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto {
|
|
|
- session = NCNetworking.shared.sessionIdentifierBackgroundWWan
|
|
|
- } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo {
|
|
|
- session = NCNetworking.shared.sessionIdentifierBackgroundWWan
|
|
|
- } else { session = NCNetworking.shared.sessionIdentifierBackground }
|
|
|
- }
|
|
|
+ if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
+ session = NKCommon.shared.sessionIdentifierUpload
|
|
|
+ } else {
|
|
|
+ if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto == false {
|
|
|
+ session = NCNetworking.shared.sessionIdentifierBackground
|
|
|
+ } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo == false {
|
|
|
+ session = NCNetworking.shared.sessionIdentifierBackground
|
|
|
+ } else if assetMediaType == PHAssetMediaType.image && account.autoUploadWWAnPhoto {
|
|
|
+ session = NCNetworking.shared.sessionIdentifierBackgroundWWan
|
|
|
+ } else if assetMediaType == PHAssetMediaType.video && account.autoUploadWWAnVideo {
|
|
|
+ session = NCNetworking.shared.sessionIdentifierBackgroundWWan
|
|
|
+ } else { session = NCNetworking.shared.sessionIdentifierBackground }
|
|
|
+ }
|
|
|
|
|
|
- if account.autoUploadCreateSubfolder {
|
|
|
- serverUrl = autoUploadPath + "/" + yearString + "/" + monthString
|
|
|
- } else {
|
|
|
- serverUrl = autoUploadPath
|
|
|
- }
|
|
|
+ if account.autoUploadCreateSubfolder {
|
|
|
+ serverUrl = autoUploadPath + "/" + yearString + "/" + monthString
|
|
|
+ } else {
|
|
|
+ serverUrl = autoUploadPath
|
|
|
+ }
|
|
|
|
|
|
- // MOST COMPATIBLE SEARCH --> HEIC --> JPG
|
|
|
- var fileNameSearchMetadata = fileName
|
|
|
- let ext = (fileNameSearchMetadata as NSString).pathExtension.uppercased()
|
|
|
- if ext == "HEIC" && CCUtility.getFormatCompatibility() {
|
|
|
- fileNameSearchMetadata = (fileNameSearchMetadata as NSString).deletingPathExtension + ".jpg"
|
|
|
+ // MOST COMPATIBLE SEARCH --> HEIC --> JPG
|
|
|
+ var fileNameSearchMetadata = fileName
|
|
|
+ let ext = (fileNameSearchMetadata as NSString).pathExtension.uppercased()
|
|
|
+ if ext == "HEIC" && CCUtility.getFormatCompatibility() {
|
|
|
+ fileNameSearchMetadata = (fileNameSearchMetadata as NSString).deletingPathExtension + ".jpg"
|
|
|
+ }
|
|
|
+ if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account.account, serverUrl, fileNameSearchMetadata)) != nil {
|
|
|
+ if selector == NCGlobal.shared.selectorUploadAutoUpload {
|
|
|
+ NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
|
|
|
}
|
|
|
- if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView == %@", account.account, serverUrl, fileNameSearchMetadata)) != nil {
|
|
|
- if selector == NCGlobal.shared.selectorUploadAutoUpload {
|
|
|
- NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
|
|
|
- }
|
|
|
- } else {
|
|
|
- let metadata = NCManageDatabase.shared.createMetadata(account: account.account, user: account.user, userId: account.userId, fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, serverUrl: serverUrl, urlBase: account.urlBase, url: "", contentType: "", isLivePhoto: livePhoto)
|
|
|
- metadata.assetLocalIdentifier = asset.localIdentifier
|
|
|
- metadata.session = session
|
|
|
- metadata.sessionSelector = selector
|
|
|
- metadata.status = NCGlobal.shared.metadataStatusWaitUpload
|
|
|
- if assetMediaType == PHAssetMediaType.video {
|
|
|
- metadata.classFile = NKCommon.typeClassFile.video.rawValue
|
|
|
- } else if assetMediaType == PHAssetMediaType.image {
|
|
|
- metadata.classFile = NKCommon.typeClassFile.image.rawValue
|
|
|
- }
|
|
|
- if selector == NCGlobal.shared.selectorUploadAutoUpload {
|
|
|
- NKCommon.shared.writeLog("[INFO] Automatic upload added \(metadata.fileNameView) with Identifier \(metadata.assetLocalIdentifier)")
|
|
|
- NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
|
|
|
- }
|
|
|
- metadatas.append(metadata)
|
|
|
+ } else {
|
|
|
+ let metadata = NCManageDatabase.shared.createMetadata(account: account.account, user: account.user, userId: account.userId, fileName: fileName, fileNameView: fileName, ocId: NSUUID().uuidString, serverUrl: serverUrl, urlBase: account.urlBase, url: "", contentType: "", isLivePhoto: livePhoto)
|
|
|
+ metadata.assetLocalIdentifier = asset.localIdentifier
|
|
|
+ metadata.session = session
|
|
|
+ metadata.sessionSelector = selector
|
|
|
+ metadata.status = NCGlobal.shared.metadataStatusWaitUpload
|
|
|
+ if assetMediaType == PHAssetMediaType.video {
|
|
|
+ metadata.classFile = NKCommon.typeClassFile.video.rawValue
|
|
|
+ } else if assetMediaType == PHAssetMediaType.image {
|
|
|
+ metadata.classFile = NKCommon.typeClassFile.image.rawValue
|
|
|
}
|
|
|
+ if selector == NCGlobal.shared.selectorUploadAutoUpload {
|
|
|
+ NKCommon.shared.writeLog("[INFO] Automatic upload added \(metadata.fileNameView) with Identifier \(metadata.assetLocalIdentifier)")
|
|
|
+ NCManageDatabase.shared.addPhotoLibrary([asset], account: account.account)
|
|
|
+ }
|
|
|
+ metadatas.append(metadata)
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- self.endForAssetToUpload = true
|
|
|
-
|
|
|
- if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
- NKCommon.shared.writeLog("[INFO] Start Upload All")
|
|
|
- #if !EXTENSION
|
|
|
- (UIApplication.shared.delegate as! AppDelegate).networkingProcessUpload?.createProcessUploads(metadatas: metadatas)
|
|
|
- completion(metadatas.count)
|
|
|
- #endif
|
|
|
- } else if selector == NCGlobal.shared.selectorUploadAutoUpload {
|
|
|
- NKCommon.shared.writeLog("[INFO] Start Upload")
|
|
|
- self.createProcessUploads(metadatas: metadatas, completion: completion)
|
|
|
+ self.endForAssetToUpload = true
|
|
|
+ if selector == NCGlobal.shared.selectorUploadAutoUploadAll {
|
|
|
+ self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
|
|
|
+ } else {
|
|
|
+ if self.applicationState == .background {
|
|
|
+ self.createBackgroundProcessAutoUpload(metadatas: metadatas, completion: completion)
|
|
|
+ } else {
|
|
|
+ self.appDelegate?.networkingProcessUpload?.createProcessUploads(metadatas: metadatas, completion: completion)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -189,63 +182,51 @@ class NCAutoUpload: NSObject {
|
|
|
|
|
|
// MARK: -
|
|
|
|
|
|
- func createProcessUploads(metadatas: [tableMetadata], completion: @escaping (_ items: Int) -> Void) {
|
|
|
+ func createBackgroundProcessAutoUpload(metadatas: [tableMetadata], completion: @escaping (_ items: Int) -> Void) {
|
|
|
|
|
|
var metadatasForUpload: [tableMetadata] = []
|
|
|
var numStartUpload: Int = 0
|
|
|
+ let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
|
|
|
|
|
|
for metadata in metadatas {
|
|
|
- if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && serverUrl == %@ && fileName == %@ && session != ''", metadata.account, metadata.serverUrl, metadata.fileName)) != nil {
|
|
|
- continue
|
|
|
- }
|
|
|
+ if NCManageDatabase.shared.getMetadata(predicate: NSPredicate(format: "account == %@ && serverUrl == %@ && fileName == %@ && session != ''", metadata.account, metadata.serverUrl, metadata.fileName)) != nil { continue }
|
|
|
metadatasForUpload.append(metadata)
|
|
|
}
|
|
|
NCManageDatabase.shared.addMetadatas(metadatasForUpload)
|
|
|
|
|
|
let metadatasInUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
|
|
|
let counterUpload = NCGlobal.shared.maxConcurrentOperationUpload - metadatasInUpload.count
|
|
|
- if counterUpload <= 0 {
|
|
|
- return completion(0)
|
|
|
- }
|
|
|
+ if counterUpload <= 0 { return completion(0) }
|
|
|
|
|
|
// Extract file
|
|
|
-
|
|
|
let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.metadataStatusWaitUpload), page: 0, limit: counterUpload, sorted: "date", ascending: true)
|
|
|
-
|
|
|
for metadata in metadatas {
|
|
|
|
|
|
let metadata = tableMetadata.init(value: metadata)
|
|
|
- let semaphore = Semaphore()
|
|
|
+ let semaphore = DispatchSemaphore(value: 0)
|
|
|
|
|
|
NCUtility.shared.extractFiles(from: metadata) { metadatas in
|
|
|
if metadatas.isEmpty {
|
|
|
NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
|
|
|
}
|
|
|
for metadata in metadatas {
|
|
|
- #if !EXTENSION
|
|
|
- if (metadata.e2eEncrypted || metadata.chunk) && UIApplication.shared.applicationState != .active { continue }
|
|
|
- #else
|
|
|
- if (metadata.e2eEncrypted || metadata.chunk) { continue }
|
|
|
- #endif
|
|
|
- let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
|
|
|
- if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
|
|
|
+ if (metadata.e2eEncrypted || metadata.chunk) { continue }
|
|
|
+ if (metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi) { continue }
|
|
|
guard let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) else { continue }
|
|
|
- // Upload
|
|
|
- let semaphoreUpload = Semaphore()
|
|
|
+ // Upload
|
|
|
+ let semaphoreUpload = DispatchSemaphore(value: 1)
|
|
|
NCNetworking.shared.upload(metadata: metadata) {
|
|
|
numStartUpload += 1
|
|
|
} completion: { error in
|
|
|
- semaphoreUpload.continue()
|
|
|
+ semaphoreUpload.signal()
|
|
|
}
|
|
|
semaphoreUpload.wait()
|
|
|
}
|
|
|
- semaphore.continue()
|
|
|
+ semaphore.signal()
|
|
|
}
|
|
|
semaphore.wait()
|
|
|
}
|
|
|
- DispatchQueue.main.async {
|
|
|
- completion(numStartUpload)
|
|
|
- }
|
|
|
+ completion(numStartUpload)
|
|
|
}
|
|
|
|
|
|
// MARK: -
|