From 40aee61694601367cdcf085e57dd7557f213b2ae Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 18 Aug 2016 02:26:47 -0400 Subject: [PATCH 1/5] fixes #1851 - EmbyServer crashes if staticly assigned IP address changes --- dashboard-ui/dashboardhosting.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dashboard-ui/dashboardhosting.html b/dashboard-ui/dashboardhosting.html index e8eb9a104..787f1f468 100644 --- a/dashboard-ui/dashboardhosting.html +++ b/dashboard-ui/dashboardhosting.html @@ -6,7 +6,7 @@
- +
${LabelBindToLocalNetworkAddressHelp}
From d21f37c1bff958cfa282f1a72cd7e5066c20db8f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 18 Aug 2016 12:08:46 -0400 Subject: [PATCH 2/5] update translations --- dashboard-ui/strings/ar.json | 11 +++++++---- dashboard-ui/strings/be-BY.json | 11 +++++++---- dashboard-ui/strings/bg-BG.json | 11 +++++++---- dashboard-ui/strings/ca.json | 11 +++++++---- dashboard-ui/strings/cs.json | 9 ++++++--- dashboard-ui/strings/da.json | 9 ++++++--- dashboard-ui/strings/de.json | 31 +++++++++++++++++-------------- dashboard-ui/strings/el.json | 11 +++++++---- dashboard-ui/strings/en-GB.json | 9 ++++++--- dashboard-ui/strings/es-AR.json | 11 +++++++---- dashboard-ui/strings/es-MX.json | 31 +++++++++++++++++-------------- dashboard-ui/strings/es.json | 9 ++++++--- dashboard-ui/strings/fi.json | 11 +++++++---- dashboard-ui/strings/fr-CA.json | 11 +++++++---- dashboard-ui/strings/fr-FR.json | 9 ++++++--- dashboard-ui/strings/fr.json | 9 ++++++--- dashboard-ui/strings/gsw.json | 11 +++++++---- dashboard-ui/strings/he.json | 11 +++++++---- dashboard-ui/strings/hr.json | 11 +++++++---- dashboard-ui/strings/hu.json | 11 +++++++---- dashboard-ui/strings/id.json | 11 +++++++---- dashboard-ui/strings/it.json | 9 ++++++--- dashboard-ui/strings/kk.json | 17 ++++++++++------- dashboard-ui/strings/ko.json | 9 ++++++--- dashboard-ui/strings/ms.json | 11 +++++++---- dashboard-ui/strings/nb.json | 9 ++++++--- dashboard-ui/strings/nl.json | 9 ++++++--- dashboard-ui/strings/pl.json | 9 ++++++--- dashboard-ui/strings/pt-BR.json | 9 ++++++--- dashboard-ui/strings/pt-PT.json | 9 ++++++--- dashboard-ui/strings/ro.json | 11 +++++++---- dashboard-ui/strings/ru.json | 19 +++++++++++-------- dashboard-ui/strings/sk.json | 11 +++++++---- dashboard-ui/strings/sl-SI.json | 11 +++++++---- dashboard-ui/strings/sv.json | 9 ++++++--- dashboard-ui/strings/tr.json | 11 +++++++---- dashboard-ui/strings/uk.json | 11 +++++++---- dashboard-ui/strings/vi.json | 11 +++++++---- dashboard-ui/strings/zh-CN.json | 9 ++++++--- dashboard-ui/strings/zh-HK.json | 11 +++++++---- dashboard-ui/strings/zh-TW.json | 11 +++++++---- 41 files changed, 299 insertions(+), 176 deletions(-) diff --git a/dashboard-ui/strings/ar.json b/dashboard-ui/strings/ar.json index c12cbf1e2..b0271a97c 100644 --- a/dashboard-ui/strings/ar.json +++ b/dashboard-ui/strings/ar.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/be-BY.json b/dashboard-ui/strings/be-BY.json index c341339e6..7e2804510 100644 --- a/dashboard-ui/strings/be-BY.json +++ b/dashboard-ui/strings/be-BY.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/bg-BG.json b/dashboard-ui/strings/bg-BG.json index 2e225d173..89e97b32b 100644 --- a/dashboard-ui/strings/bg-BG.json +++ b/dashboard-ui/strings/bg-BG.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "\u0420\u0430\u0437\u0433\u043b\u0435\u0434\u0430\u0439 \u043d\u0430\u043e\u043a\u043e\u043b\u043e", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/ca.json b/dashboard-ui/strings/ca.json index b43ff9882..8060ee221 100644 --- a/dashboard-ui/strings/ca.json +++ b/dashboard-ui/strings/ca.json @@ -880,7 +880,6 @@ "OptionNone": "Cap", "HeaderLiveTv": "TV en Directe", "HeaderReports": "Reports", - "HeaderMetadataManager": "Gestor de Metadades", "HeaderSettings": "Prefer\u00e8ncies", "OptionDefaultSort": "Per defecte", "OptionCommunityMostWatchedSort": "Els M\u00e9s Vistos", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Fes el tour", "HeaderWelcomeBack": "Benvingut de nou!", "ButtonTakeTheTourToSeeWhatsNew": "Fes el tour per veure qu\u00e8 hi ha de nou", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel\u00b7la \u00edtem", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Tauler de Control", "ButtonReports": "Reports", - "ButtonMetadataManager": "Gestor de Metadades", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/cs.json b/dashboard-ui/strings/cs.json index 090643c66..82ed4beb8 100644 --- a/dashboard-ui/strings/cs.json +++ b/dashboard-ui/strings/cs.json @@ -880,7 +880,6 @@ "OptionNone": "\u017d\u00e1dn\u00fd", "HeaderLiveTv": "Live TV", "HeaderReports": "Hl\u00e1\u0161en\u00ed", - "HeaderMetadataManager": "Spr\u00e1vce metadat", "HeaderSettings": "Nastaven\u00ed", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Nejsledovan\u011bj\u0161\u00ed", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "V\u00edtejte zp\u011bt!", "ButtonTakeTheTourToSeeWhatsNew": "Chci vid\u011bt co je nov\u00e9ho", "MessageNoSyncJobsFound": "Nebyly nalezeny \u017e\u00e1dn\u00e9 synchroniza\u010dn\u00ed \u00falohy. Synchroniza\u010dn\u00ed \u00falohy vytvo\u0159\u00edte pomoc\u00ed tla\u010d\u00edtek \"Synchronizace\" kdekoliv ve webov\u00e9m rozhran\u00ed.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Vyber za\u0159\u00edzen\u00ed", "ButtonCancelItem": "Zru\u0161it polo\u017eku", "ButtonQueueForRetry": "Za\u0159azeno pro obnoven\u00ed", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Pros\u00edm ujist\u011bte se, \u017ee je otev\u0159en\u00fd tuner dostupn\u00fd.", "ButtonDashboard": "Hlavn\u00ed nab\u00eddka", "ButtonReports": "Hl\u00e1\u0161en\u00ed", - "ButtonMetadataManager": "Spr\u00e1vce metadat", + "MetadataManager": "Metadata Manager", "HeaderTime": "\u010cas", "LabelAddedOnDate": "P\u0159id\u00e1no {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/da.json b/dashboard-ui/strings/da.json index 7cd548856..62463c3b2 100644 --- a/dashboard-ui/strings/da.json +++ b/dashboard-ui/strings/da.json @@ -880,7 +880,6 @@ "OptionNone": "Ingen", "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporter", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Indstillinger", "OptionDefaultSort": "Standard", "OptionCommunityMostWatchedSort": "Mest sete", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Velkommen tilbage!", "ButtonTakeTheTourToSeeWhatsNew": "Tag en rundvisning for at se hvad der er nyt", "MessageNoSyncJobsFound": "Intet sync job blev fundet. Opret sync jobs ved at benytte Sync knapper som findes gennem web-interfacet.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "V\u00e6lg enheder", "ButtonCancelItem": "Annuller genstand", "ButtonQueueForRetry": "S\u00e6t et nyt fors\u00f8g i k\u00f8", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Sikre dig at en \u00e5ben tuner er tilg\u00e6ngelig.", "ButtonDashboard": "Betjeningspanel", "ButtonReports": "Rapporter", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tid", "LabelAddedOnDate": "Tilf\u00f8jet {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/de.json b/dashboard-ui/strings/de.json index 4e0b03ba6..ce02b8158 100644 --- a/dashboard-ui/strings/de.json +++ b/dashboard-ui/strings/de.json @@ -310,7 +310,7 @@ "OptionAllowRemoteSharedDevices": "Erlaube Fernsteuerung geteilter Ger\u00e4te", "OptionAllowRemoteSharedDevicesHelp": "DLNA-Ger\u00e4te werden gemeinsam genutzt, bis ein Benutzer die Steuerung \u00fcbernimmt.", "OptionAllowLinkSharing": "Erlaube das Teilen in sozialen Netzwerken", - "OptionAllowLinkSharingHelp": "Es werden nur Web-Seiten mit Medieninformationen geteilt. Medien hingenen werden niemals \u00f6ffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zug\u00e4nglich und werden, basierend auf den Servereinstellungen, nach einer Zeit ung\u00fcltig.", + "OptionAllowLinkSharingHelp": "Es werden nur Web-Seiten mit Medieninformationen geteilt. Medien hingenen werden niemals \u00f6ffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zug\u00e4nglich werden nach {0} Tagen ung\u00fcltig.", "HeaderSharing": "Teilen", "HeaderRemoteControl": "Fernsteuerung", "OptionMissingTmdbId": "Fehlende Tmdb Id", @@ -880,7 +880,6 @@ "OptionNone": "Keines", "HeaderLiveTv": "Live-TV", "HeaderReports": "Berichte", - "HeaderMetadataManager": "Metadaten-Manager", "HeaderSettings": "Einstellungen", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Meistgesehen", @@ -1349,7 +1348,7 @@ "HeaderPlayback": "Medien Wiedergabe", "OptionAllowAudioPlaybackTranscoding": "Erlaube Audio-Wiedergabe die Transkodierung ben\u00f6tigt", "OptionAllowVideoPlaybackTranscoding": "Erlaube Video-Wiedergabe die Transkodierung ben\u00f6tigt", - "OptionAllowVideoPlaybackRemuxing": "Allow video playback that requires conversion without re-encoding", + "OptionAllowVideoPlaybackRemuxing": "Erlaube Video-Wiedergabe mittels Konvertierung ohne Neu-Enkodierung", "OptionAllowMediaPlaybackTranscodingHelp": "Benutzer werden, basierend auf deren Einstellungen, eine aussagekr\u00e4ftige Nachricht erhalten, wenn Inhalte nicht abgespielt werden k\u00f6nnen.", "TabStreaming": "Streaming", "LabelRemoteClientBitrateLimit": "Limit f\u00fcr die Internet Streaming Datenrate (Mbps)", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Mache die Tour", "HeaderWelcomeBack": "Willkommen zur\u00fcck!", "ButtonTakeTheTourToSeeWhatsNew": "Gehen Sie auf Erkundung und erfahren Sie was neu ist", - "MessageNoSyncJobsFound": "Keine Synchronisierungs-Aufgaben gefunden. Um Synchronisierungs-Aufgaben zu erstellen verwenden Sie die dazugeh\u00f6rige Funktion im Web-Interface.", + "MessageNoSyncJobsFound": "Keine Synchronisationsaufgaben gefunden. Um Synchronisationsaufgaben zu erstellen verwende die Synchronisationsbuttons in der App.", + "MessageDownloadsFound": "Keine Offline-Downloads. Mache deine Medien offline verf\u00fcgbar indem du \"Offline verf\u00fcgbar machen\" in der bei bei den Medien anklickst.", "HeaderSelectDevices": "Ger\u00e4t w\u00e4hlen", "ButtonCancelItem": "Datei abw\u00e4hlen", "ButtonQueueForRetry": "F\u00fcr Wiederholung in die Warteschlange setzen", @@ -1687,7 +1687,7 @@ "StatusSuccess": "Erfolgreich", "MessageFileWillBeDeleted": "Die folgende Datei wird gel\u00f6scht:", "MessageSureYouWishToProceed": "Bis du dir sicher fortfahren zu wollen?", - "MessageDuplicatesWillBeDeleted": "Zus\u00e4tzlich werden folgende Duplikate gel\u00f6scht:", + "MessageDuplicatesWillBeDeleted": "Zus\u00e4tzlich werden die folgenden Duplikate gel\u00f6scht:", "MessageFollowingFileWillBeMovedFrom": "Die folgende Datei wird verschoben von:", "MessageDestinationTo": "nach:", "HeaderSelectWatchFolder": "W\u00e4hle \u00dcberwachungsverzeichnis", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Bitte stelle sicher, dass ein freier Empf\u00e4nger verf\u00fcgbar ist.", "ButtonDashboard": "\u00dcbersicht", "ButtonReports": "Berichte", - "ButtonMetadataManager": "Metadaten Manager", + "MetadataManager": "Metadaten-Manager", "HeaderTime": "Zeit", "LabelAddedOnDate": "Hinzugef\u00fcgt {0}", "ButtonStart": "Start", @@ -1862,7 +1862,7 @@ "OptionMusicAlbums": "Musik-Alben", "OptionMusicVideos": "Musik-Videos", "OptionSongs": "Lieder", - "OptionHomeVideos": "Heim-Videos", + "OptionHomeVideos": "Heim-Videos und Fotos", "OptionBooks": "B\u00fccher", "ButtonUp": "Hoch", "ButtonDown": "Runter", @@ -2136,7 +2136,7 @@ "HeaderUnlockSync": "Freischaltung Emby Sync", "MessageUnlockAppWithPurchaseOrSupporter": "Schalten Sie diese Funktion mit einer kleinen einmaligen Geb\u00fchr oder einem aktiven Emby Premium Abo frei.", "MessageUnlockAppWithSupporter": "Schalten Sie diese Funktion mit einem aktiven Emby Premium Abo frei.", - "MessageToValidateSupporter": "Wenn Sie eine aktive Emby Premiere Mitgliedschaft haben, stellen Sie bitte sicher, dass Sie diese im Server Dashboard unter Hilfe -> Emby Premiere eingerichtet haben.", + "MessageToValidateSupporter": "Wenn Sie eine aktive Emby Premiere Mitgliedschaft haben, stellen Sie bitte sicher, dass Sie diese \u00fcber das Emby Server Dashboard eingerichtet haben (Hauptmenu -> Emby Premiere).", "MessagePaymentServicesUnavailable": "Die Zahlungsdienste stehen leider gerade nicht zur Verf\u00fcgung. Bitte versuchen Sie es sp\u00e4ter erneut.", "MessagePleaseSignInLocalNetwork": "Bevor Sie fortsetzen sollten Sie sicher sein, dass Sie mit Ihrem Heimnetzwerk verbunden sind.", "ButtonUnlockWithPurchase": "Freischalten durch Kauf", @@ -2274,7 +2274,7 @@ "LabelTitle": "Titel:", "LabelOriginalTitle": "Original Titel:", "LabelSortTitle": "Sortierungs Titel:", - "OptionConvertRecordingPreserveAudio": "Erh\u00f6he die Audiolautst\u00e4rke beim Heruntermischen. Setzte auf 1 um die original Lautst\u00e4rke zu erhalten.", + "OptionConvertRecordingPreserveAudio": "Original-Audio (wenn m\u00f6glich) erhalten bei der Aufnahme-Konvertierung.", "OptionConvertRecordingPreserveAudioHelp": "Dies liefert eine bessere Audio Qualit\u00e4t, ben\u00f6tigt aber m\u00f6glicherweise eine Transkodierung w\u00e4hrend der Wiedergabe auf einigen Ger\u00e4ten.", "CreateCollectionHelp": "Sammlungen erm\u00f6glichen personallisierte Gruppen von Filmen oder anderen Medien.", "AddItemToCollectionHelp": "Um Medien Gruppen hinzuzuf\u00fcgen, verwende die Suche und benutze die Rechtsklick oder Tap-Men\u00fcs.", @@ -2307,12 +2307,15 @@ "UnzipFFmpegFile": "Entpacke den Download in ein Verzeichnis Deiner Wahl.", "OptionUseSystemInstalledVersion": "Systeminstallierte Version verwenden", "OptionUseMyCustomVersion": "Eigene Version verwenden", - "FFmpegSavePathNotFound": "Wir konnten kein FFmpeg in dem von Dir erfassten Verzeichnis finden. FFprobe wird ebenso ben\u00f6tigt und muss sich im gleichen Verzeichnis befinden. Diese Komponenten sind normalerweise in einem B\u00fcndel vorhanden um kommen zusammen mit einem Download. Bitte pr\u00fcfe das Verzeichnis und probiere es erneut.", + "FFmpegSavePathNotFound": "Wir konnten kein FFmpeg in dem von Dir erfassten Verzeichnis finden. FFprobe wird ebenso ben\u00f6tigt und muss sich im gleichen Verzeichnis befinden. Diese Komponenten sind normalerweise in einem Paket vorhanden um kommen zusammen mit einem Download. Bitte pr\u00fcfe das Verzeichnis und probiere es erneut.", "XmlTvPremiere": "Grunds\u00e4tzlich wird Emby {0} Stunden des EPGs importieren. Um unendlich Daten zu importieren ist eine aktive Emby Premiere Mitgliedschaft notwendig.", "MoreFromValue": "Mehr von {0}", "OptionSaveMetadataAsHiddenHelp": "\u00c4nderungen werden sich auf neue Metadaten angewendet. Bereits existierende Metadaten werden bei der n\u00e4chsten Speicherung des Emby Servers auf den neusten Stand gebracht.", - "EnablePhotos": "Enable photos", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", - "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "EnablePhotos": "Aktiviere Fotos", + "EnablePhotosHelp": "Fotos werden erkannt und neben anderen Mediendateien angezeigt.", + "MakeAvailableOffline": "Offline verf\u00fcgbar machen", + "ConfirmRemoveDownload": "Download entfernen?", + "SyncToOtherDevices": "Mit anderen Ger\u00e4ten synchronisieren", + "ManageOfflineDownloads": "Offline-Downloads verwalten", + "MessageDownloadScheduled": "Download geplant" } \ No newline at end of file diff --git a/dashboard-ui/strings/el.json b/dashboard-ui/strings/el.json index a46db6545..3ad0c2209 100644 --- a/dashboard-ui/strings/el.json +++ b/dashboard-ui/strings/el.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "\u039a\u03ac\u03bd\u03c4\u03b5 \u03c4\u03b7\u03bd \u039e\u03b5\u03bd\u03ac\u03b3\u03b7\u03c3\u03b7", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/en-GB.json b/dashboard-ui/strings/en-GB.json index 51ac22842..04336e868 100644 --- a/dashboard-ui/strings/en-GB.json +++ b/dashboard-ui/strings/en-GB.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/es-AR.json b/dashboard-ui/strings/es-AR.json index 8181102ee..dbef3ebcc 100644 --- a/dashboard-ui/strings/es-AR.json +++ b/dashboard-ui/strings/es-AR.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/es-MX.json b/dashboard-ui/strings/es-MX.json index 545e6f19a..718ca7d31 100644 --- a/dashboard-ui/strings/es-MX.json +++ b/dashboard-ui/strings/es-MX.json @@ -880,7 +880,6 @@ "OptionNone": "Ninguno", "HeaderLiveTv": "TV en Vivo", "HeaderReports": "Reportes", - "HeaderMetadataManager": "Administrador de Metadatos", "HeaderSettings": "Configuraci\u00f3n", "OptionDefaultSort": "Por defecto", "OptionCommunityMostWatchedSort": "M\u00e1s Visto", @@ -1114,7 +1113,7 @@ "ViewTypeLiveTvRecordingGroups": "Grabaciones", "ViewTypeLiveTvChannels": "Canales", "LabelEasyPinCode": "C\u00f3digo pin sencillo:", - "EasyPasswordHelp": "Tu c\u00f3digo pin sencillo es usado para el acceso fuera de linea con las aplicaciones Emby soportadas, y tambi\u00e9n puede ser usado para iniciar sesi\u00f3n m\u00e1s f\u00e1cilmente cuando esta conectado dentro de su red.", + "EasyPasswordHelp": "Tu c\u00f3digo pin sencillo es usado para el acceso sin conexi\u00f3n con las aplicaciones Emby soportadas, y tambi\u00e9n puede ser usado para iniciar sesi\u00f3n m\u00e1s f\u00e1cilmente cuando esta conectado dentro de su red.", "LabelInNetworkSignInWithEasyPassword": "Habilitar inicio de sesi\u00f3n con mi c\u00f3digo pin sencillo para conexiones dentro de la red.", "LabelInNetworkSignInWithEasyPasswordHelp": "Si se habilita, podr\u00e1 usar su c\u00f3digo pin sencillo para iniciar sesi\u00f3n en las aplicaciones Emby desde su red de hogar. Su contrase\u00f1a regular sera requerida solamente cuando este fuera de casa. Si el c\u00f3digo pin es dejado en blanco, no necesitara una contrase\u00f1a dentro de su red de hogar.", "HeaderPassword": "Contrase\u00f1a", @@ -1349,7 +1348,7 @@ "HeaderPlayback": "Reproducci\u00f3n de Medios", "OptionAllowAudioPlaybackTranscoding": "Permitir la reproducci\u00f3n de audio que requiera de transcodificaci\u00f3n", "OptionAllowVideoPlaybackTranscoding": "Permitir la reproducci\u00f3n de video que requiera de transcodificaci\u00f3n", - "OptionAllowVideoPlaybackRemuxing": "Allow video playback that requires conversion without re-encoding", + "OptionAllowVideoPlaybackRemuxing": "Permitir reproducci\u00f3n de video que requiera conversi\u00f3n sin re-codificar", "OptionAllowMediaPlaybackTranscodingHelp": "Los usuarios recibir\u00e1n mensajes amigables cuando el contenido no pueda ser reproducido de acuerdo a su pol\u00edtica.", "TabStreaming": "Transmisi\u00f3n", "LabelRemoteClientBitrateLimit": "Limite de tasa de bits para transmisi\u00f3n por Internet (Mbps):", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Haga el recorrido", "HeaderWelcomeBack": "\u00a1Bienvenido nuevamente!", "ButtonTakeTheTourToSeeWhatsNew": "Inice el tour para ver que hay de nuevo", - "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cree trabajos de sincronizaci\u00f3n empleando los botones de Sinc que se encuentran en la intergface web.", + "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cree trabajos de sincronizaci\u00f3n empleando los botones de Sinc en la app.", + "MessageDownloadsFound": "No hay elementos sin conexi\u00f3n. Haga sus medios disponibles mientras esta desconectado haciendo clic en Hacer Disponible sin Conexi\u00f3n a trav\u00e9s de la app.", "HeaderSelectDevices": "Seleccionar Dispositivos", "ButtonCancelItem": "Cancelar \u00edtem.", "ButtonQueueForRetry": "En cola para reintentar", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Por favor aseg\u00farese de que se encuentre disponible un sintonizador abierto.", "ButtonDashboard": "Panel de Control", "ButtonReports": "Reportes", - "ButtonMetadataManager": "Administrador de Metadatos", + "MetadataManager": "Administrador de Metadatos", "HeaderTime": "Hora", "LabelAddedOnDate": "Agregado {0}", "ButtonStart": "Iniciar", @@ -1862,7 +1862,7 @@ "OptionMusicAlbums": "\u00c1lbumes musicales", "OptionMusicVideos": "Videos musicales", "OptionSongs": "Canciones", - "OptionHomeVideos": "Videos caseros", + "OptionHomeVideos": "Videos caseros y fotograf\u00edas", "OptionBooks": "Libros", "ButtonUp": "Arriba", "ButtonDown": "Abajo", @@ -1952,7 +1952,7 @@ "ValueSongCount": "{0} canciones", "ValueOneMusicVideo": "1 video musical", "ValueMusicVideoCount": "{0} videos musicales", - "HeaderOffline": "Fuera de L\u00ednea", + "HeaderOffline": "Sin conexi\u00f3n", "HeaderUnaired": "No Emitido", "HeaderMissing": "Falta", "ButtonWebsite": "Sitio web", @@ -2054,7 +2054,7 @@ "WebClientTourUserPreferences4": "Configure im\u00e1genes de fondo, canciones de tema y reproductores externos", "WebClientTourMobile1": "El cliente web funciona de maravilla en tel\u00e9fonos inteligentes y tabletas...", "WebClientTourMobile2": "y controla f\u00e1cilmente otros dispositivos y aplicaciones Emby", - "WebClientTourMySync": "Sincronice sus medios personales a sus dispositivos para reproducirlos fuera de l\u00ednea.", + "WebClientTourMySync": "Sincronice sus medios personales a sus dispositivos para reproducirlos sin conexi\u00f3n.", "MessageEnjoyYourStay": "Disfrute su visita", "DashboardTourDashboard": "El panel de control del servidor le permite monitorear su servidor y sus usuarios. Siempre sabr\u00e1 quien est\u00e1 haciendo qu\u00e9 y donde se encuentran.", "DashboardTourHelp": "La ayuda dentro de la app proporciona botones simples para abrir p\u00e1ginas de la wiki relacionadas con el contenido en pantalla.", @@ -2066,7 +2066,7 @@ "DashboardTourNotifications": "Env\u00ede notificaciones automatizadas de eventos del servidor a sus dispositivos m\u00f3viles, correo electr\u00f3nico y m\u00e1s.", "DashboardTourScheduledTasks": "Administre f\u00e1cilmente operaciones de larga duraci\u00f3n con tareas programadas. Decida cuando se ejecutar\u00e1n y con que periodicidad.", "DashboardTourMobile": "El panel de control del Servidor Emby funciona genial en smartphones y tablets. Administre su servidor desde la palma de su mano en cualquier momento y en cualquier lugar.", - "DashboardTourSync": "Sincronice sus medios personales a sus dispositivos para reproducirlos fuera de l\u00ednea.", + "DashboardTourSync": "Sincronice sus medios personales a sus dispositivos para reproducirlos sin conexi\u00f3n.", "MessageRefreshQueued": "Actualizaci\u00f3n programada", "TabExtras": "Extras", "HeaderUploadImage": "Subir im\u00e1gen", @@ -2231,7 +2231,7 @@ "ThankYouForTryingEnjoyOneMinute": "Por favor disfrute un minuto de reproducci\u00f3n. Gracias por probar Emby.", "HeaderTryPlayback": "Intente Reproducir", "HeaderBenefitsEmbyPremiere": "Emby Premiere", - "MobileSyncFeatureDescription": "Sincronice sus medios a sus smartphones y tablets para f\u00e1cil acceso fuera de linea.", + "MobileSyncFeatureDescription": "Sincronice sus medios a sus smartphones y tablets para f\u00e1cil acceso cuando este sin conexi\u00f3n.", "CoverArtFeatureDescription": "Cover Art crea divertidas caratulas y da otros tratamientos para ayudar a personalizar las im\u00e1genes de sus medios.", "HeaderMobileSync": "Sincronizaci\u00f3n M\u00f3vil", "HeaderCloudSync": "Sinc. en la Nube", @@ -2311,8 +2311,11 @@ "XmlTvPremiere": "Por defecto, Emby importara {0} horas de datos de la gu\u00eda. Para importar datos ilimitados necesita una subscripcion activa de Emby Premiere", "MoreFromValue": "Mas de {0}", "OptionSaveMetadataAsHiddenHelp": "Cambiando esto se aplicara a nuevos metadatos en adelante. Los archivos de metadatos existentes ser\u00e1n actualizados la pr\u00f3xima vez que sean guardados por el Servidor Emby", - "EnablePhotos": "Enable photos", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", - "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "EnablePhotos": "Habilitar fotograf\u00edas", + "EnablePhotosHelp": "Las fotograf\u00edas ser\u00e1n detectadas y mostradas junto con otros archivos de medios.", + "MakeAvailableOffline": "Hacer disponible sin conexi\u00f3n", + "ConfirmRemoveDownload": "\u00bfEliminar descarga?", + "SyncToOtherDevices": "Sincronizar a otros dispositivos", + "ManageOfflineDownloads": "Administrar elementos sin conexi\u00f3n", + "MessageDownloadScheduled": "Descarga programada" } \ No newline at end of file diff --git a/dashboard-ui/strings/es.json b/dashboard-ui/strings/es.json index f5eb87c60..d51b1e349 100644 --- a/dashboard-ui/strings/es.json +++ b/dashboard-ui/strings/es.json @@ -880,7 +880,6 @@ "OptionNone": "Nada", "HeaderLiveTv": "TV en directo", "HeaderReports": "Informes", - "HeaderMetadataManager": "Gestor de metadatos", "HeaderSettings": "Ajustes", "OptionDefaultSort": "Por defecto", "OptionCommunityMostWatchedSort": "M\u00e1s visto", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "\u00a1Bienvenido de nuevo!", "ButtonTakeTheTourToSeeWhatsNew": "Da un paseo para ver que hay nuevo", "MessageNoSyncJobsFound": "No se han encontrado trabajos de sincronizaci\u00f3n. Cr\u00e9alos usando los botones de sincronizaci\u00f3n que se encuentran a trav\u00e9s de la interfaz web.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Elegir dispositivos", "ButtonCancelItem": "Cancelar \u00edtem", "ButtonQueueForRetry": "En cola para reintentar", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Aseg\u00farese que hay un sintonizador disponible.", "ButtonDashboard": "Panel de control", "ButtonReports": "Informes", - "ButtonMetadataManager": "Gestor de metadatos", + "MetadataManager": "Metadata Manager", "HeaderTime": "Duraci\u00f3n", "LabelAddedOnDate": "A\u00f1adido {0}", "ButtonStart": "Inicio", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/fi.json b/dashboard-ui/strings/fi.json index b1fa98733..b8bd93601 100644 --- a/dashboard-ui/strings/fi.json +++ b/dashboard-ui/strings/fi.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr-CA.json b/dashboard-ui/strings/fr-CA.json index a93530ac7..5fa5e0b81 100644 --- a/dashboard-ui/strings/fr-CA.json +++ b/dashboard-ui/strings/fr-CA.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr-FR.json b/dashboard-ui/strings/fr-FR.json index 38a233d7c..34293c57f 100644 --- a/dashboard-ui/strings/fr-FR.json +++ b/dashboard-ui/strings/fr-FR.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/fr.json b/dashboard-ui/strings/fr.json index 29aca6706..b80f57939 100644 --- a/dashboard-ui/strings/fr.json +++ b/dashboard-ui/strings/fr.json @@ -880,7 +880,6 @@ "OptionNone": "Aucun", "HeaderLiveTv": "TV en direct", "HeaderReports": "Rapports", - "HeaderMetadataManager": "Gestionnaire de m\u00e9tadonn\u00e9es", "HeaderSettings": "Param\u00e8tres", "OptionDefaultSort": "Par d\u00e9faut", "OptionCommunityMostWatchedSort": "Les plus lus", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Bienvenue !", "ButtonTakeTheTourToSeeWhatsNew": "Suivez le guide pour d\u00e9couvrir les nouveaut\u00e9s", "MessageNoSyncJobsFound": "Aucune t\u00e2che de synchronisation trouv\u00e9e. Vous pouvez cr\u00e9er des t\u00e2ches de synchronisation gr\u00e2ce aux boutons 'Synchroniser' partout dans l'interface web.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "S\u00e9lectionnez un appareil", "ButtonCancelItem": "Annuler l'\u00e9l\u00e9ment", "ButtonQueueForRetry": "File d'attente pour une nouvelle tentative", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Veuillez vous assurer qu'un tuner est bien disponible.", "ButtonDashboard": "Tableau de bord", "ButtonReports": "Rapports", - "ButtonMetadataManager": "G\u00e9rer les m\u00e9tadonn\u00e9es", + "MetadataManager": "Metadata Manager", "HeaderTime": "Heure", "LabelAddedOnDate": "Ajout\u00e9 {0}", "ButtonStart": "Commencer", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/gsw.json b/dashboard-ui/strings/gsw.json index eff40ae96..36ef3dba0 100644 --- a/dashboard-ui/strings/gsw.json +++ b/dashboard-ui/strings/gsw.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Mach d'Tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/he.json b/dashboard-ui/strings/he.json index e278ada37..a4fe57a2c 100644 --- a/dashboard-ui/strings/he.json +++ b/dashboard-ui/strings/he.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/hr.json b/dashboard-ui/strings/hr.json index d7aac1b11..238a57e03 100644 --- a/dashboard-ui/strings/hr.json +++ b/dashboard-ui/strings/hr.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/hu.json b/dashboard-ui/strings/hu.json index 70d441cee..b531b3e82 100644 --- a/dashboard-ui/strings/hu.json +++ b/dashboard-ui/strings/hu.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Napl\u00f3k", - "HeaderMetadataManager": "Metaadat Kezel\u0151", "HeaderSettings": "Be\u00e1ll\u00edt\u00e1sok", "OptionDefaultSort": "Alap\u00e9rtelmezett", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Vez\u00e9rl\u0151pult", "ButtonReports": "Napl\u00f3k", - "ButtonMetadataManager": "Metaadat Kezel\u0151", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/id.json b/dashboard-ui/strings/id.json index d67ca45fb..2a09d61dd 100644 --- a/dashboard-ui/strings/id.json +++ b/dashboard-ui/strings/id.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/it.json b/dashboard-ui/strings/it.json index ca3b06331..63d3773ab 100644 --- a/dashboard-ui/strings/it.json +++ b/dashboard-ui/strings/it.json @@ -880,7 +880,6 @@ "OptionNone": "Nessuno", "HeaderLiveTv": "Diretta TV", "HeaderReports": "Rapporti", - "HeaderMetadataManager": "Manager Metadati", "HeaderSettings": "Configurazione", "OptionDefaultSort": "Predefinito", "OptionCommunityMostWatchedSort": "Pi\u00f9 visti", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Ben tornato!", "ButtonTakeTheTourToSeeWhatsNew": "Fai un tour per vedere cosa \u00e8 cambiato", "MessageNoSyncJobsFound": "Nessuna sincronizzazione pianificata. Creane una utilizzando i pulsanti sull'interfaccia web", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Seleziona periferiche", "ButtonCancelItem": "Cancella oggetto", "ButtonQueueForRetry": "In attesa di riprovare", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Si prega di assicurarsi che ci sia un sintonizzatore disponibile.", "ButtonDashboard": "Pannello", "ButtonReports": "Reports", - "ButtonMetadataManager": "Manager Metadati", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tempo", "LabelAddedOnDate": "Aggiunto {0}", "ButtonStart": "Avvio", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/kk.json b/dashboard-ui/strings/kk.json index 14f71d646..68fdc24ca 100644 --- a/dashboard-ui/strings/kk.json +++ b/dashboard-ui/strings/kk.json @@ -880,7 +880,6 @@ "OptionNone": "\u0415\u0448\u049b\u0430\u043d\u0434\u0430\u0439", "HeaderLiveTv": "\u042d\u0444\u0438\u0440\u043b\u0456\u043a \u0422\u0414", "HeaderReports": "\u0411\u0430\u044f\u043d\u0430\u0442\u0442\u0430\u0440", - "HeaderMetadataManager": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0440\u0435\u0442\u0442\u0435\u0443\u0448\u0456", "HeaderSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043b\u0435\u0440", "OptionDefaultSort": "\u04d8\u0434\u0435\u043f\u043a\u0456", "OptionCommunityMostWatchedSort": "\u0415\u04a3 \u043a\u04e9\u043f \u049b\u0430\u0440\u0430\u043b\u0493\u0430\u043d\u0434\u0430\u0440", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "\u0410\u0440\u0430\u043b\u0430\u043f \u0448\u044b\u0493\u044b\u04a3\u044b\u0437", "HeaderWelcomeBack": "\u049a\u0430\u0439\u0442\u0430 \u043a\u0435\u043b\u0443\u0456\u04a3\u0456\u0437\u0431\u0435\u043d!", "ButtonTakeTheTourToSeeWhatsNew": "\u0411\u043e\u043b\u0493\u0430\u043d \u0436\u0430\u04a3\u0430\u043b\u044b\u049b\u0442\u0430\u0440\u043c\u0435\u043d \u0442\u0430\u043d\u044b\u0441\u0443", - "MessageNoSyncJobsFound": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0412\u0435\u0431-\u0442\u0456\u043b\u0434\u0435\u0441\u0443\u0434\u0435 \u0442\u0430\u0431\u044b\u043b\u0430\u0442\u044b\u043d \u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.", + "MessageNoSyncJobsFound": "\u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u04ae\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0442\u04af\u0439\u043c\u0435\u0448\u0456\u043a\u0442\u0435\u0440\u0456\u043d \u043f\u0430\u0439\u0434\u0430\u043b\u0430\u043d\u044b\u043f \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443 \u0436\u04b1\u043c\u044b\u0441\u0442\u0430\u0440\u044b\u043d \u0436\u0430\u0441\u0430\u04a3\u044b\u0437.", + "MessageDownloadsFound": "\u0414\u0435\u0440\u0431\u0435\u0441 \u0436\u04af\u043a\u0442\u0435\u0443\u043b\u0435\u0440 \u0442\u0430\u0431\u044b\u043b\u043c\u0430\u0434\u044b. \u0411\u04af\u043a\u0456\u043b \u049b\u043e\u043b\u0434\u0430\u043d\u0431\u0430\u0434\u0430\u0493\u044b \u0414\u0435\u0440\u0431\u0435\u0441 \u0440\u0435\u0436\u0456\u043c\u0456\u043d\u0434\u0435 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443 \u0434\u0435\u0433\u0435\u043d\u0434\u0456 \u043d\u04b1\u049b\u044b\u043f \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456\u04a3\u0456\u0437\u0434\u0456 \u0434\u0435\u0440\u0431\u0435\u0441 \u0440\u0435\u0436\u0456\u043c\u0456\u043d\u0434\u0435 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0456\u04a3\u0456\u0437.", "HeaderSelectDevices": "\u049a\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u0434\u044b \u0442\u0430\u04a3\u0434\u0430\u0443", "ButtonCancelItem": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u044b \u0431\u043e\u043b\u0434\u044b\u0440\u043c\u0430\u0443", "ButtonQueueForRetry": "\u049a\u0430\u0439\u0442\u0430\u043b\u0430\u0443 \u04af\u0448\u0456\u043d \u043a\u0435\u0437\u0435\u043a\u043a\u0435", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "\u0410\u0448\u044b\u043b\u0493\u0430\u043d \u0442\u044e\u043d\u0435\u0440 \u049b\u043e\u043b \u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u043a\u0435\u043d\u0456\u043d\u0435 \u043a\u04e9\u0437 \u0436\u0435\u0442\u043a\u0456\u0437\u0456\u04a3\u0456\u0437.", "ButtonDashboard": "\u0411\u0430\u049b\u044b\u043b\u0430\u0443 \u0442\u0430\u049b\u0442\u0430\u0441\u044b\u043d\u0430", "ButtonReports": "\u0411\u0430\u044f\u043d\u0430\u0442\u0442\u0430\u0440\u0493\u0430", - "ButtonMetadataManager": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0440\u0435\u0442\u0442\u0435\u0443\u0448\u0456\u0433\u0435", + "MetadataManager": "\u041c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0440\u0435\u0442\u0442\u0435\u0443\u0448\u0456", "HeaderTime": "\u0423\u0430\u049b\u044b\u0442", "LabelAddedOnDate": "\u04ae\u0441\u0442\u0435\u043b\u0433\u0435\u043d\u0456 {0}", "ButtonStart": "\u0411\u0430\u0441\u0442\u0430\u0443", @@ -2311,8 +2311,11 @@ "XmlTvPremiere": "\u04d8\u0434\u0435\u043f\u043a\u0456\u0434\u0435, Emby \u0430\u0440\u049b\u044b\u043b\u044b {0} \u0441\u0430\u0493\u0430\u0442 \u049b\u0430\u043c\u0442\u0438\u0442\u044b\u043d \u0442\u0435\u043b\u0435\u0433\u0438\u0434 \u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0456 \u0448\u0435\u0442\u0442\u0435\u043d \u04d9\u043a\u0435\u043b\u0456\u043d\u0435\u0434\u0456. \u0414\u0435\u0440\u0435\u043a\u0442\u0435\u0440\u0434\u0456 \u0448\u0435\u043a\u0441\u0456\u0437 \u0448\u0435\u0442\u0442\u0435\u043d \u04d9\u043a\u0435\u043b\u0443\u0456 \u0431\u0435\u043b\u0441\u0435\u043d\u0434\u0456 Emby Premiere \u0436\u0430\u0437\u044b\u043b\u044b\u043c\u044b\u043d \u049b\u0430\u0436\u0435\u0442 \u0435\u0442\u0435\u0434\u0456.", "MoreFromValue": "{0} \u0430\u0440\u049b\u044b\u043b\u044b \u043a\u04e9\u0431\u0456\u0440\u0435\u043a", "OptionSaveMetadataAsHiddenHelp": "\u041e\u0441\u044b \u04e9\u0437\u0433\u0435\u0440\u0442\u0443 \u0431\u043e\u043b\u0430\u0448\u0430\u049b\u0442\u0430 \u0441\u0430\u049b\u0442\u0430\u043b\u0430\u0442\u044b\u043d \u0436\u0430\u04a3\u0430 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a\u0442\u0435\u0440 \u04af\u0448\u0456\u043d \u049b\u043e\u043b\u0434\u0430\u043d\u044b\u043b\u0430\u0434\u044b. \u0411\u0430\u0440 \u043c\u0435\u0442\u0430\u0434\u0435\u0440\u0435\u043a \u0444\u0430\u0439\u043b\u0434\u0430\u0440 \u043e\u043b\u0430\u0440 Emby \u0441\u0435\u0440\u0432\u0435\u0440\u0456 \u0430\u0440\u049b\u044b\u043b\u044b \u0441\u0430\u049b\u0442\u0430\u043b\u0493\u0430\u043d\u0434\u0430 \u043a\u0435\u043b\u0435\u0441\u0456 \u0436\u043e\u043b\u044b \u0436\u0430\u04a3\u0430\u0440\u0442\u044b\u043b\u0430\u0434\u044b.", - "EnablePhotos": "Enable photos", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", - "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "EnablePhotos": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440\u0434\u0456 \u049b\u043e\u0441\u0443", + "EnablePhotosHelp": "\u0424\u043e\u0442\u043e\u0441\u0443\u0440\u0435\u0442\u0442\u0435\u0440 \u0431\u0430\u0441\u049b\u0430 \u0442\u0430\u0441\u044b\u0493\u044b\u0448 \u0444\u0430\u0439\u043b\u0434\u0430\u0440\u044b\u043c\u0435\u043d \u049b\u0430\u0442\u0430\u0440 \u0430\u043d\u044b\u049b\u0442\u0430\u043b\u0430\u0434\u044b \u0436\u04d9\u043d\u0435 \u0431\u0435\u0439\u043d\u0435\u043b\u0435\u043d\u0435\u0434\u0456.", + "MakeAvailableOffline": "\u0414\u0435\u0440\u0431\u0435\u0441 \u0440\u0435\u0436\u0456\u043c\u0456\u043d\u0434\u0435 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443", + "ConfirmRemoveDownload": "\u0416\u04af\u043a\u0442\u0435\u0443\u0434\u0456 \u0430\u043b\u0430\u0441\u0442\u0430\u0439\u043c\u044b\u0437 \u0431\u0430?", + "SyncToOtherDevices": "\u0411\u0430\u0441\u049b\u0430 \u049b\u04b1\u0440\u044b\u043b\u0493\u044b\u043b\u0430\u0440\u043c\u0435\u043d \u04af\u043d\u0434\u0435\u0441\u0442\u0456\u0440\u0443", + "ManageOfflineDownloads": "\u0414\u0435\u0440\u0431\u0435\u0441 \u0436\u04af\u043a\u0442\u0435\u0443\u043b\u0435\u0440\u0434\u0456 \u0431\u0430\u0441\u049b\u0430\u0440\u0443", + "MessageDownloadScheduled": "\u0416\u04af\u043a\u0442\u0435\u0443 \u0436\u043e\u0441\u043f\u0430\u0440\u043b\u0430\u0493\u0430\u043d." } \ No newline at end of file diff --git a/dashboard-ui/strings/ko.json b/dashboard-ui/strings/ko.json index 101f71b82..6c8f6c53e 100644 --- a/dashboard-ui/strings/ko.json +++ b/dashboard-ui/strings/ko.json @@ -880,7 +880,6 @@ "OptionNone": "\uc5c6\uc74c", "HeaderLiveTv": "TV \ubc29\uc1a1", "HeaderReports": "Reports", - "HeaderMetadataManager": "\uba54\ud0c0\ub370\uc774\ud130 \ub9e4\ub2c8\uc800", "HeaderSettings": "\uc124\uc815", "OptionDefaultSort": "\uae30\ubcf8", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "\uc0c8\ub85c\uc6b4 \ub0b4\uc6a9\uc744 \ub458\ub7ec \ubcf4\uc138\uc694", "MessageNoSyncJobsFound": "\ub3d9\uae30\ud654 \uc791\uc5c5\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \uc6f9 \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \uc788\ub294 \ub3d9\uae30\ud654 \ubc84\ud2bc\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub3d9\uae30\ud654 \uc791\uc5c5\uc744 \uc0dd\uc131\ud558\uc138\uc694.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "\uc7a5\uce58 \uc120\ud0dd", "ButtonCancelItem": "\ud56d\ubaa9 \ucde8\uc18c", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "\ub300\uc2dc\ubcf4\ub4dc", "ButtonReports": "Reports", - "ButtonMetadataManager": "\uba54\ud0c0\ub370\uc774\ud130 \uad00\ub9ac", + "MetadataManager": "Metadata Manager", "HeaderTime": "\uc2dc\uac01", "LabelAddedOnDate": "Added {0}", "ButtonStart": "\uc2dc\uc791", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/ms.json b/dashboard-ui/strings/ms.json index 6f094688f..00bf6b114 100644 --- a/dashboard-ui/strings/ms.json +++ b/dashboard-ui/strings/ms.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/nb.json b/dashboard-ui/strings/nb.json index 971bd24dd..f73e168c0 100644 --- a/dashboard-ui/strings/nb.json +++ b/dashboard-ui/strings/nb.json @@ -880,7 +880,6 @@ "OptionNone": "Ingen", "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporter", - "HeaderMetadataManager": "Metadata Behandler", "HeaderSettings": "Innstillinger", "OptionDefaultSort": "Standard", "OptionCommunityMostWatchedSort": "Mest Sett", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Velkommen tilbake!", "ButtonTakeTheTourToSeeWhatsNew": "Ta en titt p\u00e5 hva som er nytt", "MessageNoSyncJobsFound": "Ingen synkroniseringsjobber funnet. Opprett en synkroniseringsjobb ved hjelp av Synkroniseringsknappene i biblioteket", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Velg enheter", "ButtonCancelItem": "Avbryt element", "ButtonQueueForRetry": "K\u00f8 for \u00e5 pr\u00f8ve igjen", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Vennligst s\u00f8rg for at det minst er \u00e9n \u00e5pen tuner tilgjengelig.", "ButtonDashboard": "Dashbord", "ButtonReports": "Rapporter", - "ButtonMetadataManager": "Metadata Behandler", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tid", "LabelAddedOnDate": "Lagt til {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/nl.json b/dashboard-ui/strings/nl.json index 4b37a57d5..1aeb52a2b 100644 --- a/dashboard-ui/strings/nl.json +++ b/dashboard-ui/strings/nl.json @@ -880,7 +880,6 @@ "OptionNone": "Geen", "HeaderLiveTv": "Live TV", "HeaderReports": "Rapporten", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Instellingen", "OptionDefaultSort": "Standaard", "OptionCommunityMostWatchedSort": "Meest bekeken", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Welkom terug!", "ButtonTakeTheTourToSeeWhatsNew": "Volg de tour om te zien wat nieuw is", "MessageNoSyncJobsFound": "Geen sync opdrachten gevonden. Maak sync opdrachten via de Synchronisatie knoppen in de web interface.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Selecteer Apparaten", "ButtonCancelItem": "Annuleren item", "ButtonQueueForRetry": "Wachtrij voor opnieuw proberen", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Controleer of er een vrije tuner beschikbaar is.", "ButtonDashboard": "Dashboard", "ButtonReports": "Rapporten", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tijd", "LabelAddedOnDate": "Toegevoegd {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/pl.json b/dashboard-ui/strings/pl.json index 302ce2269..500a77218 100644 --- a/dashboard-ui/strings/pl.json +++ b/dashboard-ui/strings/pl.json @@ -880,7 +880,6 @@ "OptionNone": "\u017baden", "HeaderLiveTv": "TV Na \u017bywo", "HeaderReports": "Raporty", - "HeaderMetadataManager": "Manager metadanych", "HeaderSettings": "Ustawienia", "OptionDefaultSort": "Domy\u015blny", "OptionCommunityMostWatchedSort": "Najcz\u0119\u015bciej Ogl\u0105dane", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Witaj ponownie!", "ButtonTakeTheTourToSeeWhatsNew": "Zobacz co nowego dla Ciebie przygotowali\u015bmy", "MessageNoSyncJobsFound": "Brak zada\u0144 synchronizacji. Stw\u00f3rz nowe u\u017cywaj\u0105c odno\u015bnik\u00f3w Sync w interfejsie webowym Emby.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Wybierz urz\u0105dzenie", "ButtonCancelItem": "Anuluj obiekt", "ButtonQueueForRetry": "Zapisz aby spr\u00f3bowa\u0107 p\u00f3\u017aniej", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Prosz\u0119 upewnij si\u0119 \u017ce otwarty tuner jest dost\u0119pny.", "ButtonDashboard": "Panel G\u0142\u00f3wny", "ButtonReports": "Raporty", - "ButtonMetadataManager": "Manager metadanych", + "MetadataManager": "Metadata Manager", "HeaderTime": "Czas", "LabelAddedOnDate": "Dodano {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/pt-BR.json b/dashboard-ui/strings/pt-BR.json index aa74e4119..d874ae51c 100644 --- a/dashboard-ui/strings/pt-BR.json +++ b/dashboard-ui/strings/pt-BR.json @@ -880,7 +880,6 @@ "OptionNone": "Nenhum", "HeaderLiveTv": "TV ao Vivo", "HeaderReports": "Relat\u00f3rios", - "HeaderMetadataManager": "Gerenciador de Metadados", "HeaderSettings": "Ajustes", "OptionDefaultSort": "Padr\u00e3o", "OptionCommunityMostWatchedSort": "Mais Assistidos", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Bem-vindo novamente!", "ButtonTakeTheTourToSeeWhatsNew": "Fa\u00e7a o tour para ver as novidades", "MessageNoSyncJobsFound": "Nenhuma tarefa de sincroniza\u00e7\u00e3o encontrada. Crie uma tarefa de sincroniza\u00e7\u00e3o usando os bot\u00f5es Sincroniza\u00e7\u00e3o encontrados na interface web.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Selecionar Dispositivos", "ButtonCancelItem": "Cancelar item", "ButtonQueueForRetry": "Enfileirar para tentar novamente", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Por favor, cetifique-se que existe um sintonizador aberto.", "ButtonDashboard": "Painel", "ButtonReports": "Relat\u00f3rios", - "ButtonMetadataManager": "Gerenciador de Metadados", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tempo", "LabelAddedOnDate": "Adicionado {0}", "ButtonStart": "Iniciar", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/pt-PT.json b/dashboard-ui/strings/pt-PT.json index 9a87ecc7e..7a28c4d7d 100644 --- a/dashboard-ui/strings/pt-PT.json +++ b/dashboard-ui/strings/pt-PT.json @@ -880,7 +880,6 @@ "OptionNone": "Nenhum", "HeaderLiveTv": "TV ao Vivo", "HeaderReports": "Relat\u00f3rios", - "HeaderMetadataManager": "Gestor de Metadados", "HeaderSettings": "Ajustes", "OptionDefaultSort": "Padr\u00e3o", "OptionCommunityMostWatchedSort": "Mais Assistidos", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "Bem-vindo!", "ButtonTakeTheTourToSeeWhatsNew": "Fa\u00e7a o tour para ver as novidades", "MessageNoSyncJobsFound": "Nenhuma tarefa de sincroniza\u00e7\u00e3o encontrada. Crie uma tarefa de sincroniza\u00e7\u00e3o usando os bot\u00f5es Sincroniza\u00e7\u00e3o encontrados na interface web.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Selecionar Dispositivos", "ButtonCancelItem": "Cancelar item", "ButtonQueueForRetry": "Listar para tentar novamente", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Por favor, cetifique-se que existe um sintonizador aberto.", "ButtonDashboard": "Painel Principal", "ButtonReports": "Relat\u00f3rios", - "ButtonMetadataManager": "Gestor de Metadados", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tempo", "LabelAddedOnDate": "Adicionado {0}", "ButtonStart": "Iniciar", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/ro.json b/dashboard-ui/strings/ro.json index ef773be7e..7059a3453 100644 --- a/dashboard-ui/strings/ro.json +++ b/dashboard-ui/strings/ro.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Fa turul", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/ru.json b/dashboard-ui/strings/ru.json index 13975b009..f857274d5 100644 --- a/dashboard-ui/strings/ru.json +++ b/dashboard-ui/strings/ru.json @@ -880,7 +880,6 @@ "OptionNone": "\u041d\u0438\u0447\u0435\u0433\u043e", "HeaderLiveTv": "\u0422\u0412-\u044d\u0444\u0438\u0440", "HeaderReports": "\u041e\u0442\u0447\u0451\u0442\u044b", - "HeaderMetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "HeaderSettings": "\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b", "OptionDefaultSort": "\u0423\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u0435", "OptionCommunityMostWatchedSort": "\u0427\u0430\u0449\u0435 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u044b\u0435", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f", "HeaderWelcomeBack": "\u0417\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0435\u0449\u0451!", "ButtonTakeTheTourToSeeWhatsNew": "\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u043e\u0432\u0430\u0446\u0438\u044f\u043c\u0438", - "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443.", + "MessageNoSyncJobsFound": "\u0417\u0430\u0434\u0430\u043d\u0438\u0439 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043d\u043e\u043f\u043e\u043a \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0445\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", + "MessageDownloadsFound": "\u0410\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u043a \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e. \u0421\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u0432\u0430\u0448\u0438 \u043c\u0435\u0434\u0438\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u043f\u043e \u0432\u0441\u0435\u043c\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e.", "HeaderSelectDevices": "\u0412\u044b\u0431\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430", "ButtonCancelItem": "\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442", "ButtonQueueForRetry": "\u0412 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0434\u043b\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u0430", @@ -1629,7 +1629,7 @@ "HeaderConfirmRecordingCancellation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044b \u0437\u0430\u043f\u0438\u0441\u0438", "MessageConfirmRecordingCancellation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c?", "MessageRecordingCancelled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u043c\u0435\u043d\u0435\u043d\u0430.", - "MessageRecordingScheduled": "\u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430.", + "MessageRecordingScheduled": "\u0417\u0430\u043f\u0438\u0441\u044c \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e.", "HeaderConfirmSeriesCancellation": "\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043c\u0435\u043d\u044b \u0441\u0435\u0440\u0438\u0438", "MessageConfirmSeriesCancellation": "\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0438\u0430\u043b?", "MessageSeriesCancelled": "\u0421\u0435\u0440\u0438\u0430\u043b \u043e\u0442\u043c\u0435\u043d\u0451\u043d.", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u044e\u043d\u0435\u0440.", "ButtonDashboard": "\u0418\u043d\u0444\u043e\u043f\u0430\u043d\u0435\u043b\u044c...", "ButtonReports": "\u041e\u0442\u0447\u0451\u0442\u044b...", - "ButtonMetadataManager": "\u0414\u0438\u0441\u043f. \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445...", + "MetadataManager": "\u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445", "HeaderTime": "\u0412\u0440\u0435\u043c\u044f", "LabelAddedOnDate": "\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043e {0}", "ButtonStart": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c", @@ -2311,8 +2311,11 @@ "XmlTvPremiere": "\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0432 Emby \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f {0} \u0447\u0430\u0441(\u0430\/\u043e\u0432) \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043b\u0435\u0433\u0438\u0434\u0430. \u0414\u043b\u044f \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 Emby Premiere.", "MoreFromValue": "\u0415\u0449\u0451 \u0441 {0}", "OptionSaveMetadataAsHiddenHelp": "\u042d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u043e \u043a \u043d\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c\u044b\u043c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0430 Emby Server.", - "EnablePhotos": "Enable photos", - "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", - "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "EnablePhotos": "\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438", + "EnablePhotosHelp": "\u0424\u043e\u0442\u043e \u0431\u0443\u0434\u0443\u0442 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043c\u0435\u0434\u0438\u0430\u0444\u0430\u0439\u043b\u0430\u043c\u0438.", + "MakeAvailableOffline": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e", + "ConfirmRemoveDownload": "\u0418\u0437\u044a\u044f\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443?", + "SyncToOtherDevices": "\u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438", + "ManageOfflineDownloads": "\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u044b\u043c\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u043c\u0438", + "MessageDownloadScheduled": "\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e" } \ No newline at end of file diff --git a/dashboard-ui/strings/sk.json b/dashboard-ui/strings/sk.json index 3d1ae8574..96047e21b 100644 --- a/dashboard-ui/strings/sk.json +++ b/dashboard-ui/strings/sk.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/sl-SI.json b/dashboard-ui/strings/sl-SI.json index afc2262d2..51f8d8014 100644 --- a/dashboard-ui/strings/sl-SI.json +++ b/dashboard-ui/strings/sl-SI.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Nastavitve", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/sv.json b/dashboard-ui/strings/sv.json index bd248e186..9f1f8b256 100644 --- a/dashboard-ui/strings/sv.json +++ b/dashboard-ui/strings/sv.json @@ -880,7 +880,6 @@ "OptionNone": "Inga", "HeaderLiveTv": "Live-TV", "HeaderReports": "Rapporter", - "HeaderMetadataManager": "Metadatahanteraren", "HeaderSettings": "Inst\u00e4llningar", "OptionDefaultSort": "F\u00f6rval", "OptionCommunityMostWatchedSort": "Oftast visade", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "V\u00e4lkommen tillbaka!", "ButtonTakeTheTourToSeeWhatsNew": "Ta en rundtur och se vad som \u00e4r nytt", "MessageNoSyncJobsFound": "Inga synkroniseringsjobb hittades. Skapa synkroniseringsjobb med hj\u00e4lp av Synkronisera-knapparna som finns i hela gr\u00e4nssnittet.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "V\u00e4lj Enheter", "ButtonCancelItem": "Avbryt objekt", "ButtonQueueForRetry": "K\u00f6a f\u00f6r nytt f\u00f6rs\u00f6k", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "V\u00e4nligen kontrollera att det finns en ledig TV-mottagare.", "ButtonDashboard": "Kontrollpanel", "ButtonReports": "Rapporter", - "ButtonMetadataManager": "Metadatahanteraren", + "MetadataManager": "Metadata Manager", "HeaderTime": "Tid", "LabelAddedOnDate": "{0} tillagd", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/tr.json b/dashboard-ui/strings/tr.json index fba8ea325..ff584c466 100644 --- a/dashboard-ui/strings/tr.json +++ b/dashboard-ui/strings/tr.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/uk.json b/dashboard-ui/strings/uk.json index 28b93f81f..602010d96 100644 --- a/dashboard-ui/strings/uk.json +++ b/dashboard-ui/strings/uk.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/vi.json b/dashboard-ui/strings/vi.json index cf762a0f3..bd5c1f966 100644 --- a/dashboard-ui/strings/vi.json +++ b/dashboard-ui/strings/vi.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-CN.json b/dashboard-ui/strings/zh-CN.json index 9f8c2e260..dcc8b36ed 100644 --- a/dashboard-ui/strings/zh-CN.json +++ b/dashboard-ui/strings/zh-CN.json @@ -880,7 +880,6 @@ "OptionNone": "\u6ca1\u6709", "HeaderLiveTv": "\u7535\u89c6\u76f4\u64ad", "HeaderReports": "\u62a5\u544a", - "HeaderMetadataManager": "\u5a92\u4f53\u8d44\u6599\u7ba1\u7406", "HeaderSettings": "Settings", "OptionDefaultSort": "\u9ed8\u8ba4", "OptionCommunityMostWatchedSort": "\u6700\u53d7\u77a9\u76ee", @@ -1584,6 +1583,7 @@ "HeaderWelcomeBack": "\u6b22\u8fce\u56de\u6765\uff01", "ButtonTakeTheTourToSeeWhatsNew": "\u8fdb\u884c\u53c2\u89c2\uff0c\u770b\u770b\u6709\u4ec0\u4e48\u65b0\u4e1c\u897f", "MessageNoSyncJobsFound": "\u6ca1\u6709\u53d1\u73b0\u540c\u6b65\u4f5c\u4e1a\u3002\u4f7f\u7528Web\u754c\u9762\u4e2d\u7684\u540c\u6b65\u6309\u94ae\u6765\u521b\u5efa\u540c\u6b65\u4f5c\u4e1a\u3002", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "\u9009\u62e9\u8bbe\u5907", "ButtonCancelItem": "\u53d6\u6d88\u9879\u76ee", "ButtonQueueForRetry": "\u91cd\u8bd5\u961f\u5217", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "\u8bf7\u786e\u4fdd\u6709\u4e00\u4e2a\u6253\u5f00\u7684\u53ef\u7528\u8c03\u8c10\u5668", "ButtonDashboard": "\u63a7\u5236\u53f0", "ButtonReports": "\u62a5\u544a", - "ButtonMetadataManager": "\u5a92\u4f53\u8d44\u6599\u7ba1\u7406", + "MetadataManager": "Metadata Manager", "HeaderTime": "\u65f6\u95f4", "LabelAddedOnDate": "\u6dfb\u52a0 {0}", "ButtonStart": "\u5f00\u59cb", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-HK.json b/dashboard-ui/strings/zh-HK.json index 00b47741c..13af7e842 100644 --- a/dashboard-ui/strings/zh-HK.json +++ b/dashboard-ui/strings/zh-HK.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "Live TV", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "\u6559\u5b78", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "\u72c0\u614b", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file diff --git a/dashboard-ui/strings/zh-TW.json b/dashboard-ui/strings/zh-TW.json index 70723d99a..f8a6adae3 100644 --- a/dashboard-ui/strings/zh-TW.json +++ b/dashboard-ui/strings/zh-TW.json @@ -880,7 +880,6 @@ "OptionNone": "None", "HeaderLiveTv": "\u96fb\u8996", "HeaderReports": "Reports", - "HeaderMetadataManager": "Metadata Manager", "HeaderSettings": "Settings", "OptionDefaultSort": "Default", "OptionCommunityMostWatchedSort": "Most Watched", @@ -1583,7 +1582,8 @@ "ButtonTakeTheTour": "Take the tour", "HeaderWelcomeBack": "Welcome back!", "ButtonTakeTheTourToSeeWhatsNew": "Take the tour to see what's new", - "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the web interface.", + "MessageNoSyncJobsFound": "No sync jobs found. Create sync jobs using the Sync buttons found throughout the app.", + "MessageDownloadsFound": "No offline downloads. Make your media available offline by clicking Make Available Offline throughout the app.", "HeaderSelectDevices": "Select Devices", "ButtonCancelItem": "Cancel item", "ButtonQueueForRetry": "Queue for retry", @@ -1739,7 +1739,7 @@ "MessageEnsureOpenTuner": "Please ensure there is an open tuner availalble.", "ButtonDashboard": "Dashboard", "ButtonReports": "Reports", - "ButtonMetadataManager": "Metadata Manager", + "MetadataManager": "Metadata Manager", "HeaderTime": "Time", "LabelAddedOnDate": "Added {0}", "ButtonStart": "Start", @@ -2314,5 +2314,8 @@ "EnablePhotos": "Enable photos", "EnablePhotosHelp": "Photos will be detected and displayed alongside other media files.", "MakeAvailableOffline": "Make available offline", - "ConfirmRemoveDownload": "Remove download?" + "ConfirmRemoveDownload": "Remove download?", + "SyncToOtherDevices": "Sync to other devices", + "ManageOfflineDownloads": "Manage offline downloads", + "MessageDownloadScheduled": "Download scheduled" } \ No newline at end of file From 9f68248140081d08b3ce6bf3eacaaa78a909dbe6 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 18 Aug 2016 12:45:36 -0400 Subject: [PATCH 3/5] update notifications --- .../bower_components/emby-webcomponents/.bower.json | 8 ++++---- .../emby-webcomponents/emby-select/emby-select.js | 2 +- .../emby-webcomponents/notifications/notifications.js | 11 +++++------ .../emby-webcomponents/strings/de.json | 4 ++-- .../emby-webcomponents/strings/kk.json | 4 ++-- .../emby-webcomponents/strings/ru.json | 4 ++-- dashboard-ui/bower_components/hls.js/.bower.json | 8 ++++---- dashboard-ui/bower_components/hls.js/bower.json | 2 +- dashboard-ui/bower_components/hls.js/dist/hls.min.js | 8 ++++---- dashboard-ui/bower_components/hls.js/package.json | 2 +- dashboard-ui/bower_components/polymer/.bower.json | 6 +++--- dashboard-ui/css/mediaplayer-video.css | 4 ++++ 12 files changed, 33 insertions(+), 30 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index e471a8f71..fed2364db 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -14,12 +14,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.4.173", - "_release": "1.4.173", + "version": "1.4.175", + "_release": "1.4.175", "_resolution": { "type": "version", - "tag": "1.4.173", - "commit": "8766e295ec13de73c5ef5a61c7357fc30d8c9fa1" + "tag": "1.4.175", + "commit": "aa687c378a3252d0679dfb8b16c5e6e0e1350c7a" }, "_source": "https://github.com/MediaBrowser/emby-webcomponents.git", "_target": "^1.2.1", diff --git a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js index e514183b1..2b730a412 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js +++ b/dashboard-ui/bower_components/emby-webcomponents/emby-select/emby-select.js @@ -113,7 +113,7 @@ EmbySelectPrototype.createdCallback = function () { var parent = this.parentNode; - if (!parent.classList.contains('selectContainer')) { + if (parent && !parent.classList.contains('selectContainer')) { var div = this.ownerDocument.createElement('div'); div.classList.add('selectContainer'); parent.replaceChild(div, this); diff --git a/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js b/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js index 92378815e..df0fc2189 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js +++ b/dashboard-ui/bower_components/emby-webcomponents/notifications/notifications.js @@ -86,6 +86,10 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir function showNewItemNotification(item, apiClient) { + if (playbackManager.isPlayingVideo()) { + return; + } + var notification = { title: "New " + item.Type, body: item.Name, @@ -116,11 +120,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir var newItems = data.ItemsAdded; - if (!newItems.length || !window.Notification || Notification.permission !== "granted") { - return; - } - - if (playbackManager.isPlayingVideo()) { + if (!newItems.length) { return; } @@ -131,7 +131,6 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir IsFolder: false, SortBy: "DateCreated", SortOrder: "Descending", - ImageTypes: "Primary", Ids: newItems.join(',') }).then(function (result) { diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json index a88fb8350..82c6ee4b1 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/de.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/de.json @@ -252,7 +252,7 @@ "MakeAvailableOffline": "Offline verf\u00fcgbar machen", "ServerNameIsRestarting": "Emby Server - {0} startet neu.", "ServerNameIsShuttingDown": "Emby Server - {0} f\u00e4hrt herunter.", - "HeaderDeleteItems": "Delete Items", - "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", + "HeaderDeleteItems": "Objekte l\u00f6schen", + "ConfirmDeleteItems": "Das L\u00f6schen dieser Objekte l\u00f6scht die Dateien vom Laufwerk und in deiner Medienbibliothek. Bist du wirklich sicher?", "PleaseRestartServerName": "Bitte starte Emby Server - {0} neu." } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json index 6c3f27293..7435cb750 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/kk.json @@ -252,7 +252,7 @@ "MakeAvailableOffline": "\u0414\u0435\u0440\u0431\u0435\u0441 \u049b\u043e\u043b\u0436\u0435\u0442\u0456\u043c\u0434\u0456 \u0435\u0442\u0443", "ServerNameIsRestarting": "Emby Server - {0} \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u043b\u0443\u0434\u0430.", "ServerNameIsShuttingDown": "Emby Server - {0} \u0436\u04b1\u043c\u044b\u0441\u0442\u044b \u0430\u044f\u049b\u0442\u0430\u0443\u0434\u0430.", - "HeaderDeleteItems": "Delete Items", - "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", + "HeaderDeleteItems": "\u0422\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u044e", + "ConfirmDeleteItems": "\u041e\u0441\u044b \u0442\u0430\u0440\u043c\u0430\u049b\u0442\u0430\u0440\u0434\u044b \u0436\u043e\u0439\u0493\u0430\u043d\u0434\u0430, \u043e\u043b\u0430\u0440 \u0444\u0430\u0439\u043b\u0434\u044b\u049b \u0436\u04af\u0439\u0435\u0441\u0456\u043d\u0435\u043d \u0434\u0435 \u0436\u04d9\u043d\u0435 \u0442\u0430\u0441\u044b\u0493\u044b\u0448\u0445\u0430\u043d\u0430\u04a3\u044b\u0437\u0434\u0430\u043d \u0434\u0430 \u0435\u043a\u0435\u0443\u0456\u043d\u0434\u0435 \u0436\u043e\u0439\u044b\u043b\u0430\u0434. \u0421\u0456\u0437 \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u043b\u0430\u0439\u0441\u044b\u0437 \u0431\u0430? \u0428\u044b\u043d\u044b\u043c\u0435\u043d \u0436\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443 \u049b\u0430\u0436\u0435\u0442 \u043f\u0435?", "PleaseRestartServerName": "Emby Server \u04af\u0448\u0456\u043d \u049b\u0430\u0439\u0442\u0430 \u0456\u0441\u043a\u0435 \u049b\u043e\u0441\u044b\u04a3\u044b\u0437 - {0}." } \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json index 493cba9f3..44e16005e 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json +++ b/dashboard-ui/bower_components/emby-webcomponents/strings/ru.json @@ -252,7 +252,7 @@ "MakeAvailableOffline": "\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e", "ServerNameIsRestarting": "Emby Server - {0} \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f.", "ServerNameIsShuttingDown": "Emby Server - {0} \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.", - "HeaderDeleteItems": "Delete Items", - "ConfirmDeleteItems": "Deleting these items will delete them from both the file system and your media library. Are you sure you wish to continue?", + "HeaderDeleteItems": "\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432", + "ConfirmDeleteItems": "\u041f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043d\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u0441\u044f \u0438 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0438 \u0438\u0437 \u043c\u0435\u0434\u0438\u0430\u0442\u0435\u043a\u0438. \u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c?", "PleaseRestartServerName": "\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 Emby Server - {0}." } \ No newline at end of file diff --git a/dashboard-ui/bower_components/hls.js/.bower.json b/dashboard-ui/bower_components/hls.js/.bower.json index f96feef51..99a2c095d 100644 --- a/dashboard-ui/bower_components/hls.js/.bower.json +++ b/dashboard-ui/bower_components/hls.js/.bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.42", + "version": "0.5.44", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", @@ -16,11 +16,11 @@ "test", "tests" ], - "_release": "0.5.42", + "_release": "0.5.44", "_resolution": { "type": "version", - "tag": "v0.5.42", - "commit": "6d947aa6a7c7dab11aeb72a976a48d8d53bfc38b" + "tag": "v0.5.44", + "commit": "f3800e9a8b01157c73d5847a9102137a8d73dc8e" }, "_source": "git://github.com/dailymotion/hls.js.git", "_target": "~0.5.7", diff --git a/dashboard-ui/bower_components/hls.js/bower.json b/dashboard-ui/bower_components/hls.js/bower.json index e08b7c62e..a9542f9bb 100644 --- a/dashboard-ui/bower_components/hls.js/bower.json +++ b/dashboard-ui/bower_components/hls.js/bower.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.42", + "version": "0.5.44", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/bower_components/hls.js/dist/hls.min.js b/dashboard-ui/bower_components/hls.js/dist/hls.min.js index 96f27bbe6..1c71c6141 100644 --- a/dashboard-ui/bower_components/hls.js/dist/hls.min.js +++ b/dashboard-ui/bower_components/hls.js/dist/hls.min.js @@ -1,5 +1,5 @@ !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Hls=e()}}(function(){return function s(e,t,r){function a(i,d){if(!t[i]){if(!e[i]){var l="function"==typeof require&&require;if(!d&&l)return l(i,!0);if(n)return n(i,!0);var u=new Error("Cannot find module '"+i+"'");throw u.code="MODULE_NOT_FOUND",u}var o=t[i]={exports:{}};e[i][0].call(o.exports,function(t){var r=e[i][1][t];return a(r?r:t)},o,o.exports,s,e,t,r)}return t[i].exports}for(var n="function"==typeof require&&require,i=0;ie||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},e.prototype.emit=function(l){var s,e,u,i,n,o;if(this._events||(this._events={}),"error"===l&&(!this._events.error||r(this._events.error)&&!this._events.error.length)){if(s=arguments[1],s instanceof Error)throw s;throw TypeError('Uncaught, unspecified "error" event.')}if(e=this._events[l],a(e))return!1;if(t(e))switch(arguments.length){case 1:e.call(this);break;case 2:e.call(this,arguments[1]);break;case 3:e.call(this,arguments[1],arguments[2]);break;default:i=Array.prototype.slice.call(arguments,1),e.apply(this,i)}else if(r(e))for(i=Array.prototype.slice.call(arguments,1),o=e.slice(),u=o.length,n=0;u>n;n++)o[n].apply(this,i);return!0},e.prototype.addListener=function(i,n){var s;if(!t(n))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",i,t(n.listener)?n.listener:n),this._events[i]?r(this._events[i])?this._events[i].push(n):this._events[i]=[this._events[i],n]:this._events[i]=n,r(this._events[i])&&!this._events[i].warned&&(s=a(this._maxListeners)?e.defaultMaxListeners:this._maxListeners,s&&s>0&&this._events[i].length>s&&(this._events[i].warned=!0,"function"==typeof console.trace)),this},e.prototype.on=e.prototype.addListener,e.prototype.once=function(a,e){function r(){this.removeListener(a,r),i||(i=!0,e.apply(this,arguments))}if(!t(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(a,r),this},e.prototype.removeListener=function(i,a){var e,s,o,n;if(!t(a))throw TypeError("listener must be a function");if(!this._events||!this._events[i])return this;if(e=this._events[i],o=e.length,s=-1,e===a||t(e.listener)&&e.listener===a)delete this._events[i],this._events.removeListener&&this.emit("removeListener",i,a);else if(r(e)){for(n=o;n-- >0;)if(e[n]===a||e[n].listener&&e[n].listener===a){s=n;break}if(0>s)return this;1===e.length?(e.length=0,delete this._events[i]):e.splice(s,1),this._events.removeListener&&this.emit("removeListener",i,a)}return this},e.prototype.removeAllListeners=function(r){var a,e;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[r]&&delete this._events[r],this;if(0===arguments.length){for(a in this._events)"removeListener"!==a&&this.removeAllListeners(a);return this.removeAllListeners("removeListener"),this._events={},this}if(e=this._events[r],t(e))this.removeListener(r,e);else if(e)for(;e.length;)this.removeListener(r,e[e.length-1]);return delete this._events[r],this},e.prototype.listeners=function(e){var r;return r=this._events&&this._events[e]?t(this._events[e])?[this._events[e]]:this._events[e].slice():[]},e.prototype.listenerCount=function(r){if(this._events){var e=this._events[r];if(t(e))return 1;if(e)return e.length}return 0},e.listenerCount=function(e,t){return e.listenerCount(t)}},{}],2:[function(n,a,s){var i=arguments[3],e=arguments[4],r=arguments[5],t=JSON.stringify;a.exports=function(l){for(var a,s=Object.keys(r),n=0,d=s.length;d>n;n++){var o=s[n],u=r[o].exports;if(u===l||u.default===l){a=o;break}}if(!a){a=Math.floor(Math.pow(16,8)*Math.random()).toString(16);for(var f={},n=0,d=s.length;d>n;n++){var o=s[n];f[o]=o}e[a]=[Function(["require","module","exports"],"("+l+")(self)"),f]}var h=Math.floor(Math.pow(16,8)*Math.random()).toString(16),c={};c[a]=a,e[h]=[Function(["require"],"var f = require("+t(a)+");(f.default ? f.default : f)(self);"),c];var v="("+i+")({"+Object.keys(e).map(function(r){return t(r)+":["+e[r][0]+","+t(e[r][1])+"]"}).join(",")+"},{},["+t(h)+"])",g=window.URL||window.webkitURL||window.mozURL||window.msURL;return new Worker(g.createObjectURL(new Blob([v],{type:"text/javascript"})))}},{}],3:[function(e,m,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function g(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(n,"__esModule",{value:!0});var l=function(){function e(a,r){for(var t=0;t500*e.duration){var f=i.levels,h=Math.max(1,1e3*e.loaded/u),v=Math.max(e.loaded,Math.round(e.duration*f[e.level].bitrate/8)),c=n.currentTime,d=(v-e.loaded)/h,s=o.default.bufferInfo(n,c,i.config.maxBufferHole).end-c;if(s<2*e.duration&&d>s){var l=void 0,r=void 0;for(r=e.level-1;r>=0&&(l=e.duration*f[r].bitrate/(6.4*h),a.logger.log("fragLoadedDelay/bufferStarvationDelay/fragLevelNextLoadedDelay["+r+"] :"+d.toFixed(1)+"/"+s.toFixed(1)+"/"+l.toFixed(1)),!(s>l));r--);d>l&&(r=Math.max(0,r),i.nextLoadLevel=r,this.bwEstimator.sample(u,e.loaded),a.logger.warn("loading too slow, abort fragment loading and switch to level "+r),e.loader.abort(),this.clearTimer(),i.trigger(t.default.FRAG_LOAD_EMERGENCY_ABORTED,{frag:e}))}}}}},{key:"onFragLoaded",value:function(e){var t=e.stats;void 0===t.aborted&&1===e.frag.loadCounter&&this.bwEstimator.sample(performance.now()-t.trequest,t.loaded),this.clearTimer(),this.lastLoadedFragLevel=e.frag.level,this._nextAutoLevel=-1}},{key:"onError",value:function(e){switch(e.details){case s.ErrorDetails.FRAG_LOAD_ERROR:case s.ErrorDetails.FRAG_LOAD_TIMEOUT:this.clearTimer()}}},{key:"clearTimer",value:function(){this.timer&&(clearInterval(this.timer),this.timer=null)}},{key:"autoLevelCapping",get:function(){return this._autoLevelCapping},set:function(e){this._autoLevelCapping=e}},{key:"nextAutoLevel",get:function(){var e,r,i=this.hls,t=i.levels,a=i.config;if(r=-1===this._autoLevelCapping&&t&&t.length?t.length-1:this._autoLevelCapping,-1!==this._nextAutoLevel)return Math.min(this._nextAutoLevel,r);var n=this.bwEstimator?this.bwEstimator.getEstimate():a.abrEwmaDefaultEstimate,s=void 0;for(e=0;r>=e;e++)if(s=e<=this.lastLoadedFragLevel?a.abrBandWidthFactor*n:a.abrBandWidthUpFactor*n,sthis._msDuration&&(t.logger.log("Updating mediasource duration to "+this._levelDuration),e.duration=this._levelDuration,this._msDuration=this._levelDuration)}}}},{key:"doFlush",value:function(){for(;this.flushRange.length;){var r=this.flushRange[0];if(!this.flushBuffer(r.start,r.end))return void(this._needsFlush=!0);this.flushRange.shift(),this.flushBufferCounter=0}if(0===this.flushRange.length){this._needsFlush=!1;var a=0,t=this.sourceBuffer;if(t)for(var i in t)a+=t[i].buffered.length;this.appended=a,this.hls.trigger(e.default.BUFFER_FLUSHED)}}},{key:"doAppending",value:function(){var i=this.hls,s=this.sourceBuffer,n=this.segments;if(s){if(this.media.error)return n=[],void t.logger.error("trying to append although a media error occured, flush segment and abort");for(var l in s)if(s[l].updating)return;if(n.length){var o=n.shift();try{s[o.type].appendBuffer(o.data),this.appendError=0,this.appended++}catch(s){t.logger.error("error while trying to append buffer:"+s.message),n.unshift(o);var a={type:r.ErrorTypes.MEDIA_ERROR};if(22===s.code)return this.segments=[],a.details=r.ErrorDetails.BUFFER_FULL_ERROR,void i.trigger(e.default.ERROR,a);if(this.appendError?this.appendError++:this.appendError=1,a.details=r.ErrorDetails.BUFFER_APPEND_ERROR,a.frag=this.fragCurrent,this.appendError>i.config.appendErrorMaxRetry)return t.logger.log("fail "+i.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),n=[],a.fatal=!0,void i.trigger(e.default.ERROR,a);a.fatal=!1,i.trigger(e.default.ERROR,a)}}}}},{key:"flushBuffer",value:function(l,s){var e,r,o,n,a,i;if(this.flushBufferCounter.5)return this.flushBufferCounter++,t.logger.log("flush "+u+" ["+a+","+i+"], of ["+o+","+n+"], pos:"+this.media.currentTime),e.remove(a,i),!1}else t.logger.warn("abort flushing too many retries");return t.logger.log("buffer flushed"),!0}}]),a}(s.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],5:[function(e,h,t){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function f(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(t,"__esModule",{value:!0});var o=function(){function e(a,r){for(var t=0;tthis.autoLevelCapping&&this.hls.streamController.nextLevelSwitch(),this.autoLevelCapping=this.hls.autoLevelCapping)}}},{key:"getMaxLevel",value:function(n){var r=void 0,e=void 0,t=void 0,s=this.mediaWidth,o=this.mediaHeight,a=0,i=0;for(e=0;n>=e&&(t=this.levels[e],r=e,a=t.width,i=t.height,!(a>=s||i>=o));e++);return r}},{key:"contentScaleFactor",get:function(){var e=1;try{e=window.devicePixelRatio}catch(e){}return e}},{key:"mediaWidth",get:function(){var e=void 0;return this.media&&(e=this.media.width||this.media.clientWidth||this.media.offsetWidth,e*=this.contentScaleFactor),e}},{key:"mediaHeight",get:function(){var e=void 0;return this.media&&(e=this.media.height||this.media.clientHeight||this.media.offsetHeight,e*=this.contentScaleFactor),e}}]),e}(s.default);t.default=u},{"../event-handler":22,"../events":23}],6:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t=0&&ae&&(this._level===e&&void 0!==t[e].details||this.setLevelInternal(e))}},{key:"manualLevel",get:function(){return this._manualLevel},set:function(e){this._manualLevel=e,void 0===this._startLevel&&(this._startLevel=e),-1!==e&&(this.level=e)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(e){this._firstLevel=e}},{key:"startLevel",get:function(){return void 0===this._startLevel?this._firstLevel:this._startLevel},set:function(e){this._startLevel=e}},{key:"nextLoadLevel",get:function(){return-1!==this._manualLevel?this._manualLevel:this.hls.abrController.nextAutoLevel},set:function(e){this.level=e,-1===this._manualLevel&&(this.hls.abrController.nextAutoLevel=e)}}]),a}(f.default);i.default=o},{"../errors":21,"../event-handler":22,"../events":23,"../utils/logger":38}],8:[function(i,A,o){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function v(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(o,"__esModule",{value:!0});var m=function(){function e(a,r){for(var t=0;t0?(t.logger.log("configure startPosition @"+a),this.lastPaused||(t.logger.log("resuming video"),r.play()),this.state=e.IDLE):(this.lastCurrentTime=this.startPosition?this.startPosition:i,this.state=e.STARTING),this.nextLoadPosition=this.startPosition=this.lastCurrentTime,this.tick()}else t.logger.warn("cannot start loading as manifest not parsed yet"),this.state=e.STOPPED}},{key:"stopLoad",value:function(){var t=this.fragCurrent;t&&(t.loader&&t.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.demuxer&&(this.demuxer.destroy(),this.demuxer=null),this.state=e.STOPPED}},{key:"tick",value:function(){this.ticks++,1===this.ticks&&(this.doTick(),this.ticks>1&&setTimeout(this.tick,1),this.ticks=0)}},{key:"doTick",value:function(){var R,l,n,h=this.hls,o=h.config,f=this.media,b=f&&f.seeking;switch(this.state){case e.ERROR:case e.PAUSED:break;case e.STARTING:var _=h.startLevel;-1===_&&(_=0,this.fragBitrateTest=!0),this.level=h.nextLoadLevel=_,this.state=e.WAITING_LEVEL,this.loadedmetadata=!1;break;case e.IDLE:if(!f&&(this.startFragRequested||!o.startFragPrefetch))break;R=this.loadedmetadata?f.currentTime:this.nextLoadPosition,l=h.nextLoadLevel;var v,L=s.default.bufferInfo(f,R,o.maxBufferHole),P=L.len,d=L.end,c=this.fragPrevious;if(this.levels[l].hasOwnProperty("bitrate")?(v=Math.max(8*o.maxBufferSize/this.levels[l].bitrate,o.maxBufferLength),v=Math.min(v,o.maxMaxBufferLength)):v=o.maxBufferLength,v>P){if(h.nextLoadLevel=l,this.level=l,n=this.levels[l].details,"undefined"==typeof n||n.live&&this.levelLastLoaded!==l){this.state=e.WAITING_LEVEL;break}var u=n.fragments,g=u.length,m=u[0].start,E=u[g-1].start+u[g-1].duration,i=void 0;if(n.live){var D=void 0!==o.liveMaxLatencyDuration?o.liveMaxLatencyDuration:o.liveMaxLatencyDurationCount*n.targetduration;if(dy&&(f.currentTime=y)}if(n.PTSKnown&&d>E)break;if(this.startFragRequested&&!n.PTSKnown){if(c){var A=c.sn+1;A>=n.startSN&&A<=n.endSN&&(i=u[A-n.startSN],t.logger.log("live playlist, switching playlist, load frag with next SN: "+i.sn))}i||(i=u[Math.min(g-1,Math.round(g/2))],t.logger.log("live playlist, switching playlist, unknown, load middle frag : "+i.sn))}}else m>d&&(i=u[0]);if(i||!function(){var e=o.maxFragLookUpTolerance;E>d?((d>E-e||b)&&(e=0),i=p.default.search(u,function(t){return t.start+t.duration-e<=d?1:t.start-e>d?-1:0})):i=u[g-1]}(),i){if(m=i.start,c&&i.level===c.level&&i.sn===c.sn){if(!(i.sno.maxBufferHole&&c.dropped?(i=u[k-1], -t.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),c.loadCounter--):(i=u[k+1],t.logger.log("SN just loaded, load next one: "+i.sn)),!i)break}if(null!=i.decryptdata.uri&&null==i.decryptdata.key)t.logger.log("Loading key for "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l),this.state=e.KEY_LOADING,h.trigger(r.default.KEY_LOADING,{frag:i});else{if(t.logger.log("Loading "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", currentTime:"+R+",bufferEnd:"+d.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,i.loadCounter){i.loadCounter++;var S=o.fragLoadingLoopThreshold;if(i.loadCounter>S&&Math.abs(this.fragLoadIdx-i.loadIdx)=w||b)&&(t.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=e.IDLE);break;case e.STOPPED:case e.FRAG_LOADING:case e.PARSING:case e.PARSED:case e.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(a){var e,t,r=this.bufferRange;if(r)for(e=r.length-1;e>=0;e--)if(t=r[e],a>=t.start&&a<=t.end)return t;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(r){var a=this.media;if(a)for(var t=a.buffered,e=0;e=t.start(e)&&r<=t.end(e))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var t,e,a=this.media;if(a&&a.seeking===!1&&(e=a.currentTime,e>a.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=e),this.isBuffered(e)?t=this.getBufferRange(e):this.isBuffered(e+.1)&&(t=this.getBufferRange(e+.1)),t)){var i=t.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(r.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(t.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var a=this.media,i=void 0;a?(i=a.paused,a.pause()):i=!0,this.previouslyPaused=i}var n=this.fragCurrent;n&&n.loader&&n.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var t=this.media;if(t&&t.readyState){var n=void 0,i=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,i=this.getBufferRange(t.currentTime),i&&i.start>1&&(this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:i.start-1})),t.paused)n=0;else{var l=this.hls.nextLoadLevel,u=this.levels[l],o=this.fragLastKbps;n=o&&this.fragCurrent?this.fragCurrent.duration*u.bitrate/(1e3*o)+1:0}if(a=this.getBufferRange(t.currentTime+n),a&&(a=this.followingBufferRange(a))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(r){var e=this.media=r.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),e.addEventListener("seeking",this.onvseeking),e.addEventListener("seeked",this.onvseeked),e.addEventListener("ended",this.onvended);var t=this.config;this.levels&&t.autoStartLoad&&this.hls.startLoad(t.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(t.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var r=this.levels;r&&r.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===e.FRAG_LOADING){if(0===s.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){t.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var r=this.fragCurrent;r&&(r.loader&&r.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=e.IDLE}}else this.state===e.ENDED&&(this.state=e.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){t.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){t.logger.log("trigger BUFFER_RESET"),this.hls.trigger(r.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(r){var e,a=!1,i=!1;r.levels.forEach(function(t){e=t.audioCodec,e&&(-1!==e.indexOf("mp4a.40.2")&&(a=!0),-1!==e.indexOf("mp4a.40.5")&&(i=!0))}),this.audioCodecSwitch=a&&i,this.audioCodecSwitch&&t.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=r.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var n=this.config;n.autoStartLoad&&this.hls.startLoad(n.startPosition)}},{key:"onLevelLoaded",value:function(o){var a=o.details,i=o.level,l=this.levels[i],d=a.totalduration,n=0;if(t.logger.log("level "+i+" loaded ["+a.startSN+","+a.endSN+"],duration:"+d),this.levelLastLoaded=i,a.live){var f=l.details;f?(u.default.mergeDetails(f,a),n=a.fragments[0].start,a.PTSKnown?t.logger.log("live playlist sliding:"+n.toFixed(3)):t.logger.log("live playlist - outdated PTS, unknown sliding")):(a.PTSKnown=!1,t.logger.log("live playlist - first load, unknown sliding"))}else a.PTSKnown=!1;if(l.details=a,this.hls.trigger(r.default.LEVEL_UPDATED,{details:a,level:i}),this.startFragRequested===!1){if(-1===this.startPosition){var s=a.startTimeOffset;if(isNaN(s))if(a.live){var h=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*a.targetduration;this.startPosition=Math.max(0,n+d-h)}else this.startPosition=0;else t.logger.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s}this.nextLoadPosition=this.startPosition}this.state===e.WAITING_LEVEL&&(this.state=e.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===e.KEY_LOADING&&(this.state=e.IDLE,this.tick())}},{key:"onFragLoaded",value:function(i){var a=this.fragCurrent;if(this.state===e.FRAG_LOADING&&a&&i.frag.level===a.level&&i.frag.sn===a.sn)if(t.logger.log("Loaded "+a.sn+" of level "+a.level),this.fragBitrateTest===!0)this.state=e.IDLE,this.fragBitrateTest=!1,this.startFragRequested=!1,i.stats.tparsed=i.stats.tbuffered=performance.now(),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:i.stats,frag:a});else{this.state=e.PARSING,this.stats=i.stats;var s=this.levels[this.level],o=s.details,f=o.totalduration,h=void 0===a.startDTS||isNaN(a.startDTS)?a.start:a.startDTS,l=a.level,u=a.sn,n=s.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),void 0===n&&(n=this.lastAudioCodec),n&&(n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,t.logger.log("Demuxing "+u+" of ["+o.startSN+" ,"+o.endSN+"],level "+l+", cc "+a.cc);var d=this.demuxer;d&&d.push(i.payload,n,s.videoCodec,h,a.cc,l,u,f,a.decryptdata)}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(l){if(this.state===e.PARSING){var o,a,i=l.tracks;if(a=i.audio){var n=this.levels[this.level].audioCodec,u=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==a.metadata.channelCount&&-1===u.indexOf("firefox")&&(n="mp4a.40.5"),-1!==u.indexOf("android")&&(n="mp4a.40.2",t.logger.log("Android: force audio codec to"+n)),a.levelCodec=n}if(a=i.video,a&&(a.levelCodec=this.levels[this.level].videoCodec),l.unique){var s={codec:"",levelCodec:""};for(o in l.tracks)a=i[o],s.container=a.container,s.codec&&(s.codec+=",",s.levelCodec+=","),a.codec&&(s.codec+=a.codec),a.levelCodec&&(s.levelCodec+=a.levelCodec);i={audiovideo:s}}this.hls.trigger(r.default.BUFFER_CODECS,i);for(o in i){a=i[o],t.logger.log("track:"+o+",container:"+a.container+",codecs[level/parsed]=["+a.levelCodec+"/"+a.codec+"]");var d=a.initSegment;d&&(this.pendingAppending++,this.hls.trigger(r.default.BUFFER_APPENDING,{type:o,data:d}))}this.tick()}}},{key:"onFragParsingData",value:function(a){var o=this;if(this.state===e.PARSING){this.tparse2=Date.now();var n=this.levels[this.level],i=this.fragCurrent;t.logger.log("parsed "+a.type+",PTS:["+a.startPTS.toFixed(3)+","+a.endPTS.toFixed(3)+"],DTS:["+a.startDTS.toFixed(3)+"/"+a.endDTS.toFixed(3)+"],nb:"+a.nb+",dropped:"+(a.dropped||0));var l=u.default.updateFragPTSDTS(n.details,i.sn,a.startPTS,a.endPTS,a.startDTS,a.endDTS),s=this.hls;s.trigger(r.default.LEVEL_PTS_UPDATED,{details:n.details,level:this.level,drift:l}),"video"===a.type&&(i.dropped=a.dropped),[a.data1,a.data2].forEach(function(e){e&&(o.pendingAppending++,s.trigger(r.default.BUFFER_APPENDING,{type:a.type,data:e}))}),this.nextLoadPosition=a.endPTS,this.bufferRange.push({type:a.type,start:a.startPTS,end:a.endPTS,frag:i}),this.tick()}else t.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===e.PARSING&&(this.stats.tparsed=performance.now(),this.state=e.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case e.PARSING:case e.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===e.PARSED&&0===this.pendingAppending){var i=this.fragCurrent,a=this.stats;i&&(this.fragPrevious=i,a.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*a.length/(a.tbuffered-a.tfirst)),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:a,frag:i}),t.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=e.IDLE),this.tick()}}},{key:"onError",value:function(i){switch(i.details){case a.ErrorDetails.FRAG_LOAD_ERROR:case a.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!i.fatal){var n=this.fragLoadError;if(n?n++:n=1,n<=this.config.fragLoadingMaxRetry){this.fragLoadError=n,i.frag.loadCounter=0;var s=Math.min(Math.pow(2,n-1)*this.config.fragLoadingRetryDelay,64e3);t.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=e.FRAG_LOADING_WAITING_RETRY}else t.logger.error("mediaController: "+i.details+" reaches max retry, redispatch as fatal ..."),i.fatal=!0,this.hls.trigger(r.default.ERROR,i),this.state=e.ERROR}break;case a.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case a.ErrorDetails.LEVEL_LOAD_ERROR:case a.ErrorDetails.LEVEL_LOAD_TIMEOUT:case a.ErrorDetails.KEY_LOAD_ERROR:case a.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==e.ERROR&&(this.state=i.fatal?e.ERROR:e.IDLE,t.logger.warn("mediaController: "+i.details+" while loading frag,switch to "+this.state+" state ..."));break;case a.ErrorDetails.BUFFER_FULL_ERROR:this.state!==e.PARSING&&this.state!==e.PARSED||(this.config.maxMaxBufferLength/=2,t.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.IDLE)}}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var n=e.currentTime,u=e.buffered;if(!this.loadedmetadata&&u.length){this.loadedmetadata=!0;var i=this.startPosition;if(!n&&n!==i&&i){t.logger.log("target start position:"+i);var l=u.start(0),g=u.end(0);(l>i||i>g)&&(i=l,t.logger.log("target start position not buffered, seek to buffered.start(0) "+l)),t.logger.log("adjust currentTime from "+n+" to "+i),e.currentTime=i}}else{var d=s.default.bufferInfo(e,n,0),v=!(e.paused||e.ended||0===e.buffered.length),f=.4,h=n>e.playbackRate*this.lastCurrentTime;if(this.stalled&&h&&(this.stalled=!1,t.logger.log("playback not stuck anymore @"+n)),v&&d.len<=f&&(h?(f=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,t.logger.log("playback seems stuck @"+n),this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),d.len<=f)){var o=d.nextStart,c=o-n;if(o&&c0){t.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+o+" + nudge "+this.seekHoleNudgeDuration);var p=o+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=o+this.seekHoleNudgeDuration,this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:p})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=e.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var t,r,a=[];for(r=0;re;e++)r+="["+t.start(e)+","+t.end(e)+"]";return r}},{key:"currentLevel",get:function(){if(this.media){var e=this.getBufferRange(this.media.currentTime);if(e)return e.frag.level}return-1}},{key:"nextBufferRange",get:function(){return this.media?this.followingBufferRange(this.getBufferRange(this.media.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferRange;return e?e.frag.level:-1}}]),i}(l.default);o.default=f},{"../demux/demuxer":17,"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../helper/level-helper":25,"../utils/binary-search":35,"../utils/logger":38}],9:[function(t,v,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;te;e++)c[(i[e]=e<<1^283*(e>>7))^e]=e;for(a=r=0;!h[a];a^=u||1,r=c[r]||1)for(t=r^r<<1^r<<2^r<<3^r<<4,t=t>>8^255&t^99,h[a]=t,v[t]=a,d=i[f=i[u=i[a]]],l=16843009*d^65537*f^257*u^16843008*a,s=257*i[t]^16843008*t,e=0;4>e;e++)n[e][a]=s=s<<24^s>>>8,o[e][t]=l=l<<24^l>>>8;for(e=0;5>e;e++)n[e]=n[e].slice(0),o[e]=o[e].slice(0)}},{key:"decrypt",value:function(R,p,_,b,E,m){var h,g,v,n,e=this._key[1],t=R^e[0],a=b^e[1],i=_^e[2],r=p^e[3],y=e.length/4-2,s=4,o=this._tables[1],f=o[0],d=o[1],u=o[2],l=o[3],c=o[4];for(n=0;y>n;n++)h=f[t>>>24]^d[a>>16&255]^u[i>>8&255]^l[255&r]^e[s],g=f[a>>>24]^d[i>>16&255]^u[r>>8&255]^l[255&t]^e[s+1],v=f[i>>>24]^d[r>>16&255]^u[t>>8&255]^l[255&a]^e[s+2],r=f[r>>>24]^d[t>>16&255]^u[a>>8&255]^l[255&i]^e[s+3],s+=4,t=h,a=g,i=v;for(n=0;4>n;n++)E[(3&-n)+m]=c[t>>>24]<<24^c[a>>16&255]<<16^c[i>>8&255]<<8^c[255&r]^e[s++],h=t,t=a,a=i,i=r,r=h}}]),e}();e.default=a},{}],11:[function(t,l,e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>8|e>>>24}},{key:"doDecrypt",value:function(a,g,i){var u,h,o,f,l,c,d,n,e,r=new Int32Array(a.buffer,a.byteOffset,a.byteLength>>2),p=new s.default(Array.prototype.slice.call(g)),v=new Uint8Array(a.byteLength),t=new Int32Array(v.buffer);for(u=~~i[0],h=~~i[1],o=~~i[2],f=~~i[3],e=0;ee&&(255!==t[e]||240!==(240&t[e+1]));e++);for(r.audiosamplerate||(i=o.default.getAudioConfig(this.observer,t,e,p),r.config=i.config,r.audiosamplerate=i.samplerate,r.channelCount=i.channelCount,r.codec=i.codec,r.duration=y,l.logger.log("parsed codec:"+r.codec+",rate:"+i.samplerate+",nb channel:"+i.channelCount)),c=0,g=9216e4/r.audiosamplerate;u>e+5&&(s=1&t[e+1]?7:9,n=(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5,n-=s,n>0&&u>=e+s+n);)for(f=h+c*g,v={unit:t.subarray(e+s,e+s+n),pts:f,dts:f},r.samples.push(v),r.len+=n,e+=n+s,c++;u-1>e&&(255!==t[e]||240!==(240&t[e+1]));e++);this.remuxer.remux(this._aacTrack,{samples:[]},{samples:[{pts:h,dts:h,unit:d.payload}]},{samples:[]},m)}},{key:"destroy",value:function(){}}],[{key:"probe",value:function(t){var e,r,i=new a.default(t);if(i.hasTimeStamp)for(e=i.length,r=t.length;r-1>e;e++)if(255===t[e]&&240===(240&t[e+1]))return!0;return!1}}]),e}();t.default=s},{"../demux/id3":19,"../utils/logger":38,"./adts":14}],14:[function(e,o,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>>6)+1,e=(60&u[l+2])>>>2,e>d.length-1?void h.trigger(Event.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+e}):(o=(1&u[l+2])<<2,o|=(192&u[l+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+e+"["+d[e]+"Hz],channelConfig:"+o),-1!==f.indexOf("firefox")?e>=6?(a=5,t=new Array(4),s=e-3):(a=2,t=new Array(2),s=e):-1!==f.indexOf("android")?(a=2,t=new Array(2),s=e):(a=5,t=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&e>=6?s=e-3:((i&&-1!==i.indexOf("mp4a.40.2")&&e>=6&&1===o||!i&&1===o)&&(a=2,t=new Array(2)),s=e)),t[0]=a<<3,t[0]|=(14&e)>>1,t[1]|=(1&e)<<7,t[1]|=o<<3,5===a&&(t[1]|=(14&s)>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),{config:t,samplerate:d[e],channelCount:o,codec:"mp4a.40."+a})}}]),e}();t.default=s},{"../errors":21,"../utils/logger":38}],15:[function(e,y,a){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;t1?r-1:0),e=1;r>e;e++)i[e-1]=arguments[e];t.emit.apply(t,[a,a].concat(i))},t.off=function(i){for(var r=arguments.length,a=Array(r>1?r-1:0),e=1;r>e;e++)a[e-1]=arguments[e];t.removeListener.apply(t,[i].concat(a))},r.addEventListener("message",function(a){var e=a.data;switch(e.cmd){case"init":r.demuxer=new u.default(t,e.typeSupported);break;case"demux":r.demuxer.push(new Uint8Array(e.data),e.audioCodec,e.videoCodec,e.timeOffset,e.cc,e.level,e.sn,e.duration)}}),t.on(e.default.FRAG_PARSING_INIT_SEGMENT,function(t,e){r.postMessage({event:t,tracks:e.tracks,unique:e.unique})}),t.on(e.default.FRAG_PARSING_DATA,function(a,e){var t={event:a,type:e.type,startPTS:e.startPTS,endPTS:e.endPTS,startDTS:e.startDTS,endDTS:e.endDTS,data1:e.data1.buffer,data2:e.data2.buffer,nb:e.nb,dropped:e.dropped};r.postMessage(t,[t.data1,t.data2])}),t.on(e.default.FRAG_PARSED,function(e){r.postMessage({event:e})}),t.on(e.default.ERROR,function(e,t){r.postMessage({event:e,data:t})}),t.on(e.default.FRAG_PARSING_METADATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)}),t.on(e.default.FRAG_PARSING_USERDATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)})};a.default=o},{"../demux/demuxer-inline":15,"../events":23,events:1}],17:[function(t,g,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;t0&&null!=e&&null!=e.key&&"AES-128"===e.method){null==this.decrypter&&(this.decrypter=new l.default(this.hls));var d=this;this.decrypter.decrypt(t,e.key,e.iv,function(e){d.pushDecrypted(e,r,a,i,n,s,o,u)})}else this.pushDecrypted(t,r,a,i,n,s,o,u)}},{key:"onWorkerMessage",value:function(a){var t=a.data;switch(t.event){case e.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(e.default.FRAG_PARSING_INIT_SEGMENT,r);break;case e.default.FRAG_PARSING_DATA:this.hls.trigger(e.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case e.default.FRAG_PARSING_METADATA:this.hls.trigger(e.default.FRAG_PARSING_METADATA,{samples:t.samples});break;case e.default.FRAG_PARSING_USERDATA:this.hls.trigger(e.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),r}();a.default=o},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../events":23, -"../utils/logger":38,webworkify:2}],18:[function(t,s,e){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function e(a,r){for(var t=0;te?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;return t>32&&i.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0?this.word<<=e:this.bytesAvailable>0&&this.loadWord(),e=t-e,e>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(i){var t,a,r=8,e=8;for(t=0;i>t;t++)0!==e&&(a=this.readEG(),e=(r+a+256)%256),r=0===e?r:e}},{key:"readSPS",value:function(){var t,g,p,l,i,n,a,o,r,s=0,d=0,f=0,h=0,c=1;if(this.readUByte(),t=this.readUByte(),g=this.readBits(5),this.skipBits(3),p=this.readUByte(),this.skipUEG(),100===t||110===t||122===t||244===t||44===t||83===t||86===t||118===t||128===t){var v=this.readUEG();if(3===v&&this.skipBits(1),this.skipUEG(),this.skipUEG(),this.skipBits(1),this.readBoolean())for(o=3!==v?8:12,r=0;o>r;r++)this.readBoolean()&&(6>r?this.skipScalingList(16):this.skipScalingList(64))}this.skipUEG();var u=this.readUEG();if(0===u)this.readUEG();else if(1===u)for(this.skipBits(1),this.skipEG(),this.skipEG(),l=this.readUEG(),r=0;l>r;r++)this.skipEG();if(this.skipUEG(),this.skipBits(1),i=this.readUEG(),n=this.readUEG(),a=this.readBits(1),0===a&&this.skipBits(1),this.skipBits(1),this.readBoolean()&&(s=this.readUEG(),d=this.readUEG(),f=this.readUEG(),h=this.readUEG()),this.readBoolean()&&this.readBoolean()){var e=void 0,y=this.readUByte();switch(y){case 1:e=[1,1];break;case 2:e=[12,11];break;case 3:e=[10,11];break;case 4:e=[16,11];break;case 5:e=[40,33];break;case 6:e=[24,11];break;case 7:e=[20,11];break;case 8:e=[32,11];break;case 9:e=[80,33];break;case 10:e=[18,11];break;case 11:e=[15,11];break;case 12:e=[64,33];break;case 13:e=[160,99];break;case 14:e=[4,3];break;case 15:e=[3,2];break;case 16:e=[2,1];break;case 255:e=[this.readUByte()<<8|this.readUByte(),this.readUByte()<<8|this.readUByte()]}e&&(c=e[0]/e[1])}return{width:Math.ceil((16*(i+1)-2*s-2*d)*c),height:(2-a)*(n+1)*16-(a?2:4)*(f+h)}}},{key:"readSliceType",value:function(){return this.readUByte(),this.readUEG(),this.readUEG()}}]),e}();e.default=n},{"../utils/logger":38}],19:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;tr);return t}},{key:"_parseID3Frames",value:function(r,t,n){for(var i,s,o,l,a;n>=t+8;)switch(i=this.readUTF(r,t,4),t+=4,s=r[t++]<<24+r[t++]<<16+r[t++]<<8+r[t++],l=r[t++]<<8+r[t++],o=t,i){case"PRIV":if("com.apple.streaming.transportStreamTimestamp"===this.readUTF(r,t,44)){t+=44,t+=4;var u=1&r[t++];this._hasTimeStamp=!0,a=((r[t++]<<23)+(r[t++]<<15)+(r[t++]<<7)+r[t++])/45,u&&(a+=47721858.84),a=Math.round(a),e.logger.trace("ID3 timestamp found: "+a),this._timeStamp=a}}}},{key:"hasTimeStamp",get:function(){return this._hasTimeStamp}},{key:"timeStamp",get:function(){return this._timeStamp}},{key:"length",get:function(){return this._length}},{key:"payload",get:function(){return this._payload}}]),t}();t.default=n},{"../utils/logger":38}],20:[function(t,v,i){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var f=function(){function e(a,r){for(var t=0;tt;t+=188)if(71===a[t]){if(d=!!(64&a[t+1]),u=((31&a[t+1])<<8)+a[t+2],y=(48&a[t+3])>>4,y>1){if(i=t+5+a[t+4],i===t+188)continue}else i=t+4;if(g)if(u===h){if(d){if(s&&(this._parseAVCPES(this._parsePES(s)),b&&this._avcTrack.codec&&(-1===f||this._aacTrack.codec)))return void this.remux(a);s={data:[],size:0}}s&&(s.data.push(a.subarray(i,t+188)),s.size+=t+188-i)}else if(u===f){if(d){if(o&&(this._parseAACPES(this._parsePES(o)),b&&this._aacTrack.codec&&(-1===h||this._avcTrack.codec)))return void this.remux(a);o={data:[],size:0}}o&&(o.data.push(a.subarray(i,t+188)),o.size+=t+188-i)}else u===_&&(d&&(l&&this._parseID3PES(this._parsePES(l)),l={data:[],size:0}),l&&(l.data.push(a.subarray(i,t+188)),l.size+=t+188-i));else d&&(i+=a[i]+1),0===u?this._parsePAT(a,i):u===this._pmtId?(this._parsePMT(a,i),g=this.pmtParsed=!0,h=this._avcTrack.id,f=this._aacTrack.id,_=this._id3Track.id,v&&(e.logger.log("reparse from beginning"),v=!1,t=-188)):(e.logger.log("unknown PID found before PAT/PMT"),v=!0)}else this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});s&&this._parseAVCPES(this._parsePES(s)),o&&this._parseAACPES(this._parsePES(o)),l&&this._parseID3PES(this._parsePES(l)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(r,t){var i,n,s,a;for(i=(15&r[t+1])<<8|r[t+2],n=t+3+i-4,s=(15&r[t+10])<<8|r[t+11],t+=12+s;n>t;){switch(a=(31&r[t+1])<<8|r[t+2],r[t]){case 15:this._aacTrack.id=a;break;case 21:this._id3Track.id=a;break;case 27:this._avcTrack.id=a;break;default:e.logger.log("unkown stream type:"+r[t])}t+=((15&r[t+3])<<8|r[t+4])+5}}},{key:"_parsePES",value:function(o){var e,n,h,d,u,l,a,r,t,f=0,s=o.data;if(e=s[0],h=(e[0]<<16)+(e[1]<<8)+e[2],1===h){for(d=(e[4]<<8)+e[5],n=e[7],192&n&&(a=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,a>4294967295&&(a-=8589934592),64&n?(r=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2,r>4294967295&&(r-=8589934592)):r=a),u=e[8],t=u+9,o.size-=t,l=new Uint8Array(o.size);s.length;){e=s.shift();var i=e.byteLength;if(t){if(t>i){t-=i;continue}e=e.subarray(t),i-=t,t=0}l.set(e,f),f+=i}return{data:l,pts:a,dts:r,len:d}}return null}},{key:"_parseAVCPES",value:function(a){var t,m,n,o,y=this,r=this._avcTrack,u=r.samples,p=this._parseAVCNALu(a.data),d=[],l=!1,c=!1,f=0;if(0===p.length&&u.length>0){var v=u[u.length-1],h=v.units.units[v.units.units.length-1],g=new Uint8Array(h.data.byteLength+a.data.byteLength);g.set(h.data,0),g.set(a.data,h.data.byteLength),h.data=g,v.units.length+=a.data.byteLength,r.len+=a.data.byteLength}a.data=null;var i="",E=function(){d.length&&(c===!0||r.sps&&(u.length||this.contiguous)?(m={units:{units:d,length:f},pts:a.pts,dts:a.dts,key:c},u.push(m),r.len+=f,r.nbNalu+=d.length):r.dropped++,d=[],f=0)}.bind(this);p.forEach(function(e){switch(e.type){case 1:n=!0,l&&(i+="NDR ");break;case 5:n=!0,l&&(i+="IDR "),c=!0;break;case 6:n=!0,l&&(i+="SEI "),t=new s.default(e.data),t.readUByte();var b=t.readUByte();if(4===b){var g=0;do g=t.readUByte();while(255===g);var A=t.readUByte();if(181===A){var R=t.readUShort();if(49===R){var L=t.readUInt();if(1195456820===L){var k=t.readUByte();if(3===k){var v=t.readUByte(),_=t.readUByte(),S=31&v,h=[v,_];for(o=0;S>o;o++)h.push(t.readUByte()),h.push(t.readUByte()),h.push(t.readUByte());y._txtTrack.samples.push({type:3,pts:a.pts,bytes:h})}}}}}break;case 7:if(n=!0,l&&(i+="SPS "),!r.sps){t=new s.default(e.data);var p=t.readSPS();r.width=p.width,r.height=p.height,r.sps=[e.data],r.duration=y._duration;var T=e.data.subarray(1,4),m="avc1.";for(o=0;3>o;o++){var u=T[o].toString(16);u.length<2&&(u="0"+u),m+=u}r.codec=m}break;case 8:n=!0,l&&(i+="PPS "),r.pps||(r.pps=[e.data]);break;case 9:n=!1,l&&(i+="AUD "),E();break;default:n=!1,i+="unknown NAL "+e.type+" "}n&&(d.push(e),f+=e.data.byteLength)}),(l||i.length)&&e.logger.log(i),E()}},{key:"_parseAVCNALu",value:function(r){for(var s,a,l,_,n,d,t=0,g=r.byteLength,e=this.avcNaluState,v=[];g>t;)switch(s=r[t++],e){case 0:0===s&&(e=1);break;case 1:e=0===s?2:0;break;case 2:case 3:if(0===s)e=3;else if(1===s&&g>t){if(_=31&r[t],n)l={data:r.subarray(n,t-e-1),type:d},v.push(l);else{var i=this.avcNaluState;if(i&&4-i>=t){var m=this._avcTrack,c=m.samples;if(c.length){var p=c[c.length-1],R=p.units.units,u=R[R.length-1];u.state&&(u.data=u.data.subarray(0,u.data.byteLength-i),p.units.length-=i,m.len-=i)}}if(a=t-e-1,a>0){var y=this._avcTrack,h=y.samples;if(h.length){var E=h[h.length-1],b=E.units.units,o=b[b.length-1],f=new Uint8Array(o.data.byteLength+a);f.set(o.data,0),f.set(r.subarray(0,a),o.data.byteLength),o.data=f,E.units.length+=a,y.len+=a}}}n=t,d=_,e=0}else e=0}return n&&(l={data:r.subarray(n,g),type:d,state:e},v.push(l),this.avcNaluState=e),v}},{key:"_parseAACPES",value:function(R){var l,o,p,E,t,d,f,s,_,i=this._aacTrack,a=R.data,v=R.pts,T=0,L=this._duration,A=this.audioCodec,u=this.aacOverFlow,b=this.aacLastPTS;if(u){var m=new Uint8Array(u.byteLength+a.byteLength);m.set(u,0),m.set(a,u.byteLength),a=m}for(t=T,s=a.length;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);if(t){var y,h;if(s-1>t?(y="AAC PES did not start with ADTS header,offset:"+t,h=!1):(y="no ADTS header found in AAC PES",h=!0),this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:h,reason:y}),h)return}if(i.audiosamplerate||(l=c.default.getAudioConfig(this.observer,a,t,A),i.config=l.config,i.audiosamplerate=l.samplerate,i.channelCount=l.channelCount,i.codec=l.codec,i.duration=L,e.logger.log("parsed codec:"+i.codec+",rate:"+l.samplerate+",nb channel:"+l.channelCount)),E=0,p=9216e4/i.audiosamplerate,u&&b){var g=b+p;Math.abs(g-v)>1&&(e.logger.log("AAC: align PTS for overlapping frames by "+Math.round((g-v)/90)),v=g)}for(;s>t+5&&(d=1&a[t+1]?7:9,o=(3&a[t+3])<<11|a[t+4]<<3|(224&a[t+5])>>>5,o-=d,o>0&&s>=t+d+o);)for(f=v+E*p,_={unit:a.subarray(t+d,t+d+o),pts:f,dts:f},i.samples.push(_),i.len+=o,t+=o+d,E++;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);u=s>t?a.subarray(t,s):null,this.aacOverFlow=u,this.aacLastPTS=f}},{key:"_parseID3PES",value:function(e){this._id3Track.samples.push(e)}}],[{key:"probe",value:function(e){return e.length>=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),t}();i.default=o},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(t,r,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},e.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,f,t){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},d=function(){function e(a,r){for(var t=0;t1?r-1:0),t=1;r>t;t++)a[t-1]=arguments[t];this.handledEvents=a,this.useGenericHandler=!0,this.registerListeners()}return d(e,[{key:"destroy",value:function(){this.unregisterListeners()}},{key:"isEventHandler",value:function(){return"object"===n(this.handledEvents)&&this.handledEvents.length&&"function"==typeof this.onEvent}},{key:"registerListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){if("hlsEventGeneric"===e)throw new Error("Forbidden event name: "+e);this.hls.on(e,this.onEvent)}.bind(this))}},{key:"unregisterListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){this.hls.off(e,this.onEvent)}.bind(this))}},{key:"onEvent",value:function(e,t){this.onEventGeneric(e,t)}},{key:"onEventGeneric",value:function(e,t){var a=function(t,r){var e="on"+t.replace("hls","");if("function"!=typeof this[e])throw new Error("Event "+t+" has no generic handler in this "+this.constructor.name+" class (tried "+e+")");return this[e].bind(this,r)};try{a.call(this,e,t).call()}catch(t){o.logger.error("internal error happened while processing "+e+":"+t.message),this.hls.trigger(s.default.ERROR,{type:r.ErrorTypes.OTHER_ERROR,details:r.ErrorDetails.INTERNAL_EXCEPTION,fatal:!1,event:e,err:t})}}}]),e}();t.default=l},{"./errors":21,"./events":23,"./utils/logger":38}],23:[function(t,e,r){"use strict";e.exports={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVEL_SWITCH:"hlsLevelSwitch",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_PROGRESS:"hlsFragLoadProgress",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSING_DATA:"hlsFragParsingData",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded"}},{}],24:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;td&&(t[u-1].end=r[e].end):t.push(r[e])}else t.push(r[e])}for(e=0,o=0,l=i=a;e=n&&f>a)l=n,i=f,o=i-a;else if(n>a+s){h=n;break}}return{len:o,start:l,end:i,nextStart:h}}}]),e}();e.default=a},{}],25:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;th)return void(a.PTSKnown=!1);for(var r=c;h>=r;r++){var s=f[u+r],n=l[r];n&&s&&(d=s.cc-n.cc,isNaN(s.startPTS)||(n.start=n.startPTS=s.startPTS,n.endPTS=s.endPTS,n.duration=s.duration,i=n))}if(d)for(e.logger.log("discontinuity sliding from playlist, take drift into account"),r=0;r=0&&ui.endSN)return 0;if(o=l-i.startSN,n=i.fragments,e=n[o],!isNaN(e.startPTS)){var f=Math.abs(e.startPTS-a);isNaN(e.deltaPTS)?e.deltaPTS=f:e.deltaPTS=Math.max(f,e.deltaPTS),a=Math.min(a,e.startPTS),s=Math.max(s,e.endPTS),d=Math.min(d,e.startDTS),u=Math.max(u,e.endDTS)}var h=a-e.start;for(e.start=e.startPTS=a,e.endPTS=s,e.startDTS=d,e.endDTS=u,e.duration=s-a,r=o;r>0;r--)t.updatePTS(n,r,r-1);for(r=o;ra?r.start=t.start+t.duration:r.start=t.start-r.duration:i>a?(t.duration=n-t.start,t.duration<0&&e.logger.error("negative duration computed for frag "+t.sn+",level "+t.level+", there should be some duration drift between playlist and fragment!")):(r.duration=t.start-n,r.duration<0&&e.logger.error("negative duration computed for frag "+r.sn+",level "+r.level+", there should be some duration drift between playlist and fragment!"))}}]),t}();t.default=n},{"../utils/logger":38}],26:[function(t,I,i){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t1?t-1:0),e=1;t>e;e++)i[e-1]=arguments[e];a.emit.apply(a,[r,r].concat(i))},a.off=function(i){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];a.removeListener.apply(a,[i].concat(r))},this.on=a.on.bind(a),this.off=a.off.bind(a),this.trigger=a.trigger.bind(a),this.playlistLoader=new d.default(this),this.fragmentLoader=new h.default(this),this.levelController=new R.default(this),this.abrController=new r.abrController(this),this.bufferController=new r.bufferController(this),this.capLevelController=new r.capLevelController(this),this.streamController=new r.streamController(this),this.timelineController=new r.timelineController(this),this.keyLoader=new p.default(this)}return n(t,null,[{key:"isSupported",value:function(){return window.MediaSource&&"function"==typeof window.MediaSource.isTypeSupported&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')}},{key:"Events",get:function(){return a.default}},{key:"ErrorTypes",get:function(){return s.ErrorTypes}},{key:"ErrorDetails",get:function(){return s.ErrorDetails}},{key:"DefaultConfig",get:function(){return t.defaultConfig||(t.defaultConfig={autoStartLoad:!0,startPosition:-1,debug:!1,capLevelToPlayerSize:!1,maxBufferLength:30,maxBufferSize:6e7,maxBufferHole:.5,maxSeekHole:2,seekHoleNudgeDuration:.01,stalledInBufferedNudgeThreshold:10,maxFragLookUpTolerance:.2,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxMaxBufferLength:600,enableWorker:!0,enableSoftwareAES:!0,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingLoopThreshold:3,startFragPrefetch:!1,appendErrorMaxRetry:3,loader:S.default,fLoader:void 0,pLoader:void 0,abrController:v.default,bufferController:P.default,capLevelController:m.default,streamController:b.default,timelineController:L.default,enableCEA708Captions:!0,enableMP2TPassThrough:!1,abrEwmaFastLive:5,abrEwmaSlowLive:9,abrEwmaFastVoD:4,abrEwmaSlowVoD:15,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.8,abrBandWidthUpFactor:.7}),t.defaultConfig},set:function(e){t.defaultConfig=e}}]),n(t,[{key:"destroy",value:function(){e.logger.log("destroy"),this.trigger(a.default.DESTROYING),this.detachMedia(),this.playlistLoader.destroy(),this.fragmentLoader.destroy(),this.levelController.destroy(),this.abrController.destroy(),this.bufferController.destroy(),this.capLevelController.destroy(),this.streamController.destroy(),this.timelineController.destroy(),this.keyLoader.destroy(),this.url=null,this.observer.removeAllListeners()}},{key:"attachMedia",value:function(t){e.logger.log("attachMedia"),this.media=t,this.trigger(a.default.MEDIA_ATTACHING,{media:t})}},{key:"detachMedia",value:function(){e.logger.log("detachMedia"),this.trigger(a.default.MEDIA_DETACHING),this.media=null}},{key:"loadSource",value:function(t){e.logger.log("loadSource:"+t),this.url=t,this.trigger(a.default.MANIFEST_LOADING,{url:t})}},{key:"startLoad",value:function(){var t=arguments.length<=0||void 0===arguments[0]?-1:arguments[0];e.logger.log("startLoad"),this.levelController.startLoad(),this.streamController.startLoad(t)}},{key:"stopLoad",value:function(){e.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad()}},{key:"swapAudioCodec",value:function(){e.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){e.logger.log("recoverMediaError");var t=this.media;this.detachMedia(),this.attachMedia(t)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){e.logger.log("set currentLevel:"+t),this.loadLevel=t,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){e.logger.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){e.logger.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return this.levelController.firstLevel},set:function(t){e.logger.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){e.logger.log("set startLevel:"+t),this.levelController.startLevel=t}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(t){e.logger.log("set autoLevelCapping:"+t),this.abrController.autoLevelCapping=t}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}}]),t}();i.default=l},{"./controller/abr-controller":3,"./controller/buffer-controller":4,"./controller/cap-level-controller":5,"./controller/level-controller":7,"./controller/stream-controller":8,"./controller/timeline-controller":9,"./errors":21,"./events":23,"./loader/fragment-loader":28,"./loader/key-loader":29,"./loader/playlist-loader":30,"./utils/logger":38,"./utils/xhr-loader":40,events:1}],27:[function(e,t,r){"use strict";t.exports=e("./hls.js").default},{"./hls.js":26}],28:[function(r,c,a){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;te;e++)t[e]=r>>8*(15-e)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,r){var t=e;return e&&e.method&&e.uri&&!e.iv&&(t=this.cloneObj(e),t.iv=this.createInitializationVector(r)),t}},{key:"avc1toavcoti",value:function(r){var e,t=r.split(".");return t.length>2?(e=t.shift()+".",e+=parseInt(t.shift()).toString(16),e+=("000"+parseInt(t.shift()).toString(16)).substr(-4)):e=r,e}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(D,f,T){var E,e,R,l=0,o=0,t={version:null,type:null,url:f,fragments:[],live:!0,startSN:0},a={method:null,key:null,iv:null,uri:null},y=0,c=null,r=null,n=null,d=null,h=null,s=null;for(R=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(e=R.exec(D));)switch(e.shift(),e=e.filter(function(e){return void 0!==e}),e[0]){case"VERSION":t.version=parseInt(e[1]);break;case"PLAYLIST-TYPE":t.type=e[1].toUpperCase();break;case"MEDIA-SEQUENCE":l=t.startSN=parseInt(e[1]);break;case"TARGETDURATION":t.targetduration=parseFloat(e[1]);break;case"EXTM3U":break;case"ENDLIST":t.live=!1;break;case"DIS":y++;break;case"BYTERANGE":var v=e[1].split("@");s=1===v.length?h:parseInt(v[1]),h=parseInt(v[0])+s;break;case"INF":n=parseFloat(e[1]),d=e[2]?e[2]:null;break;case"":if(!isNaN(n)){var b=l++;E=this.fragmentDecryptdataFromLevelkey(a,b);var L=e[1]?this.resolve(e[1],f):null;r={url:L,duration:n,title:d,start:o,sn:b,level:T,cc:y,decryptdata:E,programDateTime:c},null!==s&&(r.byteRangeStartOffset=s,r.byteRangeEndOffset=h),t.fragments.push(r),o+=n,n=null,d=null,s=null,c=null}break;case"KEY":var A=e[1],p=new i.default(A),g=p.enumeratedString("METHOD"),m=p.URI,k=p.hexadecimalInteger("IV");g&&(a={method:null,key:null,iv:null,uri:null},m&&"AES-128"===g&&(a.method=g,a.uri=this.resolve(m,f),a.key=null,a.iv=k));break;case"START":var S=e[1],w=new i.default(S),_=w.decimalFloatingPoint("TIME-OFFSET");_&&(t.startTimeOffset=_);break;case"PROGRAM-DATE-TIME":c=new Date(Date.parse(e[1]));break;case"#":e.shift();break;default:u.logger.warn("line parsed but not handled: "+e)}return r&&!r.url&&(t.fragments.pop(),o-=r.duration),t.totalduration=o,t.endSN=l-1,t}},{key:"loadsuccess",value:function(u,a){var s,o=u.currentTarget,n=o.responseText,r=o.responseURL,l=this.id,d=this.id2,i=this.hls;if(this.loading=!1,void 0===r&&(r=this.url),a.tload=performance.now(),a.mtime=new Date(o.getResponseHeader("Last-Modified")),0===n.indexOf("#EXTM3U"))if(n.indexOf("#EXTINF:")>0)if(null===this.id)i.trigger(t.default.MANIFEST_LOADED,{levels:[{url:r}],url:r,stats:a});else{var f=this.parseLevelPlaylist(n,r,l);a.tparsed=performance.now(),i.trigger(t.default.LEVEL_LOADED,{details:f,level:l,id:d,stats:a})}else s=this.parseMasterPlaylist(n,r),s.length?i.trigger(t.default.MANIFEST_LOADED,{levels:s,url:r,stats:a}):i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no level found in manifest"});else i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(i){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_ERROR,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_ERROR,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,response:i.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_TIMEOUT,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_TIMEOUT,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),r}(n.default);s.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t.set(i,4),r=0,e=8;n>r;r++)t.set(a[r],e),e+=a[r].byteLength;return t}},{key:"hdlr",value:function(t){return e.box(e.types.hdlr,e.HDLR_TYPES[t])}},{key:"mdat",value:function(t){return e.box(e.types.mdat,t)}},{key:"mdhd",value:function(t,r){return r*=t,e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(r){for(var t=r.length,a=[];t--;)a[t]=e.trex(r[t]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(n){var r,t,a=n.samples||[],i=new Uint8Array(4+a.length);for(t=0;t>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var u=e.box(e.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|t.sps.length].concat(a).concat([t.pps.length]).concat(s))),o=t.width,l=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,o>>8&255,255&o,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(a,t){var i=e.sdtp(a),r=a.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t])),e.trun(a,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(r){var t=r.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(h,o){var a,i,n,s,t,l,d=h.samples||[],r=d.length,f=12+16*r,u=new Uint8Array(f);for(o+=8+f,u.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,o>>>24&255,o>>>16&255,o>>>8&255,255&o],0),a=0;r>a;a++)i=d[a],n=i.duration,s=i.size,t=i.flags,l=i.cts,u.set([n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,t.isLeading<<2|t.dependsOn,t.isDependedOn<<6|t.hasRedundancy<<4|t.paddingValue<<1|t.isNonSync,61440&t.degradPrio,15&t.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,u)}},{key:"initSegment",value:function(a){e.types||e.init();var t,r=e.moov(a);return t=new Uint8Array(e.FTYP.byteLength+r.byteLength),t.set(e.FTYP),t.set(r,e.FTYP.byteLength),t}}]),e}();e.default=a},{}],32:[function(a,h,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var l=function(){function e(a,r){for(var t=0;tMath.pow(2,32)&&!function(){var e=function r(t,e){return e?r(e,t%e):t};a.timescale=a.audiosamplerate/e(a.audiosamplerate,1024)}(),e.logger.log("audio mp4 timescale :"+a.timescale),l.audio={container:"audio/mp4",codec:a.codec,initSegment:r.default.initSegment([a]),metadata:{channelCount:a.channelCount}},u&&(n=o=v[0].pts-f*h)),i.sps&&i.pps&&d.length&&(i.timescale=this.MP4_TIMESCALE,l.video={container:"video/mp4",codec:i.codec,initSegment:r.default.initSegment([i]),metadata:{width:i.width,height:i.height}},u&&(n=Math.min(n,d[0].pts-f*h),o=Math.min(o,d[0].dts-f*h))),Object.keys(l).length?(c.trigger(t.default.FRAG_PARSING_INIT_SEGMENT,g),this.ISGenerated=!0,u&&(this._initPTS=n,this._initDTS=o)):c.trigger(t.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(a,D,w){var L,s,v,T,y,d,k,S,R,g,m,f,u,i,l,b=8,c=this.PES_TIMESCALE,h=this.PES2MP4SCALEFACTOR,o=[],A=a.samples.reduce(function(t,e){return Math.max(Math.min(t,e.pts-e.dts),-18e3)},0);for(0>A&&e.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(A/90)+" ms to overcome this issue"),d=new Uint8Array(a.len+4*a.nbNalu+8),L=new DataView(d.buffer),L.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4);a.samples.length;){for(s=a.samples.shift(),T=0;s.units.units.length;)y=s.units.units.shift(),L.setUint32(b,y.data.byteLength),b+=4,d.set(y.data,b),b+=y.data.byteLength,T+=4+y.data.byteLength;if(m=s.pts-this._initDTS,f=s.dts-this._initDTS+A,f=Math.min(m,f),void 0!==g){u=this._PTSNormalize(m,g),i=this._PTSNormalize(f,g);var _=(i-g)/h;0>=_&&(e.logger.log("invalid sample duration at PTS/DTS: "+s.pts+"/"+s.dts+":"+_),_=1),v.duration=_}else{var p=void 0,n=void 0;p=w?this.nextAvcDts:D*c,u=this._PTSNormalize(m,p),i=this._PTSNormalize(f,p),n=Math.round((i-p)/90),w&&n&&(n>1?e.logger.log("AVC:"+n+" ms hole between fragments detected,filling it"):-1>n&&e.logger.log("AVC:"+-n+" ms overlapping between fragments detected"),i=p,u=Math.max(u-n,i),e.logger.log("Video/PTS/DTS adjusted: "+u+"/"+i+",delta:"+n)),S=Math.max(0,u),R=Math.max(0,i)}v={size:T,duration:0,cts:(u-i)/h,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},l=v.flags,s.key===!0?(l.dependsOn=2,l.isNonSync=0):(l.dependsOn=1,l.isNonSync=1),o.push(v),g=i}var E=0;o.length>=2&&(E=o[o.length-2].duration,v.duration=E),this.nextAvcDts=i+E*h;var O=a.dropped;a.len=0,a.nbNalu=0,a.dropped=0,o.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(l=o[0].flags,l.dependsOn=2,l.isNonSync=0),a.samples=o,k=r.default.moof(a.sequenceNumber++,R/h,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:k,data2:d,startPTS:S/c,endPTS:(u+h*E)/c,startDTS:R/c,endDTS:this.nextAvcDts/c,type:"video",nb:o.length,dropped:O})}},{key:"remuxAudio",value:function(a,D,S){var k,p,n,h,d,T,L,b,u,g,R,o,i,A=8,s=this.PES_TIMESCALE,w=a.timescale,f=s/w,E=1024*a.timescale/a.audiosamplerate,m=[],_=[];for(a.samples.sort(function(e,t){return e.pts-t.pts}),_=a.samples;_.length;){if(p=_.shift(),h=p.unit,g=p.pts-this._initDTS,R=p.dts-this._initDTS,void 0!==u)o=this._PTSNormalize(g,u),i=this._PTSNormalize(R,u),n.duration=(i-u)/f,Math.abs(n.duration-E)>E/10&&e.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*a.audiosamplerate/a.timescale)),n.duration=E,o=i=E*f+u;else{var c=void 0,l=void 0;if(c=S?this.nextAacPts:D*s,o=this._PTSNormalize(g,c),i=this._PTSNormalize(R,c),l=Math.round(1e3*(o-c)/s),S&&l){if(l>0)e.logger.log(l+" ms hole between AAC samples detected,filling it");else if(-12>l){e.logger.log(-l+" ms overlapping between AAC samples detected, drop frame"),a.len-=h.byteLength;continue}o=i=c}if(L=Math.max(0,o),b=Math.max(0,i),!(a.len>0))return;d=new Uint8Array(a.len+8),k=new DataView(d.buffer),k.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4)}d.set(h,A),A+=h.byteLength,n={size:h.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},m.push(n),u=i}var y=0,v=m.length;v>=2&&(y=m[v-2].duration,n.duration=y),v&&(this.nextAacPts=o+f*y,a.len=0,a.samples=m,T=r.default.moof(a.sequenceNumber++,b/f,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:T,data2:d,startPTS:L/s,endPTS:this.nextAacPts/s,startDTS:b/s,endDTS:(i+f*y)/s,type:"audio",nb:v}))}},{key:"remuxID3",value:function(r,i){var e,n=r.samples.length;if(n){for(var a=0;n>a;a++)e=r.samples[a],e.pts=(e.pts-this._initPTS)/this.PES_TIMESCALE,e.dts=(e.dts-this._initDTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_METADATA,{samples:r.samples})}r.samples=[],i=i}},{key:"remuxText",value:function(e,i){e.samples.sort(function(e,t){return e.pts-t.pts});var r,n=e.samples.length;if(n){for(var a=0;n>a;a++)r=e.samples[a],r.pts=(r.pts-this._initPTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_USERDATA,{samples:e.samples})}e.samples=[],i=i}},{key:"_PTSNormalize",value:function(e,t){var r;if(void 0===t)return e;for(r=e>t?-8589934592:8589934592;Math.abs(e-t)>4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),a}();i.default=d},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"hexadecimalInteger",value:function(r){if(this[r]){var e=(this[r]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var a=new Uint8Array(e.length/2),t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(t){var e=/^(\d+)x(\d+)$/.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}}}],[{key:"parseAttrList",value:function(i){for(var t,n=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,r={};null!==(t=n.exec(i));){var e=t[2],a='"';0===e.indexOf(a)&&e.lastIndexOf(a)===e.length-1&&(e=e.slice(1,-1)),r[t[1]]=e}return r}}]),e}();e.default=a},{}],35:[function(r,e,a){"use strict";var t={search:function(i,s){for(var t=0,r=i.length-1,e=null,a=null;r>=t;){e=(t+r)/2|0,a=i[e];var n=s(a);if(n>0)t=e+1;else{if(!(0>n))return a;r=e-1}}return null}};e.exports=t},{}],36:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t0;)e.removeCue(e.cues[0])}},{key:"push",value:function(r,a){this.cue||this._createCue();for(var i,t,e,s,o,u=31&a[0],n=2,l=0;u>l;l++)if(i=a[n++],t=127&a[n++],e=127&a[n++],s=0!==(4&i),o=3&i,(0!==t||0!==e)&&s&&0===o){if(32&t||64&t)this.cue.text+=this._fromCharCode(t)+this._fromCharCode(e);else if((17===t||25===t)&&e>=48&&63>=e)switch(e){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===t||25===t)&&e>=32&&47>=e)switch(e){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===t||28===t)&&e>=32&&47>=e)switch(e){case 32:this._clearActiveCues(r);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(r);break;case 42:break;case 43:break;case 44:this._clearActiveCues(r);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(r)}if((23===t||31===t)&&e>=33&&35>=e)switch(e){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(s){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var e=!0,a=!1,i=void 0;try{for(var n,t=this.memory[Symbol.iterator]();!(e=(n=t.next()).done);e=!0){var r=n.value;r.startTime=s,this._textTrack.addCue(r),this.display.push(r)}}catch(e){a=!0,i=e}finally{try{!e&&t.return&&t.return()}finally{if(a)throw i}}this.memory=[],this.cue=null}},{key:"_clearActiveCues",value:function(n){var e=!0,r=!1,a=void 0;try{for(var i,t=this.display[Symbol.iterator]();!(e=(i=t.next()).done);e=!0){var s=i.value;s.endTime=n}}catch(e){r=!0,a=e}finally{try{!e&&t.return&&t.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();e.default=a},{}],37:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t "+e}function n(t){var r=window.console[t];return r?function(){for(var n=arguments.length,e=Array(n),a=0;n>a;a++)e[a]=arguments[a];e[0]&&(e[0]=i(t,e[0])),r.apply(window.console,e)}:e}function s(r){for(var a=arguments.length,i=Array(a>1?a-1:0),e=1;a>e;e++)i[e-1]=arguments[e];i.forEach(function(e){t[e]=r[e]?r[e].bind(r):n(e)})}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},a={trace:e,debug:e,log:e,warn:e,info:e,error:e},t=a;r.enableLogs=function(e){if(e===!0||"object"===("undefined"==typeof e?"undefined":o(e))){s(e,"debug","log","info","warn","error");try{t.log()}catch(e){t=a}}else t=a},r.logger=t},{}],39:[function(r,t,a){ -"use strict";var e={buildAbsoluteURL:function(r,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var l=null,o=null,n=/^([^#]*)(.*)$/.exec(t);n&&(o=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(l=s[2],t=s[1]);var f=/^([^#]*)(.*)$/.exec(r);f&&(r=f[1]);var u=/^([^\?]*)(.*)$/.exec(r);u&&(r=u[1]);var a=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(r);if(!a)throw new Error("Error trying to parse base URL.");var h=a[2]||"",d=a[1]||"",c=a[4],i=null;return i=/^\/\//.test(t)?h+"//"+e.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?d+"/"+e.buildAbsolutePath("",t.substring(1)):e.buildAbsolutePath(d+c,t),l&&(i+=l),o&&(i+=o),i},buildAbsolutePath:function(n,s){for(var a,e,o=s,i="",t=n.replace(/[^\/]*$/,o.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),r=0;e=t.indexOf("/../",r),e>-1;r=e+a)a=/^\/(?:\.\.\/)*/.exec(t.slice(e))[0].length,i=(i+t.substring(r,e)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(a-1)/3+"}$"),"/");return i+t.substr(r)}};t.exports=e},{}],40:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t=200&&300>t?(window.clearTimeout(this.timeoutHandle),r.tload=Math.max(r.tfirst,performance.now()),this.onSuccess(a,r)):r.retry>=this.maxRetry||t>=400&&499>t?(window.clearTimeout(this.timeoutHandle),e.logger.error(t+" while loading "+this.url),this.onError(a)):(e.logger.warn(t+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),r.retry++))}},{key:"loadtimeout",value:function(t){e.logger.warn("timeout while loading "+this.url),this.onTimeout(t,this.stats)}},{key:"loadprogress",value:function(t){var e=this.stats;0===e.tfirst&&(e.tfirst=Math.max(performance.now(),e.trequest)),e.loaded=t.loaded,this.onProgress&&this.onProgress(t,e)}}]),t}();t.default=n},{"../utils/logger":38}]},{},[27])(27)}); +t.logger.warn("SN just loaded, with large PTS gap between audio and video, maybe frag is not starting with a keyframe ? load previous one to try to overcome this"),c.loadCounter--):(i=u[k+1],t.logger.log("SN just loaded, load next one: "+i.sn)),!i)break}if(null!=i.decryptdata.uri&&null==i.decryptdata.key)t.logger.log("Loading key for "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l),this.state=e.KEY_LOADING,h.trigger(r.default.KEY_LOADING,{frag:i});else{if(t.logger.log("Loading "+i.sn+" of ["+n.startSN+" ,"+n.endSN+"],level "+l+", currentTime:"+R+",bufferEnd:"+d.toFixed(3)),void 0!==this.fragLoadIdx?this.fragLoadIdx++:this.fragLoadIdx=0,i.loadCounter){i.loadCounter++;var S=o.fragLoadingLoopThreshold;if(i.loadCounter>S&&Math.abs(this.fragLoadIdx-i.loadIdx)=w||b)&&(t.logger.log("mediaController: retryDate reached, switch back to IDLE state"),this.state=e.IDLE);break;case e.STOPPED:case e.FRAG_LOADING:case e.PARSING:case e.PARSED:case e.ENDED:}this._checkBuffer(),this._checkFragmentChanged()}},{key:"getBufferRange",value:function(a){var e,t,r=this.bufferRange;if(r)for(e=r.length-1;e>=0;e--)if(t=r[e],a>=t.start&&a<=t.end)return t;return null}},{key:"followingBufferRange",value:function(e){return e?this.getBufferRange(e.end+.5):null}},{key:"isBuffered",value:function(r){var a=this.media;if(a)for(var t=a.buffered,e=0;e=t.start(e)&&r<=t.end(e))return!0;return!1}},{key:"_checkFragmentChanged",value:function(){var t,e,a=this.media;if(a&&a.seeking===!1&&(e=a.currentTime,e>a.playbackRate*this.lastCurrentTime&&(this.lastCurrentTime=e),this.isBuffered(e)?t=this.getBufferRange(e):this.isBuffered(e+.1)&&(t=this.getBufferRange(e+.1)),t)){var i=t.frag;i!==this.fragPlaying&&(this.fragPlaying=i,this.hls.trigger(r.default.FRAG_CHANGED,{frag:i}))}}},{key:"immediateLevelSwitch",value:function(){if(t.logger.log("immediateLevelSwitch"),!this.immediateSwitch){this.immediateSwitch=!0;var a=this.media,i=void 0;a?(i=a.paused,a.pause()):i=!0,this.previouslyPaused=i}var n=this.fragCurrent;n&&n.loader&&n.loader.abort(),this.fragCurrent=null,this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:Number.POSITIVE_INFINITY})}},{key:"immediateLevelSwitchEnd",value:function(){this.immediateSwitch=!1;var e=this.media;e&&e.readyState&&(e.currentTime-=1e-4,this.previouslyPaused||e.play())}},{key:"nextLevelSwitch",value:function(){var t=this.media;if(t&&t.readyState){var n=void 0,i=void 0,a=void 0;if(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,i=this.getBufferRange(t.currentTime),i&&i.start>1&&(this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:0,endOffset:i.start-1})),t.paused)n=0;else{var l=this.hls.nextLoadLevel,u=this.levels[l],o=this.fragLastKbps;n=o&&this.fragCurrent?this.fragCurrent.duration*u.bitrate/(1e3*o)+1:0}if(a=this.getBufferRange(t.currentTime+n),a&&(a=this.followingBufferRange(a))){var s=this.fragCurrent;s&&s.loader&&s.loader.abort(),this.fragCurrent=null,this.state=e.PAUSED,this.hls.trigger(r.default.BUFFER_FLUSHING,{startOffset:a.start,endOffset:Number.POSITIVE_INFINITY})}}}},{key:"onMediaAttached",value:function(r){var e=this.media=r.media;this.onvseeking=this.onMediaSeeking.bind(this),this.onvseeked=this.onMediaSeeked.bind(this),this.onvended=this.onMediaEnded.bind(this),e.addEventListener("seeking",this.onvseeking),e.addEventListener("seeked",this.onvseeked),e.addEventListener("ended",this.onvended);var t=this.config;this.levels&&t.autoStartLoad&&this.hls.startLoad(t.startPosition)}},{key:"onMediaDetaching",value:function(){var e=this.media;e&&e.ended&&(t.logger.log("MSE detaching and video ended, reset startPosition"),this.startPosition=this.lastCurrentTime=0);var r=this.levels;r&&r.forEach(function(e){e.details&&e.details.fragments.forEach(function(e){e.loadCounter=void 0})}),e&&(e.removeEventListener("seeking",this.onvseeking),e.removeEventListener("seeked",this.onvseeked),e.removeEventListener("ended",this.onvended),this.onvseeking=this.onvseeked=this.onvended=null),this.media=null,this.loadedmetadata=!1,this.stopLoad()}},{key:"onMediaSeeking",value:function(){if(this.state===e.FRAG_LOADING){if(0===s.default.bufferInfo(this.media,this.media.currentTime,this.config.maxBufferHole).len){t.logger.log("seeking outside of buffer while fragment load in progress, cancel fragment load");var r=this.fragCurrent;r&&(r.loader&&r.loader.abort(),this.fragCurrent=null),this.fragPrevious=null,this.state=e.IDLE}}else this.state===e.ENDED&&(this.state=e.IDLE);this.media&&(this.lastCurrentTime=this.media.currentTime),void 0!==this.fragLoadIdx&&(this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold),this.tick()}},{key:"onMediaSeeked",value:function(){this.tick()}},{key:"onMediaEnded",value:function(){t.logger.log("media ended"),this.startPosition=this.lastCurrentTime=0}},{key:"onManifestLoading",value:function(){t.logger.log("trigger BUFFER_RESET"),this.hls.trigger(r.default.BUFFER_RESET),this.bufferRange=[],this.stalled=!1}},{key:"onManifestParsed",value:function(r){var e,a=!1,i=!1;r.levels.forEach(function(t){e=t.audioCodec,e&&(-1!==e.indexOf("mp4a.40.2")&&(a=!0),-1!==e.indexOf("mp4a.40.5")&&(i=!0))}),this.audioCodecSwitch=a&&i,this.audioCodecSwitch&&t.logger.log("both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC"),this.levels=r.levels,this.startLevelLoaded=!1,this.startFragRequested=!1;var n=this.config;n.autoStartLoad&&this.hls.startLoad(n.startPosition)}},{key:"onLevelLoaded",value:function(o){var a=o.details,i=o.level,l=this.levels[i],d=a.totalduration,n=0;if(t.logger.log("level "+i+" loaded ["+a.startSN+","+a.endSN+"],duration:"+d),this.levelLastLoaded=i,a.live){var f=l.details;f?(u.default.mergeDetails(f,a),n=a.fragments[0].start,a.PTSKnown?t.logger.log("live playlist sliding:"+n.toFixed(3)):t.logger.log("live playlist - outdated PTS, unknown sliding")):(a.PTSKnown=!1,t.logger.log("live playlist - first load, unknown sliding"))}else a.PTSKnown=!1;if(l.details=a,this.hls.trigger(r.default.LEVEL_UPDATED,{details:a,level:i}),this.startFragRequested===!1){if(-1===this.startPosition){var s=a.startTimeOffset;if(isNaN(s))if(a.live){var h=void 0!==this.config.liveSyncDuration?this.config.liveSyncDuration:this.config.liveSyncDurationCount*a.targetduration;this.startPosition=Math.max(0,n+d-h)}else this.startPosition=0;else t.logger.log("start time offset found in playlist, adjust startPosition to "+s),this.startPosition=s}this.nextLoadPosition=this.startPosition}this.state===e.WAITING_LEVEL&&(this.state=e.IDLE),this.tick()}},{key:"onKeyLoaded",value:function(){this.state===e.KEY_LOADING&&(this.state=e.IDLE,this.tick())}},{key:"onFragLoaded",value:function(i){var a=this.fragCurrent;if(this.state===e.FRAG_LOADING&&a&&i.frag.level===a.level&&i.frag.sn===a.sn)if(t.logger.log("Loaded "+a.sn+" of level "+a.level),this.fragBitrateTest===!0)this.state=e.IDLE,this.fragBitrateTest=!1,this.startFragRequested=!1,i.stats.tparsed=i.stats.tbuffered=performance.now(),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:i.stats,frag:a});else{this.state=e.PARSING,this.stats=i.stats;var s=this.levels[this.level],o=s.details,f=o.totalduration,h=void 0===a.startDTS||isNaN(a.startDTS)?a.start:a.startDTS,l=a.level,u=a.sn,n=s.audioCodec||this.config.defaultAudioCodec;this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),void 0===n&&(n=this.lastAudioCodec),n&&(n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5")),this.pendingAppending=0,t.logger.log("Demuxing "+u+" of ["+o.startSN+" ,"+o.endSN+"],level "+l+", cc "+a.cc);var d=this.demuxer;d&&d.push(i.payload,n,s.videoCodec,h,a.cc,l,u,f,a.decryptdata)}this.fragLoadError=0}},{key:"onFragParsingInitSegment",value:function(l){if(this.state===e.PARSING){var o,a,i=l.tracks;if(a=i.audio){var n=this.levels[this.level].audioCodec,u=navigator.userAgent.toLowerCase();n&&this.audioCodecSwap&&(t.logger.log("swapping playlist audio codec"),n=-1!==n.indexOf("mp4a.40.5")?"mp4a.40.2":"mp4a.40.5"),this.audioCodecSwitch&&1!==a.metadata.channelCount&&-1===u.indexOf("firefox")&&(n="mp4a.40.5"),-1!==u.indexOf("android")&&(n="mp4a.40.2",t.logger.log("Android: force audio codec to"+n)),a.levelCodec=n}if(a=i.video,a&&(a.levelCodec=this.levels[this.level].videoCodec),l.unique){var s={codec:"",levelCodec:""};for(o in l.tracks)a=i[o],s.container=a.container,s.codec&&(s.codec+=",",s.levelCodec+=","),a.codec&&(s.codec+=a.codec),a.levelCodec&&(s.levelCodec+=a.levelCodec);i={audiovideo:s}}this.hls.trigger(r.default.BUFFER_CODECS,i);for(o in i){a=i[o],t.logger.log("track:"+o+",container:"+a.container+",codecs[level/parsed]=["+a.levelCodec+"/"+a.codec+"]");var d=a.initSegment;d&&(this.pendingAppending++,this.hls.trigger(r.default.BUFFER_APPENDING,{type:o,data:d}))}this.tick()}}},{key:"onFragParsingData",value:function(a){var o=this;if(this.state===e.PARSING){this.tparse2=Date.now();var n=this.levels[this.level],i=this.fragCurrent;t.logger.log("parsed "+a.type+",PTS:["+a.startPTS.toFixed(3)+","+a.endPTS.toFixed(3)+"],DTS:["+a.startDTS.toFixed(3)+"/"+a.endDTS.toFixed(3)+"],nb:"+a.nb+",dropped:"+(a.dropped||0));var l=u.default.updateFragPTSDTS(n.details,i.sn,a.startPTS,a.endPTS,a.startDTS,a.endDTS),s=this.hls;s.trigger(r.default.LEVEL_PTS_UPDATED,{details:n.details,level:this.level,drift:l}),"video"===a.type&&(i.dropped=a.dropped),[a.data1,a.data2].forEach(function(e){e&&(o.pendingAppending++,s.trigger(r.default.BUFFER_APPENDING,{type:a.type,data:e}))}),this.nextLoadPosition=a.endPTS,this.bufferRange.push({type:a.type,start:a.startPTS,end:a.endPTS,frag:i}),this.tick()}else t.logger.warn("not in PARSING state but "+this.state+", ignoring FRAG_PARSING_DATA event")}},{key:"onFragParsed",value:function(){this.state===e.PARSING&&(this.stats.tparsed=performance.now(),this.state=e.PARSED,this._checkAppendedParsed())}},{key:"onBufferAppended",value:function(){switch(this.state){case e.PARSING:case e.PARSED:this.pendingAppending--,this._checkAppendedParsed()}}},{key:"_checkAppendedParsed",value:function(){if(this.state===e.PARSED&&0===this.pendingAppending){var i=this.fragCurrent,a=this.stats;i&&(this.fragPrevious=i,a.tbuffered=performance.now(),this.fragLastKbps=Math.round(8*a.length/(a.tbuffered-a.tfirst)),this.hls.trigger(r.default.FRAG_BUFFERED,{stats:a,frag:i}),t.logger.log("media buffered : "+this.timeRangesToString(this.media.buffered)),this.state=e.IDLE),this.tick()}}},{key:"onError",value:function(i){switch(i.details){case a.ErrorDetails.FRAG_LOAD_ERROR:case a.ErrorDetails.FRAG_LOAD_TIMEOUT:if(!i.fatal){var n=this.fragLoadError;if(n?n++:n=1,n<=this.config.fragLoadingMaxRetry||this.media&&this.isBuffered(this.media.currentTime)){this.fragLoadError=n,i.frag.loadCounter=0;var s=Math.min(Math.pow(2,n-1)*this.config.fragLoadingRetryDelay,64e3);t.logger.warn("mediaController: frag loading failed, retry in "+s+" ms"),this.retryDate=performance.now()+s,this.state=e.FRAG_LOADING_WAITING_RETRY}else t.logger.error("mediaController: "+i.details+" reaches max retry, redispatch as fatal ..."),i.fatal=!0,this.hls.trigger(r.default.ERROR,i),this.state=e.ERROR}break;case a.ErrorDetails.FRAG_LOOP_LOADING_ERROR:case a.ErrorDetails.LEVEL_LOAD_ERROR:case a.ErrorDetails.LEVEL_LOAD_TIMEOUT:case a.ErrorDetails.KEY_LOAD_ERROR:case a.ErrorDetails.KEY_LOAD_TIMEOUT:this.state!==e.ERROR&&(this.state=i.fatal?e.ERROR:e.IDLE,t.logger.warn("mediaController: "+i.details+" while loading frag,switch to "+this.state+" state ..."));break;case a.ErrorDetails.BUFFER_FULL_ERROR:this.state!==e.PARSING&&this.state!==e.PARSED||(this.config.maxMaxBufferLength/=2,t.logger.warn("reduce max buffer length to "+this.config.maxMaxBufferLength+"s and switch to IDLE state"),this.fragLoadIdx+=2*this.config.fragLoadingLoopThreshold,this.state=e.IDLE)}}},{key:"_checkBuffer",value:function(){var e=this.media;if(e&&e.readyState){var n=e.currentTime,u=e.buffered;if(!this.loadedmetadata&&u.length){this.loadedmetadata=!0;var i=this.startPosition;if(!n&&n!==i&&i){t.logger.log("target start position:"+i);var l=u.start(0),g=u.end(0);(l>i||i>g)&&(i=l,t.logger.log("target start position not buffered, seek to buffered.start(0) "+l)),t.logger.log("adjust currentTime from "+n+" to "+i),e.currentTime=i}}else{var d=s.default.bufferInfo(e,n,0),v=!(e.paused||e.ended||0===e.buffered.length),f=.4,h=n>e.playbackRate*this.lastCurrentTime;if(this.stalled&&h&&(this.stalled=!1,t.logger.log("playback not stuck anymore @"+n)),v&&d.len<=f&&(h?(f=0,this.seekHoleNudgeDuration=0):this.stalled?this.seekHoleNudgeDuration+=this.config.seekHoleNudgeDuration:(this.seekHoleNudgeDuration=0,t.logger.log("playback seems stuck @"+n),this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1}),this.stalled=!0),d.len<=f)){var o=d.nextStart,c=o-n;if(o&&c0){t.logger.log("adjust currentTime from "+e.currentTime+" to next buffered @ "+o+" + nudge "+this.seekHoleNudgeDuration);var p=o+this.seekHoleNudgeDuration-e.currentTime;e.currentTime=o+this.seekHoleNudgeDuration,this.hls.trigger(r.default.ERROR,{type:a.ErrorTypes.MEDIA_ERROR,details:a.ErrorDetails.BUFFER_SEEK_OVER_HOLE,fatal:!1,hole:p})}}}}}},{key:"onFragLoadEmergencyAborted",value:function(){this.state=e.IDLE,this.tick()}},{key:"onBufferFlushed",value:function(){var t,r,a=[];for(r=0;re;e++)r+="["+t.start(e)+","+t.end(e)+"]";return r}},{key:"currentLevel",get:function(){if(this.media){var e=this.getBufferRange(this.media.currentTime);if(e)return e.frag.level}return-1}},{key:"nextBufferRange",get:function(){return this.media?this.followingBufferRange(this.getBufferRange(this.media.currentTime)):null}},{key:"nextLevel",get:function(){var e=this.nextBufferRange;return e?e.frag.level:-1}}]),i}(l.default);o.default=f},{"../demux/demuxer":17,"../errors":21,"../event-handler":22,"../events":23,"../helper/buffer-helper":24,"../helper/level-helper":25,"../utils/binary-search":35,"../utils/logger":38}],9:[function(t,v,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var c=function(){function e(a,r){for(var t=0;te;e++)c[(i[e]=e<<1^283*(e>>7))^e]=e;for(a=r=0;!h[a];a^=u||1,r=c[r]||1)for(t=r^r<<1^r<<2^r<<3^r<<4,t=t>>8^255&t^99,h[a]=t,v[t]=a,d=i[f=i[u=i[a]]],l=16843009*d^65537*f^257*u^16843008*a,s=257*i[t]^16843008*t,e=0;4>e;e++)n[e][a]=s=s<<24^s>>>8,o[e][t]=l=l<<24^l>>>8;for(e=0;5>e;e++)n[e]=n[e].slice(0),o[e]=o[e].slice(0)}},{key:"decrypt",value:function(R,p,_,b,E,m){var h,g,v,n,e=this._key[1],t=R^e[0],a=b^e[1],i=_^e[2],r=p^e[3],y=e.length/4-2,s=4,o=this._tables[1],f=o[0],d=o[1],u=o[2],l=o[3],c=o[4];for(n=0;y>n;n++)h=f[t>>>24]^d[a>>16&255]^u[i>>8&255]^l[255&r]^e[s],g=f[a>>>24]^d[i>>16&255]^u[r>>8&255]^l[255&t]^e[s+1],v=f[i>>>24]^d[r>>16&255]^u[t>>8&255]^l[255&a]^e[s+2],r=f[r>>>24]^d[t>>16&255]^u[a>>8&255]^l[255&i]^e[s+3],s+=4,t=h,a=g,i=v;for(n=0;4>n;n++)E[(3&-n)+m]=c[t>>>24]<<24^c[a>>16&255]<<16^c[i>>8&255]<<8^c[255&r]^e[s++],h=t,t=a,a=i,i=r,r=h}}]),e}();e.default=a},{}],11:[function(t,l,e){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>8|e>>>24}},{key:"doDecrypt",value:function(a,g,i){var u,h,o,f,l,c,d,n,e,r=new Int32Array(a.buffer,a.byteOffset,a.byteLength>>2),p=new s.default(Array.prototype.slice.call(g)),v=new Uint8Array(a.byteLength),t=new Int32Array(v.buffer);for(u=~~i[0],h=~~i[1],o=~~i[2],f=~~i[3],e=0;ee&&(255!==t[e]||240!==(240&t[e+1]));e++);for(r.audiosamplerate||(i=o.default.getAudioConfig(this.observer,t,e,p),r.config=i.config,r.audiosamplerate=i.samplerate,r.channelCount=i.channelCount,r.codec=i.codec,r.duration=y,l.logger.log("parsed codec:"+r.codec+",rate:"+i.samplerate+",nb channel:"+i.channelCount)),c=0,g=9216e4/r.audiosamplerate;u>e+5&&(s=1&t[e+1]?7:9,n=(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5,n-=s,n>0&&u>=e+s+n);)for(f=h+c*g,v={unit:t.subarray(e+s,e+s+n),pts:f,dts:f},r.samples.push(v),r.len+=n,e+=n+s,c++;u-1>e&&(255!==t[e]||240!==(240&t[e+1]));e++);this.remuxer.remux(this._aacTrack,{samples:[]},{samples:[{pts:h,dts:h,unit:d.payload}]},{samples:[]},m)}},{key:"destroy",value:function(){}}],[{key:"probe",value:function(t){var e,r,i=new a.default(t);if(i.hasTimeStamp)for(e=i.length,r=t.length;r-1>e;e++)if(255===t[e]&&240===(240&t[e+1]))return!0;return!1}}]),e}();t.default=s},{"../demux/id3":19,"../utils/logger":38,"./adts":14}],14:[function(e,o,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t>>6)+1,e=(60&u[l+2])>>>2,e>d.length-1?void h.trigger(Event.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+e}):(o=(1&u[l+2])<<2,o|=(192&u[l+3])>>>6,n.logger.log("manifest codec:"+i+",ADTS data:type:"+a+",sampleingIndex:"+e+"["+d[e]+"Hz],channelConfig:"+o),-1!==f.indexOf("firefox")?e>=6?(a=5,t=new Array(4),s=e-3):(a=2,t=new Array(2),s=e):-1!==f.indexOf("android")?(a=2,t=new Array(2),s=e):(a=5,t=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&e>=6?s=e-3:((i&&-1!==i.indexOf("mp4a.40.2")&&e>=6&&1===o||!i&&1===o)&&(a=2,t=new Array(2)),s=e)),t[0]=a<<3,t[0]|=(14&e)>>1,t[1]|=(1&e)<<7,t[1]|=o<<3,5===a&&(t[1]|=(14&s)>>1,t[2]=(1&s)<<7,t[2]|=8,t[3]=0),{config:t,samplerate:d[e],channelCount:o,codec:"mp4a.40."+a})}}]),e}();t.default=s},{"../errors":21,"../utils/logger":38}],15:[function(e,y,a){"use strict";function t(e){return e&&e.__esModule?e:{default:e}}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;t1?r-1:0),e=1;r>e;e++)i[e-1]=arguments[e];t.emit.apply(t,[a,a].concat(i))},t.off=function(i){for(var r=arguments.length,a=Array(r>1?r-1:0),e=1;r>e;e++)a[e-1]=arguments[e];t.removeListener.apply(t,[i].concat(a))},r.addEventListener("message",function(a){var e=a.data;switch(e.cmd){case"init":r.demuxer=new u.default(t,e.typeSupported);break;case"demux":r.demuxer.push(new Uint8Array(e.data),e.audioCodec,e.videoCodec,e.timeOffset,e.cc,e.level,e.sn,e.duration)}}),t.on(e.default.FRAG_PARSING_INIT_SEGMENT,function(t,e){r.postMessage({event:t,tracks:e.tracks,unique:e.unique})}),t.on(e.default.FRAG_PARSING_DATA,function(a,e){var t={event:a,type:e.type,startPTS:e.startPTS,endPTS:e.endPTS,startDTS:e.startDTS,endDTS:e.endDTS,data1:e.data1.buffer,data2:e.data2.buffer,nb:e.nb,dropped:e.dropped};r.postMessage(t,[t.data1,t.data2])}),t.on(e.default.FRAG_PARSED,function(e){r.postMessage({event:e})}),t.on(e.default.ERROR,function(e,t){r.postMessage({event:e,data:t})}),t.on(e.default.FRAG_PARSING_METADATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)}),t.on(e.default.FRAG_PARSING_USERDATA,function(e,t){var a={event:e,samples:t.samples};r.postMessage(a)})};a.default=o},{"../demux/demuxer-inline":15,"../events":23,events:1}],17:[function(t,p,a){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(a,"__esModule",{value:!0});var u=function(){function e(a,r){for(var t=0;t0&&null!=e&&null!=e.key&&"AES-128"===e.method){null==this.decrypter&&(this.decrypter=new v.default(this.hls));var u=this;this.decrypter.decrypt(t,e.key,e.iv,function(e){u.pushDecrypted(e,r,a,i,n,s,o,l)})}else this.pushDecrypted(t,r,a,i,n,s,o,l)}},{key:"onWorkerMessage",value:function(a){var t=a.data;switch(t.event){case e.default.FRAG_PARSING_INIT_SEGMENT:var r={};r.tracks=t.tracks,r.unique=t.unique,this.hls.trigger(e.default.FRAG_PARSING_INIT_SEGMENT,r);break;case e.default.FRAG_PARSING_DATA:this.hls.trigger(e.default.FRAG_PARSING_DATA,{data1:new Uint8Array(t.data1),data2:new Uint8Array(t.data2),startPTS:t.startPTS,endPTS:t.endPTS,startDTS:t.startDTS,endDTS:t.endDTS,type:t.type,nb:t.nb,dropped:t.dropped});break;case e.default.FRAG_PARSING_METADATA:this.hls.trigger(e.default.FRAG_PARSING_METADATA,{ +samples:t.samples});break;case e.default.FRAG_PARSING_USERDATA:this.hls.trigger(e.default.FRAG_PARSING_USERDATA,{samples:t.samples});break;default:this.hls.trigger(t.event,t.data)}}}]),r}();a.default=o},{"../crypt/decrypter":12,"../demux/demuxer-inline":15,"../demux/demuxer-worker":16,"../errors":21,"../events":23,"../utils/logger":38,webworkify:2}],18:[function(t,s,e){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var a=function(){function e(a,r){for(var t=0;te?(this.word<<=e,this.bitsAvailable-=e):(e-=this.bitsAvailable,t=e>>3,e-=t>>3,this.bytesAvailable-=t,this.loadWord(),this.word<<=e,this.bitsAvailable-=e)}},{key:"readBits",value:function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;return t>32&&i.logger.error("Cannot read more than 32 bits at a time"),this.bitsAvailable-=e,this.bitsAvailable>0?this.word<<=e:this.bytesAvailable>0&&this.loadWord(),e=t-e,e>0?r<>>e))return this.word<<=e,this.bitsAvailable-=e,e;return this.loadWord(),e+this.skipLZ()}},{key:"skipUEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"skipEG",value:function(){this.skipBits(1+this.skipLZ())}},{key:"readUEG",value:function(){var e=this.skipLZ();return this.readBits(e+1)-1}},{key:"readEG",value:function(){var e=this.readUEG();return 1&e?1+e>>>1:-1*(e>>>1)}},{key:"readBoolean",value:function(){return 1===this.readBits(1)}},{key:"readUByte",value:function(){return this.readBits(8)}},{key:"readUShort",value:function(){return this.readBits(16)}},{key:"readUInt",value:function(){return this.readBits(32)}},{key:"skipScalingList",value:function(i){var t,a,r=8,e=8;for(t=0;i>t;t++)0!==e&&(a=this.readEG(),e=(r+a+256)%256),r=0===e?r:e}},{key:"readSPS",value:function(){var t,g,p,l,i,n,a,o,r,s=0,d=0,f=0,h=0,c=1;if(this.readUByte(),t=this.readUByte(),g=this.readBits(5),this.skipBits(3),p=this.readUByte(),this.skipUEG(),100===t||110===t||122===t||244===t||44===t||83===t||86===t||118===t||128===t){var v=this.readUEG();if(3===v&&this.skipBits(1),this.skipUEG(),this.skipUEG(),this.skipBits(1),this.readBoolean())for(o=3!==v?8:12,r=0;o>r;r++)this.readBoolean()&&(6>r?this.skipScalingList(16):this.skipScalingList(64))}this.skipUEG();var u=this.readUEG();if(0===u)this.readUEG();else if(1===u)for(this.skipBits(1),this.skipEG(),this.skipEG(),l=this.readUEG(),r=0;l>r;r++)this.skipEG();if(this.skipUEG(),this.skipBits(1),i=this.readUEG(),n=this.readUEG(),a=this.readBits(1),0===a&&this.skipBits(1),this.skipBits(1),this.readBoolean()&&(s=this.readUEG(),d=this.readUEG(),f=this.readUEG(),h=this.readUEG()),this.readBoolean()&&this.readBoolean()){var e=void 0,y=this.readUByte();switch(y){case 1:e=[1,1];break;case 2:e=[12,11];break;case 3:e=[10,11];break;case 4:e=[16,11];break;case 5:e=[40,33];break;case 6:e=[24,11];break;case 7:e=[20,11];break;case 8:e=[32,11];break;case 9:e=[80,33];break;case 10:e=[18,11];break;case 11:e=[15,11];break;case 12:e=[64,33];break;case 13:e=[160,99];break;case 14:e=[4,3];break;case 15:e=[3,2];break;case 16:e=[2,1];break;case 255:e=[this.readUByte()<<8|this.readUByte(),this.readUByte()<<8|this.readUByte()]}e&&(c=e[0]/e[1])}return{width:Math.ceil((16*(i+1)-2*s-2*d)*c),height:(2-a)*(n+1)*16-(a?2:4)*(f+h)}}},{key:"readSliceType",value:function(){return this.readUByte(),this.readUEG(),this.readUEG()}}]),e}();e.default=n},{"../utils/logger":38}],19:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;tr);return t}},{key:"_parseID3Frames",value:function(r,t,n){for(var i,s,o,l,a;n>=t+8;)switch(i=this.readUTF(r,t,4),t+=4,s=r[t++]<<24+r[t++]<<16+r[t++]<<8+r[t++],l=r[t++]<<8+r[t++],o=t,i){case"PRIV":if("com.apple.streaming.transportStreamTimestamp"===this.readUTF(r,t,44)){t+=44,t+=4;var u=1&r[t++];this._hasTimeStamp=!0,a=((r[t++]<<23)+(r[t++]<<15)+(r[t++]<<7)+r[t++])/45,u&&(a+=47721858.84),a=Math.round(a),e.logger.trace("ID3 timestamp found: "+a),this._timeStamp=a}}}},{key:"hasTimeStamp",get:function(){return this._hasTimeStamp}},{key:"timeStamp",get:function(){return this._timeStamp}},{key:"length",get:function(){return this._length}},{key:"payload",get:function(){return this._payload}}]),t}();t.default=n},{"../utils/logger":38}],20:[function(t,v,i){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var f=function(){function e(a,r){for(var t=0;tt;t+=188)if(71===a[t]){if(d=!!(64&a[t+1]),u=((31&a[t+1])<<8)+a[t+2],y=(48&a[t+3])>>4,y>1){if(i=t+5+a[t+4],i===t+188)continue}else i=t+4;if(g)if(u===h){if(d){if(s&&(this._parseAVCPES(this._parsePES(s)),b&&this._avcTrack.codec&&(-1===f||this._aacTrack.codec)))return void this.remux(a);s={data:[],size:0}}s&&(s.data.push(a.subarray(i,t+188)),s.size+=t+188-i)}else if(u===f){if(d){if(o&&(this._parseAACPES(this._parsePES(o)),b&&this._aacTrack.codec&&(-1===h||this._avcTrack.codec)))return void this.remux(a);o={data:[],size:0}}o&&(o.data.push(a.subarray(i,t+188)),o.size+=t+188-i)}else u===_&&(d&&(l&&this._parseID3PES(this._parsePES(l)),l={data:[],size:0}),l&&(l.data.push(a.subarray(i,t+188)),l.size+=t+188-i));else d&&(i+=a[i]+1),0===u?this._parsePAT(a,i):u===this._pmtId?(this._parsePMT(a,i),g=this.pmtParsed=!0,h=this._avcTrack.id,f=this._aacTrack.id,_=this._id3Track.id,v&&(e.logger.log("reparse from beginning"),v=!1,t=-188)):(e.logger.log("unknown PID found before PAT/PMT"),v=!0)}else this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"TS packet did not start with 0x47"});s&&this._parseAVCPES(this._parsePES(s)),o&&this._parseAACPES(this._parsePES(o)),l&&this._parseID3PES(this._parsePES(l)),this.remux(null)}},{key:"remux",value:function(e){this.remuxer.remux(this._aacTrack,this._avcTrack,this._id3Track,this._txtTrack,this.timeOffset,this.contiguous,e)}},{key:"destroy",value:function(){this.switchLevel(),this._initPTS=this._initDTS=void 0,this._duration=0}},{key:"_parsePAT",value:function(e,t){this._pmtId=(31&e[t+10])<<8|e[t+11]}},{key:"_parsePMT",value:function(r,t){var i,n,s,a;for(i=(15&r[t+1])<<8|r[t+2],n=t+3+i-4,s=(15&r[t+10])<<8|r[t+11],t+=12+s;n>t;){switch(a=(31&r[t+1])<<8|r[t+2],r[t]){case 15:this._aacTrack.id=a;break;case 21:this._id3Track.id=a;break;case 27:this._avcTrack.id=a;break;default:e.logger.log("unkown stream type:"+r[t])}t+=((15&r[t+3])<<8|r[t+4])+5}}},{key:"_parsePES",value:function(o){var e,n,h,d,u,l,a,r,t,f=0,s=o.data;if(e=s[0],h=(e[0]<<16)+(e[1]<<8)+e[2],1===h){for(d=(e[4]<<8)+e[5],n=e[7],192&n&&(a=536870912*(14&e[9])+4194304*(255&e[10])+16384*(254&e[11])+128*(255&e[12])+(254&e[13])/2,a>4294967295&&(a-=8589934592),64&n?(r=536870912*(14&e[14])+4194304*(255&e[15])+16384*(254&e[16])+128*(255&e[17])+(254&e[18])/2,r>4294967295&&(r-=8589934592)):r=a),u=e[8],t=u+9,o.size-=t,l=new Uint8Array(o.size);s.length;){e=s.shift();var i=e.byteLength;if(t){if(t>i){t-=i;continue}e=e.subarray(t),i-=t,t=0}l.set(e,f),f+=i}return{data:l,pts:a,dts:r,len:d}}return null}},{key:"_parseAVCPES",value:function(a){var t,m,n,o,y=this,r=this._avcTrack,u=r.samples,p=this._parseAVCNALu(a.data),d=[],l=!1,c=!1,f=0;if(0===p.length&&u.length>0){var v=u[u.length-1],h=v.units.units[v.units.units.length-1],g=new Uint8Array(h.data.byteLength+a.data.byteLength);g.set(h.data,0),g.set(a.data,h.data.byteLength),h.data=g,v.units.length+=a.data.byteLength,r.len+=a.data.byteLength}a.data=null;var i="",E=function(){d.length&&(c===!0||r.sps&&(u.length||this.contiguous)?(m={units:{units:d,length:f},pts:a.pts,dts:a.dts,key:c},u.push(m),r.len+=f,r.nbNalu+=d.length):r.dropped++,d=[],f=0)}.bind(this);p.forEach(function(e){switch(e.type){case 1:n=!0,l&&(i+="NDR ");break;case 5:n=!0,l&&(i+="IDR "),c=!0;break;case 6:n=!0,l&&(i+="SEI "),t=new s.default(e.data),t.readUByte();var b=t.readUByte();if(4===b){var g=0;do g=t.readUByte();while(255===g);var A=t.readUByte();if(181===A){var R=t.readUShort();if(49===R){var L=t.readUInt();if(1195456820===L){var k=t.readUByte();if(3===k){var v=t.readUByte(),_=t.readUByte(),S=31&v,h=[v,_];for(o=0;S>o;o++)h.push(t.readUByte()),h.push(t.readUByte()),h.push(t.readUByte());y._txtTrack.samples.push({type:3,pts:a.pts,bytes:h})}}}}}break;case 7:if(n=!0,l&&(i+="SPS "),!r.sps){t=new s.default(e.data);var p=t.readSPS();r.width=p.width,r.height=p.height,r.sps=[e.data],r.duration=y._duration;var T=e.data.subarray(1,4),m="avc1.";for(o=0;3>o;o++){var u=T[o].toString(16);u.length<2&&(u="0"+u),m+=u}r.codec=m}break;case 8:n=!0,l&&(i+="PPS "),r.pps||(r.pps=[e.data]);break;case 9:n=!1,l&&(i+="AUD "),E();break;default:n=!1,i+="unknown NAL "+e.type+" "}n&&(d.push(e),f+=e.data.byteLength)}),(l||i.length)&&e.logger.log(i),E()}},{key:"_parseAVCNALu",value:function(r){for(var s,a,l,_,n,d,t=0,g=r.byteLength,e=this.avcNaluState,v=[];g>t;)switch(s=r[t++],e){case 0:0===s&&(e=1);break;case 1:e=0===s?2:0;break;case 2:case 3:if(0===s)e=3;else if(1===s&&g>t){if(_=31&r[t],n)l={data:r.subarray(n,t-e-1),type:d},v.push(l);else{var i=this.avcNaluState;if(i&&4-i>=t){var m=this._avcTrack,c=m.samples;if(c.length){var p=c[c.length-1],R=p.units.units,u=R[R.length-1];u.state&&(u.data=u.data.subarray(0,u.data.byteLength-i),p.units.length-=i,m.len-=i)}}if(a=t-e-1,a>0){var y=this._avcTrack,h=y.samples;if(h.length){var E=h[h.length-1],b=E.units.units,o=b[b.length-1],f=new Uint8Array(o.data.byteLength+a);f.set(o.data,0),f.set(r.subarray(0,a),o.data.byteLength),o.data=f,E.units.length+=a,y.len+=a}}}n=t,d=_,e=0}else e=0}return n&&(l={data:r.subarray(n,g),type:d,state:e},v.push(l),this.avcNaluState=e),v}},{key:"_parseAACPES",value:function(R){var l,o,p,E,t,d,f,s,_,i=this._aacTrack,a=R.data,v=R.pts,T=0,L=this._duration,A=this.audioCodec,u=this.aacOverFlow,b=this.aacLastPTS;if(u){var m=new Uint8Array(u.byteLength+a.byteLength);m.set(u,0),m.set(a,u.byteLength),a=m}for(t=T,s=a.length;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);if(t){var y,h;if(s-1>t?(y="AAC PES did not start with ADTS header,offset:"+t,h=!1):(y="no ADTS header found in AAC PES",h=!0),this.observer.trigger(n.default.ERROR,{type:r.ErrorTypes.MEDIA_ERROR,details:r.ErrorDetails.FRAG_PARSING_ERROR,fatal:h,reason:y}),h)return}if(i.audiosamplerate||(l=c.default.getAudioConfig(this.observer,a,t,A),i.config=l.config,i.audiosamplerate=l.samplerate,i.channelCount=l.channelCount,i.codec=l.codec,i.duration=L,e.logger.log("parsed codec:"+i.codec+",rate:"+l.samplerate+",nb channel:"+l.channelCount)),E=0,p=9216e4/i.audiosamplerate,u&&b){var g=b+p;Math.abs(g-v)>1&&(e.logger.log("AAC: align PTS for overlapping frames by "+Math.round((g-v)/90)),v=g)}for(;s>t+5&&(d=1&a[t+1]?7:9,o=(3&a[t+3])<<11|a[t+4]<<3|(224&a[t+5])>>>5,o-=d,o>0&&s>=t+d+o);)for(f=v+E*p,_={unit:a.subarray(t+d,t+d+o),pts:f,dts:f},i.samples.push(_),i.len+=o,t+=o+d,E++;s-1>t&&(255!==a[t]||240!==(240&a[t+1]));t++);u=s>t?a.subarray(t,s):null,this.aacOverFlow=u,this.aacLastPTS=f}},{key:"_parseID3PES",value:function(e){this._id3Track.samples.push(e)}}],[{key:"probe",value:function(e){return e.length>=564&&71===e[0]&&71===e[188]&&71===e[376]}}]),t}();i.default=o},{"../errors":21,"../events":23,"../utils/logger":38,"./adts":14,"./exp-golomb":18}],21:[function(t,r,e){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.ErrorTypes={NETWORK_ERROR:"networkError",MEDIA_ERROR:"mediaError",OTHER_ERROR:"otherError"},e.ErrorDetails={MANIFEST_LOAD_ERROR:"manifestLoadError",MANIFEST_LOAD_TIMEOUT:"manifestLoadTimeOut",MANIFEST_PARSING_ERROR:"manifestParsingError",MANIFEST_INCOMPATIBLE_CODECS_ERROR:"manifestIncompatibleCodecsError",LEVEL_LOAD_ERROR:"levelLoadError",LEVEL_LOAD_TIMEOUT:"levelLoadTimeOut",LEVEL_SWITCH_ERROR:"levelSwitchError",FRAG_LOAD_ERROR:"fragLoadError",FRAG_LOOP_LOADING_ERROR:"fragLoopLoadingError",FRAG_LOAD_TIMEOUT:"fragLoadTimeOut",FRAG_DECRYPT_ERROR:"fragDecryptError",FRAG_PARSING_ERROR:"fragParsingError",KEY_LOAD_ERROR:"keyLoadError",KEY_LOAD_TIMEOUT:"keyLoadTimeOut",BUFFER_APPEND_ERROR:"bufferAppendError",BUFFER_APPENDING_ERROR:"bufferAppendingError",BUFFER_STALLED_ERROR:"bufferStalledError",BUFFER_FULL_ERROR:"bufferFullError",BUFFER_SEEK_OVER_HOLE:"bufferSeekOverHole",INTERNAL_EXCEPTION:"internalException"}},{}],22:[function(e,f,t){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e},d=function(){function e(a,r){for(var t=0;t1?r-1:0),t=1;r>t;t++)a[t-1]=arguments[t];this.handledEvents=a,this.useGenericHandler=!0,this.registerListeners()}return d(e,[{key:"destroy",value:function(){this.unregisterListeners()}},{key:"isEventHandler",value:function(){return"object"===n(this.handledEvents)&&this.handledEvents.length&&"function"==typeof this.onEvent}},{key:"registerListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){if("hlsEventGeneric"===e)throw new Error("Forbidden event name: "+e);this.hls.on(e,this.onEvent)}.bind(this))}},{key:"unregisterListeners",value:function(){this.isEventHandler()&&this.handledEvents.forEach(function(e){this.hls.off(e,this.onEvent)}.bind(this))}},{key:"onEvent",value:function(e,t){this.onEventGeneric(e,t)}},{key:"onEventGeneric",value:function(e,t){var a=function(t,r){var e="on"+t.replace("hls","");if("function"!=typeof this[e])throw new Error("Event "+t+" has no generic handler in this "+this.constructor.name+" class (tried "+e+")");return this[e].bind(this,r)};try{a.call(this,e,t).call()}catch(t){o.logger.error("internal error happened while processing "+e+":"+t.message),this.hls.trigger(s.default.ERROR,{type:r.ErrorTypes.OTHER_ERROR,details:r.ErrorDetails.INTERNAL_EXCEPTION,fatal:!1,event:e,err:t})}}}]),e}();t.default=l},{"./errors":21,"./events":23,"./utils/logger":38}],23:[function(t,e,r){"use strict";e.exports={MEDIA_ATTACHING:"hlsMediaAttaching",MEDIA_ATTACHED:"hlsMediaAttached",MEDIA_DETACHING:"hlsMediaDetaching",MEDIA_DETACHED:"hlsMediaDetached",BUFFER_RESET:"hlsBufferReset",BUFFER_CODECS:"hlsBufferCodecs",BUFFER_APPENDING:"hlsBufferAppending",BUFFER_APPENDED:"hlsBufferAppended",BUFFER_EOS:"hlsBufferEos",BUFFER_FLUSHING:"hlsBufferFlushing",BUFFER_FLUSHED:"hlsBufferFlushed",MANIFEST_LOADING:"hlsManifestLoading",MANIFEST_LOADED:"hlsManifestLoaded",MANIFEST_PARSED:"hlsManifestParsed",LEVEL_LOADING:"hlsLevelLoading",LEVEL_LOADED:"hlsLevelLoaded",LEVEL_UPDATED:"hlsLevelUpdated",LEVEL_PTS_UPDATED:"hlsLevelPtsUpdated",LEVEL_SWITCH:"hlsLevelSwitch",FRAG_LOADING:"hlsFragLoading",FRAG_LOAD_PROGRESS:"hlsFragLoadProgress",FRAG_LOAD_EMERGENCY_ABORTED:"hlsFragLoadEmergencyAborted",FRAG_LOADED:"hlsFragLoaded",FRAG_PARSING_INIT_SEGMENT:"hlsFragParsingInitSegment",FRAG_PARSING_USERDATA:"hlsFragParsingUserdata",FRAG_PARSING_METADATA:"hlsFragParsingMetadata",FRAG_PARSING_DATA:"hlsFragParsingData",FRAG_PARSED:"hlsFragParsed",FRAG_BUFFERED:"hlsFragBuffered",FRAG_CHANGED:"hlsFragChanged",FPS_DROP:"hlsFpsDrop",ERROR:"hlsError",DESTROYING:"hlsDestroying",KEY_LOADING:"hlsKeyLoading",KEY_LOADED:"hlsKeyLoaded"}},{}],24:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;td&&(t[u-1].end=r[e].end):t.push(r[e])}else t.push(r[e])}for(e=0,o=0,l=i=a;e=n&&f>a)l=n,i=f,o=i-a;else if(n>a+s){h=n;break}}return{len:o,start:l,end:i,nextStart:h}}}]),e}();e.default=a},{}],25:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;th)return void(a.PTSKnown=!1);for(var r=c;h>=r;r++){var s=f[u+r],n=l[r];n&&s&&(d=s.cc-n.cc,isNaN(s.startPTS)||(n.start=n.startPTS=s.startPTS,n.endPTS=s.endPTS,n.duration=s.duration,i=n))}if(d)for(e.logger.log("discontinuity sliding from playlist, take drift into account"),r=0;r=0&&ui.endSN)return 0;if(o=l-i.startSN,n=i.fragments,e=n[o],!isNaN(e.startPTS)){var f=Math.abs(e.startPTS-a);isNaN(e.deltaPTS)?e.deltaPTS=f:e.deltaPTS=Math.max(f,e.deltaPTS),a=Math.min(a,e.startPTS),s=Math.max(s,e.endPTS),d=Math.min(d,e.startDTS),u=Math.max(u,e.endDTS)}var h=a-e.start;for(e.start=e.startPTS=a,e.endPTS=s,e.startDTS=d,e.endDTS=u,e.duration=s-a,r=o;r>0;r--)t.updatePTS(n,r,r-1);for(r=o;ra?r.start=t.start+t.duration:r.start=t.start-r.duration:i>a?(t.duration=n-t.start,t.duration<0&&e.logger.error("negative duration computed for frag "+t.sn+",level "+t.level+", there should be some duration drift between playlist and fragment!")):(r.duration=t.start-n,r.duration<0&&e.logger.error("negative duration computed for frag "+r.sn+",level "+r.level+", there should be some duration drift between playlist and fragment!"))}}]),t}();t.default=n},{"../utils/logger":38}],26:[function(t,I,i){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;t1?t-1:0),e=1;t>e;e++)i[e-1]=arguments[e];a.emit.apply(a,[r,r].concat(i))},a.off=function(i){for(var t=arguments.length,r=Array(t>1?t-1:0),e=1;t>e;e++)r[e-1]=arguments[e];a.removeListener.apply(a,[i].concat(r))},this.on=a.on.bind(a),this.off=a.off.bind(a),this.trigger=a.trigger.bind(a),this.playlistLoader=new d.default(this),this.fragmentLoader=new h.default(this),this.levelController=new R.default(this),this.abrController=new r.abrController(this),this.bufferController=new r.bufferController(this),this.capLevelController=new r.capLevelController(this),this.streamController=new r.streamController(this),this.timelineController=new r.timelineController(this),this.keyLoader=new p.default(this)}return n(t,null,[{key:"isSupported",value:function(){return window.MediaSource&&"function"==typeof window.MediaSource.isTypeSupported&&window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"')}},{key:"Events",get:function(){return a.default}},{key:"ErrorTypes",get:function(){return s.ErrorTypes}},{key:"ErrorDetails",get:function(){return s.ErrorDetails}},{key:"DefaultConfig",get:function(){return t.defaultConfig||(t.defaultConfig={autoStartLoad:!0,startPosition:-1,debug:!1,capLevelToPlayerSize:!1,maxBufferLength:30,maxBufferSize:6e7,maxBufferHole:.5,maxSeekHole:2,seekHoleNudgeDuration:.01,stalledInBufferedNudgeThreshold:10,maxFragLookUpTolerance:.2,liveSyncDurationCount:3,liveMaxLatencyDurationCount:1/0,liveSyncDuration:void 0,liveMaxLatencyDuration:void 0,maxMaxBufferLength:600,enableWorker:!0,enableSoftwareAES:!0,manifestLoadingTimeOut:1e4,manifestLoadingMaxRetry:1,manifestLoadingRetryDelay:1e3,levelLoadingTimeOut:1e4,levelLoadingMaxRetry:4,levelLoadingRetryDelay:1e3,fragLoadingTimeOut:2e4,fragLoadingMaxRetry:6,fragLoadingRetryDelay:1e3,fragLoadingLoopThreshold:3,startFragPrefetch:!1,appendErrorMaxRetry:3,loader:S.default,fLoader:void 0,pLoader:void 0,abrController:v.default,bufferController:P.default,capLevelController:m.default,streamController:b.default,timelineController:L.default,enableCEA708Captions:!0,enableMP2TPassThrough:!1,abrEwmaFastLive:5,abrEwmaSlowLive:9,abrEwmaFastVoD:4,abrEwmaSlowVoD:15,abrEwmaDefaultEstimate:5e5,abrBandWidthFactor:.8,abrBandWidthUpFactor:.7}),t.defaultConfig},set:function(e){t.defaultConfig=e}}]),n(t,[{key:"destroy",value:function(){e.logger.log("destroy"),this.trigger(a.default.DESTROYING),this.detachMedia(),this.playlistLoader.destroy(),this.fragmentLoader.destroy(),this.levelController.destroy(),this.abrController.destroy(),this.bufferController.destroy(),this.capLevelController.destroy(),this.streamController.destroy(),this.timelineController.destroy(),this.keyLoader.destroy(),this.url=null,this.observer.removeAllListeners()}},{key:"attachMedia",value:function(t){e.logger.log("attachMedia"),this.media=t,this.trigger(a.default.MEDIA_ATTACHING,{media:t})}},{key:"detachMedia",value:function(){e.logger.log("detachMedia"),this.trigger(a.default.MEDIA_DETACHING),this.media=null}},{key:"loadSource",value:function(t){e.logger.log("loadSource:"+t),this.url=t,this.trigger(a.default.MANIFEST_LOADING,{url:t})}},{key:"startLoad",value:function(){var t=arguments.length<=0||void 0===arguments[0]?-1:arguments[0];e.logger.log("startLoad"),this.levelController.startLoad(),this.streamController.startLoad(t)}},{key:"stopLoad",value:function(){e.logger.log("stopLoad"),this.levelController.stopLoad(),this.streamController.stopLoad()}},{key:"swapAudioCodec",value:function(){e.logger.log("swapAudioCodec"),this.streamController.swapAudioCodec()}},{key:"recoverMediaError",value:function(){e.logger.log("recoverMediaError");var t=this.media;this.detachMedia(),this.attachMedia(t)}},{key:"levels",get:function(){return this.levelController.levels}},{key:"currentLevel",get:function(){return this.streamController.currentLevel},set:function(t){e.logger.log("set currentLevel:"+t),this.loadLevel=t,this.streamController.immediateLevelSwitch()}},{key:"nextLevel",get:function(){return this.streamController.nextLevel},set:function(t){e.logger.log("set nextLevel:"+t),this.levelController.manualLevel=t,this.streamController.nextLevelSwitch()}},{key:"loadLevel",get:function(){return this.levelController.level},set:function(t){e.logger.log("set loadLevel:"+t),this.levelController.manualLevel=t}},{key:"nextLoadLevel",get:function(){return this.levelController.nextLoadLevel},set:function(e){this.levelController.nextLoadLevel=e}},{key:"firstLevel",get:function(){return this.levelController.firstLevel},set:function(t){e.logger.log("set firstLevel:"+t),this.levelController.firstLevel=t}},{key:"startLevel",get:function(){return this.levelController.startLevel},set:function(t){e.logger.log("set startLevel:"+t),this.levelController.startLevel=t}},{key:"autoLevelCapping",get:function(){return this.abrController.autoLevelCapping},set:function(t){e.logger.log("set autoLevelCapping:"+t),this.abrController.autoLevelCapping=t}},{key:"autoLevelEnabled",get:function(){return-1===this.levelController.manualLevel}},{key:"manualLevel",get:function(){return this.levelController.manualLevel}}]),t}();i.default=l},{"./controller/abr-controller":3,"./controller/buffer-controller":4,"./controller/cap-level-controller":5,"./controller/level-controller":7,"./controller/stream-controller":8,"./controller/timeline-controller":9,"./errors":21,"./events":23,"./loader/fragment-loader":28,"./loader/key-loader":29,"./loader/playlist-loader":30,"./utils/logger":38,"./utils/xhr-loader":40,events:1}],27:[function(e,t,r){"use strict";t.exports=e("./hls.js").default},{"./hls.js":26}],28:[function(r,c,a){"use strict";function i(e){return e&&e.__esModule?e:{default:e}}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(a,"__esModule",{value:!0});var h=function(){function e(a,r){for(var t=0;te;e++)t[e]=r>>8*(15-e)&255;return t}},{key:"fragmentDecryptdataFromLevelkey",value:function(e,r){var t=e;return e&&e.method&&e.uri&&!e.iv&&(t=this.cloneObj(e),t.iv=this.createInitializationVector(r)),t}},{key:"avc1toavcoti",value:function(r){var e,t=r.split(".");return t.length>2?(e=t.shift()+".",e+=parseInt(t.shift()).toString(16),e+=("000"+parseInt(t.shift()).toString(16)).substr(-4)):e=r,e}},{key:"cloneObj",value:function(e){return JSON.parse(JSON.stringify(e))}},{key:"parseLevelPlaylist",value:function(D,f,T){var E,e,R,l=0,o=0,t={version:null,type:null,url:f,fragments:[],live:!0,startSN:0},a={method:null,key:null,iv:null,uri:null},y=0,c=null,r=null,n=null,d=null,h=null,s=null;for(R=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE):(\d+))|(?:#EXT-X-(TARGETDURATION):(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT(INF):(\d+(?:\.\d+)?)(?:,(.*))?)|(?:(?!#)()(\S.+))|(?:#EXT-X-(BYTERANGE):(\d+(?:@\d+(?:\.\d+)?))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(PROGRAM-DATE-TIME):(.+))|(?:#EXT-X-(VERSION):(\d+))|(?:(#)(.*):(.*))|(?:(#)(.*)))(?:.*)\r?\n?/g;null!==(e=R.exec(D));)switch(e.shift(),e=e.filter(function(e){return void 0!==e}),e[0]){case"VERSION":t.version=parseInt(e[1]);break;case"PLAYLIST-TYPE":t.type=e[1].toUpperCase();break;case"MEDIA-SEQUENCE":l=t.startSN=parseInt(e[1]);break;case"TARGETDURATION":t.targetduration=parseFloat(e[1]);break;case"EXTM3U":break;case"ENDLIST":t.live=!1;break;case"DIS":y++;break;case"BYTERANGE":var v=e[1].split("@");s=1===v.length?h:parseInt(v[1]),h=parseInt(v[0])+s;break;case"INF":n=parseFloat(e[1]),d=e[2]?e[2]:null;break;case"":if(!isNaN(n)){var b=l++;E=this.fragmentDecryptdataFromLevelkey(a,b);var L=e[1]?this.resolve(e[1],f):null;r={url:L,duration:n,title:d,start:o,sn:b,level:T,cc:y,decryptdata:E,programDateTime:c},null!==s&&(r.byteRangeStartOffset=s,r.byteRangeEndOffset=h),t.fragments.push(r),o+=n,n=null,d=null,s=null,c=null}break;case"KEY":var A=e[1],p=new i.default(A),g=p.enumeratedString("METHOD"),m=p.URI,k=p.hexadecimalInteger("IV");g&&(a={method:null,key:null,iv:null,uri:null},m&&"AES-128"===g&&(a.method=g,a.uri=this.resolve(m,f),a.key=null,a.iv=k));break;case"START":var S=e[1],w=new i.default(S),_=w.decimalFloatingPoint("TIME-OFFSET");_&&(t.startTimeOffset=_);break;case"PROGRAM-DATE-TIME":c=new Date(Date.parse(e[1]));break;case"#":e.shift();break;default:u.logger.warn("line parsed but not handled: "+e)}return r&&!r.url&&(t.fragments.pop(),o-=r.duration),t.totalduration=o,t.endSN=l-1,t}},{key:"loadsuccess",value:function(d,a){var s,o=d.currentTarget,n=o.responseText,r=o.responseURL,l=this.id,f=this.id2,i=this.hls;if(this.loading=!1,void 0===r&&(r=this.url),a.tload=performance.now(),a.mtime=new Date(o.getResponseHeader("Last-Modified")),0===n.indexOf("#EXTM3U"))if(n.indexOf("#EXTINF:")>0){var u=this.parseLevelPlaylist(n,r,l||0);null===l?i.trigger(t.default.MANIFEST_LOADED,{levels:[{url:r,details:u}],url:r,stats:a}):(a.tparsed=performance.now(),i.trigger(t.default.LEVEL_LOADED,{details:u,level:l,id:f,stats:a}))}else s=this.parseMasterPlaylist(n,r),s.length?i.trigger(t.default.MANIFEST_LOADED,{levels:s,url:r,stats:a}):i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no level found in manifest"});else i.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:e.ErrorDetails.MANIFEST_PARSING_ERROR,fatal:!0,url:r,reason:"no EXTM3U delimiter"})}},{key:"loaderror",value:function(i){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_ERROR,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_ERROR,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,response:i.currentTarget,level:this.id,id:this.id2})}},{key:"loadtimeout",value:function(){var r,a;null===this.id?(r=e.ErrorDetails.MANIFEST_LOAD_TIMEOUT,a=!0):(r=e.ErrorDetails.LEVEL_LOAD_TIMEOUT,a=!1),this.loader&&this.loader.abort(),this.loading=!1,this.hls.trigger(t.default.ERROR,{type:e.ErrorTypes.NETWORK_ERROR,details:r,fatal:a,url:this.url,loader:this.loader,level:this.id,id:this.id2})}}]),r}(n.default);s.default=y},{"../errors":21,"../event-handler":22,"../events":23,"../utils/attr-list":34,"../utils/logger":38,"../utils/url":39}],31:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t>24&255,t[1]=e>>16&255,t[2]=e>>8&255,t[3]=255&e,t.set(i,4),r=0,e=8;n>r;r++)t.set(a[r],e),e+=a[r].byteLength;return t}},{key:"hdlr",value:function(t){return e.box(e.types.hdlr,e.HDLR_TYPES[t])}},{key:"mdat",value:function(t){return e.box(e.types.mdat,t)}},{key:"mdhd",value:function(t,r){return r*=t,e.box(e.types.mdhd,new Uint8Array([0,0,0,0,0,0,0,2,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,85,196,0,0]))}},{key:"mdia",value:function(t){return e.box(e.types.mdia,e.mdhd(t.timescale,t.duration),e.hdlr(t.type),e.minf(t))}},{key:"mfhd",value:function(t){return e.box(e.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))}},{key:"minf",value:function(t){return"audio"===t.type?e.box(e.types.minf,e.box(e.types.smhd,e.SMHD),e.DINF,e.stbl(t)):e.box(e.types.minf,e.box(e.types.vmhd,e.VMHD),e.DINF,e.stbl(t))}},{key:"moof",value:function(t,r,a){return e.box(e.types.moof,e.mfhd(t),e.traf(a,r))}},{key:"moov",value:function(t){for(var r=t.length,a=[];r--;)a[r]=e.trak(t[r]);return e.box.apply(null,[e.types.moov,e.mvhd(t[0].timescale,t[0].duration)].concat(a).concat(e.mvex(t)))}},{key:"mvex",value:function(r){for(var t=r.length,a=[];t--;)a[t]=e.trex(r[t]);return e.box.apply(null,[e.types.mvex].concat(a))}},{key:"mvhd",value:function(t,r){r*=t;var a=new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,2,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24&255,r>>16&255,r>>8&255,255&r,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return e.box(e.types.mvhd,a)}},{key:"sdtp",value:function(n){var r,t,a=n.samples||[],i=new Uint8Array(4+a.length);for(t=0;t>>8&255),a.push(255&n),a=a.concat(Array.prototype.slice.call(i));for(r=0;r>>8&255),s.push(255&n),s=s.concat(Array.prototype.slice.call(i));var u=e.box(e.types.avcC,new Uint8Array([1,a[3],a[4],a[5],255,224|t.sps.length].concat(a).concat([t.pps.length]).concat(s))),o=t.width,l=t.height;return e.box(e.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,o>>8&255,255&o,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),u,e.box(e.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])))}},{key:"esds",value:function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))}},{key:"mp4a",value:function(t){var r=t.audiosamplerate;return e.box(e.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,r>>8&255,255&r,0,0]),e.box(e.types.esds,e.esds(t)))}},{key:"stsd",value:function(t){return"audio"===t.type?e.box(e.types.stsd,e.STSD,e.mp4a(t)):e.box(e.types.stsd,e.STSD,e.avc1(t))}},{key:"tkhd",value:function(t){var r=t.id,a=t.duration*t.timescale,i=t.width,n=t.height;return e.box(e.types.tkhd,new Uint8Array([0,0,0,7,0,0,0,0,0,0,0,0,r>>24&255,r>>16&255,r>>8&255,255&r,0,0,0,0,a>>24,a>>16&255,a>>8&255,255&a,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,n>>8&255,255&n,0,0]))}},{key:"traf",value:function(a,t){var i=e.sdtp(a),r=a.id;return e.box(e.types.traf,e.box(e.types.tfhd,new Uint8Array([0,0,0,0,r>>24,r>>16&255,r>>8&255,255&r])),e.box(e.types.tfdt,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t])),e.trun(a,i.length+16+16+8+16+8+8),i)}},{key:"trak",value:function(t){return t.duration=t.duration||4294967295,e.box(e.types.trak,e.tkhd(t),e.mdia(t))}},{key:"trex",value:function(r){var t=r.id;return e.box(e.types.trex,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))}},{key:"trun",value:function(h,o){var a,i,n,s,t,l,d=h.samples||[],r=d.length,f=12+16*r,u=new Uint8Array(f);for(o+=8+f,u.set([0,0,15,1,r>>>24&255,r>>>16&255,r>>>8&255,255&r,o>>>24&255,o>>>16&255,o>>>8&255,255&o],0),a=0;r>a;a++)i=d[a],n=i.duration,s=i.size,t=i.flags,l=i.cts,u.set([n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,t.isLeading<<2|t.dependsOn,t.isDependedOn<<6|t.hasRedundancy<<4|t.paddingValue<<1|t.isNonSync,61440&t.degradPrio,15&t.degradPrio,l>>>24&255,l>>>16&255,l>>>8&255,255&l],12+16*a);return e.box(e.types.trun,u)}},{key:"initSegment",value:function(a){e.types||e.init();var t,r=e.moov(a);return t=new Uint8Array(e.FTYP.byteLength+r.byteLength),t.set(e.FTYP),t.set(r,e.FTYP.byteLength),t}}]),e}();e.default=a},{}],32:[function(a,h,i){"use strict";function n(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(i,"__esModule",{value:!0});var l=function(){function e(a,r){for(var t=0;tMath.pow(2,32)&&!function(){var e=function r(t,e){return e?r(e,t%e):t};a.timescale=a.audiosamplerate/e(a.audiosamplerate,1024)}(),e.logger.log("audio mp4 timescale :"+a.timescale),l.audio={container:"audio/mp4",codec:a.codec,initSegment:r.default.initSegment([a]),metadata:{channelCount:a.channelCount}},u&&(n=o=v[0].pts-f*h)),i.sps&&i.pps&&d.length&&(i.timescale=this.MP4_TIMESCALE,l.video={container:"video/mp4",codec:i.codec,initSegment:r.default.initSegment([i]),metadata:{width:i.width,height:i.height}},u&&(n=Math.min(n,d[0].pts-f*h),o=Math.min(o,d[0].dts-f*h))),Object.keys(l).length?(c.trigger(t.default.FRAG_PARSING_INIT_SEGMENT,g),this.ISGenerated=!0,u&&(this._initPTS=n,this._initDTS=o)):c.trigger(t.default.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.FRAG_PARSING_ERROR,fatal:!1,reason:"no audio/video samples found"})}},{key:"remuxVideo",value:function(a,D,w){var L,s,v,T,y,d,k,S,R,g,m,f,u,i,l,b=8,c=this.PES_TIMESCALE,h=this.PES2MP4SCALEFACTOR,o=[],A=a.samples.reduce(function(t,e){return Math.max(Math.min(t,e.pts-e.dts),-18e3)},0);for(0>A&&e.logger.warn("PTS < DTS detected in video samples, shifting DTS by "+Math.round(A/90)+" ms to overcome this issue"),d=new Uint8Array(a.len+4*a.nbNalu+8),L=new DataView(d.buffer),L.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4);a.samples.length;){for(s=a.samples.shift(),T=0;s.units.units.length;)y=s.units.units.shift(),L.setUint32(b,y.data.byteLength),b+=4,d.set(y.data,b),b+=y.data.byteLength,T+=4+y.data.byteLength;if(m=s.pts-this._initDTS,f=s.dts-this._initDTS+A,f=Math.min(m,f),void 0!==g){u=this._PTSNormalize(m,g),i=this._PTSNormalize(f,g);var _=(i-g)/h;0>=_&&(e.logger.log("invalid sample duration at PTS/DTS: "+s.pts+"/"+s.dts+":"+_),_=1),v.duration=_}else{var p=void 0,n=void 0;p=w?this.nextAvcDts:D*c,u=this._PTSNormalize(m,p),i=this._PTSNormalize(f,p),n=Math.round((i-p)/90),w&&n&&(n>1?e.logger.log("AVC:"+n+" ms hole between fragments detected,filling it"):-1>n&&e.logger.log("AVC:"+-n+" ms overlapping between fragments detected"),i=p,u=Math.max(u-n,i),e.logger.log("Video/PTS/DTS adjusted: "+u+"/"+i+",delta:"+n)),S=Math.max(0,u),R=Math.max(0,i)}v={size:T,duration:0,cts:(u-i)/h,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0}},l=v.flags,s.key===!0?(l.dependsOn=2,l.isNonSync=0):(l.dependsOn=1,l.isNonSync=1),o.push(v),g=i}var E=0;o.length>=2&&(E=o[o.length-2].duration,v.duration=E),this.nextAvcDts=i+E*h;var O=a.dropped;a.len=0,a.nbNalu=0,a.dropped=0,o.length&&navigator.userAgent.toLowerCase().indexOf("chrome")>-1&&(l=o[0].flags,l.dependsOn=2,l.isNonSync=0),a.samples=o,k=r.default.moof(a.sequenceNumber++,R/h,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:k,data2:d,startPTS:S/c,endPTS:(u+h*E)/c,startDTS:R/c,endDTS:this.nextAvcDts/c,type:"video",nb:o.length,dropped:O})}},{key:"remuxAudio",value:function(a,D,S){var k,p,n,h,d,T,L,b,u,g,R,o,i,A=8,s=this.PES_TIMESCALE,w=a.timescale,f=s/w,E=1024*a.timescale/a.audiosamplerate,m=[],_=[];for(a.samples.sort(function(e,t){return e.pts-t.pts}),_=a.samples;_.length;){if(p=_.shift(),h=p.unit,g=p.pts-this._initDTS,R=p.dts-this._initDTS,void 0!==u)o=this._PTSNormalize(g,u),i=this._PTSNormalize(R,u),n.duration=(i-u)/f,Math.abs(n.duration-E)>E/10&&e.logger.log("invalid AAC sample duration at PTS "+Math.round(g/90)+",should be 1024,found :"+Math.round(n.duration*a.audiosamplerate/a.timescale)),n.duration=E,o=i=E*f+u;else{var c=void 0,l=void 0;if(c=S?this.nextAacPts:D*s,o=this._PTSNormalize(g,c),i=this._PTSNormalize(R,c),l=Math.round(1e3*(o-c)/s),S&&l){if(l>0)e.logger.log(l+" ms hole between AAC samples detected,filling it");else if(-12>l){e.logger.log(-l+" ms overlapping between AAC samples detected, drop frame"),a.len-=h.byteLength;continue}o=i=c}if(L=Math.max(0,o),b=Math.max(0,i),!(a.len>0))return;d=new Uint8Array(a.len+8),k=new DataView(d.buffer),k.setUint32(0,d.byteLength),d.set(r.default.types.mdat,4)}d.set(h,A),A+=h.byteLength,n={size:h.byteLength,cts:0,duration:0,flags:{isLeading:0,isDependedOn:0,hasRedundancy:0,degradPrio:0,dependsOn:1}},m.push(n),u=i}var y=0,v=m.length;v>=2&&(y=m[v-2].duration,n.duration=y),v&&(this.nextAacPts=o+f*y,a.len=0,a.samples=m,T=r.default.moof(a.sequenceNumber++,b/f,a),a.samples=[],this.observer.trigger(t.default.FRAG_PARSING_DATA,{data1:T,data2:d,startPTS:L/s,endPTS:this.nextAacPts/s,startDTS:b/s,endDTS:(i+f*y)/s,type:"audio",nb:v}))}},{key:"remuxID3",value:function(r,i){var e,n=r.samples.length;if(n){for(var a=0;n>a;a++)e=r.samples[a],e.pts=(e.pts-this._initPTS)/this.PES_TIMESCALE,e.dts=(e.dts-this._initDTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_METADATA,{samples:r.samples})}r.samples=[],i=i}},{key:"remuxText",value:function(e,i){e.samples.sort(function(e,t){return e.pts-t.pts});var r,n=e.samples.length;if(n){for(var a=0;n>a;a++)r=e.samples[a],r.pts=(r.pts-this._initPTS)/this.PES_TIMESCALE;this.observer.trigger(t.default.FRAG_PARSING_USERDATA,{samples:e.samples})}e.samples=[],i=i}},{key:"_PTSNormalize",value:function(e,t){var r;if(void 0===t)return e;for(r=e>t?-8589934592:8589934592;Math.abs(e-t)>4294967296;)e+=r;return e}},{key:"passthrough",get:function(){return!1}}]),a}();i.default=d},{"../errors":21,"../events":23,"../remux/mp4-generator":31,"../utils/logger":38}],33:[function(r,l,e){"use strict";function a(e){return e&&e.__esModule?e:{default:e}}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function e(a,r){for(var t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"hexadecimalInteger",value:function(r){if(this[r]){var e=(this[r]||"0x").slice(2);e=(1&e.length?"0":"")+e;for(var a=new Uint8Array(e.length/2),t=0;tNumber.MAX_SAFE_INTEGER?1/0:e}},{key:"decimalFloatingPoint",value:function(e){return parseFloat(this[e])}},{key:"enumeratedString",value:function(e){return this[e]}},{key:"decimalResolution",value:function(t){var e=/^(\d+)x(\d+)$/.exec(this[t]);if(null!==e)return{width:parseInt(e[1],10),height:parseInt(e[2],10)}}}],[{key:"parseAttrList",value:function(i){for(var t,n=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,r={};null!==(t=n.exec(i));){var e=t[2],a='"';0===e.indexOf(a)&&e.lastIndexOf(a)===e.length-1&&(e=e.slice(1,-1)),r[t[1]]=e}return r}}]),e}();e.default=a},{}],35:[function(r,e,a){"use strict";var t={search:function(i,s){for(var t=0,r=i.length-1,e=null,a=null;r>=t;){e=(t+r)/2|0,a=i[e];var n=s(a);if(n>0)t=e+1;else{if(!(0>n))return a;r=e-1}}return null}};e.exports=t},{}],36:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t0;)e.removeCue(e.cues[0])}},{key:"push",value:function(r,a){this.cue||this._createCue();for(var i,t,e,s,o,u=31&a[0],n=2,l=0;u>l;l++)if(i=a[n++],t=127&a[n++],e=127&a[n++],s=0!==(4&i),o=3&i,(0!==t||0!==e)&&s&&0===o){if(32&t||64&t)this.cue.text+=this._fromCharCode(t)+this._fromCharCode(e);else if((17===t||25===t)&&e>=48&&63>=e)switch(e){case 48:this.cue.text+="®";break;case 49:this.cue.text+="°";break;case 50:this.cue.text+="½";break;case 51:this.cue.text+="¿";break;case 52:this.cue.text+="™";break;case 53:this.cue.text+="¢";break;case 54:this.cue.text+="";break;case 55:this.cue.text+="£";break;case 56:this.cue.text+="♪";break;case 57:this.cue.text+=" ";break;case 58:this.cue.text+="è";break;case 59:this.cue.text+="â";break;case 60:this.cue.text+="ê";break;case 61:this.cue.text+="î";break;case 62:this.cue.text+="ô";break;case 63:this.cue.text+="û"}if((17===t||25===t)&&e>=32&&47>=e)switch(e){case 32:break;case 33:break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:break;case 42:break;case 43:break;case 44:break;case 45:break;case 46:break;case 47:}if((20===t||28===t)&&e>=32&&47>=e)switch(e){case 32:this._clearActiveCues(r);break;case 33:this.cue.text=this.cue.text.substr(0,this.cue.text.length-1);break;case 34:break;case 35:break;case 36:break;case 37:break;case 38:break;case 39:break;case 40:break;case 41:this._clearActiveCues(r);break;case 42:break;case 43:break;case 44:this._clearActiveCues(r);break;case 45:break;case 46:this._text="";break;case 47:this._flipMemory(r)}if((23===t||31===t)&&e>=33&&35>=e)switch(e){case 33:break;case 34:break;case 35:}}}},{key:"_fromCharCode",value:function(e){switch(e){case 42:return"á";case 2:return"á";case 2:return"é";case 4:return"í";case 5:return"ó";case 6:return"ú";case 3:return"ç";case 4:return"÷";case 5:return"Ñ";case 6:return"ñ";case 7:return"█";default:return String.fromCharCode(e)}}},{key:"_flipMemory",value:function(e){this._clearActiveCues(e),this._flushCaptions(e)}},{key:"_flushCaptions",value:function(s){this._has708||(this._textTrack=this.media.addTextTrack("captions","English","en"),this._has708=!0);var e=!0,a=!1,i=void 0;try{for(var n,t=this.memory[Symbol.iterator]();!(e=(n=t.next()).done);e=!0){var r=n.value;r.startTime=s,this._textTrack.addCue(r),this.display.push(r)}}catch(e){a=!0,i=e}finally{try{!e&&t.return&&t.return()}finally{if(a)throw i}}this.memory=[],this.cue=null}},{key:"_clearActiveCues",value:function(n){var e=!0,r=!1,a=void 0;try{for(var i,t=this.display[Symbol.iterator]();!(e=(i=t.next()).done);e=!0){var s=i.value;s.endTime=n}}catch(e){r=!0,a=e}finally{try{!e&&t.return&&t.return()}finally{if(r)throw a}}this.display=[]}},{key:"_clearBufferedCues",value:function(){}}]),e}();e.default=a},{}],37:[function(i,n,e){"use strict";function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function e(a,r){for(var t=0;t "+e}function n(t){var r=window.console[t];return r?function(){for(var n=arguments.length,e=Array(n),a=0;n>a;a++)e[a]=arguments[a];e[0]&&(e[0]=i(t,e[0])),r.apply(window.console,e)}:e}function s(r){for(var a=arguments.length,i=Array(a>1?a-1:0),e=1;a>e;e++)i[e-1]=arguments[e];i.forEach(function(e){t[e]=r[e]?r[e].bind(r):n(e)})}Object.defineProperty(r,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e; +},a={trace:e,debug:e,log:e,warn:e,info:e,error:e},t=a;r.enableLogs=function(e){if(e===!0||"object"===("undefined"==typeof e?"undefined":o(e))){s(e,"debug","log","info","warn","error");try{t.log()}catch(e){t=a}}else t=a},r.logger=t},{}],39:[function(r,t,a){"use strict";var e={buildAbsoluteURL:function(r,t){if(t=t.trim(),/^[a-z]+:/i.test(t))return t;var l=null,o=null,n=/^([^#]*)(.*)$/.exec(t);n&&(o=n[2],t=n[1]);var s=/^([^\?]*)(.*)$/.exec(t);s&&(l=s[2],t=s[1]);var f=/^([^#]*)(.*)$/.exec(r);f&&(r=f[1]);var u=/^([^\?]*)(.*)$/.exec(r);u&&(r=u[1]);var a=/^(([a-z]+:)?\/\/[a-z0-9\.\-_~]+(:[0-9]+)?)?(\/.*)$/i.exec(r);if(!a)throw new Error("Error trying to parse base URL.");var h=a[2]||"",d=a[1]||"",c=a[4],i=null;return i=/^\/\//.test(t)?h+"//"+e.buildAbsolutePath("",t.substring(2)):/^\//.test(t)?d+"/"+e.buildAbsolutePath("",t.substring(1)):e.buildAbsolutePath(d+c,t),l&&(i+=l),o&&(i+=o),i},buildAbsolutePath:function(n,s){for(var a,e,o=s,i="",t=n.replace(/[^\/]*$/,o.replace(/(\/|^)(?:\.?\/+)+/g,"$1")),r=0;e=t.indexOf("/../",r),e>-1;r=e+a)a=/^\/(?:\.\.\/)*/.exec(t.slice(e))[0].length,i=(i+t.substring(r,e)).replace(new RegExp("(?:\\/+[^\\/]*){0,"+(a-1)/3+"}$"),"/");return i+t.substr(r)}};t.exports=e},{}],40:[function(r,s,t){"use strict";function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(a,r){for(var t=0;t=200&&300>t?(window.clearTimeout(this.timeoutHandle),r.tload=Math.max(r.tfirst,performance.now()),this.onSuccess(a,r)):r.retry>=this.maxRetry||t>=400&&499>t?(window.clearTimeout(this.timeoutHandle),e.logger.error(t+" while loading "+this.url),this.onError(a)):(e.logger.warn(t+" while loading "+this.url+", retrying in "+this.retryDelay+"..."),this.destroy(),window.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,64e3),r.retry++))}},{key:"loadtimeout",value:function(t){e.logger.warn("timeout while loading "+this.url),this.onTimeout(t,this.stats)}},{key:"loadprogress",value:function(t){var e=this.stats;0===e.tfirst&&(e.tfirst=Math.max(performance.now(),e.trequest)),e.loaded=t.loaded,this.onProgress&&this.onProgress(t,e)}}]),t}();t.default=n},{"../utils/logger":38}]},{},[27])(27)}); diff --git a/dashboard-ui/bower_components/hls.js/package.json b/dashboard-ui/bower_components/hls.js/package.json index 2312cda82..fb1c04788 100644 --- a/dashboard-ui/bower_components/hls.js/package.json +++ b/dashboard-ui/bower_components/hls.js/package.json @@ -1,6 +1,6 @@ { "name": "hls.js", - "version": "0.5.42", + "version": "0.5.44", "license": "Apache-2.0", "description": "Media Source Extension - HLS library, by/for Dailymotion", "homepage": "https://github.com/dailymotion/hls.js", diff --git a/dashboard-ui/bower_components/polymer/.bower.json b/dashboard-ui/bower_components/polymer/.bower.json index 25eb84c03..a96f0f050 100644 --- a/dashboard-ui/bower_components/polymer/.bower.json +++ b/dashboard-ui/bower_components/polymer/.bower.json @@ -32,14 +32,14 @@ "iron-component-page": "polymerElements/iron-component-page#^1.1.6" }, "private": true, - "homepage": "https://github.com/polymer/polymer", + "homepage": "https://github.com/Polymer/polymer", "_release": "1.6.1", "_resolution": { "type": "version", "tag": "v1.6.1", "commit": "1f197d9d7874b1e5808b2a5c26f34446a7d912fc" }, - "_source": "git://github.com/polymer/polymer.git", + "_source": "git://github.com/Polymer/polymer.git", "_target": "^1.1.0", - "_originalSource": "polymer/polymer" + "_originalSource": "Polymer/polymer" } \ No newline at end of file diff --git a/dashboard-ui/css/mediaplayer-video.css b/dashboard-ui/css/mediaplayer-video.css index 6cc9fe16e..6277c0b82 100644 --- a/dashboard-ui/css/mediaplayer-video.css +++ b/dashboard-ui/css/mediaplayer-video.css @@ -359,6 +359,10 @@ video::-webkit-media-text-track-background { margin-top: -2.5em; } +::cue { + background-color: transparent; + text-shadow: 2px 2px 2px rgba(0, 0, 0, 1); +} .videoSubtitles { position: fixed; From 99599a884658b341a70f36020635ba4374e21d34 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 18 Aug 2016 13:03:22 -0400 Subject: [PATCH 4/5] add guide paging --- .../emby-webcomponents/guide/guide.js | 42 ++++++++++++++++++- .../guide/tvguide.template.html | 11 ++++- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index ee3d5aac4..dcbe4c47c 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -1,4 +1,4 @@ -define(['require', 'browser', 'globalize', 'connectionManager', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'dom', 'clearButtonStyle', 'css!./guide.css', 'material-icons', 'scrollStyles', 'emby-button'], function (require, browser, globalize, connectionManager, serverNotifications, loading, datetime, focusManager, imageLoader, events, layoutManager, itemShortcuts, registrationServices, dom) { +define(['require', 'browser', 'globalize', 'connectionManager', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'registrationservices', 'dom', 'clearButtonStyle', 'css!./guide.css', 'material-icons', 'scrollStyles', 'emby-button', 'paper-icon-button-light'], function (require, browser, globalize, connectionManager, serverNotifications, loading, datetime, focusManager, imageLoader, events, layoutManager, itemShortcuts, registrationServices, dom) { function Guide(options) { @@ -14,6 +14,8 @@ var totalRendererdMs = msPerDay; var currentDate; + var currentStartIndex = 0; + var currentChannelLimit = 0; var channelQuery = { @@ -119,7 +121,7 @@ return registrationServices.validateFeature('livetv').then(function () { - var limit = browser.slow ? 100 : 400; + var limit = browser.mobile ? 100 : 500; context.querySelector('.guideRequiresUnlock').classList.add('hide'); @@ -144,8 +146,11 @@ getChannelLimit(context).then(function (channelLimit) { + currentChannelLimit = channelLimit; + showLoading(); + channelQuery.StartIndex = currentStartIndex; channelQuery.Limit = channelLimit; channelQuery.AddCurrentProgram = false; channelQuery.EnableUserData = false; @@ -163,6 +168,25 @@ console.log(nextDay); channelsPromise.then(function (channelsResult) { + if (channelsResult.TotalRecordCount > channelLimit) { + context.querySelector('.guidePaging').classList.remove('hide'); + + if (channelQuery.StartIndex) { + context.querySelector('.btnPreviousPage').disabled = false; + } else { + context.querySelector('.btnPreviousPage').disabled = true; + } + + if ((channelQuery.StartIndex + channelLimit) < channelsResult.TotalRecordCount) { + context.querySelector('.btnNextPage').disabled = false; + } else { + context.querySelector('.btnNextPage').disabled = true; + } + + } else { + context.querySelector('.guidePaging').classList.add('hide'); + } + apiClient.getLiveTvPrograms({ UserId: apiClient.getCurrentUserId(), MaxStartDate: nextDay.toISOString(), @@ -821,6 +845,20 @@ }); context.querySelector('.btnUnlockGuide').addEventListener('click', function () { + currentStartIndex = 0; + channelsPromise = null; + reloadPage(context); + }); + + context.querySelector('.btnNextPage').addEventListener('click', function () { + currentStartIndex += currentChannelLimit; + channelsPromise = null; + reloadPage(context); + }); + + context.querySelector('.btnPreviousPage').addEventListener('click', function () { + currentStartIndex = Math.max(currentStartIndex - currentChannelLimit, 0); + channelsPromise = null; reloadPage(context); }); diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html b/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html index d44a1ec51..8d0f25965 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html @@ -12,10 +12,19 @@
-
+

+
+ +
+ +
\ No newline at end of file From b1a4101e2777f86145ecac9c429d253b06b2a112 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Thu, 18 Aug 2016 13:27:22 -0400 Subject: [PATCH 5/5] update guide --- dashboard-ui/bower_components/emby-webcomponents/guide/guide.js | 2 +- .../emby-webcomponents/guide/tvguide.template.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js index dcbe4c47c..faccf46b3 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/guide.js @@ -121,7 +121,7 @@ return registrationServices.validateFeature('livetv').then(function () { - var limit = browser.mobile ? 100 : 500; + var limit = browser.slow ? 100 : 500; context.querySelector('.guideRequiresUnlock').classList.add('hide'); diff --git a/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html b/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html index 8d0f25965..7770f43ac 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html +++ b/dashboard-ui/bower_components/emby-webcomponents/guide/tvguide.template.html @@ -20,7 +20,7 @@
-
+