damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

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 }