Skip to content

Commit 3aa561c

Browse files
committed
uploading and retrieving progress from audiobookshelf
1 parent 5fa596c commit 3aa561c

7 files changed

Lines changed: 201 additions & 85 deletions

File tree

BookPlayer.xcodeproj/project.pbxproj

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -613,11 +613,9 @@
613613
63FCBBBE2DF7404000C50035 /* JellyfinLibraryListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63FCBBBD2DF7404000C50035 /* JellyfinLibraryListItemView.swift */; };
614614
66DF1F3E6AFECB623A558F04 /* IntegrationDisconnectedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1FDA0B60D7BE4CFE100A612 /* IntegrationDisconnectedView.swift */; };
615615
6906A55021720FDF00A9E0B2 /* BookSortServiceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6906A54F21720FDF00A9E0B2 /* BookSortServiceTest.swift */; };
616-
FED52673ACD975949EF9E219 /* PreferencesSyncServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA09FE5A35CEA0B87F83EF3 /* PreferencesSyncServiceTests.swift */; };
617616
6906A553217211C600A9E0B2 /* StubFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6906A552217211C600A9E0B2 /* StubFactory.swift */; };
618617
69343D332133844D000C425E /* VoiceOverService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69343D322133844D000C425E /* VoiceOverService.swift */; };
619618
69343D36213A07B4000C425E /* VoiceOverServiceTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69343D35213A07B4000C425E /* VoiceOverServiceTest.swift */; };
620-
760180C62F243705DE6B3224 /* IntegrationError.swift in Sources */ = {isa = PBXBuildFile; fileRef = B0D0FA9BA32EDF5F367C757B /* IntegrationError.swift */; };
621619
78D8C50324731BBDF9E9281E /* LibraryOptionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FBF775DDE66D0AA08818D45 /* LibraryOptionsView.swift */; };
622620
7CAD4B67352939D0A1E54A21 /* IntegrationConnectionFormViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3724BB21B1B88177C60BE4D8 /* IntegrationConnectionFormViewModelProtocol.swift */; };
623621
8322A3C6479B099448C63C47 /* IntegrationLibraryViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E070421575334E1CD85C049 /* IntegrationLibraryViewModelProtocol.swift */; };
@@ -649,8 +647,8 @@
649647
9911FBB02F71D03800DC9A2B /* ConcurrenceService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBAE2F71D03100DC9A2B /* ConcurrenceService.swift */; };
650648
9911FBB22F71E54C00DC9A2B /* ConcurrentTasksRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB12F71E54600DC9A2B /* ConcurrentTasksRepository.swift */; };
651649
9911FBB32F71E54C00DC9A2B /* ConcurrentTasksRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB12F71E54600DC9A2B /* ConcurrentTasksRepository.swift */; };
652-
9911FBB52F72486D00DC9A2B /* JellyfinUpdateProgressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB42F72486400DC9A2B /* JellyfinUpdateProgressOperation.swift */; };
653-
9911FBB62F72486D00DC9A2B /* JellyfinUpdateProgressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB42F72486400DC9A2B /* JellyfinUpdateProgressOperation.swift */; };
650+
9911FBB52F72486D00DC9A2B /* ExternalUpdateProgressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB42F72486400DC9A2B /* ExternalUpdateProgressOperation.swift */; };
651+
9911FBB62F72486D00DC9A2B /* ExternalUpdateProgressOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB42F72486400DC9A2B /* ExternalUpdateProgressOperation.swift */; };
654652
9911FBB82F72F46900DC9A2B /* ConcurrentSyncTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB72F72F46200DC9A2B /* ConcurrentSyncTask.swift */; };
655653
9911FBB92F72F46900DC9A2B /* ConcurrentSyncTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBB72F72F46200DC9A2B /* ConcurrentSyncTask.swift */; };
656654
9911FBBB2F736C0500DC9A2B /* ConcurrentSyncTasksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9911FBBA2F736BFC00DC9A2B /* ConcurrentSyncTasksView.swift */; };
@@ -714,8 +712,6 @@
714712
996D4CD42F98A50C00FC3B57 /* IntegrationLibraryItemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A823609A5B7EFC6D2D5D120 /* IntegrationLibraryItemProtocol.swift */; };
715713
99B367FA2F4575C900C38F7F /* MediaAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B367F92F4575C600C38F7F /* MediaAction.swift */; };
716714
99B367FC2F5108BF00C38F7F /* MediaActionRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99B367FB2F5108BF00C38F7F /* MediaActionRow.swift */; };
717-
99F3C1EC2F5BCE1600AC91A2 /* LibraryItemRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */; };
718-
99F3C1ED2F5BCE1600AC91A2 /* LibraryItemRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */; };
719715
99C919CC2F99609F00F66081 /* Get in Frameworks */ = {isa = PBXBuildFile; productRef = 99C919CB2F99609F00F66081 /* Get */; };
720716
99C919CE2F9960A400F66081 /* Get in Frameworks */ = {isa = PBXBuildFile; productRef = 99C919CD2F9960A400F66081 /* Get */; };
721717
99C919CF2F99A8C100F66081 /* IntegrationDetailsViewModelProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 808E351A8B30ABCBA9EC00EF /* IntegrationDetailsViewModelProtocol.swift */; };
@@ -731,6 +727,8 @@
731727
99D995962F71ABBD00BAF216 /* JellyfinAudiobookDetailsData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99D995942F71ABB700BAF216 /* JellyfinAudiobookDetailsData.swift */; };
732728
99D995982F71B02D00BAF216 /* JellyfinAPI in Frameworks */ = {isa = PBXBuildFile; productRef = 99D995972F71B02D00BAF216 /* JellyfinAPI */; };
733729
99D9959A2F71B05700BAF216 /* JellyfinAPI in Frameworks */ = {isa = PBXBuildFile; productRef = 99D995992F71B05700BAF216 /* JellyfinAPI */; };
730+
99F3C1EC2F5BCE1600AC91A2 /* LibraryItemRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */; };
731+
99F3C1ED2F5BCE1600AC91A2 /* LibraryItemRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */; };
734732
99F3C1F72F5F873900AC91A2 /* UUIDMigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1F62F5F873500AC91A2 /* UUIDMigrationPolicy.swift */; };
735733
99F3C1F82F5F873900AC91A2 /* UUIDMigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1F62F5F873500AC91A2 /* UUIDMigrationPolicy.swift */; };
736734
99F3C1F92F5F873900AC91A2 /* UUIDMigrationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F3C1F62F5F873500AC91A2 /* UUIDMigrationPolicy.swift */; };
@@ -925,6 +923,7 @@
925923
F50163BEFB92FB6B1B778C5E /* WindowHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BB8BFBB9A63469069F0D44A /* WindowHelper.swift */; };
926924
F906EF4FC85B1CCE138B230D /* PasskeyEmailInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3373A34FC2536111E50BF868 /* PasskeyEmailInputView.swift */; };
927925
F9FA95F9A4AE359006A85B88 /* PreferencesAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1E6918C51C370C2E89B24F9 /* PreferencesAPI.swift */; };
926+
FED52673ACD975949EF9E219 /* PreferencesSyncServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA09FE5A35CEA0B87F83EF3 /* PreferencesSyncServiceTests.swift */; };
928927
FF95F8C692908D744A32D761 /* PreferencesAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1E6918C51C370C2E89B24F9 /* PreferencesAPI.swift */; };
929928
/* End PBXBuildFile section */
930929

