Fixed metatdata

This commit is contained in:
Rasmus Krämer 2022-04-14 12:24:27 +02:00
parent 736af85855
commit 6c65c8a33e
No known key found for this signature in database
GPG key ID: EC9E510611BFDAA2
9 changed files with 51 additions and 16 deletions

View file

@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; };
3A200C1527D64D7E00CBF02E /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A200C1427D64D7E00CBF02E /* AudioPlayer.swift */; }; 3A200C1527D64D7E00CBF02E /* AudioPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A200C1427D64D7E00CBF02E /* AudioPlayer.swift */; };
3AB34053280829BF0039308B /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AB34052280829BF0039308B /* Extensions.swift */; };
3ABF580928059BAE005DFBE5 /* PlaybackSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF580828059BAE005DFBE5 /* PlaybackSession.swift */; }; 3ABF580928059BAE005DFBE5 /* PlaybackSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF580828059BAE005DFBE5 /* PlaybackSession.swift */; };
3ABF580B2805A837005DFBE5 /* PlaybackReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF580A2805A837005DFBE5 /* PlaybackReport.swift */; }; 3ABF580B2805A837005DFBE5 /* PlaybackReport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF580A2805A837005DFBE5 /* PlaybackReport.swift */; };
3ABF618F2804325C0070250E /* PlayerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF618E2804325C0070250E /* PlayerHandler.swift */; }; 3ABF618F2804325C0070250E /* PlayerHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ABF618E2804325C0070250E /* PlayerHandler.swift */; };
@ -33,6 +34,7 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; }; 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = "<group>"; };
3A200C1427D64D7E00CBF02E /* AudioPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayer.swift; sourceTree = "<group>"; }; 3A200C1427D64D7E00CBF02E /* AudioPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioPlayer.swift; sourceTree = "<group>"; };
3AB34052280829BF0039308B /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
3ABF580828059BAE005DFBE5 /* PlaybackSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackSession.swift; sourceTree = "<group>"; }; 3ABF580828059BAE005DFBE5 /* PlaybackSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackSession.swift; sourceTree = "<group>"; };
3ABF580A2805A837005DFBE5 /* PlaybackReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackReport.swift; sourceTree = "<group>"; }; 3ABF580A2805A837005DFBE5 /* PlaybackReport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaybackReport.swift; sourceTree = "<group>"; };
3ABF618E2804325C0070250E /* PlayerHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerHandler.swift; sourceTree = "<group>"; }; 3ABF618E2804325C0070250E /* PlayerHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlayerHandler.swift; sourceTree = "<group>"; };
@ -126,6 +128,7 @@
3AD4FCEA280443DD006DB301 /* Database.swift */, 3AD4FCEA280443DD006DB301 /* Database.swift */,
3AD4FCEC28044E6C006DB301 /* Store.swift */, 3AD4FCEC28044E6C006DB301 /* Store.swift */,
3AF1970B2806E2590096F747 /* ApiClient.swift */, 3AF1970B2806E2590096F747 /* ApiClient.swift */,
3AB34052280829BF0039308B /* Extensions.swift */,
); );
path = util; path = util;
sourceTree = "<group>"; sourceTree = "<group>";
@ -298,6 +301,7 @@
3AD4FCE928043FD7006DB301 /* ServerConnectionConfig.swift in Sources */, 3AD4FCE928043FD7006DB301 /* ServerConnectionConfig.swift in Sources */,
3A200C1527D64D7E00CBF02E /* AudioPlayer.swift in Sources */, 3A200C1527D64D7E00CBF02E /* AudioPlayer.swift in Sources */,
3AFCB5E827EA240D00ECCC05 /* NowPlayingInfo.swift in Sources */, 3AFCB5E827EA240D00ECCC05 /* NowPlayingInfo.swift in Sources */,
3AB34053280829BF0039308B /* Extensions.swift in Sources */,
3AD4FCEB280443DD006DB301 /* Database.swift in Sources */, 3AD4FCEB280443DD006DB301 /* Database.swift in Sources */,
3AD4FCE528043E50006DB301 /* AbsDatabase.swift in Sources */, 3AD4FCE528043E50006DB301 /* AbsDatabase.swift in Sources */,
3AF197102806E3DC0096F747 /* AbsAudioPlayer.m in Sources */, 3AF197102806E3DC0096F747 /* AbsAudioPlayer.m in Sources */,

View file

@ -25,8 +25,15 @@ public class AbsAudioPlayer: CAPPlugin {
} }
ApiClient.startPlaybackSession(libraryItemId: libraryItemId!, episodeId: episodeId) { session in ApiClient.startPlaybackSession(libraryItemId: libraryItemId!, episodeId: episodeId) { session in
NSLog(OperationQueue.current)
PlayerHandler.startPlayback(session: session, playWhenReady: playWhenReady) PlayerHandler.startPlayback(session: session, playWhenReady: playWhenReady)
do {
call.resolve(try session.asDictionary())
} catch(let exception) {
NSLog("failed to convert session to json")
debugPrint(exception)
call.resolve([:])
}
} }
} }
} }

View file

