ExampleIniter.swift 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //
  2. // ExampleIniter.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by nkl on 2025/2/6.
  6. //
  7. import Foundation
  8. import TSVideoKit
  9. class ExampleIniter {
  10. static let `default` = ExampleIniter()
  11. private func uniqueFileURL(at directory: URL, originalURL: URL) -> URL {
  12. let fileManager = FileManager.default
  13. // 检查目录是否存在,如果不存在则创建目录
  14. if !fileManager.fileExists(atPath: directory.path) {
  15. do {
  16. try fileManager.createDirectory(at: directory, withIntermediateDirectories: true, attributes: nil)
  17. } catch {
  18. // 这里可以选择抛出错误或处理错误
  19. }
  20. }
  21. let originalFilename = originalURL.deletingPathExtension().lastPathComponent
  22. let fileExtension = originalURL.pathExtension
  23. var uniqueURL = directory.appendingPathComponent(originalFilename).appendingPathExtension(fileExtension)
  24. var counter = 1
  25. while fileManager.fileExists(atPath: uniqueURL.path) {
  26. uniqueURL = directory.appendingPathComponent("\(originalFilename)-\(counter)").appendingPathExtension(fileExtension)
  27. counter += 1
  28. }
  29. return uniqueURL
  30. }
  31. func copyFileToUrl(url: URL) {
  32. let fileId = UUID().uuidString
  33. let path = TSVideoOperator.shared.configuration.fileDir.appendingPathComponent(fileId)
  34. let destinationURL = uniqueFileURL(at: path, originalURL: url)
  35. do {
  36. try FileManager.default.copyItem(at: url, to: destinationURL)
  37. Task {
  38. await self.importVideo(videoId: fileId, from: destinationURL)
  39. }
  40. } catch {
  41. print(error.localizedDescription)
  42. }
  43. }
  44. private func importVideo(videoId: String, from url: URL) async {
  45. let asset = AVAsset(url: url)
  46. let image = await asset.generateThumbnail()
  47. await MainActor.run {
  48. let title = url.lastPathComponent
  49. let pathExt = url.pathExtension.lowercased()
  50. let vPath = videoId + "/" + title
  51. let audios = ["mp3", "wav", "m4a"]
  52. var isRing: Bool = false
  53. if audios.contains(pathExt) {
  54. isRing = true
  55. }
  56. let imageData = image?.jpegData(compressionQuality: 0.8)
  57. let defaultData = UIImage(named: "ic_default")?.jpegData(compressionQuality: 0.8)
  58. let finalData = imageData ?? defaultData
  59. TSVideoOperator.shared.dataManager.createVideo(videoId: videoId, videoUrl: nil, audioStream: nil, videoStream: nil, videoTitle: title, artist: "UnKnown".localized(), artwork: finalData, online: false, customTag: isRing, status: .cached, vPath: vPath) { _ in
  60. NotificationCenter.default.post(name: kDataChangedNotifactionName, object: nil)
  61. }
  62. }
  63. }
  64. }