Merge branch 'unstable' into feature/jf-allow-unlimited-bitrate

This commit is contained in:
Jimi 2023-02-04 05:46:50 -07:00 committed by GitHub
commit a6131864f2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 4689 additions and 264 deletions

View File

@ -6,12 +6,12 @@ on:
- 'locale/**'
jobs:
run:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3
- uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3
with:
node-version: "14.12.0"
node-version: "18.13.0"
- run: npm ci
- run: npx ropm install
- run: make dev

View File

@ -6,12 +6,12 @@ on:
jobs:
test-build-release:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@master
- uses: actions/setup-node@master
with:
node-version: "14.12.0"
node-version: "18.13.0"
- run: npm ci
- run: npx ropm install
- run: npm run validate

View File

@ -6,12 +6,12 @@ on:
jobs:
test-build-release:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@master
- uses: actions/setup-node@master
with:
node-version: "14.12.0"
node-version: "18.13.0"
- run: npm ci
- run: npx ropm install
- run: npm run validate

View File

@ -3,12 +3,12 @@ on: [push, pull_request]
jobs:
run:
runs-on: ubuntu-20.04
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@master
- uses: actions/setup-node@master
with:
node-version: "14.12.0"
node-version: "18.13.0"
- run: npm ci
- run: npx ropm install
- run: npm run validate

View File

@ -8,8 +8,12 @@
"locale/**/*.*",
"settings/*.*"
],
"plugins": [ "@rokucommunity/bslint" ],
"plugins": [
"@rokucommunity/bslint"
],
"diagnosticFilters": [
"**/roku_modules/**/*"
"**/roku_modules/**/*",
"**/testFramework/*",
"**/tests/*"
]
}

View File

@ -13,11 +13,11 @@ sub init()
m.itemText.translation = [0, m.itemPoster.height + 7]
m.alwaysShowTitles = get_user_setting("itemgrid.alwaysShowTitles") = "true"
m.itemText.visible = m.alwaysShowTitles
m.gridTitles = get_user_setting("itemgrid.gridTitles")
m.itemText.visible = m.gridTitles = "showalways"
' Add some padding space when Item Titles are always showing
if m.alwaysShowTitles then m.itemText.maxWidth = 250
if m.itemText.visible then m.itemText.maxWidth = 250
'Parent is MarkupGrid and it's parent is the ItemGrid
m.topParent = m.top.GetParent().GetParent()
@ -131,16 +131,17 @@ end sub
'Display or hide title Visibility on focus change
sub focusChanged()
if m.top.itemHasFocus = true
m.itemText.visible = true
m.itemText.repeatCount = -1
m.posterMask.scale = [1, 1]
else
m.itemText.visible = m.alwaysShowTitles
m.itemText.repeatCount = 0
if m.topParent.alphaActive = true
m.posterMask.scale = [0.85, 0.85]
end if
end if
if m.gridTitles = "showonhover"
m.itemText.visible = m.top.itemHasFocus
end if
end sub
'Hide backdrop and text when poster loaded

View File

@ -196,7 +196,7 @@ sub loadInitialItems()
m.itemGrid.numRows = "3"
m.selectedMovieOverview.visible = false
m.infoGroup.visible = false
m.top.showItemTitles = get_user_setting("itemgrid.movieGridTitles")
m.top.showItemTitles = get_user_setting("itemgrid.gridTitles")
if LCase(m.top.showItemTitles) = "hidealways"
m.itemGrid.itemSize = "[230, 315]"
m.itemGrid.rowHeights = "[315]"
@ -371,6 +371,10 @@ sub ItemDataLoaded(msg)
m.loading = false
m.spinner.visible = false
' Return focus to options menu if it was opened while library was loading
if m.options.visible
m.options.setFocus(true)
end if
return
end if
@ -413,6 +417,10 @@ sub ItemDataLoaded(msg)
end if
m.spinner.visible = false
' Return focus to options menu if it was opened while library was loading
if m.options.visible
m.options.setFocus(true)
end if
end sub
'

View File

@ -1,5 +1,6 @@
sub init()
m.itemPoster = m.top.findNode("itemPoster")
m.postTextBackground = m.top.findNode("postTextBackground")
m.posterText = m.top.findNode("posterText")
m.posterText.font.size = 30
m.backdrop = m.top.findNode("backdrop")
@ -14,11 +15,25 @@ sub init()
m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode
end if
m.gridTitles = get_user_setting("itemgrid.gridTitles")
m.posterText.visible = false
m.postTextBackground.visible = false
end sub
sub itemContentChanged()
m.backdrop.blendColor = "#101010"
m.posterText.visible = false
m.postTextBackground.visible = false
if isValid(m.topParent.showItemTitles)
if LCase(m.topParent.showItemTitles) = "showalways"
m.posterText.visible = true
m.postTextBackground.visible = true
end if
end if
itemData = m.top.itemContent
if not isValid(itemData) then return
@ -38,6 +53,23 @@ sub itemContentChanged()
if m.itemPoster.loadStatus <> "ready"
m.backdrop.visible = true
end if
if m.top.itemHasFocus then focusChanged()
end sub
'Display or hide title Visibility on focus change
sub focusChanged()
if m.top.itemHasFocus = true
m.posterText.repeatCount = -1
else
m.posterText.repeatCount = 0
end if
if isValid(m.topParent.showItemTitles)
if LCase(m.topParent.showItemTitles) = "showonhover"
m.posterText.visible = m.top.itemHasFocus
m.postTextBackground.visible = m.posterText.visible
end if
end if
end sub
'Hide backdrop and text when poster loaded

View File

@ -135,6 +135,8 @@ sub loadInitialItems()
m.sortAscending = false
end if
m.top.showItemTitles = get_user_setting("itemgrid.gridTitles")
if LCase(m.top.parentItem.json.type) = "musicgenre"
m.itemGrid.translation = "[96, 60]"
m.loadItemsTask.itemType = "MusicAlbum"
@ -143,6 +145,7 @@ sub loadInitialItems()
m.loadItemsTask.itemId = m.top.parentItem.parentFolder
else if LCase(m.view) = "artistspresentation" or LCase(m.options.view) = "artistspresentation"
m.loadItemsTask.genreIds = ""
m.top.showItemTitles = "hidealways"
else if LCase(m.view) = "artistsgrid" or LCase(m.options.view) = "artistsgrid"
m.loadItemsTask.genreIds = ""
else

View File

@ -33,13 +33,13 @@
</children>
<interface>
<field id="HomeLibraryItem" type="string"/>
<field id="View" type="string"/>
<field id="parentItem" type="node" onChange="loadInitialItems" />
<field id="selectedItem" type="node" alwaysNotify="true" />
<field id="quickPlayNode" type="node" alwaysNotify="true" />
<field id="imageDisplayMode" type="string" value="scaleToZoom" />
<field id="AlphaSelected" type="string" alias="AlphaMenu.itemAlphaSelected" alwaysNotify="true" onChange="onItemAlphaSelected" />
<field id="alphaActive" type="boolean" value="false" />
<field id="showItemTitles" type="string" value="showonhover" />
<field id="jumpToItem" type="integer" value="" />
</interface>
<script type="text/brightscript" uri="pkg:/source/utils/misc.brs" />

View File

@ -11,10 +11,10 @@ sub setPoster()
if m.top.image <> invalid
m.top.posterURL = m.top.image.url
else if m.top.json.ImageTags <> invalid and m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 60 }
imgParams = { "maxHeight": 60, "Tag": m.top.json.ImageTags.Primary }
m.top.hdsmalliconurl = ImageURL(m.top.json.id, "Primary", imgParams)
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if
end sub

View File

@ -18,16 +18,16 @@ sub setPoster()
else
if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
else if m.top.json.BackdropImageTags <> invalid
imgParams = { "maxHeight": 440 }
imgParams = { "maxHeight": 440, "Tag": m.top.json.BackdropImageTags[0] }
m.top.posterURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if
' Add Backdrop Image
if m.top.json.BackdropImageTags <> invalid
imgParams = { "maxHeight": 720, "maxWidth": 1280 }
imgParams = { "maxHeight": 720, "maxWidth": 1280, "Tag": m.top.json.BackdropImageTags[0] }
m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if

View File

@ -21,7 +21,7 @@ sub setPoster()
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 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if
end sub

View File