@@ -1076,6 +1075,7 @@
10761075
/* End PBXCopyFilesBuildPhase section */
10771076

10781077
/* Begin PBXFileReference section */
1078+
0EA09FE5A35CEA0B87F83EF3 /* PreferencesSyncServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesSyncServiceTests.swift; sourceTree = "<group>"; };
10791079
0FC8B923A5506F865253B97C /* AppServices.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppServices.swift; sourceTree = "<group>"; };
10801080
13C407B5BD19D3CF9CC64EC7 /* IntegrationLibraryView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = IntegrationLibraryView.swift; sourceTree = "<group>"; };
10811081
2E070421575334E1CD85C049 /* IntegrationLibraryViewModelProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = IntegrationLibraryViewModelProtocol.swift; sourceTree = "<group>"; };
@@ -1639,7 +1639,6 @@
16391639
63FCBBBD2DF7404000C50035 /* JellyfinLibraryListItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinLibraryListItemView.swift; sourceTree = "<group>"; };
16401640
643E169A5F153B754F726AE1 /* IntegrationTagsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = IntegrationTagsView.swift; sourceTree = "<group>"; };
16411641
6906A54F21720FDF00A9E0B2 /* BookSortServiceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookSortServiceTest.swift; sourceTree = "<group>"; };
1642-
0EA09FE5A35CEA0B87F83EF3 /* PreferencesSyncServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesSyncServiceTests.swift; sourceTree = "<group>"; };
16431642
6906A552217211C600A9E0B2 /* StubFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StubFactory.swift; sourceTree = "<group>"; };
16441643
69343D322133844D000C425E /* VoiceOverService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceOverService.swift; sourceTree = "<group>"; };
16451644
69343D35213A07B4000C425E /* VoiceOverServiceTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VoiceOverServiceTest.swift; sourceTree = "<group>"; };
@@ -1674,7 +1673,7 @@
16741673
9911FBAB2F71CD5F00DC9A2B /* AsyncOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AsyncOperation.swift; sourceTree = "<group>"; };
16751674
9911FBAE2F71D03100DC9A2B /* ConcurrenceService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrenceService.swift; sourceTree = "<group>"; };
16761675
9911FBB12F71E54600DC9A2B /* ConcurrentTasksRepository.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentTasksRepository.swift; sourceTree = "<group>"; };
1677-
9911FBB42F72486400DC9A2B /* JellyfinUpdateProgressOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinUpdateProgressOperation.swift; sourceTree = "<group>"; };
1676+
9911FBB42F72486400DC9A2B /* ExternalUpdateProgressOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalUpdateProgressOperation.swift; sourceTree = "<group>"; };
16781677
9911FBB72F72F46200DC9A2B /* ConcurrentSyncTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentSyncTask.swift; sourceTree = "<group>"; };
16791678
9911FBBA2F736BFC00DC9A2B /* ConcurrentSyncTasksView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentSyncTasksView.swift; sourceTree = "<group>"; };
16801679
9911FBBD2F74526F00DC9A2B /* ConcurrentTaskProgressMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConcurrentTaskProgressMonitor.swift; sourceTree = "<group>"; };
@@ -1705,10 +1704,10 @@
17051704
996D4CC42F98A25100FC3B57 /* MappingModel_v10_to_v11.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = MappingModel_v10_to_v11.xcmappingmodel; sourceTree = "<group>"; };
17061705
99B367F92F4575C600C38F7F /* MediaAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaAction.swift; sourceTree = "<group>"; };
17071706
99B367FB2F5108BF00C38F7F /* MediaActionRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MediaActionRow.swift; sourceTree = "<group>"; };
1708-
99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryItemRef.swift; sourceTree = "<group>"; };
17091707
99C919C92F98AE4700F66081 /* Get */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Get; path = "/Users/pedro.aim/Library/Developer/Xcode/DerivedData/BookPlayer-aehtalmtnvnplqeabppyoncpqrlc/SourcePackages/checkouts/Get"; sourceTree = "<absolute>"; };
17101708
99D995942F71ABB700BAF216 /* JellyfinAudiobookDetailsData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JellyfinAudiobookDetailsData.swift; sourceTree = "<group>"; };
17111709
99D9959D2F71B67100BAF216 /* Kingfisher */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Kingfisher; path = "/Users/pedro.aim/Library/Developer/Xcode/DerivedData/BookPlayer-aehtalmtnvnplqeabppyoncpqrlc/SourcePackages/checkouts/Kingfisher"; sourceTree = "<absolute>"; };
1710+
99F3C1EB2F5BCE1000AC91A2 /* LibraryItemRef.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LibraryItemRef.swift; sourceTree = "<group>"; };
17121711
99F3C1F62F5F873500AC91A2 /* UUIDMigrationPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UUIDMigrationPolicy.swift; sourceTree = "<group>"; };
17131712
99F3C1FD2F5FC2E600AC91A2 /* SchemaV1SyncTasksModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SchemaV1SyncTasksModels.swift; sourceTree = "<group>"; };
17141713
99F3C2032F5FC76700AC91A2 /* MigrationPlan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationPlan.swift; sourceTree = "<group>"; };
@@ -3138,7 +3137,6 @@
31383137
E4D25EF2A5FFF30CF12F2C21 /* PreferencesSyncService.swift */,
31393138
5C6BC9E7E76B9BAB7A0D88D2 /* SortPreferencesResolving.swift */,
31403139
);
3141-
name = Preferences;
31423140
path = Preferences;
31433141
sourceTree = "<group>";
31443142
};
@@ -3222,7 +3220,7 @@
32223220
9911FBB12F71E54600DC9A2B /* ConcurrentTasksRepository.swift */,
32233221
9911FBAE2F71D03100DC9A2B /* ConcurrenceService.swift */,
32243222
9911FBAB2F71CD5F00DC9A2B /* AsyncOperation.swift */,
3225-
9911FBB42F72486400DC9A2B /* JellyfinUpdateProgressOperation.swift */,
3223+
9911FBB42F72486400DC9A2B /* ExternalUpdateProgressOperation.swift */,
32263224
9911FBC32F76121C00DC9A2B /* FileUploadOperation.swift */,
32273225
);
32283226
path = ConcurrentSync;
@@ -4550,7 +4548,7 @@
45504548
41A90C4627563F5A00C30394 /* ItemType.swift in Sources */,
45514549
9F2E00932A568F800001FE20 /* IdentifiersResponse.swift in Sources */,
45524550
4140EA7E227289CE0009F794 /* Library+CoreDataClass.swift in Sources */,
4553-
9911FBB62F72486D00DC9A2B /* JellyfinUpdateProgressOperation.swift in Sources */,
4551+
9911FBB62F72486D00DC9A2B /* ExternalUpdateProgressOperation.swift in Sources */,
45544552
41C233FE272E1958006BC7B8 /* SimpleLibraryItem.swift in Sources */,
45554553
996D4CD22F98A45300FC3B57 /* IntegrationError.swift in Sources */,
45564554
9911FBC12F7465EA00DC9A2B /* ConcurrentTasksCountService.swift in Sources */,
@@ -5055,7 +5053,7 @@
50555053
41A1B125226F88C500EA0400 /* LibraryItem+CoreDataClass.swift in Sources */,
50565054
62CADBA52725BCB200A4A98F /* AVAudioAssetImageDataProvider.swift in Sources */,
50575055
9FC1E4592814E0B000522FA8 /* NetworkUtils.swift in Sources */,
5058-
9911FBB52F72486D00DC9A2B /* JellyfinUpdateProgressOperation.swift in Sources */,
5056+
9911FBB52F72486D00DC9A2B /* ExternalUpdateProgressOperation.swift in Sources */,
50595057
992D6E192FA98C8F0091849F /* AudiobookShelfLibraryLevelData.swift in Sources */,
50605058
99D995892F719E7E00BAF216 /* (null) in Sources */,
50615059
41C23403272E1965006BC7B8 /* PlaybackState.swift in Sources */,

