mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-08-19 17:18:46 +02:00
Get something saving in the database
This commit is contained in:
parent
f56561b898
commit
e620f53705
2 changed files with 103 additions and 29 deletions
|
@ -10,6 +10,8 @@ import Capacitor
|
||||||
|
|
||||||
@objc(AbsDownloader)
|
@objc(AbsDownloader)
|
||||||
public class AbsDownloader: CAPPlugin {
|
public class AbsDownloader: CAPPlugin {
|
||||||
|
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
|
||||||
|
|
||||||
@objc func downloadLibraryItem(_ call: CAPPluginCall) {
|
@objc func downloadLibraryItem(_ call: CAPPluginCall) {
|
||||||
let libraryItemId = call.getString("libraryItemId")
|
let libraryItemId = call.getString("libraryItemId")
|
||||||
let episodeId = call.getString("episodeId")
|
let episodeId = call.getString("episodeId")
|
||||||
|
@ -31,28 +33,32 @@ public class AbsDownloader: CAPPlugin {
|
||||||
private func startLibraryItemDownload(item: LibraryItem) {
|
private func startLibraryItemDownload(item: LibraryItem) {
|
||||||
let length = item.media.tracks?.count ?? 0
|
let length = item.media.tracks?.count ?? 0
|
||||||
if length > 0 {
|
if length > 0 {
|
||||||
|
let localLibraryItem = LocalLibraryItem(item: item, localUrl: documentsDirectory, server: Store.serverConfig!)
|
||||||
|
|
||||||
item.media.tracks?.enumerated().forEach { position, track in
|
item.media.tracks?.enumerated().forEach { position, track in
|
||||||
startLibraryItemTrackDownload(item: item, position: position, track: track)
|
startLibraryItemTrackDownload(item: item, position: position, track: track)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Database.shared.saveLocalLibraryItem(localLibraryItem: localLibraryItem)
|
||||||
} else {
|
} else {
|
||||||
NSLog("No audio tracks for the supplied library item")
|
NSLog("No audio tracks for the supplied library item")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) -> URLSessionDownloadTask? {
|
private func startLibraryItemTrackDownload(item: LibraryItem, position: Int, track: AudioTrack) {
|
||||||
NSLog("TRACK \(track.contentUrl!)")
|
NSLog("TRACK \(track.contentUrl!)")
|
||||||
|
|
||||||
// If we don't name metadata, then we can't proceed
|
// If we don't name metadata, then we can't proceed
|
||||||
guard let filename = track.metadata?.filename else {
|
guard let filename = track.metadata?.filename else {
|
||||||
NSLog("No metadata for track, unable to download")
|
NSLog("No metadata for track, unable to download")
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let serverUrl = urlForTrack(item: item, track: track)
|
let serverUrl = urlForTrack(item: item, track: track)
|
||||||
let itemDirectory = createLibraryItemFileDirectory(item: item)
|
let itemDirectory = createLibraryItemFileDirectory(item: item)
|
||||||
let localUrl = itemDirectory.appendingPathComponent("\(filename)")
|
let localUrl = itemDirectory.appendingPathComponent("\(filename)")
|
||||||
|
|
||||||
return downloadTrack(serverUrl: serverUrl, localUrl: localUrl)
|
downloadTrack(serverUrl: serverUrl, localUrl: localUrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func urlForTrack(item: LibraryItem, track: AudioTrack) -> URL {
|
private func urlForTrack(item: LibraryItem, track: AudioTrack) -> URL {
|
||||||
|
@ -63,7 +69,6 @@ public class AbsDownloader: CAPPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createLibraryItemFileDirectory(item: LibraryItem) -> URL {
|
private func createLibraryItemFileDirectory(item: LibraryItem) -> URL {
|
||||||
let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
|
|
||||||
let itemDirectory = documentsDirectory.appendingPathComponent("\(item.id)")
|
let itemDirectory = documentsDirectory.appendingPathComponent("\(item.id)")
|
||||||
|
|
||||||
NSLog("ITEM DIR \(itemDirectory)")
|
NSLog("ITEM DIR \(itemDirectory)")
|
||||||
|
|
|
@ -9,25 +9,72 @@ import Foundation
|
||||||
import RealmSwift
|
import RealmSwift
|
||||||
|
|
||||||
|
|
||||||
class LocalLibraryItem: Object, Codable {
|
class LocalLibraryItem: Object {
|
||||||
@Persisted(primaryKey: true) var id: String
|
@Persisted(primaryKey: true) var id: String
|
||||||
@Persisted var basePath: String
|
@Persisted var basePath: String = ""
|
||||||
@Persisted var absolutePath: String
|
@Persisted var absolutePath: String = ""
|
||||||
@Persisted var contentUrl: String
|
@Persisted var contentUrl: String
|
||||||
@Persisted var isInvalid: Bool
|
@Persisted var isInvalid: Bool = false
|
||||||
@Persisted var mediaType: String
|
@Persisted var mediaType: String
|
||||||
@Persisted var media: LocalMediaType?
|
@Persisted var media: LocalMediaType?
|
||||||
@Persisted var localFiles: List<LocalFile>
|
@Persisted var localFiles: List<LocalFile>
|
||||||
@Persisted var coverContentUrl: String? = nil
|
@Persisted var coverContentUrl: String? = nil
|
||||||
@Persisted var coverAbsolutePath: String? = nil
|
@Persisted var coverAbsolutePath: String? = nil
|
||||||
@Persisted var isLocal: Bool
|
@Persisted var isLocal: Bool = true
|
||||||
@Persisted var serverConnectionConfigId: String? = nil
|
@Persisted var serverConnectionConfigId: String? = nil
|
||||||
@Persisted var serverAddress: String? = nil
|
@Persisted var serverAddress: String? = nil
|
||||||
@Persisted var serverUserId: String? = nil
|
@Persisted var serverUserId: String? = nil
|
||||||
@Persisted var libraryItemId: String? = nil
|
@Persisted var libraryItemId: String? = nil
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
init(item: LibraryItem, localUrl: URL, server: ServerConnectionConfig) {
|
||||||
|
super.init()
|
||||||
|
self.id = item.id
|
||||||
|
self.contentUrl = localUrl.absoluteString
|
||||||
|
self.mediaType = item.mediaType
|
||||||
|
self.media = LocalMediaType(mediaType: item.media)
|
||||||
|
// TODO: self.localFiles
|
||||||
|
// TODO: self.coverContentURL
|
||||||
|
// TODO: self.converAbsolutePath
|
||||||
|
self.libraryItemId = item.id
|
||||||
|
self.serverConnectionConfigId = server.id
|
||||||
|
self.serverAddress = server.address
|
||||||
|
self.serverUserId = server.userId
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalMediaItem: Object, Codable {
|
class LocalMediaType: Object {
|
||||||
|
@Persisted var libraryItemId: String? = ""
|
||||||
|
@Persisted var metadata: LocalMetadata?
|
||||||
|
@Persisted var coverPath: String? = ""
|
||||||
|
@Persisted var tags: List<String?>
|
||||||
|
@Persisted var audioFiles: List<LocalAudioFile>
|
||||||
|
@Persisted var chapters: List<LocalChapter>
|
||||||
|
@Persisted var tracks: List<LocalAudioTrack>
|
||||||
|
@Persisted var size: Int64? = nil
|
||||||
|
@Persisted var duration: Double? = nil
|
||||||
|
@Persisted var episodes: List<LocalPodcastEpisode>
|
||||||
|
@Persisted var autoDownloadEpisodes: Bool? = nil
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
init(mediaType: MediaType) {
|
||||||
|
super.init()
|
||||||
|
self.libraryItemId = mediaType.libraryItemId
|
||||||
|
self.metadata = LocalMetadata(metadata: mediaType.metadata)
|
||||||
|
self.tags.append(objectsIn: mediaType.tags ?? [])
|
||||||
|
self.size = mediaType.size
|
||||||
|
self.duration = mediaType.duration
|
||||||
|
self.autoDownloadEpisodes = mediaType.autoDownloadEpisodes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LocalMediaItem: Object {
|
||||||
@Persisted var id: String
|
@Persisted var id: String
|
||||||
@Persisted var name: String
|
@Persisted var name: String
|
||||||
@Persisted var mediaType: String
|
@Persisted var mediaType: String
|
||||||
|
@ -42,21 +89,7 @@ class LocalMediaItem: Object, Codable {
|
||||||
@Persisted var coverAbsolutePath: String? = ""
|
@Persisted var coverAbsolutePath: String? = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalMediaType: Object, Codable {
|
class LocalMetadata: Object {
|
||||||
@Persisted var libraryItemId: String? = ""
|
|
||||||
@Persisted var metadata: LocalMetadata?
|
|
||||||
@Persisted var coverPath: String? = ""
|
|
||||||
@Persisted var tags: List<String?>
|
|
||||||
@Persisted var audioFiles: List<LocalAudioFile>
|
|
||||||
@Persisted var chapters: List<LocalChapter>
|
|
||||||
@Persisted var tracks: List<LocalAudioTrack>
|
|
||||||
@Persisted var size: Int64? = nil
|
|
||||||
@Persisted var duration: Double? = nil
|
|
||||||
@Persisted var episodes: List<LocalPodcastEpisode>
|
|
||||||
@Persisted var autoDownloadEpisodes: Bool? = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
class LocalMetadata: Object, Codable {
|
|
||||||
@Persisted var title: String
|
@Persisted var title: String
|
||||||
@Persisted var subtitle: String? = ""
|
@Persisted var subtitle: String? = ""
|
||||||
@Persisted var authors: List<LocalAuthor>
|
@Persisted var authors: List<LocalAuthor>
|
||||||
|
@ -65,8 +98,7 @@ class LocalMetadata: Object, Codable {
|
||||||
@Persisted var publishedYear: String? = ""
|
@Persisted var publishedYear: String? = ""
|
||||||
@Persisted var publishedDate: String? = ""
|
@Persisted var publishedDate: String? = ""
|
||||||
@Persisted var publisher: String? = ""
|
@Persisted var publisher: String? = ""
|
||||||
// I think calling the below variable description conflicts with some public variables declared in some of the Pods we use, so it's desc. ¯\_(ツ)_/¯
|
@Persisted var desc: String? = ""
|
||||||
@Persisted final var desc: String
|
|
||||||
@Persisted var isbn: String? = ""
|
@Persisted var isbn: String? = ""
|
||||||
@Persisted var asin: String? = ""
|
@Persisted var asin: String? = ""
|
||||||
@Persisted var language: String? = ""
|
@Persisted var language: String? = ""
|
||||||
|
@ -76,6 +108,31 @@ class LocalMetadata: Object, Codable {
|
||||||
@Persisted var narratorName: String? = ""
|
@Persisted var narratorName: String? = ""
|
||||||
@Persisted var seriesName: String? = ""
|
@Persisted var seriesName: String? = ""
|
||||||
@Persisted var feedUrl: String? = ""
|
@Persisted var feedUrl: String? = ""
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
init(metadata: Metadata) {
|
||||||
|
super.init()
|
||||||
|
self.title = metadata.title
|
||||||
|
self.subtitle = metadata.subtitle
|
||||||
|
self.narrators.append(objectsIn: metadata.narrators ?? [])
|
||||||
|
self.genres.append(objectsIn: metadata.genres)
|
||||||
|
self.publishedYear = metadata.publishedYear
|
||||||
|
self.publishedDate = metadata.publishedDate
|
||||||
|
self.publisher = metadata.publisher
|
||||||
|
self.desc = metadata.description
|
||||||
|
self.isbn = metadata.isbn
|
||||||
|
self.asin = metadata.asin
|
||||||
|
self.language = metadata.language
|
||||||
|
self.explicit = metadata.explicit
|
||||||
|
self.authorName = metadata.authorName
|
||||||
|
self.authorNameLF = metadata.authorNameLF
|
||||||
|
self.narratorName = metadata.narratorName
|
||||||
|
self.seriesName = metadata.seriesName
|
||||||
|
self.feedUrl = metadata.feedUrl
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalPodcastEpisode: Object, Codable {
|
class LocalPodcastEpisode: Object, Codable {
|
||||||
|
@ -85,7 +142,7 @@ class LocalPodcastEpisode: Object, Codable {
|
||||||
@Persisted var episodeType: String? = ""
|
@Persisted var episodeType: String? = ""
|
||||||
@Persisted var title: String
|
@Persisted var title: String
|
||||||
@Persisted var subtitle: String? = ""
|
@Persisted var subtitle: String? = ""
|
||||||
@Persisted var escription: String? = ""
|
@Persisted var desc: String? = ""
|
||||||
@Persisted var audioFile: LocalAudioFile? = nil
|
@Persisted var audioFile: LocalAudioFile? = nil
|
||||||
@Persisted var audioTrack: LocalAudioTrack? = nil
|
@Persisted var audioTrack: LocalAudioTrack? = nil
|
||||||
@Persisted var duration: Double
|
@Persisted var duration: Double
|
||||||
|
@ -110,6 +167,18 @@ class LocalChapter: Object, Codable {
|
||||||
@Persisted var start: Double
|
@Persisted var start: Double
|
||||||
@Persisted var end: Double
|
@Persisted var end: Double
|
||||||
@Persisted var title: String? = nil
|
@Persisted var title: String? = nil
|
||||||
|
|
||||||
|
override init() {
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
init(chapter: Chapter) {
|
||||||
|
super.init()
|
||||||
|
self.id = chapter.id
|
||||||
|
self.start = chapter.start
|
||||||
|
self.end = chapter.end
|
||||||
|
self.title = chapter.title
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalAudioTrack: Object, Codable {
|
class LocalAudioTrack: Object, Codable {
|
||||||
|
@ -133,7 +202,7 @@ class LocalFileMetadata: Object, Codable {
|
||||||
@Persisted var relPath: String
|
@Persisted var relPath: String
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalFile: Object, Codable {
|
class LocalFile: Object {
|
||||||
@Persisted var id: String
|
@Persisted var id: String
|
||||||
@Persisted var filename: String? = ""
|
@Persisted var filename: String? = ""
|
||||||
@Persisted var contentUrl: String
|
@Persisted var contentUrl: String
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue