From b0edac4234e26b4c2c187102e10da01c82141769 Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Wed, 23 Nov 2022 01:32:52 +0100 Subject: [PATCH 1/3] Allow specifying start and end of progress via API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch is a minor extension to the update progress and batch update progress API and allows you to specify `finishedAt` and `startedAt` when updating a progress. If not specified, both values are still automatically set to the current time. If just `finishedAt` is specified, `startedAt` is set to the same value. Example API request: ``` ❯ curl -i -X PATCH \ 'http://127.0.0.1:3333/api/me/progress/li_ywupqxw5d22adcadpa' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJyb290IiwidXNlcm5hbWUiOiJyb290IiwiaWF0IjoxNjY4OTYxNjAxfQ._NbilCoFy_hfoqy7uvbV4E_0X6qgLYapQ_MoRptP0oI' \ -H 'Content-Type: application/json' \ --data-raw '{"isFinished":true, "finishedAt": 1668556852000, "startedAt": 1668056852000}' ``` --- server/objects/user/MediaProgress.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/objects/user/MediaProgress.js b/server/objects/user/MediaProgress.js index 70b2d678..159fca34 100644 --- a/server/objects/user/MediaProgress.js +++ b/server/objects/user/MediaProgress.js @@ -63,12 +63,12 @@ class MediaProgress { this.isFinished = !!progress.isFinished || this.progress == 1 this.hideFromContinueListening = !!progress.hideFromContinueListening this.lastUpdate = Date.now() - this.startedAt = Date.now() this.finishedAt = null if (this.isFinished) { - this.finishedAt = Date.now() + this.finishedAt = progress.finishedAt || Date.now() this.progress = 1 } + this.startedAt = this.finishedAt || Date.now() } update(payload) { @@ -95,7 +95,7 @@ class MediaProgress { // If time remaining is less than 5 seconds then mark as finished if ((this.progress >= 1 || (this.duration && !isNaN(timeRemaining) && timeRemaining < 5))) { this.isFinished = true - this.finishedAt = Date.now() + this.finishedAt = payload.finishedAt || Date.now() this.progress = 1 } else if (this.progress < 1 && this.isFinished) { this.isFinished = false @@ -103,7 +103,7 @@ class MediaProgress { } if (!this.startedAt) { - this.startedAt = Date.now() + this.startedAt = this.finishedAt || Date.now() } if (hasUpdates) { if (payload.hideFromContinueListening === undefined) { From 8f4391003fbbaab343f2e6c7f41e3247316ab278 Mon Sep 17 00:00:00 2001 From: ko <> Date: Wed, 23 Nov 2022 18:29:35 +0100 Subject: [PATCH 2/3] Add more polish translation --- client/strings/pl.json | 122 ++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/client/strings/pl.json b/client/strings/pl.json index 05b3d17d..a9fdffb0 100644 --- a/client/strings/pl.json +++ b/client/strings/pl.json @@ -13,7 +13,7 @@ "ButtonCheckAndDownloadNewEpisodes": "Sprawdź i pobierz nowe odcinki", "ButtonChooseAFolder": "Wybierz folder", "ButtonChooseFiles": "Wybierz pliki", - "ButtonClearFilter": "Clear Filter", + "ButtonClearFilter": "Wyczyść filtr", "ButtonCloseFeed": "Zamknij kanał", "ButtonCollections": "Kolekcje", "ButtonConfigureScanner": "Configure Scanner", @@ -44,8 +44,8 @@ "ButtonPurgeAllCache": "Wyczyść dane tymczasowe", "ButtonPurgeItemsCache": "Wyczyść dane tymczasowe pozycji", "ButtonPurgeMediaProgress": "Wyczyść postęp", - "ButtonQueueAddItem": "Add to queue", - "ButtonQueueRemoveItem": "Remove from queue", + "ButtonQueueAddItem": "Dodaj do kolejki", + "ButtonQueueRemoveItem": "Usuń z kolejki", "ButtonQuickMatch": "Szybkie dopasowanie", "ButtonRead": "Czytaj", "ButtonRemove": "Usuń", @@ -68,7 +68,7 @@ "ButtonShow": "Pokaż", "ButtonStartM4BEncode": "Eksportuj jako plik M4B", "ButtonStartMetadataEmbed": "Osadź metadane", - "ButtonSubmit": "Zgłoś", + "ButtonSubmit": "Zaloguj", "ButtonUpload": "Wgraj", "ButtonUploadBackup": "Wgraj kopię zapasową", "ButtonUploadCover": "Wgraj okładkę", @@ -96,7 +96,7 @@ "HeaderLastListeningSession": "Ostatnio odtwarzana sesja", "HeaderLatestEpisodes": "Najnowsze odcinki", "HeaderLibraries": "Biblioteki", - "HeaderLibraryFiles": "Library Files", + "HeaderLibraryFiles": "Pliki w bibliotece", "HeaderLibraryStats": "Statystyki biblioteki", "HeaderListeningSessions": "Sesje słuchania", "HeaderListeningStats": "Statystyki odtwarzania", @@ -144,14 +144,14 @@ "LabelAccountTypeGuest": "Gość", "LabelAccountTypeUser": "Użytkownik", "LabelActivity": "Aktywność", - "LabelAddedAt": "Added At", + "LabelAddedAt": "Dodano", "LabelAddToCollection": "Dodaj do kolekcji", "LabelAddToCollectionBatch": "Dodaj {0} książki do kolekcji", "LabelAll": "All", "LabelAllUsers": "Wszyscy użytkownicy", "LabelAuthor": "Autor", - "LabelAuthorFirstLast": "Author (First Last)", - "LabelAuthorLastFirst": "Author (Last, First)", + "LabelAuthorFirstLast": "Autor (Rosnąco)", + "LabelAuthorLastFirst": "Author (Malejąco)", "LabelAuthors": "Autorzy", "LabelAutoDownloadEpisodes": "Automatyczne pobieranie odcinków", "LabelBackToUser": "Powrót", @@ -165,7 +165,7 @@ "LabelChangePassword": "Zmień hasło", "LabelChaptersFound": "Znalezione rozdziały", "LabelChapterTitle": "Tytuł rozdziału", - "LabelClosePlayer": "Close player", + "LabelClosePlayer": "Zamknij odtwarzacz", "LabelCollapseSeries": "Podsumuj serię", "LabelCollections": "Kolekcje", "LabelComplete": "Ukończone", @@ -198,15 +198,15 @@ "LabelExplicit": "Nieprzyzwoite", "LabelFeedURL": "URL kanału", "LabelFile": "Plik", - "LabelFileBirthtime": "File Birthtime", - "LabelFileModified": "File Modified", + "LabelFileBirthtime": "Data utworzenia pliku", + "LabelFileModified": "Data modyfikacji pliku", "LabelFilename": "Nazwa pliku", "LabelFilterByUser": "Filtruj według danego użytkownika", "LabelFindEpisodes": "Znajdź odcinki", "LabelFinished": "Zakończone", "LabelFolder": "Folder", "LabelFolders": "Foldery", - "LabelGenre": "Genre", + "LabelGenre": "Gatunek", "LabelGenres": "Gatunki", "LabelHardDeleteFile": "Usuń trwale plik", "LabelHour": "Godzina", @@ -215,14 +215,14 @@ "LabelIncomplete": "Nieukończone", "LabelInProgress": "W trakcie", "LabelInterval": "Interwał", - "LabelIntervalCustomDailyWeekly": "Custom daily/weekly", - "LabelIntervalEvery12Hours": "Every 12 hours", - "LabelIntervalEvery15Minutes": "Every 15 minutes", - "LabelIntervalEvery2Hours": "Every 2 hours", - "LabelIntervalEvery30Minutes": "Every 30 minutes", - "LabelIntervalEvery6Hours": "Every 6 hours", - "LabelIntervalEveryDay": "Every day", - "LabelIntervalEveryHour": "Every hour", + "LabelIntervalCustomDailyWeekly": "Niestandardowy dzienny/tygodniowy", + "LabelIntervalEvery12Hours": "Co 12 godzin", + "LabelIntervalEvery15Minutes": "Co 15 minut", + "LabelIntervalEvery2Hours": "Co 2 godziny", + "LabelIntervalEvery30Minutes": "Co 30 minut", + "LabelIntervalEvery6Hours": "Co 6 godzin", + "LabelIntervalEveryDay": "Każdego dnia", + "LabelIntervalEveryHour": "Każdej godziny", "LabelInvalidParts": "Nieprawidłowe części", "LabelItem": "Pozycja", "LabelLanguage": "Język", @@ -238,8 +238,8 @@ "LabelLimit": "Limit", "LabelListenAgain": "Słuchaj ponownie", "LabelLogLevelDebug": "Debug", - "LabelLogLevelInfo": "Info", - "LabelLogLevelWarn": "Warn", + "LabelLogLevelInfo": "Informacja", + "LabelLogLevelWarn": "Ostrzeżenie", "LabelLookForNewEpisodesAfterDate": "Szukaj nowych odcinków po dacie", "LabelMarkSeries": "Oznacz serię", "LabelMediaPlayer": "Odtwarzacz", @@ -268,9 +268,9 @@ "LabelNotificationsMaxQueueSize": "Maksymalny rozmiar kolejki dla powiadomień", "LabelNotificationsMaxQueueSizeHelp": "Zdarzenia są ograniczone do 1 na sekundę. Zdarzenia będą ignorowane jeśli kolejka ma maksymalny rozmiar. Zapobiega to spamowaniu powiadomieniami.", "LabelNotificationTitleTemplate": "Szablon tytułu powiadmienia", - "LabelNotStarted": "Not Started", - "LabelNumberOfBooks": "Number of Books", - "LabelNumberOfEpisodes": "# of Episodes", + "LabelNotStarted": "Nie rozpoęczto", + "LabelNumberOfBooks": "Liczba książek", + "LabelNumberOfEpisodes": "# odcinków", "LabelOpenRSSFeed": "Otwórz kanał RSS", "LabelPassword": "Hasło", "LabelPath": "Ścieżka", @@ -296,7 +296,7 @@ "LabelRegion": "Region", "LabelReleaseDate": "Data wydania", "LabelRemoveCover": "Remove cover", - "LabelRSSFeedOpen": "RSS Feed Open", + "LabelRSSFeedOpen": "RSS Feed otwarty", "LabelRSSFeedSlug": "RSS Feed Slug", "LabelRSSFeedURL": "URL kanały RSS", "LabelSearchTerm": "Wyszukiwanie frazy", @@ -306,7 +306,7 @@ "LabelSequence": "Kolejność", "LabelSeries": "Serie", "LabelSeriesName": "Nazwy serii", - "LabelSeriesProgress": "Series Progress", + "LabelSeriesProgress": "Postęp w serii", "LabelSettingsBookshelfViewHelp": "Widok półki z ksiązkami", "LabelSettingsChromecastSupport": "Wsparcie Chromecast", "LabelSettingsDateFormat": "Format daty", @@ -343,7 +343,7 @@ "LabelSettingsStoreMetadataWithItemHelp": "Domyślnie metadane są przechowywane w folderze /metadata/items, włączenie tej opcji spowoduje, że okładka będzie przechowywana w folderze ksiązki. Tylko jedna okładka o nazwie pliku \"cover\" będzie przechowywana. Rozszerzenie pliku metadanych: .abs", "LabelShowAll": "Pokaż wszystko", "LabelSize": "Rozmiar", - "LabelSleepTimer": "Sleep timer", + "LabelSleepTimer": "Wyłącznik czasowy", "LabelStart": "Rozpocznij", "LabelStarted": "Rozpoczęty", "LabelStartedAt": "Rozpoczęto", @@ -360,8 +360,8 @@ "LabelStatsItemsInLibrary": "Pozycje w bibliotece", "LabelStatsMinutes": "Minuty", "LabelStatsMinutesListening": "Minuty odtwarzania", - "LabelStatsOverallDays": "Overall Days", - "LabelStatsOverallHours": "Overall Hours", + "LabelStatsOverallDays": "Całkowity czas (dni)", + "LabelStatsOverallHours": "Całkowity czas (godziny)", "LabelStatsWeekListening": "Tydzień odtwarzania", "LabelSubtitle": "Podtytuł", "LabelSupportedFileTypes": "Obsługiwane typy plików", @@ -373,13 +373,13 @@ "LabelTimeRemaining": "Pozostało {0}", "LabelTimeToShift": "Czas do przesunięcia w sekundach", "LabelTitle": "Tytuł", - "LabelToolsEmbedMetadata": "Embed Metadata", - "LabelToolsEmbedMetadataDescription": "Embed metadata into audio files including cover image and chapters.", - "LabelToolsMakeM4b": "Make M4B Audiobook File", - "LabelToolsMakeM4bDescription": "Generate a .M4B audiobook file with embedded metadata, cover image, and chapters.", - "LabelToolsSplitM4b": "Split M4B to MP3's", - "LabelToolsSplitM4bDescription": "Create MP3's from an M4B split by chapters with embedded metadata, cover image, and chapters.", - "LabelTotalDuration": "Total Duration", + "LabelToolsEmbedMetadata": "Załącz metadane", + "LabelToolsEmbedMetadataDescription": "Załącz metadane do plików audio (okładkę oraz znaczniki rozdziałów)", + "LabelToolsMakeM4b": "Generuj plik M4B", + "LabelToolsMakeM4bDescription": "Tworzy plik w formacie .M4B, który zawiera metadane, okładkę oraz rozdziały.", + "LabelToolsSplitM4b": "Podziel plik .M4B na pliki .MP3", + "LabelToolsSplitM4bDescription": "Podziel plik .M4B na pliki .MP3 na rozdziały z załączonymi metadanymi oraz okładką.", + "LabelTotalDuration": "TCałkowita długość", "LabelTotalTimeListened": "Całkowity czas odtwarzania", "LabelTrackFromFilename": "Ścieżka z nazwy pliku", "LabelTrackFromMetadata": "Ścieżka z metadanych", @@ -387,33 +387,33 @@ "LabelUnknown": "Nieznany", "LabelUpdateCover": "Zaktalizuj odkładkę", "LabelUpdateCoverHelp": "Umożliwienie nadpisania istniejących okładek dla wybranych książek w przypadku znalezienia dopasowania", - "LabelUpdatedAt": "Zaktualizaowano", + "LabelUpdatedAt": "Zaktualizowano", "LabelUpdateDetails": "Zaktualizuj szczegóły", "LabelUpdateDetailsHelp": "Umożliwienie nadpisania istniejących szczegółów dla wybranych książek w przypadku znalezienia dopasowania", "LabelUploaderDragAndDrop": "Przeciągnij i puść foldery lub pliki", "LabelUploaderDropFiles": "Puść pliki", - "LabelUseChapterTrack": "Use chapter track", + "LabelUseChapterTrack": "Użyj ścieżki rozdziału", "LabelUseFullTrack": "Użycie ścieżki rozdziału", "LabelUser": "Użytkownik", "LabelUsername": "Nazwa użytkownika", "LabelValue": "Wartość", "LabelVersion": "Wersja", - "LabelViewBookmarks": "View bookmarks", - "LabelViewChapters": "View chapters", - "LabelViewQueue": "View player queue", - "LabelVolume": "Volume", + "LabelViewBookmarks": "Wyświetlaj zakładki", + "LabelViewChapters": "Wyświetlaj rozdziały", + "LabelViewQueue": "Wyświetlaj kolejkę odtwarzania", + "LabelVolume": "Głośność", "LabelWeekdaysToRun": "Dni tygodnia", "LabelYourAudiobookDuration": "Czas trwania audiobooka", "LabelYourBookmarks": "Twoje zakładki", "LabelYourProgress": "Twój postęp", - "MessageAppriseDescription": "To use this feature you will need to have an instance of Apprise API running or an api that will handle those same requests.
The Apprise API Url should be the full URL path to send the notification, e.g., if your API instance is served at http://192.168.1.1:8337 then you would put http://192.168.1.1:8337/notify.", + "MessageAppriseDescription": "Aby użyć tej funkcji, konieczne jest posiadanie instancji Apprise API albo innego rozwiązania, które obsługuje schemat zapytań Apprise.
URL do interfejsu API powinno być całkowitą ścieżką, np., jeśli Twoje API do powiadomień jest dostępne pod adresem http://192.168.1.1:8337 to wpisany tutaj URL powinien mieć postać: http://192.168.1.1:8337/notify.", "MessageBackupsDescription": "Kopie zapasowe obejmują użytkowników, postępy użytkowników, szczegóły pozycji biblioteki, ustawienia serwera i obrazy przechowywane w", "MessageBackupsNote": "Kopie zapasowe nie obejmują żadnych plików przechowywanych w folderach biblioteki.", "MessageBatchQuickMatchDescription": "Quick Match będzie próbował dodać brakujące okładki i metadane dla wybranych elementów. Włącz poniższe opcje, aby umożliwić Quick Match nadpisanie istniejących okładek i/lub metadanych.", - "MessageBookshelfNoCollections": "You haven't made any collections yet", - "MessageBookshelfNoResultsForFilter": "No Results for filter \"{0}: {1}\"", - "MessageBookshelfNoRSSFeeds": "No RSS feeds are open", - "MessageBookshelfNoSeries": "You have no series", + "MessageBookshelfNoCollections": "Nie posiadasz jeszcze żadnych kolekcji", + "MessageBookshelfNoResultsForFilter": "Nie znaleziono żadnych pozycji przy aktualnym filtrowaniu \"{0}: {1}\"", + "MessageBookshelfNoRSSFeeds": "Nie posiadasz żadnych otwartych feedów RSS", + "MessageBookshelfNoSeries": "Nie masz jeszcze żadnych serii", "MessageChapterEndIsAfter": "Koniec rozdziału następuje po zakończeniu audiobooka", "MessageChapterStartIsAfter": "Początek rozdziału następuje po zakończeniu audiobooka", "MessageCheckingCron": "Sprawdzanie cron...", @@ -456,7 +456,7 @@ "MessageNoEpisodes": "Brak odcinków", "MessageNoFoldersAvailable": "Brak dostępnych folderów", "MessageNoGenres": "Brak gatunków", - "MessageNoIssues": "No Issues", + "MessageNoIssues": "Brak problemów", "MessageNoItems": "Brak elementów", "MessageNoItemsFound": "Nie znaleziono żadnych elemntów", "MessageNoListeningSessions": "Brak sesji odtwarzania", @@ -466,16 +466,16 @@ "MessageNoPodcastsFound": "Nie znaleziono podcastów", "MessageNoResults": "Brak wyników", "MessageNoSearchResultsFor": "Brak wyników wyszukiwania dla \"{0}\"", - "MessageNotYetImplemented": "Not yet implemented", + "MessageNotYetImplemented": "Jeszcze nie zaimplementowane", "MessageNoUpdateNecessary": "Brak konieczności aktualizacji", "MessageNoUpdatesWereNecessary": "Brak aktualizacji", - "MessageOr": "or", - "MessagePauseChapter": "Pause chapter playback", - "MessagePlayChapter": "Listen to beginning of chapter", + "MessageOr": "lub", + "MessagePauseChapter": "Zatrzymaj odtwarzanie rozdziały", + "MessagePlayChapter": "Rozpocznij odtwarzanie od początku rozdziału", "MessagePodcastHasNoRSSFeedForMatching": "Podcast nie ma adresu url kanału RSS, który mógłby zostać użyty do dopasowania", "MessageQuickMatchDescription": "Wypełnij puste informacje i okładkę pierwszym wynikiem dopasowania z '{0}'. Nie nadpisuje szczegółów, chyba że włączone jest ustawienie serwera 'Preferuj dopasowane metadane'.", "MessageRemoveAllItemsWarning": "UWAGA! Ta akcja usunie wszystkie elementy biblioteki z bazy danych, w tym wszystkie aktualizacje lub dopasowania, które zostały wykonane. Pliki pozostaną niezmienione. Czy jesteś pewien?", - "MessageRemoveChapter": "Remove chapter", + "MessageRemoveChapter": "Usuń rozdział", "MessageRemoveEpisodes": "Usuń {0} odcinków", "MessageRemoveUserWarning": "Czy na pewno chcesz trwale usunąć użytkownika \"{0}\"?", "MessageReportBugsAndContribute": "Zgłoś błędy, pomysły i pomóż rozwijać aplikację na", @@ -490,12 +490,12 @@ "MessageUploading": "Przesyłanie...", "MessageValidCronExpression": "Sprawdź wyrażenie CRON", "MessageWatcherIsDisabledGlobally": "Watcher jest wyłączony globalnie w ustawieniach serwera", - "MessageXLibraryIsEmpty": "{0} Library is empty!", + "MessageXLibraryIsEmpty": "{0} Biblioteka jest pusta!", "MessageYourAudiobookDurationIsLonger": "Czas trwania Twojego audiobooka jest dłuższy niż znaleziony czas trwania", "MessageYourAudiobookDurationIsShorter": "Czas trwania Twojego audiobooka jest krótszy niż znaleziony czas trwania", "NoteChangeRootPassword": "Tylko użytkownik root, może posiadać puste hasło", "NoteChapterEditorTimes": "Uwaga: Czas rozpoczęcia pierwszego rozdziału musi pozostać na poziomie 0:00, a czas rozpoczęcia ostatniego rozdziału nie może przekroczyć czasu trwania audiobooka.", - "NoteFolderPicker": "Note: folders already mapped will not be shown", + "NoteFolderPicker": "Uwaga: dotychczas zmapowane foldery nie zostaną wyświetlone", "NoteFolderPickerDebian": "Uwaga: Wybór folderu w instalcji opartej o system debian nie jest w pełni zaimplementowany. Powinieneś wprowadzić ścieżkę do swojej biblioteki bezpośrednio.", "NoteRSSFeedPodcastAppsHttps": "Ostrzeżenie: Większość aplikacji do obsługi podcastów wymaga, aby adres URL kanału RSS korzystał z protokołu HTTPS.", "NoteRSSFeedPodcastAppsPubDate": "Ostrzeżenie: 1 lub więcej odcinków nie ma daty publikacji. Niektóre aplikacje do słuchania podcastów tego wymagają.", @@ -515,8 +515,8 @@ "ToastAuthorUpdateSuccessNoImageFound": "Autor zaktualizowany (nie znaleziono obrazu)", "ToastBackupCreateFailed": "Nie udało się utworzyć kopii zapasowej", "ToastBackupCreateSuccess": "Utworzono kopię zapasową", - "ToastBackupDeleteFailed": "Failed to delete backup", - "ToastBackupDeleteSuccess": "Nie udało się usunąć kopii zapasowej", + "ToastBackupDeleteFailed": "Nie udało się usunąć kopii zapasowej", + "ToastBackupDeleteSuccess": "Udało się usunąć kopie zapasowej", "ToastBackupRestoreFailed": "Nie udało się przywrócić kopii zapasowej", "ToastBackupUploadFailed": "Nie udało się przesłać kopii zapasowej", "ToastBackupUploadSuccess": "Kopia zapasowa została przesłana", @@ -559,9 +559,9 @@ "ToastRSSFeedCloseSuccess": "Zamknięcie kanału RSS powiodło się", "ToastSessionDeleteFailed": "Nie udało się usunąć sesji", "ToastSessionDeleteSuccess": "Sesja usunięta", - "ToastSocketConnected": "Socket connected", - "ToastSocketDisconnected": "Socket disconnected", - "ToastSocketFailedToConnect": "Socket failed to connect", + "ToastSocketConnected": "Nawiązano połączenie z serwerem", + "ToastSocketDisconnected": "Połączenie z serwerem zostało zamknięte", + "ToastSocketFailedToConnect": "Poączenie z serwerem nie powiodło się", "ToastUserDeleteFailed": "Nie udało się usunąć użytkownika", "ToastUserDeleteSuccess": "Użytkownik usunięty", "WeekdayFriday": "Piątek", From 45434b16e03d43eda5ca88ebd946677aef71af2f Mon Sep 17 00:00:00 2001 From: Lars Kiesow Date: Thu, 24 Nov 2022 00:16:20 +0100 Subject: [PATCH 3/3] Fix startedAt in progress API If no progress had been set before, setting `startedAt` did not work and it would always been set to `finishedAt` or `Date.now()`. Settings this if any progress had already been recorded did work. This fixes the problem so that setting `startedAt` it properly works in both cases. --- server/objects/user/MediaProgress.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/objects/user/MediaProgress.js b/server/objects/user/MediaProgress.js index 159fca34..3c4b4ca3 100644 --- a/server/objects/user/MediaProgress.js +++ b/server/objects/user/MediaProgress.js @@ -68,7 +68,7 @@ class MediaProgress { this.finishedAt = progress.finishedAt || Date.now() this.progress = 1 } - this.startedAt = this.finishedAt || Date.now() + this.startedAt = progress.startedAt || this.finishedAt || Date.now() } update(payload) {