@ -16,7 +16,7 @@ sub setData()
' Set appropriate Images for Wide and Tall based on type
if datum.type = "CollectionFolder" or datum.type = "UserView"
params = { "maxHeight": 261, "maxWidth": 464 }
params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 }
m.top.thumbnailURL = ImageURL(datum.id, "Primary", params)
m.top.widePosterUrl = m.top.thumbnailURL
@ -33,14 +33,22 @@ sub setData()
imgParams.Append({ "maxHeight": 261 })
imgParams.Append({ "maxWidth": 464 })
if datum.ImageTags.Primary <> invalid
param = { "Tag": datum.ImageTags.Primary }
imgParams.Append(param)
end if
m.top.thumbnailURL = ImageURL(datum.id, "Primary", imgParams)
' Add Wide Poster (Series Backdrop)
if datum.ParentThumbImageTag <> invalid
imgParams["Tag"] = datum.ParentThumbImageTag
m.top.widePosterUrl = ImageURL(datum.ParentThumbItemId, "Thumb", imgParams)
else if datum.ParentBackdropImageTags <> invalid
imgParams["Tag"] = datum.ParentBackdropImageTags[0]
m.top.widePosterUrl = ImageURL(datum.ParentBackdropItemId, "Backdrop", imgParams)
else if datum.ImageTags.Primary <> invalid
imgParams["Tag"] = datum.SeriesPrimaryImageTag
m.top.widePosterUrl = ImageURL(datum.id, "Primary", imgParams)
end if
@ -52,8 +60,10 @@ sub setData()
' Add Wide Poster (Series Backdrop)
if datum.ImageTags <> invalid and datum.imageTags.Thumb <> invalid
imgParams["Tag"] = datum.imageTags.Thumb
m.top.widePosterUrl = ImageURL(datum.Id, "Thumb", imgParams)
else if datum.BackdropImageTags <> invalid
imgParams["Tag"] = datum.BackdropImageTags[0]
m.top.widePosterUrl = ImageURL(datum.Id, "Backdrop", imgParams)
end if
@ -63,14 +73,21 @@ sub setData()
imgParams.Append({ "maxHeight": 261 })
imgParams.Append({ "maxWidth": 175 })
if datum.ImageTags.Primary <> invalid
param = { "Tag": datum.ImageTags.Primary }
imgParams.Append(param)
end if
m.top.posterURL = ImageURL(datum.id, "Primary", imgParams)
' For wide image, use backdrop
imgParams["maxWidth"] = 464
if datum.ImageTags <> invalid and datum.imageTags.Thumb <> invalid
imgParams["Tag"] = datum.imageTags.Thumb
m.top.thumbnailUrl = ImageURL(datum.Id, "Thumb", imgParams)
else if datum.BackdropImageTags[0] <> invalid
imgParams["Tag"] = datum.BackdropImageTags[0]
m.top.thumbnailUrl = ImageURL(datum.id, "Backdrop", imgParams)
end if
@ -80,24 +97,31 @@ sub setData()
imgParams.Append({ "maxHeight": 261 })
imgParams.Append({ "maxWidth": 175 })
if datum.ImageTags.Primary <> invalid
param = { "Tag": datum.ImageTags.Primary }
imgParams.Append(param)
end if
m.top.posterURL = ImageURL(datum.id, "Primary", imgParams)
' For wide image, use backdrop
imgParams["maxWidth"] = 464
if datum.ImageTags <> invalid and datum.imageTags.Thumb <> invalid
imgParams["Tag"] = datum.imageTags.Thumb
m.top.thumbnailUrl = ImageURL(datum.Id, "Thumb", imgParams)
else if datum.BackdropImageTags[0] <> invalid
imgParams["Tag"] = datum.BackdropImageTags[0]
m.top.thumbnailUrl = ImageURL(datum.id, "Backdrop", imgParams)
end if
else if datum.type = "MusicAlbum"
params = { "maxHeight": 261, "maxWidth": 261 }
params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 261 }
m.top.thumbnailURL = ImageURL(datum.id, "Primary", params)
m.top.widePosterUrl = m.top.thumbnailURL
m.top.posterUrl = m.top.thumbnailURL
else if datum.type = "TvChannel" or datum.type = "Channel"
params = { "maxHeight": 261, "maxWidth": 464 }
params = { "Tag": datum.ImageTags.Primary, "maxHeight": 261, "maxWidth": 464 }
m.top.thumbnailURL = ImageURL(datum.id, "Primary", params)
m.top.widePosterUrl = m.top.thumbnailURL
m.top.iconUrl = "pkg:/images/media_type_icons/live_tv_white.png"

View File

@ -40,20 +40,20 @@ sub setPoster()
else
if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
else if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 440 }
imgParams = { "maxHeight": 440, "Tag": m.top.json.BackdropImageTags[0] }
m.top.posterURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
else if m.top.json.ParentThumbImageTag <> invalid and m.top.json.ParentThumbItemId <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ParentThumbImageTag }
m.top.posterURL = ImageURL(m.top.json.ParentThumbItemId, "Thumb", imgParams)
end if
' Add Backdrop Image
if m.top.json.BackdropImageTags <> invalid
if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 720, "maxWidth": 1280 }
imgParams = { "maxHeight": 720, "maxWidth": 1280, "Tag": m.top.json.BackdropImageTags[0] }
m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if
end if

View File

@ -12,19 +12,19 @@ sub setPoster()
else
if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
else if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 440 }
imgParams = { "maxHeight": 440, "Tag": m.top.json.BackdropImageTags[0] }
m.top.posterURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
else if m.top.json.ParentThumbImageTag <> invalid and m.top.json.ParentThumbItemId <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ParentThumbImageTag }
m.top.posterURL = ImageURL(m.top.json.ParentThumbItemId, "Thumb", imgParams)
end if
' Add Backdrop Image
if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 720, "maxWidth": 1280 }
imgParams = { "maxHeight": 720, "maxWidth": 1280, "Tag": m.top.json.BackdropImageTags[0] }
m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if

View File

@ -14,19 +14,19 @@ sub setPoster()
else
if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
else if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 440 }
imgParams = { "maxHeight": 440, "Tag": m.top.json.BackdropImageTags[0] }
m.top.posterURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
else if m.top.json.ParentThumbImageTag <> invalid and m.top.json.ParentThumbItemId <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ParentThumbImageTag }
m.top.posterURL = ImageURL(m.top.json.ParentThumbItemId, "Thumb", imgParams)
end if
' Add Backdrop Image
if m.top.json.BackdropImageTags[0] <> invalid
imgParams = { "maxHeight": 720, "maxWidth": 1280 }
imgParams = { "maxHeight": 720, "maxWidth": 1280, "Tag": m.top.json.BackdropImageTags[0] }
m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if

View File

@ -36,7 +36,7 @@ sub setPoster()
m.top.posterURL = m.top.image.url
else
if m.top.json.ImageTags <> invalid and m.top.json.ImageTags.Thumb <> invalid
imgParams = { "maxHeight": 500, "maxWidth": 500 }
imgParams = { "maxHeight": 500, "maxWidth": 500, "Tag": m.top.json.ImageTags.Thumb }
m.top.posterURL = ImageURL(m.top.json.id, "Thumb", imgParams)
end if
end if

View File

@ -32,16 +32,16 @@ sub setPoster()
if m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 440, "maxWidth": 295 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
else if m.top.json.BackdropImageTags <> invalid
imgParams = { "maxHeight": 440 }
imgParams = { "maxHeight": 440, "Tag": m.top.json.BackdropImageTags[0] }
m.top.posterURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if
' Add Backdrop Image
if m.top.json.BackdropImageTags <> invalid
imgParams = { "maxHeight": 720, "maxWidth": 1280 }
imgParams = { "maxHeight": 720, "maxWidth": 1280, "Tag": m.top.json.BackdropImageTags[0] }
m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
end if

View File

@ -15,7 +15,7 @@ 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 }
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if
end sub

View File

@ -73,8 +73,12 @@ sub itemContentChanged()
' "Program" is from clicking on an "On Now" item on the Home Screen
if itemData.type = "Program"
m.itemText.Text = itemData.json.name
if itemData.json.ImageURL <> invalid
m.itemPoster.uri = itemData.json.ImageURL
m.itemTextExtra.Text = itemData.json.ChannelName
if itemData.widePosterURL <> ""
m.itemPoster.uri = ImageURL(itemData.widePosterURL)
else
m.itemPoster.uri = ImageURL(itemData.json.ChannelId)
m.itemPoster.loadDisplayMode = "scaleToFill"
end if
' Set Episode title if available

View File

