Merge branch 'master' into transcoding-fix

This commit is contained in:
Neil Burrows 2022-07-13 10:51:47 +04:00 committed by GitHub
commit 84bdf2d256
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
26 changed files with 1617 additions and 86 deletions

View File

@ -37,26 +37,37 @@ sub itemContentChanged()
if itemData.type = "Movie"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "Series"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "Boxset"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "TvChannel"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "Folder"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
'm.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode
else if itemData.type = "Video"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "Photo"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.Title
else if itemData.type = "Episode"
m.itemPoster.uri = itemData.PosterUrl
m.itemIcon.uri = itemData.iconUrl
m.itemText.text = itemData.json.SeriesName + " - " + itemData.Title
else if itemData.type = "MusicArtist"
m.itemPoster.uri = itemData.PosterUrl
m.itemText.text = itemData.Title

View File

@ -42,9 +42,9 @@ sub init()
'set inital counts for overhang before content is loaded.
m.loadItemsTask.totalRecordCount = 0
m.spinner = m.top.findNode("spinner")
m.spinner.visible = true
m.Alpha = m.top.findNode("AlphaMenu")
m.AlphaSelected = m.top.findNode("AlphaSelected")
@ -55,7 +55,9 @@ end sub
'
'Load initial set of Data
sub loadInitialItems()
if m.top.parentItem.json.Type = "CollectionFolder" 'or m.top.parentItem.json.Type = "Folder"
m.top.HomeLibraryItem = m.top.parentItem.Id
end if
if m.top.parentItem.backdropUrl <> invalid
SetBackground(m.top.parentItem.backdropUrl)
end if
@ -78,10 +80,10 @@ sub loadInitialItems()
sortAscendingStr = get_user_setting("display." + m.top.parentItem.Id + ".sortAscending")
m.filter = get_user_setting("display." + m.top.parentItem.Id + ".filter")
else
m.view = invalid
m.sortField = get_user_setting("display." + m.top.parentItem.Id + ".sortField")
sortAscendingStr = get_user_setting("display." + m.top.parentItem.Id + ".sortAscending")
m.filter = get_user_setting("display." + m.top.parentItem.Id + ".filter")
m.view = get_user_setting("display." + m.top.parentItem.Id + ".landing")
end if
if m.sortField = invalid then m.sortField = "SortName"
@ -92,28 +94,42 @@ sub loadInitialItems()
else
m.sortAscending = false
end if
'Set Stuido Id
if m.top.parentItem.json.type = "Studio"
m.loadItemsTask.studioIds = m.top.parentItem.Id
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
m.loadItemsTask.genreIds = ""
'set Genre Id
else if m.top.parentItem.json.type = "Genre"
m.loadItemsTask.genreIds = m.top.parentItem.Id
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
m.loadItemsTask.studioIds = ""
else if (m.view = "Shows" or m.options.view = "Shows") or (m.view = "Movies" or m.options.view = "Movies")
m.loadItemsTask.studioIds = ""
m.loadItemsTask.genreIds = ""
end if
updateTitle()
m.loadItemsTask.nameStartsWith = m.top.AlphaSelected
m.emptyText.visible = false
updateTitle()
m.loadItemsTask.itemId = m.top.parentItem.Id
m.loadItemsTask.sortField = m.sortField
m.loadItemsTask.sortAscending = m.sortAscending
m.loadItemsTask.filter = m.filter
m.loadItemsTask.startIndex = 0
'Load Item Types
if m.top.parentItem.collectionType = "movies"
m.loadItemsTask.itemType = "Movie"
m.loadItemsTask.itemId = m.top.parentItem.Id
else if m.top.parentItem.collectionType = "tvshows"
m.loadItemsTask.itemType = "Series"
m.loadItemsTask.itemId = m.top.parentItem.Id
else if m.top.parentItem.collectionType = "music"
' Default Settings
m.loadItemsTask.recursive = false
m.itemGrid.itemSize = "[290, 290]"
m.itemGrid.itemSpacing = "[ 0, 20]"
m.loadItemsTask.itemType = "MusicArtist,MusicAlbum"
m.loadItemsTask.itemId = m.top.parentItem.Id
m.view = get_user_setting("display.music.view")
@ -134,26 +150,51 @@ sub loadInitialItems()
showTvGuide()
end if
else if m.top.parentItem.collectionType = "CollectionFolder" or m.top.parentItem.type = "CollectionFolder" or m.top.parentItem.collectionType = "boxsets" or m.top.parentItem.Type = "Boxset" or m.top.parentItem.Type = "Folder" or m.top.parentItem.Type = "Channel"
' Non-recursive, to not show subfolder contents
m.loadItemsTask.recursive = false
else if m.top.parentItem.collectionType = "Channel"
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
else if m.top.parentItem.Type = "Channel"
m.top.imageDisplayMode = "scaleToFit"
else if m.top.parentItem.json.type = "Studio"
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
m.loadItemsTask.itemType = "Series,Movie"
m.top.imageDisplayMode = "scaleToFit"
else if m.top.parentItem.json.type = "Genre"
m.loadItemsTask.itemType = "Series,Movie"
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
else
print "[ItemGrid] Unknown Type: " m.top.parentItem
end if
'end if
if m.top.parentItem.type <> "Folder" and (m.options.view = "Networks" or m.view = "Networks" or m.options.view = "Studios" or m.view = "Studios")
m.loadItemsTask.view = "Networks"
m.top.imageDisplayMode = "scaleToFit"
else if m.top.parentItem.type <> "Folder" and (m.options.view = "Genres" or m.view = "Genres")
m.loadItemsTask.StudioIds = m.top.parentItem.Id
m.loadItemsTask.view = "Genres"
else if m.top.parentItem.type <> "Folder" and (m.options.view = "Shows" or m.view = "Shows")
m.loadItemsTask.studioIds = ""
m.loadItemsTask.view = "Shows"
else if m.top.parentItem.type <> "Folder" and (m.options.view = "Movies" or m.view = "Movies")
m.loadItemsTask.studioIds = ""
m.loadItemsTask.view = "Movies"
end if
m.loadItemsTask.observeField("content", "ItemDataLoaded")
m.spinner.visible = true
m.loadItemsTask.control = "RUN"
SetUpOptions()
end sub
' Set Movies view, sort, and filter options
sub setMoviesOptions(options)
options.views = [
{ "Title": tr("Movies"), "Name": "movies" },
{ "Title": tr("Movies"), "Name": "Movies" },
{ "Title": tr("Studios"), "Name": "Studios" },
{ "Title": tr("Genres"), "Name": "Genres" }
]
options.sort = [
{ "Title": tr("TITLE"), "Name": "SortName" },
@ -189,7 +230,12 @@ end sub
' Set TV Show view, sort, and filter options
sub setTvShowsOptions(options)
options.views = [{ "Title": tr("Shows"), "Name": "shows" }]
options.views = [
{ "Title": tr("Shows"), "Name": "Shows" },
{ "Title": tr("Networks"), "Name": "Networks" },
{ "Title": tr("Genres"), "Name": "Genres" }
]
options.sort = [
{ "Title": tr("TITLE"), "Name": "SortName" },
{ "Title": tr("IMDB_RATING"), "Name": "CommunityRating" },
@ -281,10 +327,10 @@ end function
' Data to display when options button selected
sub SetUpOptions()
options = {}
options.filter = []
options.favorite = []
if getCollectionType() = "movies"
setMoviesOptions(options)
else if inStringArray(["boxsets", "Boxset"], getCollectionType())
@ -297,6 +343,7 @@ sub SetUpOptions()
setPhotoAlbumOptions(options)
else if getCollectionType() = "music"
setMusicOptions(options)
else
setDefaultOptions(options)
end if
@ -352,7 +399,6 @@ sub ItemDataLoaded(msg)
m.loadedItems = m.itemGrid.content.getChildCount()
m.loadedRows = m.loadedItems / m.itemGrid.numColumns
m.Loading = false
'If there are no items to display, show message
if m.loadedItems = 0
m.emptyText.text = tr("NO_ITEMS").Replace("%1", m.top.parentItem.Type)
@ -396,7 +442,7 @@ sub onItemFocused()
' Set Background to item backdrop
SetBackground(m.itemGrid.content.getChild(m.itemGrid.itemFocused).backdropUrl)
' Load more data if focus is within last 3 rows, and there are more items to load
' Load more data if focus is within last 5 rows, and there are more items to load
if focusedRow >= m.loadedRows - 5 and m.loadeditems < m.loadItemsTask.totalRecordCount
loadMoreData()
end if
@ -433,9 +479,8 @@ end sub
'
'Load next set of items
sub loadMoreData()
m.spinner.visible = true
if m.Loading = true then return
m.Loading = true
m.loadItemsTask.startIndex = m.loadedItems
m.loadItemsTask.observeField("content", "ItemDataLoaded")
@ -453,6 +498,7 @@ sub onItemAlphaSelected()
m.loadedItems = 0
m.data = CreateObject("roSGNode", "ContentNode")
m.itemGrid.content = m.data
m.spinner.visible = true
loadInitialItems()
end sub
@ -460,7 +506,6 @@ end sub
'
'Check if options updated and any reloading required
sub optionsClosed()
if m.top.parentItem.collectionType = "livetv" and m.options.view <> m.view
if m.options.view = "tvGuide"
m.view = "tvGuide"
@ -503,6 +548,14 @@ sub optionsClosed()
set_user_setting("display.music.view", m.view)
reload = true
end if
else
m.view = get_user_setting("display." + m.top.parentItem.Id + ".landing")
if m.options.view <> m.view
'reload and store new view setting
m.view = m.options.view
set_user_setting("display." + m.top.parentItem.Id + ".landing", m.view)
reload = true
end if
end if
if m.options.sortField <> m.sortField or m.options.sortAscending <> m.sortAscending
@ -653,6 +706,15 @@ sub updateTitle()
m.top.overhangTitle = m.top.parentItem.title + " " + tr("(Filtered)")
end if
if m.options.view = "Networks" or m.view = "Networks"
m.top.overhangTitle = "%s (%s)".Format(m.top.parentItem.title, tr("Networks"))
end if
if m.options.view = "Studios" or m.view = "Studios"
m.top.overhangTitle = "%s (%s)".Format(m.top.parentItem.title, tr("Studios"))
end if
if m.options.view = "Genres" or m.view = "Genres"
m.top.overhangTitle = "%s (%s)".Format(m.top.parentItem.title, tr("Genres"))
end if
actInt = m.itemGrid.itemFocused + 1
if m.showItemCount and m.loadItemsTask.totalRecordCount > 0
m.top.overhangTitle += " (" + tr("%1 of %2").Replace("%1", actInt.toStr()).Replace("%2", m.loadItemsTask.totalRecordCount.toStr()) + ")"

View File

@ -34,6 +34,7 @@
<Alpha id="AlphaMenu" />
</children>
<interface>
<field id="HomeLibraryItem" type="string"/>
<field id="parentItem" type="node" onChange="loadInitialItems" />
<field id="selectedItem" type="node" alwaysNotify="true" />
<field id="quickPlayNode" type="node" alwaysNotify="true" />
@ -44,6 +45,7 @@
</interface>
<script type="text/brightscript" uri="pkg:/source/utils/misc.brs" />
<script type="text/brightscript" uri="pkg:/source/utils/config.brs" />
<script type="text/brightscript" uri="pkg:/source/api/baserequest.brs" />
<script type="text/brightscript" uri="pkg:/source/utils/deviceCapabilities.brs" />
<script type="text/brightscript" uri="ItemGrid.brs" />
</component>

View File

@ -36,7 +36,7 @@ sub optionsSet()
if m.top.options.views <> invalid
viewContent = CreateObject("roSGNode", "ContentNode")
index = 0
selectedViewIndex = 0
selectedViewIndex = m.selectedViewIndex
for each view in m.top.options.views
entry = viewContent.CreateChild("ContentNode")

View File

@ -22,9 +22,10 @@ sub loadItems()
SortBy: sort_field,
SortOrder: sort_order,
recursive: m.top.recursive,
Fields: "Overview"
Fields: "Overview",
StudioIds: m.top.studioIds,
genreIds: m.top.genreIds
}
' Handle special case when getting names starting with numeral
if m.top.NameStartsWith <> ""
if m.top.NameStartsWith = "#"
@ -49,12 +50,17 @@ sub loadItems()
if m.top.ItemType = "LiveTV"
url = "LiveTv/Channels"
params.append({ UserId: get_setting("active_user") })
else if m.top.view = "Networks"
url = "Studios"
params.append({ UserId: get_setting("active_user") })
else if m.top.view = "Genres"
url = "Genres"
params.append({ UserId: get_setting("active_user") })
else
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
end if
resp = APIRequest(url, params)
data = getJson(resp)
if data <> invalid
if data.TotalRecordCount <> invalid then m.top.totalRecordCount = data.TotalRecordCount
@ -77,6 +83,12 @@ sub loadItems()
tmp = CreateObject("roSGNode", "PhotoData")
else if item.type = "PhotoAlbum"
tmp = CreateObject("roSGNode", "FolderData")
else if item.type = "Episode"
tmp = CreateObject("roSGNode", "TVEpisode")
else if item.Type = "Genre"
tmp = CreateObject("roSGNode", "FolderData")
else if item.Type = "Studio"
tmp = CreateObject("roSGNode", "FolderData")
else if item.Type = "MusicArtist" or item.Type = "MusicAlbum"
tmp = CreateObject("roSGNode", "MusicArtistData")
else if item.Type = "Audio"
@ -84,8 +96,8 @@ sub loadItems()
else
print "[LoadItems] Unknown Type: " item.Type
end if
if tmp <> invalid
tmp.parentFolder = m.top.itemId
tmp.json = item
if item.UserData <> invalid and item.UserData.isFavorite <> invalid
tmp.favorite = item.UserData.isFavorite
@ -94,7 +106,5 @@ sub loadItems()
end if
end for
end if
m.top.content = results
end sub

View File

@ -12,7 +12,9 @@
<field id="nameStartsWith" type="string" value="" />
<field id="recursive" type="boolean" value="true" />
<field id="filter" type="string" value="All" />
<field id="studioIds" type="string" value="" />
<field id="genreIds" type="string" value="" />
<field id="view" type="string" value="" />
<!-- Total records available from server-->
<field id="totalRecordCount" type="int" value="-1" />
<field id="content" type="array" />

View File

@ -17,8 +17,13 @@ end sub
sub setPoster()
if m.top.image <> invalid
m.top.posterURL = m.top.image.url
else if m.top.json.Type = "Studio"
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ParentThumbImageTag }
m.top.posterURL = ImageURL(m.top.json.id, "Thumb", imgParams)
else if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if
end sub
'TODO Set network Poster image

View File

@ -8,6 +8,7 @@
<field id="SubTitle" type="string" value="" />
<field id="iconUrl" type="string" value="" />
<field id="Type" type="string" value="" />
<field id="parentFolder" type="string" value="" />
<field id="json" type="assocarray" onChange="setFields" />
</interface>
</component>

View File

@ -9,6 +9,7 @@ end sub
' Push a new group onto the stack, replacing the existing group on the screen
sub pushScene(newGroup)
currentGroup = m.groups.peek()
if currentGroup <> invalid
'Search through group and store off last focused item
if currentGroup.focusedChild <> invalid
@ -16,10 +17,10 @@ sub pushScene(newGroup)
while focused.hasFocus() = false
focused = focused.focusedChild
end while
currentGroup.lastFocus = focused
currentGroup.setFocus(false)
else
currentGroup.lastFocus = invalid
currentGroup.setFocus(false)
end if
@ -104,14 +105,17 @@ sub popScene()
if group.isSubType("JFScreen")
group.callFunc("OnScreenShown")
else
' Restore focus
if group.lastFocus <> invalid
group.lastFocus.setFocus(true)
else
if group.focusedChild <> invalid
group.focusedChild.setFocus(true)
else
group.setFocus(true)
end if
end if
end if
else
' Exit app if the stack is empty after removing group
m.scene.exit = true
@ -134,6 +138,12 @@ sub clearScenes()
m.groups = []
end sub
'
' Clear previous scene from group stack
sub clearPreviousScene()
m.groups.pop()
end sub
'
' Display user/device settings screen
sub settings()