@ -7,7 +7,7 @@
import Foundation import Foundation
struct PlaybackSession: Decodable { struct PlaybackSession: Decodable, Encodable {
var id: String var id: String
var userId: String? var userId: String?
var libraryItemId: String? var libraryItemId: String?
@ -30,13 +30,13 @@ struct PlaybackSession: Decodable {
var serverConnectionConfigId: String? var serverConnectionConfigId: String?
var serverAddress: String? var serverAddress: String?
} }
struct Chapter: Decodable { struct Chapter: Decodable, Encodable {
var id: Int var id: Int
var start: Double var start: Double
var end: Double var end: Double
var title: String? var title: String?
} }
struct AudioTrack: Decodable { struct AudioTrack: Decodable, Encodable {
var index: Int? var index: Int?
var startOffset: Double var startOffset: Double
var duration: Double var duration: Double
@ -49,7 +49,7 @@ struct AudioTrack: Decodable {
// var audioProbeResult: AudioProbeResult? Needed for local playback // var audioProbeResult: AudioProbeResult? Needed for local playback
var serverIndex: Int? var serverIndex: Int?
} }
struct FileMetadata: Decodable { struct FileMetadata: Decodable, Encodable {
var filename: String var filename: String
var ext: String var ext: String
var path: String var path: String

View file

@ -75,9 +75,9 @@ class AudioPlayer: NSObject {
print(error) print(error)
} }
DispatchQueue.main.sync { // DispatchQueue.main.sync {
UIApplication.shared.endReceivingRemoteControlEvents() UIApplication.shared.endReceivingRemoteControlEvents()
} // }
} }
// MARK: - Methods // MARK: - Methods
@ -165,7 +165,8 @@ class AudioPlayer: NSObject {
"Authorization": "Bearer \(Store.serverConfig.token)" "Authorization": "Bearer \(Store.serverConfig.token)"
] ]
return AVURLAsset(url: URL(string: activeAudioTrack.contentUrl)!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) debugPrint(activeAudioTrack)
return AVURLAsset(url: URL(string: "\(Store.serverConfig.address)\(activeAudioTrack.contentUrl)")!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers])
} }
private func initAudioSession() { private func initAudioSession() {
do { do {
@ -179,9 +180,9 @@ class AudioPlayer: NSObject {
// MARK: - Now playing // MARK: - Now playing
private func setupRemoteTransportControls() { private func setupRemoteTransportControls() {
DispatchQueue.main.sync { // DispatchQueue.main.sync {
UIApplication.shared.beginReceivingRemoteControlEvents() UIApplication.shared.beginReceivingRemoteControlEvents()
} // }
let commandCenter = MPRemoteCommandCenter.shared() let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.isEnabled = true commandCenter.playCommand.isEnabled = true

View file

@ -17,7 +17,7 @@ class PlayerHandler {
player = nil player = nil
} }
NowPlayingInfo.setSessionMetadata(metadata: NowPlayingMetadata(id: session.id, artworkUrl: "\(Store.serverConfig.address)/api/items/\(String(describing: session.libraryItemId))/cover?token=\(Store.serverConfig.token)", title: session.displayTitle ?? "Unknown title", author: session.displayAuthor, series: nil)) NowPlayingInfo.setSessionMetadata(metadata: NowPlayingMetadata(id: session.id, itemId: session.libraryItemId!, artworkUrl: session.coverPath, title: session.displayTitle ?? "Unknown title", author: session.displayAuthor, series: nil))
self.session = session self.session = session
player = AudioPlayer(playbackSession: session, playWhenReady: playWhenReady) player = AudioPlayer(playbackSession: session, playWhenReady: playWhenReady)
} }

View file

@ -8,8 +8,6 @@
import Foundation import Foundation
import RealmSwift import RealmSwift
extension String: Error {}
class Database { class Database {
public static let realmQueue = DispatchQueue(label: "realm-queue") public static let realmQueue = DispatchQueue(label: "realm-queue")

View file

@ -0,0 +1,20 @@
//
// Extensions.swift
// App
//
// Created by Rasmus Krämer on 14.04.22.
//
import Foundation
extension String: Error {}
extension Encodable {
func asDictionary() throws -> [String: Any] {
let data = try JSONEncoder().encode(self)
guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
throw NSError()
}
return dictionary
}
}

View file

@ -18,6 +18,7 @@ func getData(from url: URL, completion: @escaping (UIImage?) -> Void) {
struct NowPlayingMetadata { struct NowPlayingMetadata {
var id: String var id: String
var itemId: String
var artworkUrl: String? var artworkUrl: String?
var title: String var title: String
var author: String? var author: String?
@ -28,13 +29,18 @@ class NowPlayingInfo {
private static var nowPlayingInfo: [String: Any] = [:] private static var nowPlayingInfo: [String: Any] = [:]
public static func setSessionMetadata(metadata: NowPlayingMetadata) { public static func setSessionMetadata(metadata: NowPlayingMetadata) {
setMetadata(artwork: nil, metadata: nil) setMetadata(artwork: nil, metadata: metadata)
/*
if !shouldFetchCover(id: metadata.id) || metadata.artworkUrl == nil { if !shouldFetchCover(id: metadata.id) || metadata.artworkUrl == nil {
return return
} }
*/
guard let url = URL(string: "\(Store.serverConfig.address)/api/items/\(metadata.itemId)/cover?token=\(Store.serverConfig.token)") else {
return
}
guard let url = URL(string: metadata.artworkUrl!) else { return }
getData(from: url) { [self] image in getData(from: url) { [self] image in
guard let downloadedImage = image else { guard let downloadedImage = image else {
return return

View file

@ -10,7 +10,6 @@ import RealmSwift
class Store { class Store {
@ThreadSafe private static var _serverConfig: ServerConnectionConfig? @ThreadSafe private static var _serverConfig: ServerConnectionConfig?
// ONLY USE REALM IN Database.realmQueue OR ELSE THE APP WILL CRASH
public static var serverConfig: ServerConnectionConfig { public static var serverConfig: ServerConnectionConfig {
get { get {
if _serverConfig == nil { if _serverConfig == nil {