@ -61,10 +61,13 @@ sub onLibrariesLoaded()
m.LoadLibrariesTask.content = []
' create My Media, Continue Watching, and Next Up rows
content = CreateObject("roSGNode", "ContentNode")
mediaRow = content.CreateChild("HomeRow")
mediaRow.title = tr("My Media")
continueRow = content.CreateChild("HomeRow")
continueRow.title = tr("Continue Watching")
nextUpRow = content.CreateChild("HomeRow")
nextUpRow.title = tr("Next Up >")
@ -79,6 +82,19 @@ sub onLibrariesLoaded()
]
haveLiveTV = false
' Load the NextUp Data
m.LoadNextUpTask.observeField("content", "updateNextUpItems")
m.LoadNextUpTask.control = "RUN"
' Load the Continue Watching Data
m.LoadContinueTask.observeField("content", "updateContinueItems")
m.LoadContinueTask.control = "RUN"
' Load the Favorites Data
m.LoadFavoritesTask.observeField("content", "updateFavoritesItems")
m.LoadFavoritesTask.control = "RUN"
' validate library data
if m.libraryData <> invalid and m.libraryData.count() > 0
userConfig = m.top.userConfig
@ -92,36 +108,38 @@ sub onLibrariesLoaded()
' create a "Latest In" row for each library
filteredLatest = filterNodeArray(m.libraryData, "id", userConfig.LatestItemsExcludes)
for each lib in filteredLatest
if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv"
if lib.collectionType <> "boxsets" and lib.collectionType <> "livetv" and lib.json.CollectionType <> "Program"
latestInRow = content.CreateChild("HomeRow")
latestInRow.title = tr("Latest in") + " " + lib.name + " >"
sizeArray.Push([464, 331])
loadLatest = createObject("roSGNode", "LoadItemsTask")
loadLatest.itemsToLoad = "latest"
loadLatest.itemId = lib.id
metadata = { "title": lib.name }
metadata.Append({ "contentType": lib.json.CollectionType })
loadLatest.metadata = metadata
loadLatest.observeField("content", "updateLatestItems")
loadLatest.control = "RUN"
else if lib.collectionType = "livetv"
' If we have Live TV, add "On Now"
onNowRow = content.CreateChild("HomeRow")
onNowRow.title = tr("On Now")
sizeArray.Push([464, 331])
haveLiveTV = true
' If we have Live TV access, load "On Now" data
if haveLiveTV
m.LoadOnNowTask.observeField("content", "updateOnNowItems")
m.LoadOnNowTask.control = "RUN"
end if
end if
end for
end if
m.top.rowItemSize = sizeArray
m.top.content = content
' Load the Continue Watching Data
m.LoadContinueTask.observeField("content", "updateContinueItems")
m.LoadContinueTask.control = "RUN"
' Load the Favorites Data
m.LoadFavoritesTask.observeField("content", "updateFavoritesItems")
m.LoadFavoritesTask.control = "RUN"
' If we have Live TV access, load "On Now" data
if haveLiveTV
m.LoadOnNowTask.observeField("content", "updateOnNowItems")
m.LoadOnNowTask.control = "RUN"
end if
end sub
sub updateHomeRows()
@ -219,9 +237,6 @@ sub updateContinueItems()
homeRows.replaceChild(row, continueRowIndex)
end if
end if
m.LoadNextUpTask.observeField("content", "updateNextUpItems")
m.LoadNextUpTask.control = "RUN"
end sub
sub updateNextUpItems()
@ -274,24 +289,6 @@ sub updateNextUpItems()
m.global.app_loaded = true
end if
' create task nodes for "Latest In" rows
userConfig = m.top.userConfig
filteredLatest = filterNodeArray(m.libraryData, "id", userConfig.LatestItemsExcludes)
for each lib in filteredLatest
if lib.collectionType <> "livetv" and lib.collectionType <> "boxsets" and lib.json.CollectionType <> "Program"
loadLatest = createObject("roSGNode", "LoadItemsTask")
loadLatest.itemsToLoad = "latest"
loadLatest.itemId = lib.id
metadata = { "title": lib.name }
metadata.Append({ "contentType": lib.json.CollectionType })
loadLatest.metadata = metadata
loadLatest.observeField("content", "updateLatestItems")
loadLatest.control = "RUN"
end if
end for
end sub
sub updateLatestItems(msg)

View File

@ -30,6 +30,7 @@ sub loadItems()
params["ParentId"] = m.top.itemId
params["EnableImageTypes"] = "Primary,Backdrop,Thumb"
params["ImageTypeLimit"] = 1
params["EnableTotalRecordCount"] = false
resp = APIRequest(url, params)
data = getJson(resp)
@ -53,6 +54,10 @@ sub loadItems()
params["SortOrder"] = "Descending"
params["ImageTypeLimit"] = 1
params["UserId"] = get_setting("active_user")
params["EnableRewatching"] = false
params["DisableFirstEpisode"] = false
params["limit"] = 24
params["EnableTotalRecordCount"] = false
maxDaysInNextUp = get_user_setting("ui.details.maxdaysnextup", "365")
if isValid(maxDaysInNextUp)
@ -64,9 +69,6 @@ sub loadItems()
dateCutoff.FromSeconds(dateToday.AsSeconds() - (maxDaysInNextUp * 86400))
params["NextUpDateCutoff"] = dateCutoff.ToISOString()
params["EnableRewatching"] = false
params["DisableFirstEpisode"] = false
params["limit"] = 24
end if
end if
@ -88,6 +90,7 @@ sub loadItems()
params["SortBy"] = "DatePlayed"
params["SortOrder"] = "Descending"
params["Filters"] = "IsResumable"
params["EnableTotalRecordCount"] = false
resp = APIRequest(url, params)
data = getJson(resp)
@ -109,6 +112,7 @@ sub loadItems()
params["Limit"] = 20
params["recursive"] = true
params["sortby"] = "random"
params["EnableTotalRecordCount"] = false
resp = APIRequest(url, params)
data = getJson(resp)

View File

@ -243,8 +243,8 @@ function getRelativeDayName(date) as string
end if
' Check for Yesterday
todayMidnight = now.AsSeconds() - (now.AsSeconds() MOD 86400)
dateMidnight = date.AsSeconds() - (date.AsSeconds() MOD 86400)
todayMidnight = now.AsSeconds() - (now.AsSeconds() mod 86400)
dateMidnight = date.AsSeconds() - (date.AsSeconds() mod 86400)
if todayMidnight - dateMidnight = 86400
return "yesterday"
@ -266,8 +266,8 @@ function getDurationStringFromSeconds(seconds) as string
minutes = seconds / 60.0
if minutes > 60
hours = (minutes - (minutes MOD 60)) / 60
minutes = minutes MOD 60
hours = (minutes - (minutes mod 60)) / 60
minutes = minutes mod 60
end if
if hours > 0

View File

@ -187,6 +187,11 @@ function onKeyEvent(key as string, press as boolean) as boolean
return true
end if
if key = "options"
m.global.sceneManager.callFunc("popScene")
return true
end if
if key = "right"
settingSelected()
end if

View File

@ -8,6 +8,11 @@ sub init()
m.rating = m.top.findnode("rating")
m.infoBar = m.top.findnode("infoBar")
m.progressBackground = m.top.findNode("progressBackground")
m.progressBar = m.top.findnode("progressBar")
m.playedIndicator = m.top.findNode("playedIndicator")
m.checkmark = m.top.findNode("checkmark")
m.checkmark.font.size = 35
end sub
sub itemContentChanged()
@ -64,6 +69,20 @@ sub itemContentChanged()
m.infoBar.itemSpacings = [20, -25, 20, 20]
end if
' Add checkmark in corner (if applicable)
if isValid(itemData?.UserData?.Played) and itemData.UserData.Played = true
m.playedIndicator.visible = true
end if
' Add progress bar on bottom (if applicable)
if isValid(itemData?.UserData?.PlayedPercentage) and itemData?.UserData?.PlayedPercentage > 0
m.progressBackground.width = m.poster.width
m.progressBackground.visible = true
progressWidthInPixels = int(m.progressBackground.width * itemData.UserData.PlayedPercentage / 100)
m.progressBar.width = progressWidthInPixels
m.progressBar.visible = true
end if
videoIdx = invalid
audioIdx = invalid

View File

@ -2,8 +2,15 @@
<component name="TVListDetails" extends="Group">
<children>
<LayoutGroup id="toplevel" layoutDirection="vert" itemSpacings="[40]">
<LayoutGroup id="main_group" layoutDirection="horiz" itemSpacings="[30]">
<Poster id="poster" width="350" height="300" />
<LayoutGroup id="main_group" layoutDirection="horiz" itemSpacings="[30]">
<Poster id="poster" width="350" height="300" loadDisplayMode="scaleToZoom">
<Rectangle id="playedIndicator" color="#00a4dcFF" width="60" height="46" visible="false" translation="[290, 0]">
<Label id="checkmark" width="60" height="42" font="font:SmallestBoldSystemFont" horizAlign="center" vertAlign="bottom" text="✓"/>
</Rectangle>
<Rectangle id="progressBackground" visible="false" color="0x00000098" width="350" height="16" translation="[0,286]">
<Rectangle id="progressBar" color="#00a4dcFF" width="0" height="16" visible="false"/>
</Rectangle>
</Poster>
<LayoutGroup id="text" layoutDirection="vert" itemSpacings="[15]">
<!-- Using poster of 1 length to get spacing. Not successful with adding translation to title -->
<Poster id="null" height="1" />

View File