View File

@ -6,6 +6,7 @@
<function name="settings" />
<function name="getActiveScene" />
<function name="clearScenes" />
<function name="clearPreviousScene" />
<function name="resetTime" />
<function name="userMessage" />
<field id="currentUser" type="string" onChange="updateUser" />

View File

@ -0,0 +1,21 @@
sub setFields()
json = m.top.json
m.top.id = json.id
m.top.Title = json.name
m.top.Description = json.overview
m.top.favorite = json.UserData.isFavorite
m.top.watched = json.UserData.played
m.top.Type = json.Type
setPoster()
end sub
sub setPoster()
if m.top.image <> invalid
m.top.posterURL = m.top.image.url
else if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if
end sub

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<component name="TVEpisode" extends="JFContentItem">
<script type="text/brightscript" uri="TVEpisode.brs" />
<script type="text/brightscript" uri="pkg:/source/api/Image.brs" />
<script type="text/brightscript" uri="pkg:/source/api/baserequest.brs" />
<script type="text/brightscript" uri="pkg:/source/utils/config.brs" />
</component>

View File

@ -6,6 +6,7 @@ sub setFields()
m.top.showID = datum.SeriesID
m.top.seasonID = datum.SeasonID
m.top.overview = datum.overview
m.top.favorite = datum.UserData.isFavorite
end sub
sub setPoster()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -4487,5 +4487,464 @@
<source>Change Server</source>
<translation>Server wechseln</translation>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin home background. Jellyfin will need to be closed and reopened for change to take effect.</source>
<translation>Verwenden Sie das generierte Splashscreen-Bild als Jellyfin-Hintergrund. Jellyfin muss geschlossen und erneut geöffnet werden, damit die Änderung wirksam wird.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Use Splashscreen as Home Background</source>
<translation>Splashscreen als Hintergrund für die Startseite verwenden</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Options that alter the design of Jellyfin.</source>
<translation>Optionen, die das Design von Jellyfin verändern.</translation>
<extracomment>Description for Design Elements user settings.</extracomment>
</message>
<message>
<source>Design Elements</source>
<translation>Designelemente</translation>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin&apos;s screensaver background.</source>
<translation>Verwenden Sie das generierte Splashscreen-Bild als Hintergrund für Jellyfin&apos;s Bildschirmschoner.</translation>
</message>
<message>
<source>Options for Jellyfin&apos;s screensaver.</source>
<translation>Optionen für Jellyfin&apos;s Bildschirmschoner.</translation>
<extracomment>Description for Screensaver user settings.</extracomment>
</message>
<message>
<source>Use Splashscreen as Screensaver Background</source>
<translation>Splashscreen als Bildschirmschoner-Hintergrund verwenden</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Screensaver</source>
<translation>Bildschirmschoner</translation>
</message>
<message>
<source>If enabled, images for unwatched episodes will be blurred.</source>
<translation>Wenn diese Option aktiviert ist, werden die Bilder von nicht angesehenen Episoden unscharf dargestellt.</translation>
</message>
<message>
<source>Options for TV Shows.</source>
<translation>Optionen für Serien.</translation>
<extracomment>Description for TV Shows user settings.</extracomment>
</message>
<message>
<source>Options for details pages.</source>
<translation>Optionen für Detailseiten.</translation>
<extracomment>Description for Detail Page user settings.</extracomment>
</message>
<message>
<source>Detail Page</source>
<translation>Detailseite</translation>
</message>
<message>
<source>Use the replay button to slowly animate to the first item in the folder. (If disabled, The folder will reset to the first item immediately)</source>
<translation>Verwenden Sie die Schaltfläche &quot;Wiederholen&quot;, um langsam zum ersten Element im Ordner zu animieren. (Wenn diese Funktion deaktiviert ist, wird der Ordner sofort auf das erste Element zurückgesetzt)</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Return to Top</source>
<translation>Zurück zum Seitenanfang</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>There was an error authenticating via Quick Connect.</source>
<translation>Bei der Authentifizierung über Quick Connect ist ein Fehler aufgetreten.</translation>
</message>
<message>
<source>(Dialog will close automatically)</source>
<translation>(Dialog wird automatisch geschlossen)</translation>
</message>
<message>
<source>Here is your Quick Connect code:</source>
<translation>Hier ist dein Quick Connect Code:</translation>
</message>
<message>
<source>Quick Connect</source>
<translation>Quick Connect</translation>
</message>
<message>
<source>%1 of %2</source>
<translation>%1 von %2</translation>
<extracomment>Item position and count. %1 = current item. %2 = total number of items</extracomment>
</message>
<message>
<source>Go to episode</source>
<translation>Zur Episode gehen</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Episode Detail Page</extracomment>
</message>
<message>
<source>Go to season</source>
<translation>Zur Staffel gehen</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Season Page</extracomment>
</message>
<message>
<source>Go to series</source>
<translation>Zur Serie gehen</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Series Detail Page</extracomment>
</message>
<message>
<source>Set Watched</source>
<translation>Als Gesehen markieren</translation>
<extracomment>Button Text - When pressed, marks item as Warched</extracomment>
</message>
<message>
<source>Set Favorite</source>
<translation>Als Favoriten markieren</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</extracomment>
</message>
<message>
<source>Show item count in the library, and index of selected item.</source>
<translation>Zeigt die Anzahl der Objekte in der Bibliothek und den Index des ausgewählten Objekts an.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Always show the titles below the poster images. (If disabled, title will be shown under hilighted item only)</source>
<translation>Die Titel werden immer unter den Plakatbildern angezeigt. (Wenn deaktiviert, wird der Titel nur unter dem hervorgehobenen Element angezeigt)</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>User Interface</source>
<translation>Benutzeroberfläche</translation>
<extracomment>Title for User Interface section in user setting screen.</extracomment>
</message>
<message>
<source>Disabled</source>
<translation>Deaktiviert</translation>
</message>
<message>
<source>Enabled</source>
<translation>Aktiviert</translation>
</message>
<message>
<source>Support direct play of MPEG 2 content (e.g. Live TV). This will prevent transcoding of MPEG 2 content, but uses significantly more bandwidth</source>
<translation>Unterstützung der direkten Wiedergabe von MPEG-2-Inhalten (z. B. Live-TV). Dies verhindert die Transkodierung von MPEG-2-Inhalten, verbraucht aber deutlich mehr Bandbreite</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>MPEG 2 Support</source>
<translation>MPEG-2-Support</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Playback</source>
<translation>Wiedergabe</translation>
<extracomment>Title for Playback section in user setting screen.</extracomment>
</message>
<message>
<source>Version</source>
<translation>Version</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation>Beim Abspielen des Titels ist ein Fehler aufgetreten. Der Server hat zur Transkodierung erforderliche Daten nicht zur Verfügung gestellt.</translation>
<extracomment>Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url</extracomment>
</message>
<message>
<source>Error Getting Playback Information</source>
<translation>Fehler beim Abruf von Wiedergabe-Informationen</translation>
<extracomment>Dialog Title: Received error from server when trying to get information about the selected item for playback</extracomment>
</message>
<message>
<source>...or enter server URL manually:</source>
<translation>...oder gebe die URL per Hand ein:</translation>
<extracomment>Instructions on initial app launch when the user is asked to manually enter a server URL</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Wähle einen Jellyfin-Server aus dem lokalen Netzwerk</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</message>
<message>
<source>Enter the server name or ip address</source>
<translation>Gebe den Servernamen oder die IP-Adresse ein</translation>
<extracomment>Title of KeyboardDialog when manually entering a server URL</extracomment>
</message>
<message>
<source>The requested content does not exist on the server</source>
<translation>Der angefragte Inhalt konnte auf dem Server nicht gefunden werden</translation>
<extracomment>Content of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Unknown</source>
<translation>Unbekannt</translation>
<extracomment>Title for a cast member for which we have no information for</extracomment>
</message>
<message>
<source>Not found</source>
<translation>Nicht gefunden</translation>
<extracomment>Title of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Connecting to Server</source>
<translation>Verbindungsaufbau mit dem Server</translation>
<extracomment>Message to display to user while client is attempting to connect to the server</extracomment>
</message>
<message>
<source>Close</source>
<translation>Schließen</translation>
</message>
<message>
<source>Cancel Series Recording</source>
<translation>Serienaufnahme abbrechen</translation>
</message>
<message>
<source>Cancel Recording</source>
<translation>Aufnahme abbrechen</translation>
</message>
<message>
<source>Record Series</source>
<translation>Serie aufnehmen</translation>
</message>
<message>
<source>Record</source>
<translation>Aufnehmen</translation>
</message>
<message>
<source>View Channel</source>
<translation>Kanal anzeigen</translation>
</message>
<message>
<source>TV Guide</source>
<translation>TV-Programm</translation>
<extracomment>Menu option for showing Live TV Guide / Schedule</extracomment>
</message>
<message>
<source>Channels</source>
<translation>Kanäle</translation>
<extracomment>Menu option for showing Live TV Channel List</extracomment>
</message>
<message>
<source>Repeat</source>
<translation>Wiederholung</translation>
<extracomment>If TV Shows has previously been broadcasted</extracomment>
</message>
<message>
<source>Live</source>
<translation>Live</translation>
<extracomment>If TV Show is being broadcast live (not pre-recorded)</extracomment>
</message>
<message>
<source>Ends at</source>
<translation>Endet um</translation>
<extracomment>(Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Ended at</source>
<translation>Endete um</translation>
<extracomment>(Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) </extracomment>
</message>
<message>
<source>Starts</source>
<translation>Startet</translation>
<extracomment>(Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Starts at</source>
<translation>Startet um</translation>
<extracomment>(Future Tense) For defining time when a program will start today (e.g. Starts at 08:00) </extracomment>
</message>
<message>
<source>Started</source>
<translation>Gestartet</translation>
<extracomment>(Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Started at</source>
<translation>Gestartet um</translation>
<extracomment>(Past Tense) For defining time when a program started today (e.g. Started at 08:00) </extracomment>
</message>
<message>
<source>Saturday</source>
<translation>Samstag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>Freitag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>Donnerstag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>Mittwoch</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Tuesday</source>
<translation>Dienstag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>Montag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Sunday</source>
<translation>Sonntag</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>morgen</translation>
<extracomment>Next day</extracomment>
</message>
<message>
<source>yesterday</source>
<translation>gestern</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>today</source>
<translation>heute</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>TV Shows</source>
<translation>TV-Sendungen</translation>
</message>
<message>
<source>Movies</source>
<translation>Filme</translation>
</message>
<message>
<source>More Like This</source>
<translation>Ähnliches</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Besetzung &amp; Mitwirkende</translation>
</message>
<message>
<source>Age</source>
<translation>Alter</translation>
</message>
<message>
<source>Died</source>
<translation>Gestorben</translation>
</message>
<message>
<source>Born</source>
<translation>Geboren</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Filter</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Sortieren</translation>
</message>
<message>
<comment>Title of Tab for switching &quot;views&quot; when looking at a library</comment>
<source>TAB_VIEW</source>
<translation>Anzeigen</translation>
</message>
<message>
<source>RUNTIME</source>
<translation>Laufzeit</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Erscheinungsdatum</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Wiedergabeanzahl</translation>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Altersfreigabe</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Abgespielt am</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Hinzugefügt am</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Kritikerwertung</translation>
</message>
<message>
<source>IMDB_RATING</source>
<translation>IMDb Bewertung</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Name</translation>
</message>
<message>
<comment>Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)</comment>
<source>NO_ITEMS</source>
<translation>%1 enthält keine Einträge</translation>
</message>
<message>
<source>Unable to load Channel Data from the server</source>
<translation>Laden der Kanaldaten vom Server nicht möglich</translation>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Fehler beim Laden der Kanaldaten</translation>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Lade Kanaldaten</translation>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Beim Abspielen des Inhalts ist ein Problem aufgetreten.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment>
</message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Es ist ein Fehler beim Abrufen der Daten vom Server für diesen Eintrag aufgetreten.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</message>
<message>
<source>Error During Playback</source>
<translation>Fehler beim Abspielen</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
<message>
<source>Error Retrieving Content</source>
<translation>Fehler beim Abrufen der Inhalte</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>On Now</source>
<translation>Läuft gerade</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Gespeicherte Löschen</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Login-Daten speichern?</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Abmelden</translation>
</message>
<message>
<source>Change Server</source>
<translation>Server wechseln</translation>
</message>
</context>
</TS>

View File

@ -729,5 +729,111 @@
<source>Save Credentials?</source>
<translation>Save Credentials?</translation>
</message>
<message>
<source>Version</source>
<translation>Version</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation type="unfinished">An error was encountered while playing this item. Server did not provide required transcoding data.</translation>
<extracomment>Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url</extracomment>
</message>
<message>
<source>Error Getting Playback Information</source>
<translation>Error Getting Playback Information</translation>
<extracomment>Dialog Title: Received error from server when trying to get information about the selected item for playback</extracomment>
</message>
<message>
<source>...or enter server URL manually:</source>
<translation>or enter server URL manually:</translation>
<extracomment>Instructions on initial app launch when the user is asked to manually enter a server URL</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Pick a Jellyfin server from the local network</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</message>
<message>
<source>Enter the server name or ip address</source>
<translation>Enter the server name or IP address</translation>
<extracomment>Title of KeyboardDialog when manually entering a server URL</extracomment>
</message>
<message>
<source>Unknown</source>
<translation>Unknown</translation>
<extracomment>Title for a cast member for which we have no information for</extracomment>
</message>
<message>
<source>Close</source>
<translation>Close</translation>
</message>
<message>
<source>Cancel Series Recording</source>
<translation>Cancel Series Recording</translation>
</message>
<message>
<source>Cancel Recording</source>
<translation>Cancel Recording</translation>
</message>
<message>
<source>Record Series</source>
<translation>Record Series</translation>
</message>
<message>
<source>Record</source>
<translation>Record</translation>
</message>
<message>
<source>View Channel</source>
<translation>View Channel</translation>
</message>
<message>
<source>TV Shows</source>
<translation>TV Shows</translation>
</message>
<message>
<source>Movies</source>
<translation>Films</translation>
</message>
<message>
<source>Special Features</source>
<translation>Special Features</translation>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Press &apos;OK&apos; to Close</translation>
</message>
</message>
<message>
<source>More Like This</source>
<translation>More Like This</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Cast &amp; Crew</translation>
</message>
<message>
<source>Age</source>
<translation>Age</translation>
</message>
<message>
<source>Died</source>
<translation>Died</translation>
</message>
<message>
<source>Born</source>
<translation>Born</translation>
</message>
<message>
<source>On Now</source>
<translation>On Now</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Delete Saved</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Save Credentials?</translation>
</message>
</context>
</TS>

View File

@ -574,6 +574,17 @@
<translation>There was an error authenticating via Quick Connect.</translation>
</message>
<message>
<source>Networks</source>
<translation>Networks</translation>
</message>
<message>
<source>Studios</source>
<translation>Studios</translation>
</message>
<message>
<source>Shows</source>
<translation>Shows</translation>
</message>
<source>Return to Top</source>
<translation>Return to Top</translation>
<extracomment>UI -> Media Grid -> Item Title in user setting screen.</extracomment>
@ -656,5 +667,15 @@
<translation>Use generated splashscreen image as Jellyfin home background. Jellyfin will need to be closed and reopened for change to take effect.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Cinema mode</source>
<translation>Cinema mode</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Cinema mode brings the theater experience straight to your living room with the ability to play custom intros before the main feature.</source>
<translation>Cinema mode brings the theater experience straight to your living room with the ability to play custom intros before the main feature.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
</context>
</TS>

View File

@ -1990,5 +1990,269 @@
<source>Delete Saved</source>
<translation>Supprimer les valeurs enregistrées</translation>
</message>
<message>
<source>Age</source>
<translation>Âge</translation>
</message>
<message>
<source>Died</source>
<translation>Décès</translation>
</message>
<message>
<source>Born</source>
<translation>Naissance</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Filtre</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Trier</translation>
</message>
<message>
<source>RUNTIME</source>
<translation>Durée</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Date de sortie</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Nombre de lecture</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Date de lecture</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Date d&apos;ajout</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Note des critiques</translation>
</message>
<message>
<source>IMDB_RATING</source>
<translation>Classement IMDb</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Nom</translation>
</message>
<message>
<comment>Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)</comment>
<source>NO_ITEMS</source>
<translation>%1 ne contient aucun élément</translation>
</message>
<message>
<source>Unable to load Channel Data from the server</source>
<translation>Impossible de charger les données de la chaîne à partir du serveur</translation>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Erreur lors du chargement des données de la chaîne</translation>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Chargement des données de la chaîne</translation>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Une erreur s&apos;est produite lors de la lecture de cet élément.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment>
</message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Une erreur s&apos;est produite lors de la récupération des données de cet élément à partir du serveur.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</message>
<message>
<source>Error During Playback</source>
<translation type="unfinished">Erreur pendant la lecture</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
<message>
<source>Error Retrieving Content</source>
<translation type="unfinished">Erreur pendant la récupération du contenant</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>On Now</source>
<translation type="unfinished">Actifs actuellement</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Supprimer les valeurs enregistrées</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Enregistrer les identifiants ?</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation>Une erreur s&apos;est produite lors de la lecture de cet élément. Le serveur n&apos;a pas fourni les données de transcodage nécessaires.</translation>
<extracomment>Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url</extracomment>
</message>
<message>
<source>Error Getting Playback Information</source>
<translation>Impossible de récupérer les informations de lecture</translation>
<extracomment>Dialog Title: Received error from server when trying to get information about the selected item for playback</extracomment>
</message>
<message>
<source>...or enter server URL manually:</source>
<translation>...ou entrez l&apos;URL du serveur manuellement&#xa0;:</translation>
<extracomment>Instructions on initial app launch when the user is asked to manually enter a server URL</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Choisissiez un serveur Jellyfin depuis le réseau local</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</message>
<message>
<source>Enter the server name or ip address</source>
<translation>Entrer le nom ou l&apos;adresse IP du serveur</translation>
<extracomment>Title of KeyboardDialog when manually entering a server URL</extracomment>
</message>
<message>
<source>The requested content does not exist on the server</source>
<translation>Le contenu demandé n&apos;existe pas sur le serveur</translation>
<extracomment>Content of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Not found</source>
<translation>Non trouvé</translation>
<extracomment>Title of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Connecting to Server</source>
<translation>Connexion au serveur en cours</translation>
<extracomment>Message to display to user while client is attempting to connect to the server</extracomment>
</message>
<message>
<source>Cancel Recording</source>
<translation>Annuler l&apos;enregistrement</translation>
</message>
<message>
<source>Record Series</source>
<translation>Enregistrer une série</translation>
</message>
<message>
<source>Record</source>
<translation>Enregistrer</translation>
</message>
<message>
<source>View Channel</source>
<translation>Voir la chaîne</translation>
</message>
<message>
<source>TV Guide</source>
<translation>Guide des chaînes</translation>
<extracomment>Menu option for showing Live TV Guide / Schedule</extracomment>
</message>
<message>
<source>Channels</source>
<translation>Chaînes</translation>
<extracomment>Menu option for showing Live TV Channel List</extracomment>
</message>
<message>
<source>Repeat</source>
<translation>Rediffusion</translation>
<extracomment>If TV Shows has previously been broadcasted</extracomment>
</message>
<message>
<source>Live</source>
<translation>Direct</translation>
<extracomment>If TV Show is being broadcast live (not pre-recorded)</extracomment>
</message>
<message>
<source>Ends at</source>
<translation>Terminé à</translation>
<extracomment>(Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Ended at</source>
<translation>Termine à</translation>
<extracomment>(Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) </extracomment>
</message>
<message>
<source>Starts</source>
<translation>Débutera</translation>
<extracomment>(Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Started at</source>
<translation>Commencé à</translation>
<extracomment>(Past Tense) For defining time when a program started today (e.g. Started at 08:00) </extracomment>
</message>
<message>
<source>Saturday</source>
<translation>Samedi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>Vendredi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>Jeudi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>Mercredi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Tuesday</source>
<translation>Mardi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>Lundi</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Sunday</source>
<translation>Dimanche</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>demain</translation>
<extracomment>Next day</extracomment>
</message>
<message>
<source>yesterday</source>
<translation>hier</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>today</source>
<translation>aujourd&apos;hui</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Classification parentale</translation>
</message>
<message>
<source>Error During Playback</source>
<translation>Erreur lors de la lecture</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
<message>
<source>Error Retrieving Content</source>
<translation>Erreur lors de la récupération du contenu</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
</context>
</TS>

View File

@ -4284,5 +4284,480 @@ elemeket</translation>
<source>On Now</source>
<translation>Most</translation>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin home background. Jellyfin will need to be closed and reopened for change to take effect.</source>
<translation>Használja a generált indítóképernyős képet Jellyfin kezdőképernyőjének háttereként. A Jellyfint újra kell indítani, hogy a változás életbe lépjen.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Use Splashscreen as Home Background</source>
<translation>Használja a Splashscreent a kezdőképernyő háttereként</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Options that alter the design of Jellyfin.</source>
<translation>Opciók, amelyek megváltoztatják a Jellyfin designját.</translation>
<extracomment>Description for Design Elements user settings.</extracomment>
</message>
<message>
<source>Design Elements</source>
<translation>Design elemek</translation>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin&apos;s screensaver background.</source>
<translation>Használja a generált splashscreen képet, a Jellyfin képernyővédő háttereként.</translation>
</message>
<message>
<source>Use Splashscreen as Screensaver Background</source>
<translation>Használja a Splashscreent képernyővédő háttereként</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Options for Jellyfin&apos;s screensaver.</source>
<translation>Jellyfin képernyővédőjének beállításai.</translation>
<extracomment>Description for Screensaver user settings.</extracomment>
</message>
<message>
<source>Screensaver</source>
<translation>Képernyőkímélő</translation>
</message>
<message>
<source>If enabled, images for unwatched episodes will be blurred.</source>
<translation>Ha engedélyezve van, a meg nem nézett epizódok képei elmosódnak.</translation>
</message>
<message>
<source>Blur Unwatched Episodes</source>
<translation>A nem megtekintett epizódok elhomályosítása</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Options for TV Shows.</source>
<translation>TV-műsorok beállításai.</translation>
<extracomment>Description for TV Shows user settings.</extracomment>
</message>
<message>
<source>Hides tagline text on details pages.</source>
<translation>Elrejti a címszó szövegét a részletező oldalakon.</translation>
</message>
<message>
<source>Hide Taglines</source>
<translation>Címsorok elrejtése</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Options for details pages.</source>
<translation>Lehetőségek a részletező oldalakhoz.</translation>
<extracomment>Description for Detail Page user settings.</extracomment>
</message>
<message>
<source>Detail Page</source>
<translation>Részletező Oldal</translation>
</message>
<message>
<source>Use the replay button to slowly animate to the first item in the folder. (If disabled, The folder will reset to the first item immediately)</source>
<translation>A visszajátszás gombbal lassan lapozhatsz a mappa első elemére. (Ha le van tiltva, a mappa azonnal visszaáll az első elemre)</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Return to Top</source>
<translation>Vissza a tetejére</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>There was an error authenticating via Quick Connect.</source>
<translation>Hiba történt a gyorscsatlakozás segítségével történő hitelesítés során.</translation>
</message>
<message>
<source>(Dialog will close automatically)</source>
<translation>(A párbeszédablak automatikusan bezárul)</translation>
</message>
<message>
<source>Here is your Quick Connect code:</source>
<translation>Íme a gyorscsatlakozási kódod:</translation>
</message>
<message>
<source>Quick Connect</source>
<translation>Gyorscsatlakozás</translation>
</message>
<message>
<source>%1 of %2</source>
<translation>%1 a %2 -ból</translation>
<extracomment>Item position and count. %1 = current item. %2 = total number of items</extracomment>
</message>
<message>
<source>Go to episode</source>
<translation>Ugrás az epizódra</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Episode Detail Page</extracomment>
</message>
<message>
<source>Go to season</source>
<translation>Ugrás az évadra</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Season Page</extracomment>
</message>
<message>
<source>Go to series</source>
<translation>Ugrás a sorozatra</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Series Detail Page</extracomment>
</message>
<message>
<source>Set Watched</source>
<translation>Megnézve</translation>
<extracomment>Button Text - When pressed, marks item as Warched</extracomment>
</message>
<message>
<source>Set Favorite</source>
<translation>Kedvenc hozzáadása</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</extracomment>
</message>
<message>
<source>Show item count in the library, and index of selected item.</source>
<translation>Elemszám megjelenítése a könyvtárban.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Item Count</source>
<translation>Elemek száma</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Count in user setting screen.</extracomment>
</message>
<message>
<source>Always show the titles below the poster images. (If disabled, title will be shown under hilighted item only)</source>
<translation>Mindig mutasd a címeket a plakátképek alatt. (Ha le van tiltva, a cím csak a kiemelt elem alatt jelenik meg)</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Item Titles</source>
<translation>Fájl Címek</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>Media Grid Options</source>
<translation>Média Rács beállítások</translation>
</message>
<message>
<source>Media Grid</source>
<translation>Média Rács</translation>
<extracomment>UI -&gt; Media Grid section in user setting screen.</extracomment>
</message>
<message>
<source>User Interface</source>
<translation>Felhasználói felület</translation>
<extracomment>Title for User Interface section in user setting screen.</extracomment>
</message>
<message>
<source>Disabled</source>
<translation>Kikapcsolva</translation>
</message>
<message>
<source>Enabled</source>
<translation>Engedélyezve</translation>
</message>
<message>
<source>Support direct play of MPEG 2 content (e.g. Live TV). This will prevent transcoding of MPEG 2 content, but uses significantly more bandwidth</source>
<translation>Támogatja az MPEG 2 tartalom közvetlen lejátszását (pl. É TV). Ez megakadályozza az MPEG 2 tartalom átkódolását, de lényegesen nagyobb sávszélességet használ fel</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>MPEG 2 Support</source>
<translation>MPEG 2 Támogatás</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Playback</source>
<translation>Lejátszás</translation>
<extracomment>Title for Playback section in user setting screen.</extracomment>
</message>
<message>
<source>Version</source>
<translation>Verzió</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation>Hiba történt az elem lejátszása közben. A szerver nem biztosította a szükséges transzkódolási adatokat.</translation>
<extracomment>Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url</extracomment>
</message>
<message>
<source>Error Getting Playback Information</source>
<translation>Hiba a lejátszási információk lekérésekor</translation>
<extracomment>Dialog Title: Received error from server when trying to get information about the selected item for playback</extracomment>
</message>
<message>
<source>...or enter server URL manually:</source>
<translation>vagy add meg kézzel a szerver URL-jét:</translation>
<extracomment>Instructions on initial app launch when the user is asked to manually enter a server URL</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Válassz ki egy Jellyfin szervert a helyi hálózatról</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</message>
<message>
<source>Enter the server name or ip address</source>
<translation>Írd be a Szerver nevét vagy IP-címét</translation>
<extracomment>Title of KeyboardDialog when manually entering a server URL</extracomment>
</message>
<message>
<source>The requested content does not exist on the server</source>
<translation>A kért tartalom nem található a szerveren</translation>
<extracomment>Content of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Unknown</source>
<translation>Ismeretlen</translation>
<extracomment>Title for a cast member for which we have no information for</extracomment>
</message>
<message>
<source>Not found</source>
<translation>Nem található</translation>
<extracomment>Title of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Connecting to Server</source>
<translation>Csatlakozás a szerverhez</translation>
<extracomment>Message to display to user while client is attempting to connect to the server</extracomment>
</message>
<message>
<source>Close</source>
<translation>Bezárás</translation>
</message>
<message>
<source>Cancel Series Recording</source>
<translation>Sorozatfelvétel leállítása</translation>
</message>
<message>
<source>Cancel Recording</source>
<translation>Felvétel megállítása</translation>
</message>
<message>
<source>Record Series</source>
<translation>Sorozat felvétele</translation>
</message>
<message>
<source>Record</source>
<translation>Felvétel</translation>
</message>
<message>
<source>View Channel</source>
<translation>Csatorna Megtekintése</translation>
</message>
<message>
<source>TV Guide</source>
<translation>Műsorújság</translation>
<extracomment>Menu option for showing Live TV Guide / Schedule</extracomment>
</message>
<message>
<source>Channels</source>
<translation>Csatornák</translation>
<extracomment>Menu option for showing Live TV Channel List</extracomment>
</message>
<message>
<source>Repeat</source>
<translation>Ismétlés</translation>
<extracomment>If TV Shows has previously been broadcasted</extracomment>
</message>
<message>
<source>Live</source>
<translation>É</translation>
<extracomment>If TV Show is being broadcast live (not pre-recorded)</extracomment>
</message>
<message>
<source>Ends at</source>
<translation>Vége volt</translation>
<extracomment>(Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Ended at</source>
<translation>Vége lett</translation>
<extracomment>(Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) </extracomment>
</message>
<message>
<source>Starts</source>
<translation>Kezdődni fog</translation>
<extracomment>(Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Starts at</source>
<translation>Kezdődik majd</translation>
<extracomment>(Future Tense) For defining time when a program will start today (e.g. Starts at 08:00) </extracomment>
</message>
<message>
<source>Started</source>
<translation>Kezdődött</translation>
<extracomment>(Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Started at</source>
<translation>Ekkor kezdődött</translation>
<extracomment>(Past Tense) For defining time when a program started today (e.g. Started at 08:00) </extracomment>
</message>
<message>
<source>Saturday</source>
<translation>Szombat</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>Péntek</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>Csütörtök</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>Szerda</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Tuesday</source>
<translation>Kedd</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>Hétfő</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Sunday</source>
<translation>Vasárnap</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>holnap</translation>
<extracomment>Next day</extracomment>
</message>
<message>
<source>yesterday</source>
<translation>tegnap</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>today</source>
<translation>ma</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>TV Shows</source>
<translation>TV Sorozatok</translation>
</message>
<message>
<source>Movies</source>
<translation>Filmek</translation>
</message>
<message>
<source>Special Features</source>
<translation>Sajátosságok</translation>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Press &apos;OK&apos; to Close</translation>
</message>
</message>
<message>
<source>More Like This</source>
<translation>Több hasonló</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Szereplők &amp; Stáb</translation>
</message>
<message>
<source>Age</source>
<translation>Kor</translation>
</message>
<message>
<source>Died</source>
<translation>Elhunyt</translation>
</message>
<message>
<source>Born</source>
<translation>Született</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Szűrő</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Rendezés</translation>
</message>
<message>
<comment>Title of Tab for switching &quot;views&quot; when looking at a library</comment>
<source>TAB_VIEW</source>
<translation>Nézet</translation>
</message>
<message>
<source>RUNTIME</source>
<translation>Játékidő</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Megjelenés dátuma</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Lejátszások Száma</translation>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Korhatár</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Utoljára lejátszva</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Hozzáadva</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Kritikusok Értékelése</translation>
</message>
<message>
<source>IMDB_RATING</source>
<translation>IMDb Értékelés</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Név</translation>
</message>
<message>
<comment>Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)</comment>
<source>NO_ITEMS</source>
<translation>Ez a(z) %1 nem tartalmaz elemeket</translation>
</message>
<message>
<source>Unable to load Channel Data from the server</source>
<translation>Nem lehet betölteni a csatornaadatokat a szerverről</translation>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Hiba történt a csatornaadatok betöltésekor</translation>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Csatornaadatok betöltése</translation>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Hiba történt az elem lejátszása közben.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment>
</message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Hiba történt az elem(ek) betöltése során a szerverről.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</message>
<message>
<source>Error During Playback</source>
<translation>Hiba történt a lejátszás közben</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
</context>
</TS>

78
package-lock.json generated
View File

@ -13,7 +13,7 @@
},
"devDependencies": {
"@rokucommunity/bslint": "0.7.1",
"brighterscript": "0.51.4",
"brighterscript": "0.52.3",
"rooibos-cli": "1.4.0"
}
},
@ -760,9 +760,9 @@
}
},
"node_modules/brighterscript": {
"version": "0.51.4",
"resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.51.4.tgz",
"integrity": "sha512-/mxXy+fU8HM6u3B0lO8mBsgucTXgVz3dyeaVHwvF0N0MS36Q1CQWI4KliLQ8ko1uVP6Csax9ZOGCJF8hW0GcGg==",
"version": "0.52.3",
"resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.52.3.tgz",
"integrity": "sha512-kglNHAfthxv+SFAjddu1h6NqdWJ0p+InfRuAFfUMwr+EigcwKuATkpzPticWQt1tWuOTm3J8v2RJ0JvPpV/jiA==",
"dev": true,
"dependencies": {
"@rokucommunity/bslib": "^0.1.1",
@ -775,9 +775,9 @@
"cross-platform-clear-console": "^2.3.0",
"debounce-promise": "^3.1.0",
"eventemitter3": "^4.0.0",
"fast-glob": "^3.2.11",
"file-url": "^3.0.0",
"fs-extra": "^7.0.1",
"glob": "^7.1.6",
"fs-extra": "^8.0.0",
"jsonc-parser": "^2.3.0",
"long": "^3.2.0",
"luxon": "^1.8.3",
@ -785,7 +785,7 @@
"moment": "^2.23.0",
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
"roku-deploy": "^3.7.0",
"roku-deploy": "^3.7.1",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
@ -1173,12 +1173,12 @@
}
},
"node_modules/brighterscript/node_modules/fs-extra": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.2",
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
},
@ -1250,9 +1250,9 @@
}
},
"node_modules/brighterscript/node_modules/source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"dev": true,
"engines": {
"node": ">= 8"
@ -4109,9 +4109,9 @@
}
},
"node_modules/moment": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
"engines": {
"node": "*"
}
@ -4802,9 +4802,9 @@
}
},
"node_modules/roku-deploy": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.7.0.tgz",
"integrity": "sha512-+MBppc3q7ZEhzXu86O43mITxa+ro4hkCCXt4UhsWDqvCNx7w4b6CHzjrRAXYtdGQoDe6xqZjJhqCqC/YytJqWA==",
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.7.1.tgz",
"integrity": "sha512-xXTYNr4Ug+Kr+bnhDqlJDcbuu6rg8x0MFIpA+36jbpJcqsI6ekbWzRh2QhUG6aZ4F8+zKt8jZFIkZDeyooJJfQ==",
"dependencies": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",
@ -6471,9 +6471,9 @@
}
},
"brighterscript": {
"version": "0.51.4",
"resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.51.4.tgz",
"integrity": "sha512-/mxXy+fU8HM6u3B0lO8mBsgucTXgVz3dyeaVHwvF0N0MS36Q1CQWI4KliLQ8ko1uVP6Csax9ZOGCJF8hW0GcGg==",
"version": "0.52.3",
"resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.52.3.tgz",
"integrity": "sha512-kglNHAfthxv+SFAjddu1h6NqdWJ0p+InfRuAFfUMwr+EigcwKuATkpzPticWQt1tWuOTm3J8v2RJ0JvPpV/jiA==",
"dev": true,
"requires": {
"@rokucommunity/bslib": "^0.1.1",
@ -6486,9 +6486,9 @@
"cross-platform-clear-console": "^2.3.0",
"debounce-promise": "^3.1.0",
"eventemitter3": "^4.0.0",
"fast-glob": "^3.2.11",
"file-url": "^3.0.0",
"fs-extra": "^7.0.1",
"glob": "^7.1.6",
"fs-extra": "^8.0.0",
"jsonc-parser": "^2.3.0",
"long": "^3.2.0",
"luxon": "^1.8.3",
@ -6496,7 +6496,7 @@
"moment": "^2.23.0",
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
"roku-deploy": "^3.7.0",
"roku-deploy": "^3.7.1",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
@ -6578,12 +6578,12 @@
}
},
"fs-extra": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
"integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
"integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
"requires": {
"graceful-fs": "^4.1.2",
"graceful-fs": "^4.2.0",
"jsonfile": "^4.0.0",
"universalify": "^0.1.0"
}
@ -6634,9 +6634,9 @@
"dev": true
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
"integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"dev": true
},
"supports-color": {
@ -9134,9 +9134,9 @@
}
},
"moment": {
"version": "2.29.3",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
"integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"ms": {
"version": "2.0.0",
@ -9653,9 +9653,9 @@
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
"roku-deploy": {
"version": "3.7.0",
"resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.7.0.tgz",
"integrity": "sha512-+MBppc3q7ZEhzXu86O43mITxa+ro4hkCCXt4UhsWDqvCNx7w4b6CHzjrRAXYtdGQoDe6xqZjJhqCqC/YytJqWA==",
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.7.1.tgz",
"integrity": "sha512-xXTYNr4Ug+Kr+bnhDqlJDcbuu6rg8x0MFIpA+36jbpJcqsI6ekbWzRh2QhUG6aZ4F8+zKt8jZFIkZDeyooJJfQ==",
"requires": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",

View File

@ -8,7 +8,7 @@
},
"devDependencies": {
"@rokucommunity/bslint": "0.7.1",
"brighterscript": "0.51.4",
"brighterscript": "0.52.3",
"rooibos-cli": "1.4.0"
},
"scripts": {

View File

@ -16,6 +16,13 @@
"settingName": "playback.tryDirect.h264ProfileLevel",
"type": "bool",
"default": "true"
},
{
"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"
}
]
},

