How to check url is image or video?

Viewed 10265

I fetch API response and parse pick url in swift . but i need to check is image url or video url :

If i get image url then show image and if get video url then play video :

 if let url = postMedia?.url{

    //need to check here 
  }

For example

Here is my video url :

https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4
https://clips.vorwaerts-gmbh.de/big_buck_bunny.mov

here is image url :

https://clips.vorwaerts-gmbh.de/big_buck_bunny.png
https://clips.vorwaerts-gmbh.de/big_buck_bunny.jpg

note : i know how to show image and play video

8 Answers

This answer asks the framework to check the filename extension.

#import <MobileCoreServices/MobileCoreServices.h>

// ...

+ (BOOL) urlIsImage:(NSURL*)fileUrl
{
    if (fileUrl) {
        NSString *extension = fileUrl.pathExtension;
        if (extension && extension.length > 0) {
            CFStringRef uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)extension, NULL);
            return uti && UTTypeConformsTo(uti, kUTTypeImage);
        }
    }

    return NO;
}

Swift

import MobileCoreServices

extension URL {
    func mimeType() -> String {
         let pathExtension = self.pathExtension
         if let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension as NSString, nil)?.takeRetainedValue() {
             if let mimetype = UTTypeCopyPreferredTagWithClass(uti, kUTTagClassMIMEType)?.takeRetainedValue() {
                return mimetype as String
             }
         }
         return "application/octet-stream"
    }

    var containsImage: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
             return false
        }
        return UTTypeConformsTo(uti, kUTTypeImage)
    }

    var containsAudio: Bool {
        let mimeType = self.mimeType()
        guard let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
              return false
        }
        return UTTypeConformsTo(uti, kUTTypeAudio)
    }
    var containsVideo: Bool {
        let mimeType = self.mimeType()
        guard  let uti = UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, mimeType as CFString, nil)?.takeRetainedValue() else {
               return false
        }
        return UTTypeConformsTo(uti, kUTTypeMovie)
    }
 }

if you are sure that the file can only be a photo or a video you can use this simple code:

if let data = try? Data(contentsOf: YOUR_LOCAL_URL) {
    if let _: UIImage = UIImage(data: (data)) {
        print("image!")
    } else {
        print("video!")
    }
}

Use import UniformTypeIdentifiers

extension URL {
    var isImageFile: Bool {
        UTType(filenameExtension: pathExtension)?.conforms(to: .image) ?? false
    }
}

Related