@ -9522,5 +9522,349 @@
<source>Disabled</source>
<translation>Deaktiviert</translation>
</message>
<message>
<source>Default view for Movie Libraries.</source>
<translation>Standard Ansicht für Film Sammlungen.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Movie Library Grid Titles</source>
<translation>Film Sammlung Grid Titel</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Select when to show titles.</source>
<translation>Wähle aus wann Serientitel gezeigt werden sollen.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Show On Hover</source>
<translation>Beim Hovern anzeigen</translation>
</message>
<message>
<source>Always Show</source>
<translation>Immer zeigen</translation>
</message>
<message>
<source>Always Hide</source>
<translation>Niemals anzeigen</translation>
</message>
<message>
<source>Media Grid</source>
<translation>Medien Anordnung</translation>
<extracomment>UI -&gt; Media Grid section in user setting screen.</extracomment>
</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 &quot;Wiederholen&quot;, um langsam zum ersten Element im Ordner zu überblenden. (Wenn diese Funktion deaktiviert ist, wird der Ordner sofort zum ersten Element zurückgesetzt).</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>If enabled, selecting a TV series with only one season will go straight to the episode list rather than the show details and season list.</source>
<translation>Wenn diese Option aktiviert ist, führt die Auswahl einer TV-Serie mit nur einer Staffel direkt zur Episodenliste und nicht zu den Showdetails und der Staffelliste.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin&apos;s screensaver background. Jellyfin will need to be closed and reopened for change to take effect.</source>
<translation>Generierten Splashscreen als Jellyfin&apos;s Bildschirmschoner verwenden. Jellyfin muss neu geöffnet werden, damit die Änderung wirksam wird.</translation>
</message>
<message>
<source>Use Splashscreen as Home Background</source>
<translation>Startbildschirm als Hintergrund verwenden</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Use generated splashscreen image as Jellyfin&apos;s home background. Jellyfin will need to be closed and reopened for change to take effect.</source>
<translation>Generierten Startbildschirm als Jellyfins Hintergrund verwenden. Jellyfin muss neu geöffnet werden, damit die Änderung wirksam wird.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Next episode</source>
<translation>Nächste Folge</translation>
</message>
<message>
<source>Set the maximum amount of days a show should stay in the &apos;Next Up&apos; list without watching it.</source>
<translation>Legen Sie die maximale Anzahl von Tagen fest, die eine Serie in der Liste &quot;Als Nächstes&quot; verbleiben soll, ohne dass sie angesehen wird.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Text Subtitles Only</source>
<translation>Nur Text Untertitel</translation>
<extracomment>Name of a setting - should we hide subtitles that might transcode</extracomment>
</message>
<message>
<source>Show What&apos;s New popup when Jellyfin is updated to a new version.</source>
<translation>Zeige Was ist neu Popup nach einem Jellyfin update.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Resumable</source>
<translation>fortsetzen</translation>
</message>
<message>
<source>Movie Library Default View</source>
<translation>Film Sammlung standard Ansicht</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>If enabled, the star and community rating for episodes of a TV show will be removed. This is to prevent spoilers of an upcoming good/bad episode.</source>
<translation>Wenn ausgewählt, wird das Sterne und Benutzerbewertungssystem entfernt. Dies ist um spoilern vorzubeugen.</translation>
</message>
<message>
<source>Options that alter the design of Jellyfin.</source>
<translation>Einstellungen für das Aussehen Jellyfins.</translation>
<extracomment>Description for Design Elements user settings.</extracomment>
</message>
<message>
<source>Cinema Mode</source>
<translation>Kinomodus</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>Der Kinomodus bringt das Kinoerlebnis direkt in Ihr Wohnzimmer und bietet die Möglichkeit, benutzerdefinierte Intros vor dem Hauptfilm abzuspielen.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Hide Clock</source>
<translation>Uhr ausblenden</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Hides all clocks in Jellyfin. Jellyfin will need to be closed and reopened for change to take effect.</source>
<translation>Blendet alle Uhren in Jellyfin aus. Jellyfin muss neu gestartet werden, damit die Änderung wirksam wird.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Play Trailer</source>
<translation>Trailer abspielen</translation>
</message>
<message>
<source>H.264</source>
<translation>H.264</translation>
<extracomment>Name of codec used in settings menu</extracomment>
</message>
<message>
<source>HEVC</source>
<translation>HEVC</translation>
<extracomment>Name of codec used in settings menu</extracomment>
</message>
<message>
<source>Transcoding Information</source>
<translation>Transkodierung-Information</translation>
</message>
<message>
<source>Video Codec</source>
<translation>Video-Codec</translation>
</message>
<message>
<source>Audio Codec</source>
<translation>Audio-Codec</translation>
</message>
<message>
<source>direct</source>
<translation>direkt</translation>
</message>
<message>
<source>Audio Channels</source>
<translation>Audiokanäle</translation>
</message>
<message>
<source>Codec Tag</source>
<translation>Codec-Tag</translation>
</message>
<message>
<source>Bit Rate</source>
<translation>Bitrate</translation>
<extracomment>Video streaming bit rate</extracomment>
</message>
<message>
<source>Container</source>
<translation>Container</translation>
<extracomment>Video streaming container</extracomment>
</message>
<message>
<source>Video range type</source>
<translation>Video-Spektrum</translation>
</message>
<message>
<source>Pixel format</source>
<translation>Pixelformat</translation>
<extracomment>Video pixel format</extracomment>
</message>
<message>
<source>Unable to find any albums or songs belonging to this artist</source>
<translation>Es konnten keine Alben oder Lieder dieses Künstlers gefunden werden</translation>
<extracomment>Popup message when we find no audio data for an artist</extracomment>
</message>
<message>
<source>Only display text subtitles to minimize transcoding.</source>
<translation>Zeige nur Text Untertitel um Transkodierungen zu minimieren.</translation>
<extracomment>Description of a setting - should we hide subtitles that might transcode</extracomment>
</message>
<message>
<source>Slideshow Off</source>
<translation>Diashow aus</translation>
</message>
<message>
<source>Slideshow On</source>
<translation>Diashow an</translation>
</message>
<message>
<source>Slideshow Paused</source>
<translation>Diashow pausiert</translation>
</message>
<message>
<source>Slideshow Resumed</source>
<translation>Diashow fortgesetzt</translation>
</message>
<message>
<source>MPEG-4 Support</source>
<translation>MPEG-4 Unterstützung</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Show What&apos;s New Popup</source>
<translation>Serie Was ist neu Popup</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Options for TV Shows.</source>
<translation>Serien-Einstellungen.</translation>
<extracomment>Description for TV Shows user settings.</extracomment>
</message>
<message>
<source>Home Page</source>
<translation>Startseite</translation>
</message>
<message>
<source>Max Days Next Up</source>
<translation>Max. Tage im &quot;Als Nächstes&quot; Bereich</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
<source>Playback Information</source>
<translation>Wiedergabeinformation</translation>
</message>
<message>
<source>Stream Information</source>
<translation>Stream Informationen</translation>
</message>
<message>
<source>WxH</source>
<translation>Breite x Höhe</translation>
<extracomment>Video width x height</extracomment>
</message>
<message>
<source>all</source>
<translation>Alle</translation>
<extracomment>all will reset the searchTerm so all data will be availible</extracomment>
</message>
<message>
<source>Aired</source>
<translation>Ausgestrahlt</translation>
<extracomment>Aired date label</extracomment>
</message>
<message>
<source>Artists (Presentation)</source>
<translation>Künstlerinnenvorstellung</translation>
</message>
<message>
<source>Song</source>
<translation>Musiktitel</translation>
</message>
<message>
<source>Songs</source>
<translation>Lieder</translation>
</message>
<message>
<source>Album</source>
<translation>Album</translation>
</message>
<message>
<source>Albums</source>
<translation>Alben</translation>
</message>
<message>
<source>View All</source>
<translation>Alle anzeigen</translation>
</message>
<message>
<source>Disable Community Rating for Episodes</source>
<translation>Deaktiviere Community Bewertungen für Episoden</translation>
</message>
<message>
<source>Artists (Grid)</source>
<translation>Künstler (Gitter)</translation>
</message>
<message>
<source>Item Count</source>
<translation>Dateien-Anzahl</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Count in user setting screen.</extracomment>
</message>
<message>
<source>Media Grid options.</source>
<translation>Medien Anordnung Optionen.</translation>
</message>
<message>
<source>Design Elements</source>
<translation>Designelemente</translation>
</message>
<message>
<source>Settings relating to how the application looks.</source>
<translation>Einstellungen zum Aussehen des Programms.</translation>
</message>
<message>
<source>Settings relating to playback and supported codec and media types.</source>
<translation>Einstellungen für die Wiedergabe und unterstützte Codec- und Medientypen.</translation>
</message>
<message>
<source>Reason</source>
<translation>Grund</translation>
</message>
<message>
<source>Total Bitrate</source>
<translation>Gesamte Bitrate</translation>
</message>
<message>
<source>Codec</source>
<translation>Codec</translation>
</message>
<message>
<source>Size</source>
<translation>Größe</translation>
<extracomment>Video size</extracomment>
</message>
<message>
<source>Random On</source>
<translation>Zufällig an</translation>
</message>
<message>
<source>Random Off</source>
<translation>Zufällig aus</translation>
</message>
<message>
<source>Played</source>
<translation>gespielt</translation>
</message>
<message>
<source>Unplayed</source>
<translation>nicht gespielt</translation>
</message>
<message>
<source>Item Titles</source>
<translation>Dateien-Titel</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>Level</source>
<translation>Level</translation>
<extracomment>Video profile level</extracomment>
</message>
<message>
<source>Options for Home Page.</source>
<translation>Einstellungen für die Startseite.</translation>
<extracomment>Description for Home Page user settings.</extracomment>
</message>
</context>
</TS>

View File