View File

@ -63,7 +63,7 @@ sub Main (args as dynamic) as void
if (args.mediaType <> invalid) and (args.contentId <> invalid)
video = CreateVideoPlayerGroup(args.contentId)
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
else
dialog = createObject("roSGNode", "Dialog")
@ -104,7 +104,7 @@ sub Main (args as dynamic) as void
else
video = CreateVideoPlayerGroup(itemNode.id)
end if
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
end if
end if
@ -123,7 +123,7 @@ sub Main (args as dynamic) as void
else
video = CreateVideoPlayerGroup(video_id)
end if
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
end if
else if selectedItem.type = "Series"
@ -145,7 +145,7 @@ sub Main (args as dynamic) as void
video = CreateVideoPlayerGroup(video_id)
dialog.close = true
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
else
dialog = createObject("roSGNode", "Dialog")
@ -217,7 +217,7 @@ sub Main (args as dynamic) as void
else
video = CreateVideoPlayerGroup(video_id)
end if
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
end if
else if isNodeEvent(msg, "search_value")
@ -263,7 +263,7 @@ sub Main (args as dynamic) as void
video_id = group.id
video = CreateVideoPlayerGroup(video_id, mediaSourceId, audio_stream_idx)
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
end if
@ -383,7 +383,7 @@ sub Main (args as dynamic) as void
info = msg.GetInfo()
if info.DoesExist("mediatype") and info.DoesExist("contentid")
video = CreateVideoPlayerGroup(info.contentId)
if video <> invalid
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
else
dialog = createObject("roSGNode", "Dialog")

