Bläddra i källkod

Merge pull request #2197 from nextcloud/451

451
Marino Faggiana 2 år sedan
förälder
incheckning
656333a63d

+ 2 - 2
Nextcloud.xcodeproj/project.pbxproj

@@ -3607,7 +3607,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 17;
+				CURRENT_PROJECT_VERSION = 18;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;
@@ -3670,7 +3670,7 @@
 				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
-				CURRENT_PROJECT_VERSION = 17;
+				CURRENT_PROJECT_VERSION = 18;
 				DEVELOPMENT_TEAM = NKUJUXUJ3B;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
 				ENABLE_TESTABILITY = YES;

+ 11 - 11
iOSClient/Account Request/NCAccountRequest.storyboard

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="18122" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="V0q-CP-xMJ">
-    <device id="retina3_5" orientation="portrait" appearance="light"/>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21225" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="V0q-CP-xMJ">
+    <device id="retina6_0" orientation="portrait" appearance="light"/>
     <dependencies>
         <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="18093"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21207"/>
         <capability name="System colors in document resources" minToolsVersion="11.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -21,13 +21,13 @@
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Accounts" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nZr-nE-ths">
-                                <rect key="frame" x="20" y="15" width="260" height="18"/>
-                                <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                <rect key="frame" x="20" y="62" width="260" height="18"/>
+                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
                                 <nil key="textColor"/>
                                 <nil key="highlightedColor"/>
                             </label>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QqL-qq-3JI">
-                                <rect key="frame" x="16" y="16.5" width="15" height="15"/>
+                                <rect key="frame" x="16" y="63.666666666666657" width="15" height="15"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="15" id="FJj-0n-59w"/>
                                     <constraint firstAttribute="width" constant="15" id="FLg-jE-FHJ"/>
@@ -38,11 +38,11 @@
                                 </connections>
                             </button>
                             <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="Pdo-MB-AhU">
-                                <rect key="frame" x="10" y="48" width="280" height="262"/>
+                                <rect key="frame" x="10" y="95" width="280" height="215"/>
                                 <color key="backgroundColor" systemColor="systemBackgroundColor"/>
                                 <prototypes>
                                     <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="none" indentationWidth="10" reuseIdentifier="Cell" rowHeight="60" id="Q4K-la-J3W">
-                                        <rect key="frame" x="0.0" y="24.5" width="280" height="60"/>
+                                        <rect key="frame" x="0.0" y="50" width="280" height="60"/>
                                         <autoresizingMask key="autoresizingMask"/>
                                         <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Q4K-la-J3W" id="IkA-cK-iZV">
                                             <rect key="frame" x="0.0" y="0.0" width="280" height="60"/>
@@ -56,19 +56,19 @@
                                                     </constraints>
                                                 </imageView>
                                                 <label opaque="NO" userInteractionEnabled="NO" tag="20" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pWI-iZ-BTy" userLabel="User">
-                                                    <rect key="frame" x="40" y="20.5" width="220" height="19.5"/>
+                                                    <rect key="frame" x="40" y="20.333333333333336" width="220" height="19.333333333333336"/>
                                                     <fontDescription key="fontDescription" type="boldSystem" pointSize="16"/>
                                                     <nil key="textColor"/>
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <label opaque="NO" userInteractionEnabled="NO" tag="30" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sWT-NJ-ihR" userLabel="Url">
-                                                    <rect key="frame" x="40" y="41" width="220" height="16"/>
+                                                    <rect key="frame" x="40" y="40.666666666666664" width="220" height="16"/>
                                                     <fontDescription key="fontDescription" type="system" pointSize="13"/>
                                                     <nil key="textColor"/>
                                                     <nil key="highlightedColor"/>
                                                 </label>
                                                 <imageView clipsSubviews="YES" userInteractionEnabled="NO" tag="40" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="x47-dQ-alI" userLabel="Active">
