From 4d0d1eb88f7f32b9411c3e9d7f05045dc555ed5c Mon Sep 17 00:00:00 2001 From: benonymity Date: Fri, 22 Apr 2022 20:31:45 -0400 Subject: [PATCH 1/2] New Data Classes --- ios/App/App.xcodeproj/project.pbxproj | 4 + ios/App/Shared/models/DataClasses.swift | 137 ++++++++++++++++++++ ios/App/Shared/models/PlaybackSession.swift | 29 +---- 3 files changed, 143 insertions(+), 27 deletions(-) create mode 100644 ios/App/Shared/models/DataClasses.swift diff --git a/ios/App/App.xcodeproj/project.pbxproj b/ios/App/App.xcodeproj/project.pbxproj index 2b96344c..d088ee44 100644 --- a/ios/App/App.xcodeproj/project.pbxproj +++ b/ios/App/App.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; + C4D0677528106D0C00B8F875 /* DataClasses.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D0677428106D0C00B8F875 /* DataClasses.swift */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -60,6 +61,7 @@ 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; + C4D0677428106D0C00B8F875 /* DataClasses.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataClasses.swift; sourceTree = ""; }; FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -118,6 +120,7 @@ children = ( 3AD4FCE828043FD7006DB301 /* ServerConnectionConfig.swift */, 3ABF580828059BAE005DFBE5 /* PlaybackSession.swift */, + C4D0677428106D0C00B8F875 /* DataClasses.swift */, 3A90295E280968E700E1D427 /* PlaybackReport.swift */, ); path = models; @@ -309,6 +312,7 @@ 3AD4FCE528043E50006DB301 /* AbsDatabase.swift in Sources */, 3AF197102806E3DC0096F747 /* AbsAudioPlayer.m in Sources */, 3AF1970C2806E2590096F747 /* ApiClient.swift in Sources */, + C4D0677528106D0C00B8F875 /* DataClasses.swift in Sources */, 3AB34055280832720039308B /* PlayerEvents.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ios/App/Shared/models/DataClasses.swift b/ios/App/Shared/models/DataClasses.swift new file mode 100644 index 00000000..2af3cd21 --- /dev/null +++ b/ios/App/Shared/models/DataClasses.swift @@ -0,0 +1,137 @@ +// +// DataClasses.swift +// App +// +// Created by Benonymity on 4/20/22. +// + +import Foundation +import CoreMedia + +struct LibraryItem: Codable { + var id: String + var ino:String + var libraryId: String + var folderId: String + var path: String + var relPath: String + var mtimeMs: Int64 + var ctimeMs: Int64 + var birthtimeMs: Int64 + var addedAt: Int64 + var updatedAt: Int64 + var lastScan: Int64? + var scanVersion: String? + var isMissing: Bool + var isInvalid: Bool + var mediaType: String +// var media: MediaType + var libraryFiles: [LibraryFile] +} +struct Book: Codable { + var libraryItemId: String? + var metadata: BookMetadata + var coverPath: String? + var tags: [String] + var audioFiles: [AudioTrack]? + var chapters: [Chapter]? + var tracks: [AudioTrack]? + var size: Int64? + var duration: Double? +} +struct BookMetadata: Codable { + var title:String + var subtitle: String? + var authors: [Author]? + var narrators: [String]? + var genres: [String] + var publishedYear: String? + var publishedDate: String? + var publisher: String? + var description: String? + var isbn: String? + var asin: String? + var language: String? + var explicit: Bool + var authorName: String? + var authorNameLF: String? + var narratorName: String? + var seriesName: String? +} +struct Podcast: Codable { + var metadata: PodcastMetadata + var coverPath: String? + var tags: [String] + var episodes: [PodcastEpisode] + var autoDownloadEpisodes: Bool +} +struct PodcastMetadata: Codable { + var title: String + var author: String? + var feedUrl: String? + var genres: [String] +} +struct PodcastEpisode: Codable { + var id: String + var index: Int + var episode: String? + var episodeType: String? + var title: String? + var subtitle: String? + var description: String? + var audioFile: AudioFile? + var audioTrack: AudioTrack? + var duration: Double + var size: Int64 +// var serverEpisodeId: String? +} +struct AudioFile: Codable { + var index: Int + var ino: String + var metadata: FileMetadata +} +struct Author: Codable { + var id: String + var name: String + var coverPath: String? +} +struct Chapter: Codable { + var id: Int + var start: Double + var end: Double + var title: String? +} +struct AudioTrack: Codable { + var index: Int? + var startOffset: Double + var duration: Double + var title: String + var contentUrl: String + var mimeType: String + var metadata: FileMetadata? + // var isLocal: Bool + // var localFileId: String? + // var audioProbeResult: AudioProbeResult? Needed for local playback + var serverIndex: Int? +} +struct FileMetadata: Codable { + var filename: String + var ext: String + var path: String + var relPath: String +} +struct Library: Codable { + var id: String + var name: String + var folders: [Folder] + var icon: String + var mediaType: String +} +struct Folder: Codable { + var id: String + var fullPath: String +} +struct LibraryFile: Codable { + var ino: String + var metadata: FileMetadata +} diff --git a/ios/App/Shared/models/PlaybackSession.swift b/ios/App/Shared/models/PlaybackSession.swift index bf947c71..483da125 100644 --- a/ios/App/Shared/models/PlaybackSession.swift +++ b/ios/App/Shared/models/PlaybackSession.swift @@ -6,7 +6,7 @@ // import Foundation - + struct PlaybackSession: Decodable, Encodable { var id: String var userId: String? @@ -25,33 +25,8 @@ struct PlaybackSession: Decodable, Encodable { var timeListening: Double var audioTracks: [AudioTrack] var currentTime: Double - // var libraryItem: LibraryItem? + var libraryItem: LibraryItem // var localLibraryItem: LocalLibraryItem? var serverConnectionConfigId: String? var serverAddress: String? } -struct Chapter: Decodable, Encodable { - var id: Int - var start: Double - var end: Double - var title: String? -} -struct AudioTrack: Decodable, Encodable { - var index: Int? - var startOffset: Double - var duration: Double - var title: String - var contentUrl: String - var mimeType: String - var metadata: FileMetadata? - // var isLocal: Bool - // var localFileId: String? - // var audioProbeResult: AudioProbeResult? Needed for local playback - var serverIndex: Int? -} -struct FileMetadata: Decodable, Encodable { - var filename: String - var ext: String - var path: String - var relPath: String -} From 81ca757c773acc49138e464f21e63ce9b1bec762 Mon Sep 17 00:00:00 2001 From: benonymity Date: Mon, 25 Apr 2022 00:15:44 -0400 Subject: [PATCH 2/2] Book-Podcast combination, optional fixes --- ios/App/Shared/models/DataClasses.swift | 34 +++++++++---------------- ios/App/Shared/player/AudioPlayer.swift | 4 +-- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/ios/App/Shared/models/DataClasses.swift b/ios/App/Shared/models/DataClasses.swift index 2af3cd21..f3e0b2f5 100644 --- a/ios/App/Shared/models/DataClasses.swift +++ b/ios/App/Shared/models/DataClasses.swift @@ -25,22 +25,24 @@ struct LibraryItem: Codable { var isMissing: Bool var isInvalid: Bool var mediaType: String -// var media: MediaType + var media: MediaType var libraryFiles: [LibraryFile] } -struct Book: Codable { +struct MediaType: Codable { var libraryItemId: String? - var metadata: BookMetadata + var metadata: Metadata var coverPath: String? - var tags: [String] + var tags: [String]? var audioFiles: [AudioTrack]? var chapters: [Chapter]? var tracks: [AudioTrack]? var size: Int64? var duration: Double? + var episodes: [PodcastEpisode]? + var autoDownloadEpisodes: Bool? } -struct BookMetadata: Codable { - var title:String +struct Metadata: Codable { + var title: String var subtitle: String? var authors: [Author]? var narrators: [String]? @@ -57,26 +59,14 @@ struct BookMetadata: Codable { var authorNameLF: String? var narratorName: String? var seriesName: String? -} -struct Podcast: Codable { - var metadata: PodcastMetadata - var coverPath: String? - var tags: [String] - var episodes: [PodcastEpisode] - var autoDownloadEpisodes: Bool -} -struct PodcastMetadata: Codable { - var title: String - var author: String? var feedUrl: String? - var genres: [String] } struct PodcastEpisode: Codable { var id: String var index: Int var episode: String? var episodeType: String? - var title: String? + var title: String var subtitle: String? var description: String? var audioFile: AudioFile? @@ -103,10 +93,10 @@ struct Chapter: Codable { } struct AudioTrack: Codable { var index: Int? - var startOffset: Double + var startOffset: Double? var duration: Double - var title: String - var contentUrl: String + var title: String? + var contentUrl: String? var mimeType: String var metadata: FileMetadata? // var isLocal: Bool diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 0bd7270c..88550c27 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -40,7 +40,7 @@ class AudioPlayer: NSObject { if playbackSession.audioTracks.count != 1 || playbackSession.audioTracks[0].mimeType != "application/vnd.apple.mpegurl" { NSLog("The player only support HLS streams right now") - self.activeAudioTrack = AudioTrack(index: 0, startOffset: -1, duration: -1, title: "", contentUrl: "", mimeType: "") + self.activeAudioTrack = AudioTrack(index: 0, startOffset: -1, duration: -1, title: "", contentUrl: nil, mimeType: "", metadata: nil, serverIndex: 0) super.init() return @@ -168,7 +168,7 @@ class AudioPlayer: NSObject { "Authorization": "Bearer \(Store.serverConfig!.token)" ] - return AVURLAsset(url: URL(string: "\(Store.serverConfig!.address)\(activeAudioTrack.contentUrl)")!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) + return AVURLAsset(url: URL(string: "\(Store.serverConfig!.address)\(activeAudioTrack.contentUrl ?? "")")!, options: ["AVURLAssetHTTPHeaderFieldsKey": headers]) } private func initAudioSession() { do {