View File

@ -455,10 +455,13 @@ sub CreateSidePanel(buttons, options)
group.options = options
end sub
function CreateVideoPlayerGroup(video_id, mediaSourceId = invalid, audio_stream_idx = 1, forceTranscoding = false)
function CreateVideoPlayerGroup(video_id, mediaSourceId = invalid, audio_stream_idx = 1, forceTranscoding = false, showIntro = true)
' Video is Playing
video = VideoPlayer(video_id, mediaSourceId, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), forceTranscoding)
video = VideoPlayer(video_id, mediaSourceId, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), showIntro)
if video = invalid then return invalid
if video.errorMsg = "introaborted" then return video
video.observeField("selectSubtitlePressed", m.port)
video.observeField("state", m.port)

View File

@ -1,9 +1,12 @@
function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle_idx = -1, forceTranscoding = false)
function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle_idx = -1, forceTranscoding = false, showIntro = true)
' Get video controls and UI
video = CreateObject("roSGNode", "JFVideo")
video.id = id
AddVideoContent(video, mediaSourceId, audio_stream_idx, subtitle_idx, -1, forceTranscoding)
AddVideoContent(video, mediaSourceId, audio_stream_idx, subtitle_idx, -1, forceTranscoding, showIntro)
if video.errorMsg = "introaborted"
return video
end if
if video.content = invalid
return invalid
@ -16,8 +19,7 @@ function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle
return video
end function
sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1, forceTranscoding = false)
sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1, forceTranscoding = false, showIntro = true)
video.content = createObject("RoSGNode", "ContentNode")
meta = ItemMetaData(video.id)
m.videotype = meta.type
@ -140,6 +142,16 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
end if
end if
' Don't attempt to play an intro for an intro video
if showIntro
' Do not play intros when resuming playback
if playbackPosition = 0
if not PlayIntroVideo(video.id, audio_stream_idx)
video.errorMsg = "introaborted"
return
end if
end if
end if
video.content.PlayStart = int(playbackPosition / 10000000)
@ -170,6 +182,10 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
video.container = getContainerType(meta)
if playbackInfo.MediaSources[0] = invalid
playbackInfo = meta.json
end if
subtitles = sortSubtitles(meta.id, playbackInfo.MediaSources[0].MediaStreams)
video.Subtitles = subtitles["all"]
@ -259,6 +275,43 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
end sub
function PlayIntroVideo(video_id, audio_stream_idx) as boolean
' Intro videos only play if user has cinema mode setting enabled
if get_user_setting("playback.cinemamode") = "true"
' Check if server has intro videos setup and available
introVideos = GetIntroVideos(video_id)
if introVideos = invalid then return true
if introVideos.TotalRecordCount > 0
' Bypass joke pre-roll
if lcase(introVideos.items[0].name) = "rick roll'd" then return true
introVideo = VideoPlayer(introVideos.items[0].id, introVideos.items[0].id, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), false)
port = CreateObject("roMessagePort")
introVideo.observeField("state", port)
m.global.sceneManager.callFunc("pushScene", introVideo)
introPlaying = true
while introPlaying
msg = wait(0, port)
if type(msg) = "roSGNodeEvent"
if msg.GetData() = "finished"
m.global.sceneManager.callFunc("clearPreviousScene")
introPlaying = false
else if msg.GetData() = "stopped"
introPlaying = false
return false
end if
end if
end while
end if
end if
return true
end function
'
' Extract array of Transcode Reasons from the content URL
' @returns Array of Strings
@ -360,7 +413,7 @@ sub autoPlayNextEpisode(videoID as string, showID as string)
' remove finished video node
m.global.sceneManager.callFunc("popScene")
' setup new video node
nextVideo = CreateVideoPlayerGroup(data.Items[1].Id)
nextVideo = CreateVideoPlayerGroup(data.Items[1].Id, invalid, 1, false)
if nextVideo <> invalid
m.global.sceneManager.callFunc("pushScene", nextVideo)
else

View File

@ -220,6 +220,16 @@ function CreateInstantMix(id as string)
return getJson(resp)
end function
' Get Intro Videos for an item
function GetIntroVideos(id as string)
url = Substitute("Users/{0}/Items/{1}/Intros", get_setting("active_user"), id)
resp = APIRequest(url, {
"UserId": get_setting("active_user")
})
return getJson(resp)
end function
function AudioStream(id as string)
songData = AudioItem(id)