Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions Sources/ForemWebView/ForemMediaManager/ForemMediaManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,33 @@ class ForemMediaManager: NSObject {
}
}

internal func handle(_ podcast: Podcast) {
switch podcast.action {
case .play:
play(audioUrl: podcast.url, at: podcast.seconds)
case .load:
load(audioUrl: podcast.url)
case .seek:
seek(to: podcast.seconds)
case .rate:
podcastRate = podcast.rate ?? 1
avPlayer?.rate = podcastRate ?? 1
case .muted:
avPlayer?.isMuted = podcast.muted ?? false
case .pause:
avPlayer?.pause()
case .terminate:
avPlayer?.pause()
clearObservers()
UIApplication.shared.endReceivingRemoteControlEvents()
case .volume:
podcastVolume = podcast.volume ?? 1
avPlayer?.rate = podcastVolume ?? 1
case .metadata:
break
}
}

internal func handlePodcastMessage(_ message: [String: String]) {
ensureAudioSessionIsActive()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ extension ForemWebView: WKScriptMessageHandler {
didReceive message: WKScriptMessage) {
switch message.name {
case "podcast":
mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:])
if let podcast: Podcast = MessageParser().parse(json: message.body) {
mediaManager.handle(podcast)
}
// mediaManager.handlePodcastMessage(message.body as? [String: String] ?? [:])
case "video":
mediaManager.handleVideoMessage(message.body as? [String: String] ?? [:])
case "imageUpload":
Expand All @@ -37,7 +40,8 @@ extension ForemWebView: WKScriptMessageHandler {
foremWebViewDelegate?.didLogin(userData: foremUser)
ensureForemInstance()
}
default: ()
default:
break
}
}

Expand Down
29 changes: 29 additions & 0 deletions Sources/ForemWebView/Models/Podcast.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
//
// Podcast.swift
//
//
// Created by Daniel Chick on 10/26/22.
//

import Foundation

struct Podcast: Codable {
let action: PodcastAction
let url: String?
let seconds: String?
let rate: Float?
let muted: Bool?
let volume: Float?
}

enum PodcastAction: String, Codable {
case play
case load
case seek
case rate
case muted
case pause
case terminate
case volume
case metadata
}
46 changes: 46 additions & 0 deletions Sources/ForemWebView/Utils/MessageParser.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
//
// MessageParser.swift
//
//
// Created by Daniel Chick on 10/26/22.
//

import Foundation

public typealias Json = [String: Any]

public class MessageParser {
public init () {}

public func parse<T: Decodable>(jsonArray: [Json]) -> T? {
guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: jsonArray) else {
return nil
}

return parseObject(serializedJson: serializedInnerJSON)
}

public func parse<T: Decodable>(json: Json) -> T? {
guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else {
return nil
}

return parseObject(serializedJson: serializedInnerJSON)
}

public func parse<T: Decodable>(json: Any) -> T? {
guard let serializedInnerJSON = try? JSONSerialization.data(withJSONObject: json) else {
return nil
}

return parseObject(serializedJson: serializedInnerJSON)
}

private func parseObject<T: Decodable> (serializedJson: Data) -> T? {
do {
return try JSONDecoder().decode(T.self, from: serializedJson)
} catch {
return nil
}
}
}