MediaUploader.swift (3532B)
1 // 2 // MediaUploader.swift 3 // damus 4 // 5 // Created by Daniel D’Aquino on 2023-11-24. 6 // 7 8 import Foundation 9 10 enum MediaUploader: String, CaseIterable, Identifiable, StringCodable { 11 var id: String { self.rawValue } 12 case nostrBuild 13 case nostrImg 14 15 init?(from string: String) { 16 guard let mu = MediaUploader(rawValue: string) else { 17 return nil 18 } 19 20 self = mu 21 } 22 23 func to_string() -> String { 24 return rawValue 25 } 26 27 var nameParam: String { 28 switch self { 29 case .nostrBuild: 30 return "\"fileToUpload\"" 31 case .nostrImg: 32 return "\"image\"" 33 } 34 } 35 36 var supportsVideo: Bool { 37 switch self { 38 case .nostrBuild: 39 return true 40 case .nostrImg: 41 return false 42 } 43 } 44 45 struct Model: Identifiable, Hashable { 46 var id: String { self.tag } 47 var index: Int 48 var tag: String 49 var displayName : String 50 } 51 52 var model: Model { 53 switch self { 54 case .nostrBuild: 55 return .init(index: -1, tag: "nostrBuild", displayName: "nostr.build") 56 case .nostrImg: 57 return .init(index: 0, tag: "nostrImg", displayName: "nostrimg.com") 58 } 59 } 60 61 62 var postAPI: String { 63 switch self { 64 case .nostrBuild: 65 return "https://nostr.build/api/v2/upload/files" 66 case .nostrImg: 67 return "https://nostrimg.com/api/upload" 68 } 69 } 70 71 func getMediaURL(from data: Data) -> String? { 72 switch self { 73 case .nostrBuild: 74 do { 75 if let jsonObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any], 76 let status = jsonObject["status"] as? String { 77 78 if status == "success", let dataArray = jsonObject["data"] as? [[String: Any]] { 79 80 var urls: [String] = [] 81 82 for dataDict in dataArray { 83 if let mainUrl = dataDict["url"] as? String { 84 urls.append(mainUrl) 85 } 86 } 87 88 return urls.joined(separator: "\n") 89 } else if status == "error", let message = jsonObject["message"] as? String { 90 print("Upload Error: \(message)") 91 return nil 92 } 93 } 94 } catch { 95 print("Failed JSONSerialization") 96 return nil 97 } 98 return nil 99 case .nostrImg: 100 guard let responseString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) else { 101 print("Upload failed getting response string") 102 return nil 103 } 104 105 guard let startIndex = responseString.range(of: "https://i.nostrimg.com/")?.lowerBound else { 106 return nil 107 } 108 let stringContainingName = responseString[startIndex..<responseString.endIndex] 109 guard let endIndex = stringContainingName.range(of: "\"")?.lowerBound else { 110 return nil 111 } 112 let nostrBuildImageName = responseString[startIndex..<endIndex] 113 let nostrBuildURL = "\(nostrBuildImageName)" 114 return nostrBuildURL 115 } 116 } 117 }