BookPlayer/Library/ItemList/ItemListViewModel.swift

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -816,17 +816,38 @@ extension ItemListViewModel: PlaybackSyncProgressDelegate {
816816
let jellyfinService = JellyfinConnectionService()
817817
jellyfinService.setup()
818818

819-
guard let externalResources = libraryService.findResources(for: playableItem.uuid),
820-
let jellyfinSource = externalResources.first(where: { $0.providerName == ExternalResource.ProviderName.jellyfin.rawValue }),
821-
let jellyfinItem = try await jellyfinService.fetchItem(for: jellyfinSource.providerId) else { return }
819+
let audiobookShelfService = AudiobookShelfConnectionService()
820+
audiobookShelfService.setup()
822821

823-
let threshold: TimeInterval = 15
824-
let externalPlayDate = jellyfinItem.lastPlayedDate ?? Date.distantPast
825-
let isExternalDateNewer = externalPlayDate > lastPlayDate.addingTimeInterval(threshold)
826-
let isExternalSecondsFarther = TimeInterval(jellyfinItem.currentSeconds ?? 0) > (playableItem.currentTime + threshold)
827-
if isExternalDateNewer || isExternalSecondsFarther {
828-
playerState.remotePlayTime = Double(jellyfinItem.currentSeconds ?? 0)
829-
playerState.showResumePopup = true
822+
guard let externalResources = libraryService.findResources(for: playableItem.uuid) else { return }
823+
824+
for externalResource in externalResources {
825+
switch ExternalResource.ProviderName(rawValue: externalResource.providerName) {
826+
case .jellyfin:
827+
if let jellyfinItem = try await jellyfinService.fetchItem(for: externalResource.providerId) {
828+
let threshold: TimeInterval = 15
829+
let externalPlayDate = jellyfinItem.lastPlayedDate ?? Date.distantPast
830+
let isExternalDateNewer = externalPlayDate > lastPlayDate.addingTimeInterval(threshold)
831+
let isExternalSecondsFarther = TimeInterval(jellyfinItem.currentSeconds ?? 0) > (playableItem.currentTime + threshold)
832+
if !playerState.showResumePopup && (isExternalDateNewer || isExternalSecondsFarther) {
833+
playerState.remotePlayTime = Double(jellyfinItem.currentSeconds ?? 0)
834+
playerState.showResumePopup = true
835+
}
836+
}
837+
case .audiobookshelf:
838+
if let audiobookShelfItem = try await audiobookShelfService.fetchItem(for: externalResource.providerId) {
839+
let threshold: TimeInterval = 15
840+
let externalPlayDate = Date.distantPast
841+
let isExternalDateNewer = externalPlayDate > lastPlayDate.addingTimeInterval(threshold)
842+
let isExternalSecondsFarther = TimeInterval(audiobookShelfItem.currentTime ?? 0) > (playableItem.currentTime + threshold)
843+
if !playerState.showResumePopup && (isExternalDateNewer || isExternalSecondsFarther) {
844+
playerState.remotePlayTime = Double(audiobookShelfItem.currentTime ?? 0)
845+
playerState.showResumePopup = true
846+
}
847+
}
848+
default:
849+
break
850+
}
830851
}
831852
}
832853
}

Shared/AudiobookShelf/AudiobookShelfLibraryItem.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,18 @@ extension AudiobookShelfLibraryItem {
226226
isFinished: apiItem.userMediaProgress?.isFinished
227227
)
228228
}
229+
230+
public init(progressItem: AudiobookShelfAPIItem.UserMediaProgress) {
231+
self.init(
232+
id: "",
233+
title: "",
234+
kind: Kind.audiobook,
235+
libraryId: "",
236+
progress: progressItem.progress,
237+
currentTime: progressItem.currentTime,
238+
isFinished: progressItem.isFinished
239+
)
240+
}
229241
}
230242

231243
// MARK: - API Response Models

0 commit comments

Comments
 (0)