-                                                    <rect key="frame" x="265" y="22.5" width="15" height="15"/>
+                                                    <rect key="frame" x="265" y="22.666666666666668" width="15" height="15.000000000000004"/>
                                                     <constraints>
                                                         <constraint firstAttribute="height" constant="15" id="SXt-LG-c5N"/>
                                                         <constraint firstAttribute="width" constant="15" id="vdZ-4R-gY5"/>

+ 3 - 4
iOSClient/AppDelegate.swift

@@ -868,14 +868,13 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
                 if let activeAccount = NCManageDatabase.shared.getActiveAccount() {
 
                     let urlBase = URL(string: activeAccount.urlBase)
-                    let user = activeAccount.user
-                    if linkScheme.contains(urlBase?.host ?? "") && userScheme == user {
+                    if linkScheme.contains(urlBase?.host ?? "") && userScheme == activeAccount.userId {
                         matchedAccount = activeAccount
                     } else {
                         let accounts = NCManageDatabase.shared.getAllAccount()
                         for account in accounts {
-                            guard let accountURL = URL(string: account.urlBase) else { return false }
-                            if linkScheme.contains(accountURL.host ?? "") && userScheme == account.user {
+                            let urlBase = URL(string: account.urlBase)
+                            if linkScheme.contains(urlBase?.host ?? "") && userScheme == account.userId {
                                 changeAccount(account.account)
                                 matchedAccount = account
                                 break

+ 2 - 2
iOSClient/Data/NCDataSource.swift

@@ -114,7 +114,7 @@ class NCDataSource: NSObject {
         // get all Section
         for metadata in self.metadatas {
             // skipped livePhoto
-            if filterLivePhoto && metadata.livePhoto && metadata.ext == "mov" {
+            if filterLivePhoto && metadata.livePhoto && (metadata.fileNameView as NSString).pathExtension.lowercased() == "mov" {
                 continue
             }
             let section = NSLocalizedString(self.getSectionValue(metadata: metadata), comment: "")
@@ -521,7 +521,7 @@ class NCMetadataForSection: NSObject {
             }
 
             // skipped livePhoto
-            if filterLivePhoto && metadata.livePhoto && metadata.ext == "mov" {
+            if filterLivePhoto && metadata.livePhoto && (metadata.fileNameView as NSString).pathExtension.lowercased() == "mov" {
                 continue
             }
 

+ 4 - 1
iOSClient/Data/NCManageDatabase+Metadata.swift

@@ -115,12 +115,15 @@ extension NCManageDatabase {
         // Live Photo "DETECT"
         if !metadata.directory && !metadata.livePhoto && (metadata.classFile == NKCommon.typeClassFile.video.rawValue || metadata.classFile == NKCommon.typeClassFile.image.rawValue) {
             var classFile = metadata.classFile
+            var fileNameView = metadata.fileNameView
             if classFile == NKCommon.typeClassFile.image.rawValue {
                 classFile = NKCommon.typeClassFile.video.rawValue
+                fileNameView = (fileNameView as NSString).deletingPathExtension + ".mov"
             } else {
                 classFile = NKCommon.typeClassFile.image.rawValue
+                fileNameView = (fileNameView as NSString).deletingPathExtension + ".jpg"
             }
-            if getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameWithoutExt == %@ AND ocId != %@ AND classFile == %@", metadata.account, metadata.serverUrl, metadata.fileNameWithoutExt, metadata.ocId, classFile)) != nil {
+            if getMetadata(predicate: NSPredicate(format: "account == %@ AND serverUrl == %@ AND fileNameView =[c] %@ AND ocId != %@ AND classFile == %@", metadata.account, metadata.serverUrl, fileNameView, metadata.ocId, classFile)) != nil {
                 metadata.livePhoto = true
             }
         }

+ 2 - 1
iOSClient/Data/NCManageDatabase.swift

@@ -164,11 +164,12 @@ class NCManageDatabase: NSObject {
                         migration.deleteData(forType: tableTrash.className())
                     }
 
-                    if oldSchemaVersion < 237 {
+                    if oldSchemaVersion < 250 {
                         migration.deleteData(forType: tableActivity.className())
                         migration.deleteData(forType: tableActivityLatestId.className())
                         migration.deleteData(forType: tableActivityPreview.className())
                         migration.deleteData(forType: tableActivitySubjectRich.className())
+                        migration.deleteData(forType: tableShare.className())
                     }
 
                 }, shouldCompactOnLaunch: { totalBytes, usedBytes in

+ 1 - 1
iOSClient/NCGlobal.swift

@@ -116,7 +116,7 @@ class NCGlobal: NSObject {
     // Database Realm
     //
     let databaseDefault                             = "nextcloud.realm"
-    let databaseSchemaVersion: UInt64               = 246
+    let databaseSchemaVersion: UInt64               = 250
 
     // Intro selector
     //

+ 11 - 1
iOSClient/Networking/NCNetworking.swift

@@ -1462,7 +1462,7 @@ import Photos
         }
     }
 
-    // MARK: - NextcloudKit convert completion handlers into async functions
+    // MARK: - [NextcloudKit wrapper] convert completion handlers into async functions
 
     func getPreview(url: URL,
                     options: NKRequestOptions = NKRequestOptions()) async -> (account: String, data: Data?, error: NKError) {
@@ -1491,6 +1491,16 @@ import Photos
             }
         })
     }
+
+    func createFolder(_ serverUrlFileName: String,
+                      options: NKRequestOptions = NKRequestOptions()) async -> (account: String, ocId: String?, date: NSDate?, error: NKError) {
+
+        await withUnsafeContinuation({ continuation in
+            NextcloudKit.shared.createFolder(serverUrlFileName, options: options) { account, ocId, date, error in
+                continuation.resume(returning: (account: account, ocId:ocId, date:date, error:error))
+            }
+        })
+    }
 }
 
 extension Array where Element == URLQueryItem {

+ 40 - 47
iOSClient/Networking/NCNetworkingProcessUpload.swift

@@ -50,13 +50,16 @@ class NCNetworkingProcessUpload: NSObject {
     }
 
     @objc private func processForeground() {
+        
         guard let account = NCManageDatabase.shared.getActiveAccount(), UIApplication.shared.applicationState == .active else { return }
+        let metadatasUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+        if metadatasUpload.filter({ $0.chunk || $0.e2eEncrypted }).count > 0 { return }
 
         stopTimer()
 
         var counterUpload: Int = 0
         let sessionSelectors = [NCGlobal.shared.selectorUploadFileNODelete, NCGlobal.shared.selectorUploadFile, NCGlobal.shared.selectorUploadAutoUpload, NCGlobal.shared.selectorUploadAutoUploadAll]
-        let metadatasUpload = NCManageDatabase.shared.getMetadatas(predicate: NSPredicate(format: "status == %d OR status == %d", NCGlobal.shared.metadataStatusInUpload, NCGlobal.shared.metadataStatusUploading))
+
         counterUpload = metadatasUpload.count
 
         print("[LOG] PROCESS-UPLOAD \(counterUpload)")
@@ -67,63 +70,53 @@ class NCNetworkingProcessUpload: NSObject {
 
         NCNetworking.shared.getOcIdInBackgroundSession(queue: DispatchQueue.global(), completion: { listOcId in
 
-            for sessionSelector in sessionSelectors {
-                if counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
+            for sessionSelector in sessionSelectors where counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
 
-                    let limit = NCGlobal.shared.maxConcurrentOperationUpload - counterUpload
-                    let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, NCGlobal.shared.metadataStatusWaitUpload), page: 1, limit: limit, sorted: "date", ascending: true)
-                    if metadatas.count > 0 {
-                        NKCommon.shared.writeLog("[INFO] PROCESS-UPLOAD find \(metadatas.count) items")
-                    }
+                let limit = NCGlobal.shared.maxConcurrentOperationUpload - counterUpload
+                let metadatas = NCManageDatabase.shared.getAdvancedMetadatas(predicate: NSPredicate(format: "sessionSelector == %@ AND status == %d", sessionSelector, NCGlobal.shared.metadataStatusWaitUpload), page: 1, limit: limit, sorted: "date", ascending: true)
+                if metadatas.count > 0 {
+                    NKCommon.shared.writeLog("[INFO] PROCESS-UPLOAD find \(metadatas.count) items")
+                }
 
-                    for metadata in metadatas {
+                for metadata in metadatas where counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
 
-                        // Different account
-                        if account.account != metadata.account {
-                            NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView) on account: \(metadata.account), because the actual account is \(account.account).")
-                            continue
-                        }
+                    // Different account
+                    if account.account != metadata.account {
+                        NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView) on account: \(metadata.account), because the actual account is \(account.account).")
+                        continue
+                    }
 
-                        // Is already in upload background? skipped
-                        if listOcId.contains(metadata.ocId) {
-                            NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView), because is already in session.")
-                            continue
-                        }
+                    // Is already in upload background? skipped
+                    if listOcId.contains(metadata.ocId) {
+                        NKCommon.shared.writeLog("[INFO] Process auto upload skipped file: \(metadata.serverUrl)/\(metadata.fileNameView), because is already in session.")
+                        continue
+                    }
 
-                        // Session Extension ? skipped
-                        if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundExtension {
-                            continue
-                        }
+                    // Session Extension ? skipped
+                    if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundExtension {
+                        continue
+                    }
 
-                        // Is already in upload E2EE / CHUNK ? exit [ ONLY ONE IN QUEUE ]
-                        for metadata in metadatasUpload {
-                            if metadata.chunk || metadata.e2eEncrypted {
-                                counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
-                                continue
-                            }
+                    let semaphore = DispatchSemaphore(value: 0)
+                    NCUtility.shared.extractFiles(from: metadata) { metadatas in
+                        if metadatas.isEmpty {
+                            NCManageDatabase.shared.deleteMetadata(predicate: NSPredicate(format: "ocId == %@", metadata.ocId))
                         }
-
-                        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 where counterUpload < NCGlobal.shared.maxConcurrentOperationUpload {
+                            let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
+                            if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
+                            if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
+                                NCNetworking.shared.upload(metadata: metadata)
                             }
-                            for metadata in metadatas {
-                                let isWiFi = NCNetworking.shared.networkReachability == NKCommon.typeReachability.reachableEthernetOrWiFi
-                                if metadata.session == NCNetworking.shared.sessionIdentifierBackgroundWWan && !isWiFi { continue }
-                                if let metadata = NCManageDatabase.shared.setMetadataStatus(ocId: metadata.ocId, status: NCGlobal.shared.metadataStatusInUpload) {
-                                    NCNetworking.shared.upload(metadata: metadata)
-                                }
-                                if metadata.e2eEncrypted || metadata.chunk {
-                                    counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
-                                } else {
-                                    counterUpload += 1
-                                }
+                            if metadata.e2eEncrypted || metadata.chunk {
+                                counterUpload = NCGlobal.shared.maxConcurrentOperationUpload
+                            } else {
+                                counterUpload += 1
                             }
-                            semaphore.signal()
                         }
-                        semaphore.wait()
+                        semaphore.signal()
                     }
+                    semaphore.wait()
                 }
             }
 

+ 2 - 10
iOSClient/Utility/CCUtility.m

@@ -695,15 +695,7 @@
 
 + (BOOL)getPrivacyScreenEnabled
 {
-    NSString *valueString = [UICKeyChainStore stringForKey:@"privacyScreen" service:NCGlobal.shared.serviceShareKeyChain];
-    
-    // Default TRUE
-    if (valueString == nil) {
-        [self setPrivacyScreenEnabled:YES];
-        return true;
-    }
-    
-    return [valueString boolValue];
+    return [[UICKeyChainStore stringForKey:@"privacyScreen" service:NCGlobal.shared.serviceShareKeyChain] boolValue];
 }
 
 + (void)setPrivacyScreenEnabled:(BOOL)set
@@ -1139,7 +1131,7 @@
     unsigned long long fileNameSize = [[[NSFileManager defaultManager] attributesOfItemAtPath:fileNamePath error:nil] fileSize];
 
     if (isFolderEncrypted == true) {
-        if (fileNameSize == metadata.size && fileNameViewSize > 0) {
+        if ((fileNameSize == metadata.size || fileNameViewSize == metadata.size) && fileNameViewSize > 0) {
             return true;
         } else {
             return false;

+ 2 - 1
iOSClient/Utility/NCUtility.swift

@@ -543,6 +543,7 @@ class NCUtility: NSObject {
         options.deliveryMode = PHImageRequestOptionsDeliveryMode.fastFormat
         options.isNetworkAccessAllowed = true
         let chunckSize = CCUtility.getChunkSize() * 1000000
+        let e2eEncrypted = CCUtility.isFolderEncrypted(metadata.serverUrl, e2eEncrypted: metadata.e2eEncrypted, account: metadata.account, urlBase: metadata.urlBase)
         let ocId = NSUUID().uuidString
         let fileName = (metadata.fileName as NSString).deletingPathExtension + ".mov"
         let fileNamePath = CCUtility.getDirectoryProviderStorageOcId(ocId, fileNameView: fileName)!
@@ -562,7 +563,7 @@ class NCUtility: NSObject {
                 if error != nil { return completion(nil) }
                 let metadataLivePhoto = NCManageDatabase.shared.createMetadata(account: metadata.account, user: metadata.user, userId: metadata.userId, fileName: fileName, fileNameView: fileName, ocId: ocId, serverUrl: metadata.serverUrl, urlBase: metadata.urlBase, url: "", contentType: "", isLivePhoto: true)
                 metadataLivePhoto.classFile = NKCommon.typeClassFile.video.rawValue
-                metadataLivePhoto.e2eEncrypted = metadata.e2eEncrypted
+                metadataLivePhoto.e2eEncrypted = e2eEncrypted
                 metadataLivePhoto.isExtractFile = true
                 metadataLivePhoto.session = metadata.session
                 metadataLivePhoto.sessionSelector = metadata.sessionSelector

+ 15 - 0
iOSClient/Viewer/NCViewerMedia/NCViewerMediaPage.swift

@@ -271,6 +271,11 @@ class NCViewerMediaPage: UIViewController {
               let ocId = userInfo["ocId"] as? String
         else { return }
 
+        // Stop media
+        if let ncplayer = currentViewController.ncplayer, ncplayer.isPlay() {
+            ncplayer.playerPause()
+        }
+        
         let metadatas = self.metadatas.filter { $0.ocId != ocId }
         if self.metadatas.count == metadatas.count { return }
         self.metadatas = metadatas
@@ -288,6 +293,11 @@ class NCViewerMediaPage: UIViewController {
               let metadata = NCManageDatabase.shared.getMetadataFromOcId(ocId)
         else { return }
 
+        // Stop media
+        if let ncplayer = currentViewController.ncplayer, ncplayer.isPlay() {
+            ncplayer.playerPause()
+        }
+
         metadatas[index] = metadata
         if index == currentIndex {
             navigationItem.title = metadata.fileNameView
@@ -302,6 +312,11 @@ class NCViewerMediaPage: UIViewController {
               let ocId = userInfo["ocId"] as? String
         else { return }
 
+        // Stop media
+        if let ncplayer = currentViewController.ncplayer, ncplayer.isPlay() {
+            ncplayer.playerPause()
+        }
+
         if metadatas.firstIndex(where: {$0.ocId == ocId}) != nil {
             deleteFile(notification)
         }