@ -2974,5 +2974,86 @@
<source>View All</source>
<translation>View All</translation>
</message>
<message>
<source>Select when to show titles.</source>
<translation>Select when to show titles.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Show On Hover</source>
<translation>Show On Hover</translation>
</message>
<message>
<source>Always Show</source>
<translation>Always Show</translation>
</message>
<message>
<source>Always Hide</source>
<translation>Always Hide</translation>
</message>
<message>
<source>Album</source>
<translation>Album</translation>
</message>
<message>
<source>Artists (Grid)</source>
<translation>Artists (Grid)</translation>
</message>
<message>
<source>Song</source>
<translation>Song</translation>
</message>
<message>
<source>Artists (Presentation)</source>
<translation>Artists (Presentation)</translation>
</message>
<message>
<source>Songs</source>
<translation>Songs</translation>
</message>
<message>
<source>Albums</source>
<translation>Albums</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Delete Saved</translation>
</message>
<message>
<source>On Now</source>
<translation>On Now</translation>
</message>
<message>
<source>Age</source>
<translation>Age</translation>
</message>
<message>
<source>Died</source>
<translation>Died</translation>
</message>
<message>
<source>More Like This</source>
<translation>More Like This</translation>
</message>
<message>
<source>Born</source>
<translation>Born</translation>
</message>
<message>
<source>Special Features</source>
<translation>Special Features</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Save Credentials?</translation>
</message>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Press &apos;OK&apos; to Close</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Cast &amp; Crew</translation>
</message>
</context>
</TS>

View File

@ -557,16 +557,6 @@
<source>Media Grid options.</source>
<translation>Media Grid options.</translation>
</message>
<message>
<source>Item Titles</source>
<translation>Item Titles</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>Always show the titles below the poster images. (If disabled, the title will be shown under the highlighted item only).</source>
<translation>Always show the titles below the poster images. (If disabled, the title will be shown under the highlighted item only).</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Item Count</source>
<translation>Item Count</translation>
@ -660,15 +650,6 @@
<translation>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).</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Details Page</source>
<translation>Details Page</translation>
</message>
<message>
<source>Options for Details pages.</source>
<translation>Options for Details pages.</translation>
<extracomment>Description for Details page user settings.</extracomment>
</message>
<message>
<source>Hide Taglines</source>
<translation>Hide Taglines</translation>
@ -712,8 +693,8 @@
<extracomment>Description for Screensaver user settings.</extracomment>
</message>
<message>
<source>Use Splashscreen as Screensaver Background</source>
<translation>Use Splashscreen as Screensaver Background</translation>
<source>Use Splashscreen as Screensaver</source>
<translation>Use Splashscreen as Screensaver</translation>
<extracomment>Option Title in user setting screen</extracomment>
</message>
<message>
@ -795,15 +776,6 @@
<source>Settings relating to how the application looks.</source>
<translation>Settings relating to how the application looks.</translation>
</message>
<message>
<source>Home Page</source>
<translation>Home Page</translation>
</message>
<message>
<source>Options for Home Page.</source>
<translation>Options for Home Page.</translation>
<extracomment>Description for Home Page user settings.</extracomment>
</message>
<message>
<source>Max Days Next Up</source>
<translation>Max Days Next Up</translation>
@ -992,9 +964,9 @@
<translation>Movies (Grid)</translation>
</message>
<message>
<source>Movie Library Grid Titles</source>
<translation>Movie Library Grid Titles</translation>
<extracomment>Settings Menu - Title for option</extracomment>
<source>Item Titles</source>
<translation>Item Titles</translation>
<extracomment>Title of a setting - when should we show the title text of a grid item</extracomment>
</message>
<message>
<source>Select when to show titles.</source>
@ -1057,5 +1029,47 @@
<source>Enable or disable limiting video bitrates based on Roku's specifications.</source>
<translation>Enable or disable limiting video bitrates based on Roku's specifications.</translation>
</message>
<message>
<source>Libraries</source>
<translation>Libraries</translation>
</message>
<message>
<source>Settings relating to the appearance of Library pages</source>
<translation>Settings relating to the appearance of Library pages</translation>
</message>
<message>
<source>General</source>
<translation>General</translation>
</message>
<message>
<source>Settings relating to the appearance of the Home screen and the program in general.</source>
<translation>Settings relating to the appearance of the Home screen and the program in general.</translation>
</message>
<message>
<source>Grid View Settings</source>
<translation>Grid View Settings</translation>
</message>
<message>
<source>Settings that apply when Grid views are enabled.</source>
<translation>Settings that apply when Grid views are enabled.</translation>
</message>
<message>
<source>Settings relating to the appearance of pages in TV Libraries.</source>
<translation>Settings relating to the appearance of pages in TV Libraries.</translation>
</message>
<message>
<source>Settings relating to the appearance of pages in Movie Libraries.</source>
<translation>Settings relating to the appearance of pages in Movie Libraries.</translation>
</message>
<message>
<source>Presentation</source>
<translation>Presentation</translation>
<extracomment>Title of an option - name of presentation view</extracomment>
</message>
<message>
<source>Grid</source>
<translation>Grid</translation>
<extracomment>Title of an option - name of grid view</extracomment>
</message>
</context>
</TS>

View File

@ -1713,5 +1713,41 @@
<translation>Domingo</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>%1 of %2</source>
<translation>%1 de %2</translation>
<extracomment>Item position and count. %1 = current item. %2 = total number of items</extracomment>
</message>
<message>
<source>Details Page</source>
<translation>Detalles</translation>
</message>
<message>
<source>Options that alter the design of Jellyfin.</source>
<translation>Opciones que alteran el diseño de Jellyfin.</translation>
<extracomment>Description for Design Elements user settings.</extracomment>
</message>
<message>
<source>Size</source>
<translation>Tamaño</translation>
<extracomment>Video size</extracomment>
</message>
<message>
<source>Aired</source>
<translation>Transmitido</translation>
<extracomment>Aired date label</extracomment>
</message>
<message>
<source>Album</source>
<translation>Álbum</translation>
</message>
<message>
<source>Albums</source>
<translation>Álbumes</translation>
</message>
<message>
<source>Song</source>
<translation>Canción</translation>
</message>
</context>
</TS>

View File

@ -1345,5 +1345,14 @@
<translation>Error al recuperar contenido</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>Song</source>
<translation>Canción</translation>
</message>
<message>
<source>Size</source>
<translation>Tamaño</translation>
<extracomment>Video size</extracomment>
</message>
</context>
</TS>

View File

