diff --git a/components/JFVideo.brs b/components/JFVideo.brs
index a6fe67fc..7054bfd6 100644
--- a/components/JFVideo.brs
+++ b/components/JFVideo.brs
@@ -19,6 +19,7 @@ sub init()
m.nextEpisodeButton = m.top.findNode("nextEpisode")
m.nextEpisodeButton.text = tr("Next Episode")
m.nextEpisodeButton.setFocus(false)
+ m.nextupbuttonseconds = get_user_setting("playback.nextupbuttonseconds", "30")
m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton")
m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton")
@@ -64,7 +65,11 @@ end sub
'
'Update count down text
sub updateCount()
- m.nextEpisodeButton.text = tr("Next Episode") + " " + Int(m.top.runTime - m.top.position).toStr()
+ nextEpisodeCountdown = Int(m.top.runTime - m.top.position)
+ if nextEpisodeCountdown < 0
+ nextEpisodeCountdown = 0
+ end if
+ m.nextEpisodeButton.text = tr("Next Episode") + " " + nextEpisodeCountdown.toStr()
end sub
'
@@ -77,7 +82,13 @@ end sub
' Checks if we need to display the Next Episode button
sub checkTimeToDisplayNextEpisode()
- if int(m.top.position) >= (m.top.runTime - 30)
+ nextEpisodeCountdown = Int(m.top.runTime - m.top.position)
+ if nextEpisodeCountdown < 0
+ hideNextEpisodeButton()
+ return
+ end if
+
+ if int(m.top.position) >= (m.top.runTime - Val(m.nextupbuttonseconds))
showNextEpisodeButton()
updateCount()
return
@@ -112,11 +123,10 @@ sub onState(msg)
m.top.retryWithTranscoding = true ' If playback was not reported, retry with transcoding
else
' If an error was encountered, Display dialog
- dialog = createObject("roSGNode", "Dialog")
+ dialog = createObject("roSGNode", "PlaybackDialog")
dialog.title = tr("Error During Playback")
dialog.buttons = [tr("OK")]
dialog.message = tr("An error was encountered while playing this item.")
- dialog.observeField("buttonSelected", "dialogClosed")
m.top.getScene().dialog = dialog
end if
@@ -197,11 +207,10 @@ sub bufferCheck(msg)
m.top.callFunc("refresh")
else
' If buffering has stopped Display dialog
- dialog = createObject("roSGNode", "Dialog")
+ dialog = createObject("roSGNode", "PlaybackDialog")
dialog.title = tr("Error Retrieving Content")
dialog.buttons = [tr("OK")]
dialog.message = tr("There was an error retrieving the data for this item from the server.")
- dialog.observeField("buttonSelected", "dialogClosed")
m.top.getScene().dialog = dialog
' Stop playback and exit player
@@ -212,14 +221,6 @@ sub bufferCheck(msg)
end sub
-'
-' Clean up on Dialog Closed
-sub dialogClosed(msg)
- sourceNode = msg.getRoSGNode()
- sourceNode.unobserveField("buttonSelected")
- sourceNode.close = true
-end sub
-
function onKeyEvent(key as string, press as boolean) as boolean
if key = "OK" and m.nextEpisodeButton.hasfocus() and not m.top.trickPlayBar.visible
diff --git a/components/PlaybackDialog.brs b/components/PlaybackDialog.brs
new file mode 100644
index 00000000..3665c241
--- /dev/null
+++ b/components/PlaybackDialog.brs
@@ -0,0 +1,9 @@
+function onKeyEvent(key as string, press as boolean) as boolean
+
+ if key = "OK"
+ m.top.close = true
+ return true
+ end if
+
+ return false
+end function
diff --git a/components/PlaybackDialog.xml b/components/PlaybackDialog.xml
new file mode 100644
index 00000000..6966e5d2
--- /dev/null
+++ b/components/PlaybackDialog.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts
index b3a18909..9d597a2e 100644
--- a/locale/de_DE/translations.ts
+++ b/locale/de_DE/translations.ts
@@ -9866,5 +9866,88 @@
Einstellungen für die Startseite.Description for Home Page user settings.
+
+
+ Abmelden
+
+
+
+ Löschen
+
+
+
+ Fehler bei der wiedergabe
+ Dialog title when error occurs during playback
+
+
+
+ Fehler beim laden der Daten vom Server
+ Dialog detail when unable to load Content from Server
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Dieses %1 hat keine Inhalte
+
+
+
+ Laufzeit
+
+
+
+ Beim Abspielen ist ein Fehler aufgetreten.
+ Dialog detail when error occurs during playback
+
+
+
+ Schlüssel speichern?
+
+
+
+ Fehler beim laden des Inhalts
+ Dialog title when unable to load Content from Server
+
+
+ Title of Tab for switching "views" when looking at a library
+
+ Ansicht
+
+
+
+ Veröffentlichungsdatum
+
+
+
+ Server wechseln
+
+
+ Name or Title field of media item
+
+ Name
+
+
+
+ Kritiker Bewertung
+
+
+
+ Altersfreigabe
+
+
+
+ IMDb Bewertung
+
+
+
+ Wiedergabeanzahl
+
+
+
+ Zuletzt abgespielt
+
+
+
+ Datum
+
diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts
index 3f3a8ab1..2aecc856 100644
--- a/locale/en_GB/translations.ts
+++ b/locale/en_GB/translations.ts
@@ -3103,5 +3103,111 @@
Record Series
+
+
+ Delete Saved
+
+
+
+ Save Credentials?
+
+
+
+ On Now
+
+
+
+ TV Shows
+
+
+
+ Died
+
+
+
+ More Like This
+
+
+
+ Additional Parts
+ Additional parts of a video
+
+
+
+ Delete Saved
+
+
+
+ Born
+
+
+
+ Special Features
+
+
+
+ Save Credentials?
+
+
+
+ Press 'OK' to Close
+
+
+
+ Cast & Crew
+
+
+
+ Age
+
+
+
+ Select an available Jellyfin server from your local network:
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Record
+
+
+
+ Cancel Series Recording
+
+
+
+ Close
+
+
+
+ Unknown
+ Title for a cast member for which we have no information for
+
+
+
+ Enter the server name or IP address
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Cancel Recording
+
+
+
+ View Channel
+
+
+
+ If no server is listed above, you may also enter the server URL manually:
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Error Getting Playback Information
+ Dialog Title: Received error from server when trying to get information about the selected item for playback
+
+
+
+ Record Series
+
diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts
index a552d6eb..3bc55787 100644
--- a/locale/en_US/translations.ts
+++ b/locale/en_US/translations.ts
@@ -1103,6 +1103,16 @@
Loading trailerDialog title in Main.brs
+
+
+ Next Episode Button Time
+ Settings Menu - Title for option
+
+
+
+ Set how many seconds before the end of an episode the Next Episode button should appear. Set to 0 to disable.
+ Settings Menu - Description for option
+
diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts
index 1b619dd5..212a7f4b 100644
--- a/locale/es_ES/translations.ts
+++ b/locale/es_ES/translations.ts
@@ -2741,5 +2741,327 @@
Modo CineSettings Menu - Title for option
+
+
+ Borrar guardado
+
+
+
+ Muerto
+
+
+
+ Cambiar de servidor
+
+
+
+ Desconectar
+
+
+
+ ¿Guardar credenciales?
+
+
+
+ Error al reproducir
+ Dialog title when error occurs during playback
+
+
+
+ Se encontró un error mientras se reproducía este medio
+ Dialog detail when error occurs during playback
+
+
+
+ Tiempo funcionando
+
+
+ Title of Tab for switching "views" when looking at a library
+
+ Visualización
+
+
+
+ Características especiales
+
+
+
+ Reproduciendo ahora
+
+
+
+ Error al recuperar el contenido desde el servidor
+ Dialog title when unable to load Content from Server
+
+
+
+ Nacido
+
+
+
+ Cargando información del canal
+
+
+
+ Error al cargar información del canal
+
+
+
+ Valoración de IMDb
+
+
+
+ Fecha añadida
+
+
+
+ Fecha de reproducción
+
+
+
+ Valoración parental
+
+
+
+ Contador de reproducciones
+
+
+
+ Fecha de lanzamiento
+
+
+ Title of Tab for options to sort library content
+
+ Ordenar
+
+
+ Title of Tab for options to filter library content
+
+ Filtro
+
+
+
+ Edad
+
+
+
+ Actores y personal
+
+
+
+ Más como este/a
+
+
+
+ hoy
+ Current day
+
+
+
+ Sábado
+ Day of Week
+
+
+
+ Repetir
+ If TV Shows has previously been broadcasted
+
+
+
+ Películas (presentación)
+
+
+
+ Películas (cuadrícula)
+
+
+
+ Programas de TV
+
+
+
+ ayer
+ Previous day
+
+
+
+ mañana
+ Next day
+
+
+
+ Jueves
+ Day of Week
+
+
+
+ Viernes
+ Day of Week
+
+
+
+ Empezado a las
+ (Past Tense) For defining time when a program started today (e.g. Started at 08:00)
+
+
+
+ Empieza a las
+ (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00)
+
+
+
+ En vivo
+ If TV Show is being broadcast live (not pre-recorded)
+
+
+
+ Guía de TV
+ Menu option for showing Live TV Guide / Schedule
+
+
+
+ Grabar series
+
+
+
+ Cancelar grabación
+
+
+
+ Cancelar grabación de series
+
+
+
+ Cerrar
+
+
+
+ Conectando al servidor
+ Message to display to user while client is attempting to connect to the server
+
+
+
+ No se ha encontrado
+ Title of message box when the requested content is not found on the server
+
+
+
+ Desconocido
+ Title for a cast member for which we have no information for
+
+
+
+ Seleccione un servidor Jellyfin disponible en su red local
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Pulsa 'OK' para cerrar
+
+
+
+ Partes adicionales
+ Additional parts of a video
+
+
+
+ Películas
+
+
+
+ Domingo
+ Day of Week
+
+
+
+ Lunes
+ Day of Week
+
+
+
+ Martes
+ Day of Week
+
+
+
+ Miércoles
+ Day of Week
+
+
+
+ Empieza
+ (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00)
+
+
+
+ Terminado a las
+ (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00)
+
+
+
+ Termina a las
+ (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00)
+
+
+
+ Canales
+ Menu option for showing Live TV Channel List
+
+
+
+ Canal Ver
+
+
+
+ Grabar
+
+
+
+ Empezado
+ (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00)
+
+
+
+ Hubo un error al recuperar la información de este objeto desde el servidor
+ Dialog detail when unable to load Content from Server
+
+
+
+ Incapaz de cargar la información del canal desde el servidor
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Este/a %1 no contiene medios
+
+
+ Name or Title field of media item
+
+ Nombre
+
+
+
+ Valoración de los críticos
+
+
+
+ El contenido solicitado no existe en el servidor
+ Content of message box when the requested content is not found on the server
+
+
+
+ Introduce el nombre del servidor o la dirección IP
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Si arriba no hay ningún servidor listado, puedes introducir la URL del servidor manualmente:
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Error obteniendo la información de reproducción
+ Dialog Title: Received error from server when trying to get information about the selected item for playback
+
diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts
index 244197ec..27c90f61 100644
--- a/locale/fr/translations.ts
+++ b/locale/fr/translations.ts
@@ -5713,5 +5713,32 @@
Informations de transcodage
+
+
+ En ce moment
+
+
+
+ Sauvegarder les informations d'identification ?
+
+
+
+ Erreur lors de la récupération du contenu
+ Dialog title when unable to load Content from Server
+
+
+
+ Une erreur s'est produite lors de la récupération des données de cet élément à partir du serveur.
+ Dialog detail when unable to load Content from Server
+
+
+
+ Erreur lors de la lecture
+ Dialog title when error occurs during playback
+
+
+
+ Supprimer les valeurs enregistrées
+
diff --git a/settings/settings.json b/settings/settings.json
index bb645058..50179bad 100644
--- a/settings/settings.json
+++ b/settings/settings.json
@@ -3,13 +3,6 @@
"title": "Playback",
"description": "Settings relating to playback and supported codec and media types.",
"children": [
- {
- "title": "Cinema Mode",
- "description": "Cinema Mode brings the theater experience straight to your living room with the ability to play custom intros before the main feature.",
- "settingName": "playback.cinemamode",
- "type": "bool",
- "default": "false"
- },
{
"title": "Codec Support",
"description": "Enable or disable Direct Play support for certain codecs",
@@ -77,6 +70,20 @@
}
]
},
+ {
+ "title": "Cinema Mode",
+ "description": "Cinema Mode brings the theater experience straight to your living room with the ability to play custom intros before the main feature.",
+ "settingName": "playback.cinemamode",
+ "type": "bool",
+ "default": "false"
+ },
+ {
+ "title": "Next Episode Button Time",
+ "description": "Set how many seconds before the end of an episode the Next Episode button should appear. Set to 0 to disable.",
+ "settingName": "playback.nextupbuttonseconds",
+ "type": "integer",
+ "default": "30"
+ },
{
"title": "Text Subtitles Only",
"description": "Only display text subtitles to minimize transcoding.",
diff --git a/source/Main.brs b/source/Main.brs
index 885b2836..d528f437 100644
--- a/source/Main.brs
+++ b/source/Main.brs
@@ -525,7 +525,11 @@ sub Main (args as dynamic) as void
else if node.showID = invalid
sceneManager.callFunc("popScene")
else
- autoPlayNextEpisode(node.id, node.showID)
+ if video.errorMsg = ""
+ autoPlayNextEpisode(node.id, node.showID)
+ else
+ sceneManager.callFunc("popScene")
+ end if
end if
end if
else if type(msg) = "roDeviceInfoEvent"
diff --git a/source/VideoPlayer.brs b/source/VideoPlayer.brs
index 67c98e0e..81233243 100644
--- a/source/VideoPlayer.brs
+++ b/source/VideoPlayer.brs
@@ -47,7 +47,9 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
end if
if m.videotype = "Episode" or m.videotype = "Series"
- video.runTime = (meta.json.RunTimeTicks / 10000000.0)
+ if isValid(meta.json.RunTimeTicks)
+ video.runTime = (meta.json.RunTimeTicks / 10000000.0)
+ end if
video.content.contenttype = "episode"
end if
diff --git a/source/api/userauth.brs b/source/api/userauth.brs
index a98618a4..8636b1d4 100644
--- a/source/api/userauth.brs
+++ b/source/api/userauth.brs
@@ -155,6 +155,11 @@ sub LoadUserAbilities(user)
else
set_user_setting("livetv.canrecord", "false")
end if
+ if user.Policy.EnableContentDeletion = true
+ set_user_setting("content.candelete", "true")
+ else
+ set_user_setting("content.candelete", "false")
+ end if
end sub
function initQuickConnect()