Skip to content

Commit

Permalink
feat: support opening more file types
Browse files Browse the repository at this point in the history
  • Loading branch information
godly-devotion committed Mar 21, 2024
1 parent b851f07 commit bc9746d
Show file tree
Hide file tree
Showing 4 changed files with 157 additions and 11 deletions.
78 changes: 78 additions & 0 deletions Front Row/Support/Extensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,84 @@
//

import Foundation
import SwiftUI

struct AnyDropDelegate: DropDelegate {
var isTargeted: Binding<Bool>?
var onValidate: ((DropInfo) -> Bool)?
let onPerform: (DropInfo) -> Bool
var onEntered: ((DropInfo) -> Void)?
var onExited: ((DropInfo) -> Void)?
var onUpdated: ((DropInfo) -> DropProposal?)?

func performDrop(info: DropInfo) -> Bool {
onPerform(info)
}

func validateDrop(info: DropInfo) -> Bool {
onValidate?(info) ?? true
}

func dropEntered(info: DropInfo) {
isTargeted?.wrappedValue = true
onEntered?(info)
}

func dropExited(info: DropInfo) {
isTargeted?.wrappedValue = false
onExited?(info)
}

func dropUpdated(info: DropInfo) -> DropProposal? {
onUpdated?(info)
}
}

extension NSItemProvider: @unchecked Sendable {}

extension NSItemProvider {
func loadObject<T>(ofClass: T.Type) async throws -> T? where T: NSItemProviderReading {
try await withCheckedThrowingContinuation { continuation in
_ = loadObject(ofClass: ofClass) { data, error in
if let error {
continuation.resume(throwing: error)
return
}

guard let object = data as? T else {
continuation.resume(returning: nil)
return
}

continuation.resume(returning: object)
}
}
}

func loadObject<T>(ofClass: T.Type) async throws -> T?
where T: _ObjectiveCBridgeable, T._ObjectiveCType: NSItemProviderReading {
try await withCheckedThrowingContinuation { continuation in
_ = loadObject(ofClass: ofClass) { data, error in
if let error {
continuation.resume(throwing: error)
return
}

guard let data else {
continuation.resume(returning: nil)
return
}

continuation.resume(returning: data)
}
}
}

/// Get a URL from the item provider, if any.
func getURL() async -> URL? {
try? await loadObject(ofClass: URL.self)
}
}

extension NSSize {
var aspect: CGFloat {
Expand Down
10 changes: 9 additions & 1 deletion Front Row/Support/PlayEngine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@ import SwiftUI

static let shared = PlayEngine()

static let supportedFileTypes: [UTType] = [
.mp3,
.mpeg2TransportStream,
.mpeg4Audio,
.mpeg4Movie,
.quickTimeMovie,
]

var player = AVPlayer()

var isLoaded = false
Expand Down Expand Up @@ -72,7 +80,7 @@ import SwiftUI
@MainActor
func showOpenFileDialog() async {
let panel = NSOpenPanel()
panel.allowedContentTypes = [.mpeg4Movie]
panel.allowedContentTypes = PlayEngine.supportedFileTypes
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
Expand Down
26 changes: 17 additions & 9 deletions Front Row/Views/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,24 @@ struct ContentView: View {
var body: some View {
VideoPlayer(player: PlayEngine.shared.player)
.onDrop(
of: [.mpeg4Movie], isTargeted: nil,
perform: { providers -> Bool in
guard let provider = providers.first else { return false }
provider.loadItem(forTypeIdentifier: UTType.mpeg4Movie.identifier, options: nil)
{ (urlData, _) in
guard let url = urlData as? URL else { return }
PlayEngine.shared.openFile(url: url)
of: [.fileURL],
delegate: AnyDropDelegate(
onValidate: {
$0.hasItemsConforming(to: PlayEngine.supportedFileTypes)
},
onPerform: {
guard let provider = $0.itemProviders(for: [.fileURL]).first else {
return false
}

Task {
guard let url = await provider.getURL() else { return }
PlayEngine.shared.openFile(url: url)
}

return true
}
return true
}
)
)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
.ignoresSafeArea()
Expand Down
54 changes: 53 additions & 1 deletion FrontRowInfo.plist
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,61 @@
<key>CFBundleTypeExtensions</key>
<array>
<string>mp4</string>
<string>m4v</string>
</array>
<key>CFBundleTypeName</key>
<string>MPEG4 Video File</string>
<string>MPEG-4 Video</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Default</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>m4a</string>
</array>
<key>CFBundleTypeName</key>
<string>MPEG-4 Audio</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Default</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mov</string>
<string>qt</string>
</array>
<key>CFBundleTypeName</key>
<string>QuickTime Media</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Default</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>ts</string>
<string>mts</string>
<string>m2ts</string>
</array>
<key>CFBundleTypeName</key>
<string>MPEG Transport Stream</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
<string>Default</string>
</dict>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>mp3</string>
</array>
<key>CFBundleTypeName</key>
<string>MPEG Layer III Audio</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>LSHandlerRank</key>
Expand Down

0 comments on commit bc9746d

Please sign in to comment.