@ -2203,5 +2203,543 @@
<source>Change Server</source>
<translation>Cambiar Servidor</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Borrar Credenciales</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Puntuación de la crítica</translation>
</message>
<message>
<source>Age</source>
<translation>Edad</translation>
</message>
<message>
<source>today</source>
<translation>hoy</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>Died</source>
<translation>Muerto/a</translation>
</message>
<message>
<source>IMDB_RATING</source>
<translation>Puntuación de IMDb</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Reparto y equipo</translation>
</message>
<message>
<source>Saturday</source>
<translation>Sábado</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Repeat</source>
<translation>Repetir</translation>
<extracomment>If TV Shows has previously been broadcasted</extracomment>
</message>
<message>
<source>Media Grid</source>
<translation>Cuadrícula de medios</translation>
<extracomment>UI -&gt; Media Grid section in user setting screen.</extracomment>
</message>
<message>
<source>Sign Out</source>
<translation>Cerrar sesión</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>¿Guardar credenciales?</translation>
</message>
<message>
<source>Error During Playback</source>
<translation>Error durante la reproducción</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Ha ocurrido un error al reproducir este contenido.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Reproduciendo contenido del canal</translation>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Error de reproducción de contenido del canal</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Nombre</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Fecha en que se agregó</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Fecha de reproducción</translation>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Control Parental</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Fecha de estreno</translation>
</message>
<message>
<source>RUNTIME</source>
<translation>Tiempo de duración</translation>
</message>
<message>
<comment>Title of Tab for switching &quot;views&quot; when looking at a library</comment>
<source>TAB_VIEW</source>
<translation>Vista</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Clasificar</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Filtro</translation>
</message>
<message>
<source>Special Features</source>
<translation>Funciones especiales</translation>
</message>
<message>
<source>Unable to load Channel Data from the server</source>
<translation>No se ha podido reproducir el contenido del canal de este servidor</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Conteo de reproducción</translation>
</message>
<message>
<source>On Now</source>
<translation>En directo ahora</translation>
</message>
<message>
<source>Error Retrieving Content</source>
<translation>Error recuperando contenido</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Ha ocurrido un error al tratar de recuperar la información de este contenido desde el servidor.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</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>Este %1 no contiene elementos</translation>
</message>
<message>
<source>Born</source>
<translation>Nacido/a</translation>
</message>
<message>
<source>More Like This</source>
<translation>Mas de este estilo</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation>Se ha encontrado un error al reproducir este elemento. El servidor no proveyó la información necesaria para la transcodificación.</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>Use voice remote to search</source>
<translation>Utilizar la búsqueda remota por voz</translation>
<extracomment>Help text in search voice text box</extracomment>
</message>
<message>
<source>Movies (Presentation)</source>
<translation>Películas (presentación)</translation>
</message>
<message>
<source>Movies (Grid)</source>
<translation>Películas (cuadrícula)</translation>
</message>
<message>
<source>TV Shows</source>
<translation>Programas de televisión</translation>
</message>
<message>
<source>yesterday</source>
<translation>ayer</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>mañana</translation>
<extracomment>Next day</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>Jueves</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>Viernes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Started at</source>
<translation>Comenzó a las</translation>
<extracomment>(Past Tense) For defining time when a program started today (e.g. Started at 08:00) </extracomment>
</message>
<message>
<source>Starts at</source>
<translation>Comienza a las</translation>
<extracomment>(Future Tense) For defining time when a program will start today (e.g. Starts at 08:00) </extracomment>
</message>
<message>
<source>Live</source>
<translation>En vivo</translation>
<extracomment>If TV Show is being broadcast live (not pre-recorded)</extracomment>
</message>
<message>
<source>TV Guide</source>
<translation>Guía de televisión</translation>
<extracomment>Menu option for showing Live TV Guide / Schedule</extracomment>
</message>
<message>
<source>Record Series</source>
<translation>Grabar serie</translation>
</message>
<message>
<source>Cancel Recording</source>
<translation>Cancelar la grabación</translation>
</message>
<message>
<source>Cancel Series Recording</source>
<translation>Cancelar la grabación de la serie</translation>
</message>
<message>
<source>Close</source>
<translation>Cerrar</translation>
</message>
<message>
<source>Connecting to Server</source>
<translation>Conectando con el servidor</translation>
<extracomment>Message to display to user while client is attempting to connect to the server</extracomment>
</message>
<message>
<source>Not found</source>
<translation>No se ha encontrado</translation>
<extracomment>Title of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Unknown</source>
<translation>Desconocido</translation>
<extracomment>Title for a cast member for which we have no information for</extracomment>
</message>
<message>
<source>The requested content does not exist on the server</source>
<translation>El contenido solicitado no existe en el servidor</translation>
<extracomment>Content of message box when the requested content is not found on the server</extracomment>
</message>
<message>
<source>Enter the server name or IP address</source>
<translation>Agregar el nombre del servidor o su dirección de IP</translation>
<extracomment>Title of KeyboardDialog when manually entering a server URL</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Elige un servidor Jellyfin disponible en la red local:</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</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>Soporte de reproducción directa para contenido MPEG-2 (ej., televisión en vivo). Esto previene la transcodificación de contenido MPEG-2, pero a mayor uso de ancho de banda.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files.</source>
<translation>Soporte de reproducción directa para contenido MPEG-4. Esto podría requerir ser deshabilitado para poder reproducir los archivos de video con encodificación DIVX.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>** EXPERIMENTAL** Support Direct Play of AV1 content if this Roku device supports it.</source>
<translation>**EXPERIMENTAL** Soporte de reproducción directa para contenido AV1 si este dispositivo Roku es compatible.</translation>
<extracomment>Description of a setting - should we try to direct play experimental av1 codec</extracomment>
</message>
<message>
<source>Always show the titles below the poster images. (If disabled, the title will be shown under the highlighted item only).</source>
<translation>Siempre mostrar los títulos por debajo de las imágenes de cartelera. (Si se deshabilita, el título se mostrará debajo del elemento resaltado solamente).</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Item Count</source>
<translation>Conteo de elementos</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Count in user setting screen.</extracomment>
</message>
<message>
<source>Show item count in the library and index of selected item.</source>
<translation>Mostrar el conteo de elementos en la biblioteca y en el índice del elemento seleccionado.</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Set Favorite</source>
<translation>Agregar a favoritos</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</extracomment>
</message>
<message>
<source>Set Watched</source>
<translation>Marcar como visto</translation>
<extracomment>Button Text - When pressed, marks item as Warched</extracomment>
</message>
<message>
<source>Go to series</source>
<translation>Ir a serie</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Series Detail Page</extracomment>
</message>
<message>
<source>Go to season</source>
<translation>Ir a la temporada</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Season Page</extracomment>
</message>
<message>
<source>Go to episode</source>
<translation>Ir al episodio</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Episode Detail Page</extracomment>
</message>
<message>
<source>Search now</source>
<translation>Buscar ahora</translation>
<extracomment>Help text in search Box</extracomment>
</message>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Presiona &apos;OK&apos; para cerrar</translation>
</message>
<message>
<source>Additional Parts</source>
<translation>Partes adicionales</translation>
<extracomment>Additional parts of a video</extracomment>
</message>
<message>
<source>Movies</source>
<translation>Películas</translation>
</message>
<message>
<source>Sunday</source>
<translation>Domingo</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>Lunes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Tuesday</source>
<translation>Martes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>Miércoles</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Starts</source>
<translation>Comienza a las</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>Ended at</source>
<translation>Terminó a las</translation>
<extracomment>(Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) </extracomment>
</message>
<message>
<source>Ends at</source>
<translation>Termina a las</translation>
<extracomment>(Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Channels</source>
<translation>Canales</translation>
<extracomment>Menu option for showing Live TV Channel List</extracomment>
</message>
<message>
<source>View Channel</source>
<translation>Ver Canal</translation>
</message>
<message>
<source>Record</source>
<translation>Grabar</translation>
</message>
<message>
<source>...or enter server URL manually:</source>
<translation>Si no hay servidores disponibles, puedes agregar manualmente la URL:</translation>
<extracomment>Instructions on initial app launch when the user is asked to manually enter a server URL</extracomment>
</message>
<message>
<source>Error Getting Playback Information</source>
<translation>Error obteniendo la Información de reproducción</translation>
<extracomment>Dialog Title: Received error from server when trying to get information about the selected item for playback</extracomment>
</message>
<message>
<source>Version</source>
<translation>Versión</translation>
</message>
<message>
<source>Playback</source>
<translation>Reproducción</translation>
<extracomment>Title for Playback section in user setting screen.</extracomment>
</message>
<message>
<source>User Interface</source>
<translation>Interfaz de usuario</translation>
<extracomment>Title for User Interface section in user setting screen.</extracomment>
</message>
<message>
<source>Media Grid options.</source>
<translation>Opciones de la cuadrícula de medios.</translation>
</message>
<message>
<source>Codec Support</source>
<translation>Soporte de Codec</translation>
<extracomment>Settings Menu - Title for settings group related to codec support</extracomment>
</message>
<message>
<source>Enable or disable Direct Play for optional codecs</source>
<translation>Habilitar o desactivar la reproducción directa para codecs opcionales</translation>
<extracomment>Settings Menu - Title for settings group related to codec support</extracomment>
</message>
<message>
<source>MPEG-2</source>
<translation>MPEG-2</translation>
<extracomment>Name of codec used in settings menu</extracomment>
</message>
<message>
<source>MPEG-4</source>
<translation>MPEG-4</translation>
<extracomment>Name of codec used in settings menu</extracomment>
</message>
<message>
<source>AV1</source>
<translation>AV1</translation>
<extracomment>Name of a setting - should we try to direct play experimental av1 codec</extracomment>
</message>
<message>
<source>Item Titles</source>
<translation>Títulos de elementos</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>Started</source>
<translation>Comenzó a las</translation>
<extracomment>(Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Enabled</source>
<translation>Activado</translation>
</message>
<message>
<source>Disabled</source>
<translation>Desactivado</translation>
</message>
<message>
<source>Shows</source>
<translation>espectáculos</translation>
</message>
<message>
<source>Quick Connect</source>
<translation>Conexión rápida</translation>
</message>
<message>
<source>(Dialog will close automatically)</source>
<translation>(El diálogo se cerrará automáticamente)</translation>
</message>
<message>
<source>Return to Top</source>
<translation>Vuelva a la parte superior</translation>
<extracomment>UI -&gt; Media Grid -&gt; Item Title in user setting screen.</extracomment>
</message>
<message>
<source>You can search for Titles, People, Live TV Channels and more</source>
<translation>Puede buscar títulos, personas, canales de TV en vivo y más</translation>
<extracomment>Help text in search results</extracomment>
</message>
<message>
<source>Here is your Quick Connect code:</source>
<translation>Aquí está su código de conexión rápida:</translation>
</message>
<message>
<source>There was an error authenticating via Quick Connect.</source>
<translation>Hubo un error al autenticarse a través de Quick Connect.</translation>
</message>
<message>
<source>Networks</source>
<translation>Redes</translation>
</message>
<message>
<source>Studios</source>
<translation>Estudios</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>Use el botón de reproducción para animar lentamente al primer elemento de la carpeta. (Si está deshabilitado, la carpeta se restablecerá al primer elemento inmediatamente).</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Pick a Jellyfin server from the local network</source>
<translation>Eliga un servidor Jellyfin disponible en la red local:</translation>
<extracomment>Instructions on initial app launch when the user is asked to pick a server from a list</extracomment>
</message>
<message>
<source>%1 of %2</source>
<translation>%1 de %2</translation>
<extracomment>Item position and count. %1 = current item. %2 = total number of items</extracomment>
</message>
<message>
<source>Options for Jellyfin&apos;s screensaver.</source>
<translation>Opciones para el protector de pantalla de Jellyfin.</translation>
<extracomment>Description for Screensaver user settings.</extracomment>
</message>
<message>
<source>Next episode</source>
<translation>Siguiente episodio</translation>
</message>
<message>
<source>Size</source>
<translation>Tamaño</translation>
<extracomment>Video size</extracomment>
</message>
<message>
<source>Song</source>
<translation>Canción</translation>
</message>
<message>
<source>Play Trailer</source>
<translation>Reproducir Trailer</translation>
</message>
<message>
<source>Screensaver</source>
<translation>Protector de pantalla</translation>
</message>
<message>
<source>Options that alter the design of Jellyfin.</source>
<translation>Opciones que alteran el diseño de Jellyfin.</translation>
<extracomment>Description for Design Elements user settings.</extracomment>
</message>
<message>
<source>Cinema Mode</source>
<translation>Modo Cine</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
</context>
</TS>

View File

@ -1124,5 +1124,53 @@
<source>Change Server</source>
<translation>Changer de serveur</translation>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Chargement des données de la chaîne</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>On Now</source>
<translation>En ce moment</translation>
</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>
<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>Change Server</source>
<translation>Changer de serveur</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Se déconnecter</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Sauvegarder les informations d&apos;authentification?</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Supprimer les valeurs enregistrées</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>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 depuis le serveur.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</message>
</context>
</TS>

View File

@ -10102,5 +10102,82 @@ elemeket</translation>
<translation>MPEG-4 Támogatás</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Album</source>
<translation>Album</translation>
</message>
<message>
<source>View All</source>
<translation>Mutassa Mind</translation>
</message>
<message>
<source>Default view for Movie Libraries.</source>
<translation>Alapértelmezett nézet Filmkönyvtáraknak.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Movie Library Grid Titles</source>
<translation>Filmkönyvtár Rácscímek</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Show On Hover</source>
<translation>Mutassa Rámutatáskor</translation>
</message>
<message>
<source>Always Show</source>
<translation>Mindig Mutassa</translation>
</message>
<message>
<source>Always Hide</source>
<translation>Sose Mutassa</translation>
</message>
<message>
<source>Albums</source>
<translation>Albumok</translation>
</message>
<message>
<source>Show What&apos;s New popup when Jellyfin is updated to a new version.</source>
<translation>Újdonságok felugró ablak mutatása miután a Jellyfin a legújabb verzióra frissült.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>Movie Library Default View</source>
<translation>Filmkönyvtár Alapértelmezett Nézet</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Select when to show titles.</source>
<translation>Válaszd ki mikor mutassa a címeket.</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>If enabled, the star and community rating for episodes of a TV show will be removed. This is to prevent spoilers of an upcoming good/bad episode.</source>
<translation>Ha bekapcsolja, akkor a csillagok és a közösség általi értékelések el lesznek rejtve a sorozatok epizódjainál, hogy elkerülhetőek legyenek a spoilerek a közelgő /rossz epizódoknál.</translation>
</message>
<message>
<source>Song</source>
<translation>Zene</translation>
</message>
<message>
<source>Songs</source>
<translation>Zenék</translation>
</message>
<message>
<source>Disable Community Rating for Episodes</source>
<translation>Közösségi Minősítés Kikapcsolása az Epizódoknál</translation>
</message>
<message>
<source>Played</source>
<translation>Lejátszott</translation>
</message>
<message>
<source>Resumable</source>
<translation>Folytatható</translation>
</message>
<message>
<source>Unplayed</source>
<translation>Nem játszott</translation>
</message>
</context>
</TS>

View File

@ -1952,5 +1952,13 @@
<source>Change Server</source>
<translation>Cambia server</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Esci</translation>
</message>
<message>
<source>Change Server</source>
<translation>Cambia Server</translation>
</message>
</context>
</TS>

View File

@ -2643,5 +2643,53 @@ não contém itens</translation>
<source>OFFICIAL_RATING</source>
<translation>Classificação Etária</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Sair</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Salvar Credenciais?</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Deletar Salvos</translation>
</message>
<message>
<source>Error During Playback</source>
<translation>Erro Durante a Reprodução</translation>
<extracomment>Dialog title when error occurs during playback</extracomment>
</message>
<message>
<source>Change Server</source>
<translation>Mudar Servidor</translation>
</message>
<message>
<source>Error Retrieving Content</source>
<translation>Erro ao Carregar Conteúdo</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Carregando Dados do Canal</translation>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Foi encontrado um erro na reprodução deste item.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment>
</message>
<message>
<source>On Now</source>
<translation>Em Exibição</translation>
</message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Houve um erro ao recuperar os dados deste item do servidor.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Erro ao carregar os Dados do Canal</translation>
</message>
</context>
</TS>

View File

@ -958,5 +958,169 @@
<translation>Prehrávanie</translation>
<extracomment>Title for Playback section in user setting screen.</extracomment>
</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>Tento %1 neobsahuje žiadne položky</translation>
</message>
<message>
<source>Tuesday</source>
<translation>utorok</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>piatok</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>IMDB_RATING</source>
<translation>Hodnotenie IMDb</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Dátum vydania</translation>
</message>
<message>
<comment>Title of Tab for switching &quot;views&quot; when looking at a library</comment>
<source>TAB_VIEW</source>
<translation>Zobrazenie</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Uložiť prihlasovacie údaje?</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Dátum prehrania</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Obsadenie a štáb</translation>
</message>
<message>
<source>Movies</source>
<translation>Filmy</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Meno</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Odstrániť uložené</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Dátum pridania</translation>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Rodičovské hodnotenie</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Počet prehraní</translation>
</message>
<message>
<source>RUNTIME</source>
<translation>Dĺžka</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Zoradenie</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Filter</translation>
</message>
<message>
<source>Born</source>
<translation>Dátum narodenia</translation>
</message>
<message>
<source>Died</source>
<translation>Dátum úmrtia</translation>
</message>
<message>
<source>Age</source>
<translation>Vek</translation>
</message>
<message>
<source>More Like This</source>
<translation>Viac podobných</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Hodnotenie kritikov</translation>
</message>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Zatvorte stlačením tlačidla &apos;OK&apos;</translation>
</message>
<message>
<source>Special Features</source>
<translation>Špeciálne Funkcie</translation>
</message>
<message>
<source>Additional Parts</source>
<translation>Dodatočné Časti</translation>
<extracomment>Additional parts of a video</extracomment>
</message>
<message>
<source>yesterday</source>
<translation>včera</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>Sunday</source>
<translation>nedeľa</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>pondelok</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>streda</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>štvrtok</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Saturday</source>
<translation>sobota</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Movies (Presentation)</source>
<translation>Filmy (prezentácia)</translation>
</message>
<message>
<source>Movies (Grid)</source>
<translation>Filmy (mriežka)</translation>
</message>
<message>
<source>TV Shows</source>
<translation>TV Seriály</translation>
</message>
<message>
<source>today</source>
<translation>dnes</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>zajtra</translation>
<extracomment>Next day</extracomment>
</message>
</context>
</TS>

35
package-lock.json generated
View File

@ -1345,14 +1345,14 @@
}
},
"node_modules/jszip": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"dependencies": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"set-immediate-shim": "~1.0.1"
"setimmediate": "^1.0.5"
}
},
"node_modules/latinize": {
@ -2007,13 +2007,10 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
"node_modules/set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
"engines": {
"node": ">=0.10.0"
}
"node_modules/setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"node_modules/sob": {
"name": "slide-out-button",
@ -3422,14 +3419,14 @@
}
},
"jszip": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"version": "3.10.1",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
"integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"requires": {
"lie": "~3.3.0",
"pako": "~1.0.2",
"readable-stream": "~2.3.6",
"set-immediate-shim": "~1.0.1"
"setimmediate": "^1.0.5"
}
},
"latinize": {
@ -3914,10 +3911,10 @@
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
},
"set-immediate-shim": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
"setimmediate": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
"integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
},
"sob": {
"version": "npm:slide-out-button@1.0.1",

View File

@ -73,21 +73,21 @@
}
]
},
{
"title": "Show What's New Popup",
"description": "Show What's New popup when Jellyfin is updated to a new version.",
"settingName": "load.allowwhatsnew",
"type": "bool",
"default": "true"
},
{
"title": "User Interface",
"description": "Settings relating to how the application looks.",
"children": [
{
"title": "Home Page",
"description": "Options for Home page.",
"title": "General",
"description": "Settings relating to the appearance of the Home screen and the program in general.",
"children": [
{
"title": "Hide Clock",
"description": "Hides all clocks in Jellyfin. Jellyfin will need to be closed and reopened for change to take effect.",
"settingName": "ui.design.hideclock",
"type": "bool",
"default": "false"
},
{
"title": "Max Days Next Up",
"description": "Set the maximum amount of days a show should stay in the 'Next Up' list without watching it.",
@ -95,61 +95,22 @@
"type": "integer",
"default": "365"
},
{
"title": "Show What's New Popup",
"description": "Show What's New popup when Jellyfin is updated to a new version.",
"settingName": "load.allowwhatsnew",
"type": "bool",
"default": "true"
},
{
"title": "Use Splashscreen as Home Background",
"description": "Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect.",
"settingName": "ui.home.splashBackground",
"type": "bool",
"default": "false"
}
]
},
{
"title": "Details Page",
"description": "Options for Details pages.",
"children": [
{
"title": "Hide Taglines",
"description": "Hides tagline text on details pages.",
"settingName": "ui.details.hidetagline",
"type": "bool",
"default": "false"
}
]
},
{
"title": "TV Shows",
"description": "Options for TV Shows.",
"children": [
{
"title": "Blur Unwatched Episodes",
"description": "If enabled, images of unwatched episodes will be blurred.",
"settingName": "ui.tvshows.blurunwatched",
"type": "bool",
"default": "false"
},
{
"title": "Skip Details for Single Seasons",
"description": "If enabled, selecting a TV series with only one season will go straight to the episode list rather than the show details and season list.",
"settingName": "ui.tvshows.goStraightToEpisodeListing",
"type": "bool",
"default": "false"
},
{
"title": "Disable Community Rating for Episodes",
"description": "If enabled, the star and community rating for episodes of a TV show will be removed. This is to prevent spoilers of an upcoming good/bad episode.",
"settingName": "ui.tvshows.disableCommunityRating",
"type": "bool",
"default": "false"
}
]
},
{
"title": "Screensaver",
"description": "Options for Jellyfin's screensaver.",
"children": [
{
"title": "Use Splashscreen as Screensaver Background",
"title": "Use Splashscreen as Screensaver",
"description": "Use generated splashscreen image as Jellyfin's screensaver background. Jellyfin will need to be closed and reopened for change to take effect.",
"settingName": "ui.screensaver.splashBackground",
"type": "bool",
@ -158,80 +119,112 @@
]
},
{
"title": "Design Elements",
"description": "Options that alter the design of Jellyfin.",
"title": "Libraries",
"description": "Settings relating to the appearance of Library pages.",
"children": [
{
"title": "Hide Clock",
"description": "Hides all clocks in Jellyfin. Jellyfin will need to be closed and reopened for change to take effect.",
"settingName": "ui.design.hideclock",
"type": "bool",
"default": "false"
}
]
},
{
"title": "Media Grid",
"description": "Media Grid options.",
"children": [
{
"title": "Movie Library Default View",
"description": "Default view for Movie Libraries.",
"settingName": "itemgrid.movieDefaultView",
"type": "radio",
"default": "movies",
"options": [
"title": "General",
"description": "Settings relating to the appearance of pages in all Libraries.",
"children": [
{
"title": "Movies (Presentation)",
"id": "Movies"
"title": "Grid View Settings",
"description": "Settings that apply when Grid views are enabled.",
"children": [
{
"title": "Item Count",
"description": "Show item count in the library and index of selected item.",
"settingName": "itemgrid.showItemCount",
"type": "bool",
"default": "false"
},
{
"title": "Item Titles",
"description": "Select when to show titles.",
"settingName": "itemgrid.gridTitles",
"type": "radio",
"default": "showonhover",
"options": [
{
"title": "Show On Hover",
"id": "showonhover"
},
{
"title": "Always Show",
"id": "showalways"
},
{
"title": "Always Hide",
"id": "hidealways"
}
]
}
]
},
{
"title": "Movies (Grid)",
"id": "MoviesGrid"
"title": "Hide Taglines",
"description": "Hides tagline text on details pages.",
"settingName": "ui.details.hidetagline",
"type": "bool",
"default": "false"
},
{
"title": "Return to Top",
"description": "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).",
"settingName": "itemgrid.reset",
"type": "bool",
"default": "true"
}
]
},
{
"title": "Movie Library Grid Titles",
"description": "Select when to show titles.",
"settingName": "itemgrid.movieGridTitles",
"type": "radio",
"default": "showonhover",
"options": [
"title": "Movies",
"description": "Settings relating to the appearance of pages in Movie Libraries.",
"children": [
{
"title": "Show On Hover",
"id": "showonhover"
},
{
"title": "Always Show",
"id": "showalways"
},
{
"title": "Always Hide",
"id": "hidealways"
"title": "Default View",
"description": "Default view for Movie Libraries.",
"settingName": "itemgrid.movieDefaultView",
"type": "radio",
"default": "movies",
"options": [
{
"title": "Movies (Presentation)",
"id": "Movies"
},
{
"title": "Movies (Grid)",
"id": "MoviesGrid"
}
]
}
]
},
{
"title": "Item Count",
"description": "Show item count in the library and index of selected item.",
"settingName": "itemgrid.showItemCount",
"type": "bool",
"default": "false"
},
{
"title": "Item Titles",
"description": "Always show the titles below the poster images. (If disabled, the title will be shown under the highlighted item only).",
"settingName": "itemgrid.alwaysShowTitles",
"type": "bool",
"default": "false"
},
{
"title": "Return to Top",
"description": "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).",
"settingName": "itemgrid.reset",
"type": "bool",
"default": "true"
"title": "TV Shows",
"description": "Settings relating to the appearance of pages in TV Libraries.",
"children": [
{
"title": "Blur Unwatched Episodes",
"description": "If enabled, images of unwatched episodes will be blurred.",
"settingName": "ui.tvshows.blurunwatched",
"type": "bool",
"default": "false"
},
{
"title": "Skip Details for Single Seasons",
"description": "If enabled, selecting a TV series with only one season will go straight to the episode list rather than the show details and season list.",
"settingName": "ui.tvshows.goStraightToEpisodeListing",
"type": "bool",
"default": "false"
},
{
"title": "Disable Community Rating for Episodes",
"description": "If enabled, the star and community rating for episodes of a TV show will be removed. This is to prevent spoilers of an upcoming good/bad episode.",
"settingName": "ui.tvshows.disableCommunityRating",
"type": "bool",
"default": "false"
}
]
}
]
}

View File

@ -2,6 +2,22 @@ sub Main (args as dynamic) as void
appInfo = CreateObject("roAppInfo")
if appInfo.IsDev() and args.RunTests = "true" and TF_Utils__IsFunction(TestRunner)
' POST to {ROKU ADDRESS}:8060/launch/dev?RunTests=true
Runner = TestRunner()
Runner.SetFunctions([
TestSuite__Misc
])
Runner.Logger.SetVerbosity(1)
Runner.Logger.SetEcho(false)
Runner.Logger.SetJUnit(false)
Runner.SetFailFast(true)
Runner.Run()
end if
' The main function that runs when the application is launched.
m.screen = CreateObject("roSGScreen")
@ -136,7 +152,7 @@ sub Main (args as dynamic) as void
sceneManager.callFunc("pushScene", group)
else if selectedItem.type = "Folder" and selectedItem.json.type = "Genre"
' User clicked on a genre folder
if selectedItem.collectionType = "movies"
if selectedItem.json.MovieCount > 0
group = CreateMovieLibraryView(selectedItem)
else
group = CreateItemGrid(selectedItem)

View File

@ -389,11 +389,7 @@ function TVEpisodes(show_id as string, season_id as string)
data = getJson(resp)
results = []
for each item in data.Items
imgParams = { "AddPlayedIndicator": item.UserData.Played, "maxWidth": 400, "maxheight": 250 }
if item.UserData.PlayedPercentage <> invalid
param = { "PercentPlayed": item.UserData.PlayedPercentage }
imgParams.Append(param)
end if
imgParams = { "maxWidth": 400, "maxheight": 250 }
tmp = CreateObject("roSGNode", "TVEpisodeData")
tmp.image = PosterImage(item.id, imgParams)
if tmp.image <> invalid

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,81 @@
function TestSuite__Misc() as object
' Inherite test suite from BaseTestSuite
this = BaseTestSuite()
' Test suite name for log statistics
this.Name = "MiscTestSuite"
this.SetUp = MiscTestSuite__SetUp
this.TearDown = MiscTestSuite__TearDown
' Add tests to suite's tests collection
this.addTest("IsValid() true", TestCase__Misc_IsValid_True)
this.addTest("IsValid() false", TestCase__Misc_IsValid_False)
this.addTest("RoundNumber() Floor", TestCase__Misc_RoundNumber_Floor)
this.addTest("RoundNumber() Ceiling", TestCase__Misc_RoundNumber_Ceiling)
return this
end function
'----------------------------------------------------------------
' This function called immediately before running tests of current suite.
'----------------------------------------------------------------
sub MiscTestSuite__SetUp()
end sub
'----------------------------------------------------------------
' This function called immediately after running tests of current suite.
'----------------------------------------------------------------
sub MiscTestSuite__TearDown()
end sub
'----------------------------------------------------------------
' Check if isValid() properly identifies valid items
'
' @return An empty string if test is success or error message if not.
'----------------------------------------------------------------
function TestCase__Misc_IsValid_True() as string
returnResults = ""
testData = [1, 2, [3, 4], { "key": invalid }, [1, 2, 3], CreateObject("roAppInfo")]
for each testItem in testData
returnResults = returnResults + m.AssertTrue(isValid(testItem))
end for
return m.AssertEmpty(returnResults)
end function
'----------------------------------------------------------------
' Check if isValid() properly identifies invalid items
'
' @return An empty string if test is success or error message if not.
'----------------------------------------------------------------
function TestCase__Misc_IsValid_False() as string
returnResults = ""
testData = [invalid, CreateObject("nothing")]
for each testItem in testData
returnResults = m.AssertFalse(isValid(testItem))
end for
return m.AssertEmpty(returnResults)
end function
'----------------------------------------------------------------
' Check if roundNumber() properly rounds down
'
' @return An empty string if test is success or error message if not.
'----------------------------------------------------------------
function TestCase__Misc_RoundNumber_Floor() as string
return m.AssertEqual(roundNumber(9.4), 9)
end function
'----------------------------------------------------------------
' Check if roundNumber() properly rounds up
'
' @return An empty string if test is success or error message if not.
'----------------------------------------------------------------
function TestCase__Misc_RoundNumber_Ceiling() as string
return m.AssertEqual(roundNumber(9.6), 10)
end function