From 6ae8232e0911c8f07e30f9db703e28e230100bd8 Mon Sep 17 00:00:00 2001 From: Francesco <100066266+cranci1@users.noreply.github.com> Date: Fri, 25 Apr 2025 09:19:34 +0200 Subject: [PATCH] removed ffmpeg sorry --- .../DownloadManager/DownloadManager.swift | 211 ------------------ Sulfur.xcodeproj/project.pbxproj | 29 --- .../xcshareddata/swiftpm/Package.resolved | 18 -- 3 files changed, 258 deletions(-) delete mode 100644 Sora/Utils/DownloadManager/DownloadManager.swift diff --git a/Sora/Utils/DownloadManager/DownloadManager.swift b/Sora/Utils/DownloadManager/DownloadManager.swift deleted file mode 100644 index 78d2b08..0000000 --- a/Sora/Utils/DownloadManager/DownloadManager.swift +++ /dev/null @@ -1,211 +0,0 @@ -// -// DownloadManager.swift -// Sulfur -// -// Created by Francesco on 09/03/25. -// - -import Foundation -import FFmpegSupport -import UIKit - -class DownloadManager { - static let shared = DownloadManager() - - private var backgroundTaskIdentifier: UIBackgroundTaskIdentifier = .invalid - private var activeConversions = [String: Bool]() - - private init() { - NotificationCenter.default.addObserver(self, selector: #selector(applicationWillResignActive), name: UIApplication.willResignActiveNotification, object: nil) - } - - @objc private func applicationWillResignActive() { - if !activeConversions.isEmpty { - backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask { [weak self] in - self?.endBackgroundTask() - } - } - } - - private func endBackgroundTask() { - if backgroundTaskIdentifier != .invalid { - UIApplication.shared.endBackgroundTask(backgroundTaskIdentifier) - backgroundTaskIdentifier = .invalid - } - } - - func downloadAndConvertHLS(from url: URL, title: String, episode: Int, subtitleURL: URL? = nil, module: ScrapingModule, completion: @escaping (Bool, URL?) -> Void) { - guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { - completion(false, nil) - return - } - - let folderURL = documentsDirectory.appendingPathComponent(title + "-" + module.metadata.sourceName) - if (!FileManager.default.fileExists(atPath: folderURL.path)) { - do { - try FileManager.default.createDirectory(at: folderURL, withIntermediateDirectories: true, attributes: nil) - } catch { - Logger.shared.log("Error creating folder: \(error)") - completion(false, nil) - return - } - } - - let outputFileName = "\(title)_Episode\(episode)_\(module.metadata.sourceName).mp4" - let outputFileURL = folderURL.appendingPathComponent(outputFileName) - - let fileExtension = url.pathExtension.lowercased() - - if fileExtension == "mp4" { - NotificationCenter.default.post(name: .DownloadManagerStatusUpdate, object: nil, userInfo: [ - "title": title, - "episode": episode, - "type": "mp4", - "status": "Downloading", - "progress": 0.0 - ]) - - let task = URLSession.custom.downloadTask(with: url) { tempLocalURL, response, error in - if let tempLocalURL = tempLocalURL { - do { - try FileManager.default.moveItem(at: tempLocalURL, to: outputFileURL) - NotificationCenter.default.post(name: .DownloadManagerStatusUpdate, object: nil, userInfo: [ - "title": title, - "episode": episode, - "type": "mp4", - "status": "Completed", - "progress": 1.0 - ]) - DispatchQueue.main.async { - Logger.shared.log("Download successful: \(outputFileURL)") - completion(true, outputFileURL) - } - } catch { - DispatchQueue.main.async { - Logger.shared.log("Download failed: \(error)") - completion(false, nil) - } - } - } else { - DispatchQueue.main.async { - Logger.shared.log("Download failed: \(error?.localizedDescription ?? "Unknown error")") - completion(false, nil) - } - } - } - task.resume() - } else if fileExtension == "m3u8" { - let conversionKey = "\(title)_\(episode)_\(module.metadata.sourceName)" - activeConversions[conversionKey] = true - - if UIApplication.shared.applicationState != .active && backgroundTaskIdentifier == .invalid { - backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask { [weak self] in - self?.endBackgroundTask() - } - } - - DispatchQueue.global(qos: .background).async { - NotificationCenter.default.post(name: .DownloadManagerStatusUpdate, object: nil, userInfo: [ - "title": title, - "episode": episode, - "type": "hls", - "status": "Converting", - "progress": 0.0 - ]) - - let processorCount = ProcessInfo.processInfo.processorCount - let physicalMemory = ProcessInfo.processInfo.physicalMemory / (1024 * 1024) - - var ffmpegCommand = ["ffmpeg", "-y"] - - ffmpegCommand.append(contentsOf: ["-protocol_whitelist", "file,http,https,tcp,tls"]) - - ffmpegCommand.append(contentsOf: ["-fflags", "+genpts"]) - ffmpegCommand.append(contentsOf: ["-reconnect", "1", "-reconnect_streamed", "1", "-reconnect_delay_max", "5"]) - ffmpegCommand.append(contentsOf: ["-headers", "Referer: \(module.metadata.baseUrl)\nOrigin: \(module.metadata.baseUrl)"]) - - let multiThreads = UserDefaults.standard.bool(forKey: "multiThreads") - if multiThreads { - let threadCount = max(2, processorCount - 1) - ffmpegCommand.append(contentsOf: ["-threads", "\(threadCount)"]) - } else { - ffmpegCommand.append(contentsOf: ["-threads", "2"]) - } - - let bufferSize = min(32, max(8, Int(physicalMemory) / 256)) - ffmpegCommand.append(contentsOf: ["-bufsize", "\(bufferSize)M"]) - ffmpegCommand.append(contentsOf: ["-i", url.absoluteString]) - - if let subtitleURL = subtitleURL { - do { - let subtitleData = try Data(contentsOf: subtitleURL) - let subtitleFileExtension = subtitleURL.pathExtension.lowercased() - if subtitleFileExtension != "srt" && subtitleFileExtension != "vtt" { - Logger.shared.log("Unsupported subtitle format: \(subtitleFileExtension)") - } - let subtitleFileName = "\(title)_Episode\(episode).\(subtitleFileExtension)" - let subtitleLocalURL = folderURL.appendingPathComponent(subtitleFileName) - try subtitleData.write(to: subtitleLocalURL) - ffmpegCommand.append(contentsOf: ["-i", subtitleLocalURL.path]) - - ffmpegCommand.append(contentsOf: [ - "-c:v", "copy", - "-c:a", "copy", - "-c:s", "mov_text", - "-disposition:s:0", "default+forced", - "-metadata:s:s:0", "handler_name=English", - "-metadata:s:s:0", "language=eng" - ]) - - ffmpegCommand.append(outputFileURL.path) - } catch { - Logger.shared.log("Subtitle download failed: \(error)") - ffmpegCommand.append(contentsOf: ["-c:v", "copy", "-c:a", "copy"]) - ffmpegCommand.append(contentsOf: ["-movflags", "+faststart"]) - ffmpegCommand.append(outputFileURL.path) - } - } else { - ffmpegCommand.append(contentsOf: ["-c:v", "copy", "-c:a", "copy"]) - ffmpegCommand.append(contentsOf: ["-movflags", "+faststart"]) - ffmpegCommand.append(outputFileURL.path) - } - Logger.shared.log("FFmpeg command: \(ffmpegCommand.joined(separator: " "))", type: "Debug") - - NotificationCenter.default.post(name: .DownloadManagerStatusUpdate, object: nil, userInfo: [ - "title": title, - "episode": episode, - "type": "hls", - "status": "Converting", - "progress": 0.5 - ]) - - let success = ffmpeg(ffmpegCommand) - DispatchQueue.main.async { [weak self] in - if success == 0 { - NotificationCenter.default.post(name: .DownloadManagerStatusUpdate, object: nil, userInfo: [ - "title": title, - "episode": episode, - "type": "hls", - "status": "Completed", - "progress": 1.0 - ]) - Logger.shared.log("Conversion successful: \(outputFileURL)") - completion(true, outputFileURL) - } else { - Logger.shared.log("Conversion failed") - completion(false, nil) - } - - self?.activeConversions[conversionKey] = nil - - if self?.activeConversions.isEmpty ?? true { - self?.endBackgroundTask() - } - } - } - } else { - Logger.shared.log("Unsupported file type: \(fileExtension)") - completion(false, nil) - } - } -} diff --git a/Sulfur.xcodeproj/project.pbxproj b/Sulfur.xcodeproj/project.pbxproj index 8e19b85..c4617a0 100644 --- a/Sulfur.xcodeproj/project.pbxproj +++ b/Sulfur.xcodeproj/project.pbxproj @@ -18,7 +18,6 @@ 132AF1232D9995C300A0140B /* JSController-Details.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132AF1222D9995C300A0140B /* JSController-Details.swift */; }; 132AF1252D9995F900A0140B /* JSController-Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132AF1242D9995F900A0140B /* JSController-Search.swift */; }; 132E351D2D959DDB0007800E /* Drops in Frameworks */ = {isa = PBXBuildFile; productRef = 132E351C2D959DDB0007800E /* Drops */; }; - 132E35202D959E1D0007800E /* FFmpeg-iOS-Lame in Frameworks */ = {isa = PBXBuildFile; productRef = 132E351F2D959E1D0007800E /* FFmpeg-iOS-Lame */; }; 132E35232D959E410007800E /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 132E35222D959E410007800E /* Kingfisher */; }; 133D7C6E2D2BE2500075467E /* SoraApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C6D2D2BE2500075467E /* SoraApp.swift */; }; 133D7C702D2BE2500075467E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 133D7C6F2D2BE2500075467E /* ContentView.swift */; }; @@ -56,7 +55,6 @@ 13DB46902D900A38008CBC03 /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DB468F2D900A38008CBC03 /* URL.swift */; }; 13DB46922D900BCE008CBC03 /* SettingsViewTrackers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DB46912D900BCE008CBC03 /* SettingsViewTrackers.swift */; }; 13DB7CC32D7D99C0004371D3 /* SubtitleSettingsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DB7CC22D7D99C0004371D3 /* SubtitleSettingsManager.swift */; }; - 13DB7CEC2D7DED5D004371D3 /* DownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DB7CEB2D7DED5D004371D3 /* DownloadManager.swift */; }; 13DC0C462D302C7500D0F966 /* VideoPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13DC0C452D302C7500D0F966 /* VideoPlayer.swift */; }; 13E62FC22DABC5830007E259 /* Trakt-Login.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E62FC12DABC5830007E259 /* Trakt-Login.swift */; }; 13E62FC42DABC58C0007E259 /* Trakt-Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E62FC32DABC58C0007E259 /* Trakt-Token.swift */; }; @@ -118,7 +116,6 @@ 13DB468F2D900A38008CBC03 /* URL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = URL.swift; sourceTree = ""; }; 13DB46912D900BCE008CBC03 /* SettingsViewTrackers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewTrackers.swift; sourceTree = ""; }; 13DB7CC22D7D99C0004371D3 /* SubtitleSettingsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubtitleSettingsManager.swift; sourceTree = ""; }; - 13DB7CEB2D7DED5D004371D3 /* DownloadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadManager.swift; sourceTree = ""; }; 13DC0C412D2EC9BA00D0F966 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 13DC0C452D302C7500D0F966 /* VideoPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VideoPlayer.swift; sourceTree = ""; }; 13E62FC12DABC5830007E259 /* Trakt-Login.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Trakt-Login.swift"; sourceTree = ""; }; @@ -140,7 +137,6 @@ files = ( 13B77E192DA44F8300126FDF /* MarqueeLabel in Frameworks */, 132E35232D959E410007800E /* Kingfisher in Frameworks */, - 132E35202D959E1D0007800E /* FFmpeg-iOS-Lame in Frameworks */, 132E351D2D959DDB0007800E /* Drops in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -262,7 +258,6 @@ isa = PBXGroup; children = ( 136BBE7C2DB102BE00906B5E /* iCloudSyncManager */, - 13DB7CEA2D7DED50004371D3 /* DownloadManager */, 13C0E5E82D5F85DD00E7F619 /* ContinueWatching */, 13103E8C2D58E037000F0673 /* SkeletonCells */, 13DC0C442D302C6A00D0F966 /* MediaPlayer */, @@ -398,14 +393,6 @@ path = Auth; sourceTree = ""; }; - 13DB7CEA2D7DED50004371D3 /* DownloadManager */ = { - isa = PBXGroup; - children = ( - 13DB7CEB2D7DED5D004371D3 /* DownloadManager.swift */, - ); - path = DownloadManager; - sourceTree = ""; - }; 13DC0C442D302C6A00D0F966 /* MediaPlayer */ = { isa = PBXGroup; children = ( @@ -480,7 +467,6 @@ name = Sulfur; packageProductDependencies = ( 132E351C2D959DDB0007800E /* Drops */, - 132E351F2D959E1D0007800E /* FFmpeg-iOS-Lame */, 132E35222D959E410007800E /* Kingfisher */, 13B77E182DA44F8300126FDF /* MarqueeLabel */, ); @@ -513,7 +499,6 @@ mainGroup = 133D7C612D2BE2500075467E; packageReferences = ( 132E351B2D959DDB0007800E /* XCRemoteSwiftPackageReference "Drops" */, - 132E351E2D959E1D0007800E /* XCRemoteSwiftPackageReference "FFmpeg-iOS-Lame" */, 132E35212D959E410007800E /* XCRemoteSwiftPackageReference "Kingfisher" */, 13B77E172DA44F8300126FDF /* XCRemoteSwiftPackageReference "MarqueeLabel" */, ); @@ -563,7 +548,6 @@ 133D7C932D2BE2640075467E /* Modules.swift in Sources */, 13DB7CC32D7D99C0004371D3 /* SubtitleSettingsManager.swift in Sources */, 133D7C702D2BE2500075467E /* ContentView.swift in Sources */, - 13DB7CEC2D7DED5D004371D3 /* DownloadManager.swift in Sources */, 13D99CF72D4E73C300250A86 /* ModuleAdditionSettingsView.swift in Sources */, 13C0E5EC2D5F85F800E7F619 /* ContinueWatchingItem.swift in Sources */, 13CBA0882D60F19C00EFE70A /* VTTSubtitlesLoader.swift in Sources */, @@ -840,14 +824,6 @@ kind = branch; }; }; - 132E351E2D959E1D0007800E /* XCRemoteSwiftPackageReference "FFmpeg-iOS-Lame" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/kewlbear/FFmpeg-iOS-Lame"; - requirement = { - branch = main; - kind = branch; - }; - }; 132E35212D959E410007800E /* XCRemoteSwiftPackageReference "Kingfisher" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/onevcat/Kingfisher.git"; @@ -872,11 +848,6 @@ package = 132E351B2D959DDB0007800E /* XCRemoteSwiftPackageReference "Drops" */; productName = Drops; }; - 132E351F2D959E1D0007800E /* FFmpeg-iOS-Lame */ = { - isa = XCSwiftPackageProductDependency; - package = 132E351E2D959E1D0007800E /* XCRemoteSwiftPackageReference "FFmpeg-iOS-Lame" */; - productName = "FFmpeg-iOS-Lame"; - }; 132E35222D959E410007800E /* Kingfisher */ = { isa = XCSwiftPackageProductDependency; package = 132E35212D959E410007800E /* XCRemoteSwiftPackageReference "Kingfisher" */; diff --git a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 5fe78fe..a843cd1 100644 --- a/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Sulfur.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -10,24 +10,6 @@ "version": null } }, - { - "package": "FFmpeg-iOS-Lame", - "repositoryURL": "https://github.com/kewlbear/FFmpeg-iOS-Lame", - "state": { - "branch": "main", - "revision": "1808fa5a1263c5e216646cd8421fc7dcb70520cc", - "version": null - } - }, - { - "package": "FFmpeg-iOS-Support", - "repositoryURL": "https://github.com/kewlbear/FFmpeg-iOS-Support", - "state": { - "branch": null, - "revision": "be3bd9149ac53760e8725652eee99c405b2be47a", - "version": "0.0.2" - } - }, { "package": "Kingfisher", "repositoryURL": "https://github.com/onevcat/Kingfisher.git",