Merge branch 'master' into add-screen-events

This commit is contained in:
Neil Burrows 2022-05-19 21:41:29 +01:00 committed by GitHub
commit 5251c46270
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 2020 additions and 183 deletions

View File

@ -0,0 +1,15 @@
sub init()
m.top.functionName = "setFavoriteStatus"
end sub
sub setFavoriteStatus()
task = m.top.favTask
if task = "Favorite"
MarkItemFavorite(m.top.itemId)
else if task = "Unfavorite"
UnmarkItemFavorite(m.top.itemId)
end if
end sub

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<component name="FavoriteItemsTask" extends="Task">
<interface>
<field id="itemId" type="string" />
<field id="favTask" type="string" value="" />
</interface>
<script type="text/brightscript" uri="FavoriteItemsTask.brs" />
<script type="text/brightscript" uri="pkg:/source/api/UserLibrary.brs" />
<script type="text/brightscript" uri="pkg:/source/api/baserequest.brs" />
<script type="text/brightscript" uri="pkg:/source/utils/config.brs" />
</component>

View File

@ -10,6 +10,12 @@ sub init()
m.itemText.translation = [0, m.itemPoster.height + 7] m.itemText.translation = [0, m.itemPoster.height + 7]
m.alwaysShowTitles = get_user_setting("itemgrid.alwaysShowTitles") = "true"
m.itemText.visible = m.alwaysShowTitles
' Add some padding space when Item Titles are always showing
if m.alwaysShowTitles then m.itemText.maxWidth = 250
'Parent is MarkupGrid and it's parent is the ItemGrid 'Parent is MarkupGrid and it's parent is the ItemGrid
topParent = m.top.GetParent().GetParent() topParent = m.top.GetParent().GetParent()
'Get the imageDisplayMode for these grid items 'Get the imageDisplayMode for these grid items
@ -80,7 +86,7 @@ sub focusChanged()
m.itemText.visible = true m.itemText.visible = true
m.itemText.repeatCount = -1 m.itemText.repeatCount = -1
else else
m.itemText.visible = false m.itemText.visible = m.alwaysShowTitles
m.itemText.repeatCount = 0 m.itemText.repeatCount = 0
end if end if

View File

@ -7,7 +7,7 @@
<Poster id="itemIcon" width="50" height="50" translation="[230,10]" /> <Poster id="itemIcon" width="50" height="50" translation="[230,10]" />
<Label id="posterText" width="280" height="415" translation="[5,5]" horizAlign="center" vertAlign="center" ellipsizeOnBoundary="true" wrap="true" /> <Label id="posterText" width="280" height="415" translation="[5,5]" horizAlign="center" vertAlign="center" ellipsizeOnBoundary="true" wrap="true" />
</maskGroup> </maskGroup>
<ScrollingLabel id="itemText" horizAlign="center" font="font:SmallSystemFont" maxWidth="290" repeatCount="-1" visible="false" /> <ScrollingLabel id="itemText" horizAlign="center" font="font:SmallSystemFont" maxWidth="290" repeatCount="0" visible="false" />
</children> </children>
<interface> <interface>
<field id="itemContent" type="node" onChange="itemContentChanged" /> <field id="itemContent" type="node" onChange="itemContentChanged" />
@ -15,4 +15,5 @@
<field id="focusPercent" type="float" onChange="focusChanging" /> <field id="focusPercent" type="float" onChange="focusChanging" />
</interface> </interface>
<script type="text/brightscript" uri="GridItem.brs" /> <script type="text/brightscript" uri="GridItem.brs" />
<script type="text/brightscript" uri="pkg:/source/utils/config.brs" />
</component> </component>

View File

@ -1,7 +1,9 @@
sub init() sub init()
m.options = m.top.findNode("options") m.options = m.top.findNode("options")
m.tvGuide = invalid m.tvGuide = invalid
m.channelFocused = invalid
m.itemGrid = m.top.findNode("itemGrid") m.itemGrid = m.top.findNode("itemGrid")
m.backdrop = m.top.findNode("backdrop") m.backdrop = m.top.findNode("backdrop")
@ -32,6 +34,7 @@ sub init()
m.sortAscending = true m.sortAscending = true
m.filter = "All" m.filter = "All"
m.favorite = "Favorite"
m.loadItemsTask = createObject("roSGNode", "LoadItemsTask2") m.loadItemsTask = createObject("roSGNode", "LoadItemsTask2")
m.spinner = m.top.findNode("spinner") m.spinner = m.top.findNode("spinner")
@ -123,6 +126,7 @@ sub SetUpOptions()
options = {} options = {}
options.filter = [] options.filter = []
options.favorite = []
'Movies 'Movies
if m.top.parentItem.collectionType = "movies" if m.top.parentItem.collectionType = "movies"
@ -185,6 +189,9 @@ sub SetUpOptions()
{ "Title": tr("All"), "Name": "All" }, { "Title": tr("All"), "Name": "All" },
{ "Title": tr("Favorites"), "Name": "Favorites" } { "Title": tr("Favorites"), "Name": "Favorites" }
] ]
options.favorite = [
{ "Title": tr("Favorite"), "Name": "Favorite" }
]
else if m.top.parentItem.collectionType = "photoalbum" or m.top.parentItem.collectionType = "photo" or m.top.parentItem.collectionType = "homevideos" else if m.top.parentItem.collectionType = "photoalbum" or m.top.parentItem.collectionType = "photo" or m.top.parentItem.collectionType = "homevideos"
' For some reason, my photo library shows up as "homevideos", maybe because it has some mp4 mixed in with the jpgs? ' For some reason, my photo library shows up as "homevideos", maybe because it has some mp4 mixed in with the jpgs?
@ -229,6 +236,12 @@ sub SetUpOptions()
end if end if
end for end for
' for each o in options.favorite
' if o.Name = m.favorite
' m.options.favorite = o.Name
' end if
' end for
m.options.options = options m.options.options = options
end sub end sub
@ -291,6 +304,8 @@ sub onItemFocused()
return return
end if end if
m.selectedFavoriteItem = m.itemGrid.content.getChild(m.itemGrid.itemFocused)
' Set Background to item backdrop ' Set Background to item backdrop
SetBackground(m.itemGrid.content.getChild(m.itemGrid.itemFocused).backdropUrl) SetBackground(m.itemGrid.content.getChild(m.itemGrid.itemFocused).backdropUrl)
@ -439,6 +454,7 @@ sub showTVGuide()
m.tvGuide = createObject("roSGNode", "Schedule") m.tvGuide = createObject("roSGNode", "Schedule")
m.top.signalBeacon("EPGLaunchInitiate") ' Required Roku Performance monitoring m.top.signalBeacon("EPGLaunchInitiate") ' Required Roku Performance monitoring
m.tvGuide.observeField("watchChannel", "onChannelSelected") m.tvGuide.observeField("watchChannel", "onChannelSelected")
m.tvGuide.observeField("focusedChannel", "onChannelFocused")
end if end if
m.tvGuide.filter = m.filter m.tvGuide.filter = m.filter
m.top.appendChild(m.tvGuide) m.top.appendChild(m.tvGuide)
@ -454,6 +470,11 @@ sub onChannelSelected(msg)
end if end if
end sub end sub
sub onChannelFocused(msg)
node = msg.getRoSGNode()
m.channelFocused = node.focusedChannel
end sub
function onKeyEvent(key as string, press as boolean) as boolean function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false if not press then return false
topGrp = m.top.findNode("itemGrid") topGrp = m.top.findNode("itemGrid")
@ -463,6 +484,16 @@ function onKeyEvent(key as string, press as boolean) as boolean
m.top.removeChild(m.options) m.top.removeChild(m.options)
optionsClosed() optionsClosed()
else else
channelSelected = m.channelFocused
itemSelected = m.selectedFavoriteItem
if itemSelected <> invalid
m.options.selectedFavoriteItem = itemSelected
end if
if channelSelected <> invalid
if channelSelected.type = "TvChannel"
m.options.selectedFavoriteItem = channelSelected
end if
end if
m.options.visible = true m.options.visible = true
m.top.appendChild(m.options) m.top.appendChild(m.options)
m.options.setFocus(true) m.options.setFocus(true)

View File

@ -5,6 +5,9 @@ sub init()
m.buttons.selectedIndex = 1 m.buttons.selectedIndex = 1
m.buttons.setFocus(true) m.buttons.setFocus(true)
m.favoriteMenu = m.top.findNode("favoriteMenu")
m.selectedFavoriteItem = m.top.findNode("selectedFavoriteItem")
m.selectedSortIndex = 0 m.selectedSortIndex = 0
m.selectedItem = 1 m.selectedItem = 1
@ -23,7 +26,7 @@ sub init()
m.fadeInAnimOpacity = m.top.findNode("inOpacity") m.fadeInAnimOpacity = m.top.findNode("inOpacity")
m.buttons.observeField("focusedIndex", "buttonFocusChanged") m.buttons.observeField("focusedIndex", "buttonFocusChanged")
m.favoriteMenu.observeField("buttonSelected", "toggleFavorite")
end sub end sub
@ -105,24 +108,83 @@ sub optionsSet()
m.menus[2].content = filterContent m.menus[2].content = filterContent
m.menus[2].checkedItem = 0 m.menus[2].checkedItem = 0
end if end if
end sub end sub
' Switch menu shown when button focus changes ' Switch menu shown when button focus changes
sub buttonFocusChanged() sub buttonFocusChanged()
if m.buttons.focusedIndex = m.selectedItem then return if m.buttons.focusedIndex = m.selectedItem
if m.buttons.hasFocus()
m.buttons.setFocus(false)
m.menus[m.selectedItem].setFocus(false)
m.menus[m.selectedItem].visible = false
m.favoriteMenu.setFocus(true)
end if
end if
m.fadeOutAnimOpacity.fieldToInterp = m.menus[m.selectedItem].id + ".opacity" m.fadeOutAnimOpacity.fieldToInterp = m.menus[m.selectedItem].id + ".opacity"
m.fadeInAnimOpacity.fieldToInterp = m.menus[m.buttons.focusedIndex].id + ".opacity" m.fadeInAnimOpacity.fieldToInterp = m.menus[m.buttons.focusedIndex].id + ".opacity"
m.fadeAnim.control = "start" m.fadeAnim.control = "start"
m.selectedItem = m.buttons.focusedIndex m.selectedItem = m.buttons.focusedIndex
end sub end sub
sub toggleFavorite()
m.favItemsTask = createObject("roSGNode", "FavoriteItemsTask")
if m.favoriteMenu.iconUri = "pkg:/images/icons/favorite.png"
m.favoriteMenu.iconUri = "pkg:/images/icons/favorite_selected.png"
m.favoriteMenu.focusedIconUri = "pkg:/images/icons/favorite_selected.png"
' Run the task to actually favorite it via API
m.favItemsTask.favTask = "Favorite"
m.favItemsTask.itemId = m.selectedFavoriteItem.id
m.favItemsTask.control = "RUN"
else
m.favoriteMenu.iconUri = "pkg:/images/icons/favorite.png"
m.favoriteMenu.focusedIconUri = "pkg:/images/icons/favorite.png"
m.favItemsTask.favTask = "Unfavorite"
m.favItemsTask.itemId = m.selectedFavoriteItem.id
m.favItemsTask.control = "RUN"
end if
' Make sure we set the Favorite Heart color for the appropriate child
setHeartColor("#cc3333")
end sub
sub setHeartColor(color as string)
error = []
try
for i = 0 to 6
node = m.favoriteMenu.getChild(i)
if node <> invalid
if node.uri <> invalid and node.uri = "pkg:/images/icons/favorite_selected.png"
m.favoriteMenu.getChild(i).blendColor = color
end if
end if
end for
catch error
print error
end try
end sub
sub saveFavoriteItemSelected(msg)
data = msg.GetData()
m.selectedFavoriteItem = data
' Favorite button
if m.selectedFavoriteItem <> invalid
if m.selectedFavoriteItem.favorite = true
m.favoriteMenu.iconUri = "pkg:/images/icons/favorite_selected.png"
m.favoriteMenu.focusedIconUri = "pkg:/images/icons/favorite_selected.png"
' Make sure we set the Favorite Heart color for the appropriate child
setHeartColor("#cc3333")
else
m.favoriteMenu.iconUri = "pkg:/images/icons/favorite.png"
m.favoriteMenu.focusedIconUri = "pkg:/images/icons/favorite.png"
' Make sure we set the Favorite Heart color for the appropriate child
setHeartColor("#cc3333")
end if
end if
end sub
function onKeyEvent(key as string, press as boolean) as boolean function onKeyEvent(key as string, press as boolean) as boolean
if key = "down" or (key = "OK" and m.top.findNode("buttons").hasFocus()) if key = "down" or (key = "OK" and m.buttons.hasFocus())
m.top.findNode("buttons").setFocus(false) m.buttons.setFocus(false)
m.menus[m.selectedItem].setFocus(true) m.menus[m.selectedItem].setFocus(true)
m.menus[m.selectedItem].drawFocusFeedback = true m.menus[m.selectedItem].drawFocusFeedback = true
@ -134,6 +196,12 @@ function onKeyEvent(key as string, press as boolean) as boolean
end if end if
return true return true
else if key = "left"
if m.favoriteMenu.hasFocus()
m.favoriteMenu.setFocus(false)
m.menus[m.selectedItem].visible = true
m.buttons.setFocus(true)
end if
else if key = "OK" else if key = "OK"
if m.menus[m.selectedItem].isInFocusChain() if m.menus[m.selectedItem].isInFocusChain()
' Handle View Screen ' Handle View Screen
@ -172,12 +240,14 @@ function onKeyEvent(key as string, press as boolean) as boolean
end if end if
return true return true
else if key = "back" or key = "up" else if key = "back" or key = "up"
m.menus[2].visible = true ' Show Filter contents in case hidden by favorite button
if m.menus[m.selectedItem].isInFocusChain() if m.menus[m.selectedItem].isInFocusChain()
m.buttons.setFocus(true) m.buttons.setFocus(true)
m.menus[m.selectedItem].drawFocusFeedback = false m.menus[m.selectedItem].drawFocusFeedback = false
return true return true
end if end if
else if key = "options" else if key = "options"
m.menus[2].visible = true ' Show Filter contents in case hidden by favorite button
m.menus[m.selectedItem].drawFocusFeedback = false m.menus[m.selectedItem].drawFocusFeedback = false
return false return false
end if end if

View File

@ -15,6 +15,9 @@
</RadiobuttonList> </RadiobuttonList>
</Group> </Group>
</LayoutGroup> </LayoutGroup>
<ButtonGroup translation="[1250,50]">
<Button id="favoriteMenu" iconUri="pkg:/images/icons/favorite.png" focusedIconUri="pkg:/images/icons/favorite.png" focusBitmapUri="" focusFootprintBitmapUri="" text="Favorite" showFocusFootprint="false"></Button>
</ButtonGroup>
</Group> </Group>
<Animation id="fadeAnim" duration="0.5" repeat="false"> <Animation id="fadeAnim" duration="0.5" repeat="false">
@ -26,11 +29,13 @@
<interface> <interface>
<field id="buttons" type="nodearray" /> <field id="buttons" type="nodearray" />
<field id="options" type="assocarray" onChange="optionsSet" /> <field id="options" type="assocarray" onChange="optionsSet" />
<field id="selectedFavoriteItem" type="node" onChange="saveFavoriteItemSelected" />
<field id="view" type="string" /> <field id="view" type="string" />
<field id="sortField" type="string" value="SortName" /> <field id="sortField" type="string" value="SortName" />
<field id="sortAscending" type="boolean" value="false" /> <field id="sortAscending" type="boolean" value="false" />
<field id="filter" type="string" value="All" /> <field id="filter" type="string" value="All" />
<field id="favorite" type="string" value="Favorite" />
</interface> </interface>
<script type="text/brightscript" uri="ItemGridOptions.brs" /> <script type="text/brightscript" uri="ItemGridOptions.brs" />

View File

@ -48,13 +48,12 @@ sub loadItems()
if m.top.ItemType = "LiveTV" if m.top.ItemType = "LiveTV"
url = "LiveTv/Channels" url = "LiveTv/Channels"
params.append({ userId: get_setting("active_user") }) params.append({ UserId: get_setting("active_user") })
else else
url = Substitute("Users/{0}/Items/", get_setting("active_user")) url = Substitute("Users/{0}/Items/", get_setting("active_user"))
end if end if
resp = APIRequest(url, params) resp = APIRequest(url, params)
data = getJson(resp) data = getJson(resp)
if data <> invalid if data <> invalid
if data.TotalRecordCount <> invalid then m.top.totalRecordCount = data.TotalRecordCount if data.TotalRecordCount <> invalid then m.top.totalRecordCount = data.TotalRecordCount
@ -79,6 +78,9 @@ sub loadItems()
if tmp <> invalid if tmp <> invalid
tmp.json = item tmp.json = item
if item.UserData <> invalid and item.UserData.isFavorite <> invalid
tmp.favorite = item.UserData.isFavorite
end if
results.push(tmp) results.push(tmp)
end if end if
end for end for

View File

@ -6,6 +6,7 @@ sub init()
m.bufferPercentage = 0 ' Track whether content is being loaded m.bufferPercentage = 0 ' Track whether content is being loaded
m.playReported = false m.playReported = false
m.top.transcodeReasons = [] m.top.transcodeReasons = []
m.bufferCheckTimer.duration = 10
end sub end sub
@ -67,6 +68,7 @@ sub ReportPlayback(state = "update" as string)
"MediaSourceId": m.top.transcodeParams.MediaSourceId, "MediaSourceId": m.top.transcodeParams.MediaSourceId,
"LiveStreamId": m.top.transcodeParams.LiveStreamId "LiveStreamId": m.top.transcodeParams.LiveStreamId
}) })
m.bufferCheckTimer.duration = 30
end if end if
' Report playstate via worker task ' Report playstate via worker task
@ -85,12 +87,13 @@ sub bufferCheck(msg)
m.bufferCheckTimer.unobserveField("fire") m.bufferCheckTimer.unobserveField("fire")
return return
end if end if
if m.top.bufferingStatus <> invalid if m.top.bufferingStatus <> invalid
' Check that the buffering percentage is increasing ' Check that the buffering percentage is increasing
if m.top.bufferingStatus["percentage"] > m.bufferPercentage if m.top.bufferingStatus["percentage"] > m.bufferPercentage
m.bufferPercentage = m.top.bufferingStatus["percentage"] m.bufferPercentage = m.top.bufferingStatus["percentage"]
else if m.top.content.live = true
m.top.callFunc("refresh")
else else
' If buffering has stopped Display dialog ' If buffering has stopped Display dialog
dialog = createObject("roSGNode", "Dialog") dialog = createObject("roSGNode", "Dialog")

View File

@ -24,6 +24,6 @@
<script type="text/brightscript" uri="JFVideo.brs" /> <script type="text/brightscript" uri="JFVideo.brs" />
<children> <children>
<timer id="playbackTimer" repeat="true" duration="30" /> <timer id="playbackTimer" repeat="true" duration="30" />
<timer id="bufferCheckTimer" repeat="true" duration="10" /> <timer id="bufferCheckTimer" repeat="true" />
</children> </children>
</component> </component>

View File

@ -118,9 +118,11 @@ sub setFavoriteColor()
if fave <> invalid and fave if fave <> invalid and fave
fave_button.textColor = "#00ff00ff" fave_button.textColor = "#00ff00ff"
fave_button.focusedTextColor = "#269926ff" fave_button.focusedTextColor = "#269926ff"
fave_button.text = tr("Favorite")
else else
fave_button.textColor = "0xddddddff" fave_button.textColor = "0xddddddff"
fave_button.focusedTextColor = "#262626ff" fave_button.focusedTextColor = "#262626ff"
fave_button.text = tr("Set Favorite")
end if end if
end sub end sub

View File

@ -41,8 +41,11 @@ function PlaystateDefaults(params = {} as object)
'"PlaySessionId": "", '"PlaySessionId": "",
'"RepeatMode": "RepeatNone" '"RepeatMode": "RepeatNone"
} }
for each p in params.items()
new_params[p.key] = p.value paramsArray = params.items()
for i = 0 to paramsArray.count() - 1
item = paramsArray[i]
new_params[item.key] = item.value
end for end for
return FormatJson(new_params) return FormatJson(new_params)
end function end function

View File

@ -38,11 +38,13 @@ function onKeyEvent(key as string, press as boolean) as boolean
else if key = "down" and m.serverUrlContainer.hasFocus() else if key = "down" and m.serverUrlContainer.hasFocus()
m.submit.setFocus(true) m.submit.setFocus(true)
else if key = "options" else if key = "options"
serverName = m.serverPicker.content.getChild(m.serverPicker.itemFocused).name if m.serverPicker.itemFocused >= 0 and m.serverPicker.itemFocused < m.serverPicker.content.getChildCount()
if m.servers.Count() > 0 and Instr(1, serverName, "Saved") > 0 serverName = m.serverPicker.content.getChild(m.serverPicker.itemFocused).name
'Can only delete previously saved servers, not locally discovered ones if m.servers.Count() > 0 and Instr(1, serverName, "Saved") > 0
'So if we are on a "Saved" item, let the options dialog be shown (handled elsewhere) 'Can only delete previously saved servers, not locally discovered ones
handled = false 'So if we are on a "Saved" item, let the options dialog be shown (handled elsewhere)
handled = false
end if
end if end if
else else
handled = false handled = false

View File

@ -1,6 +1,5 @@
sub setFields() sub setFields()
json = m.top.json json = m.top.json
m.top.id = json.id m.top.id = json.id
m.top.title = json.name m.top.title = json.name
m.top.live = true m.top.live = true
@ -12,6 +11,9 @@ sub setPoster()
if m.top.image <> invalid if m.top.image <> invalid
m.top.posterURL = m.top.image.url m.top.posterURL = m.top.image.url
else if m.top.json.ImageTags <> invalid and m.top.json.ImageTags.Primary <> invalid else if m.top.json.ImageTags <> invalid and m.top.json.ImageTags.Primary <> invalid
imgParams = { "maxHeight": 60, "Tag": m.top.json.ImageTags.Primary }
m.top.hdsmalliconurl = ImageURL(m.top.json.id, "Primary", imgParams)
imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary } imgParams = { "maxHeight": 440, "maxWidth": 295, "Tag": m.top.json.ImageTags.Primary }
m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams) m.top.posterURL = ImageURL(m.top.json.id, "Primary", imgParams)
end if end if

View File

@ -49,7 +49,7 @@ sub onPeopleLoaded()
row = data.createChild("ContentNode") row = data.createChild("ContentNode")
row.Title = tr("Cast & Crew") row.Title = tr("Cast & Crew")
for each person in people for each person in people
if person.json.type = "Actor" if person.json.type = "Actor" and person.json.Role <> invalid
person.subTitle = "as " + person.json.Role person.subTitle = "as " + person.json.Role
else else
person.subTitle = person.json.Type person.subTitle = person.json.Type

View File

@ -76,9 +76,12 @@ sub loadItems()
resp = APIRequest(url, params) resp = APIRequest(url, params)
data = getJson(resp) data = getJson(resp)
for each item in data.Items for each item in data.Items
tmp = CreateObject("roSGNode", "HomeData") ' Skip Books for now as we don't support it (issue #558)
tmp.json = item if item.Type <> "Book"
results.push(tmp) tmp = CreateObject("roSGNode", "HomeData")
tmp.json = item
results.push(tmp)
end if
end for end for
else if m.top.itemsToLoad = "onNow" else if m.top.itemsToLoad = "onNow"

View File

@ -28,7 +28,16 @@ sub loadChannels()
for each item in data.Items for each item in data.Items
channel = createObject("roSGNode", "ChannelData") channel = createObject("roSGNode", "ChannelData")
channel.json = item channel.json = item
results.push(channel) if item.UserData <> invalid and item.UserData.isFavorite <> invalid
channel.favorite = item.UserData.isFavorite
if channel.favorite = true
results.Unshift(channel)
else
results.push(channel)
end if
else
results.push(channel)
end if
end for end for
m.top.channels = results m.top.channels = results

View File

@ -20,6 +20,7 @@ sub init()
m.duration = m.top.findNode("duration") m.duration = m.top.findNode("duration")
m.channelName = m.top.findNode("channelName") m.channelName = m.top.findNode("channelName")
m.image = m.top.findNode("image") m.image = m.top.findNode("image")
m.favorite = m.top.findNode("favorite")
m.viewChannelFocusAnimationOpacity = m.top.findNode("viewChannelFocusAnimationOpacity") m.viewChannelFocusAnimationOpacity = m.top.findNode("viewChannelFocusAnimationOpacity")
m.recordFocusAnimationOpacity = m.top.findNode("recordFocusAnimationOpacity") m.recordFocusAnimationOpacity = m.top.findNode("recordFocusAnimationOpacity")
@ -123,6 +124,7 @@ sub channelUpdated()
if m.top.programDetails = invalid if m.top.programDetails = invalid
m.image.uri = m.top.channel.posterURL m.image.uri = m.top.channel.posterURL
end if end if
m.favorite.visible = m.top.channel.favorite
end if end if
end sub end sub

View File

@ -7,6 +7,8 @@
<Poster id="image" height="375" width="500" loadDisplayMode="scaleToFit" /> <Poster id="image" height="375" width="500" loadDisplayMode="scaleToFit" />
</maskGroup> </maskGroup>
<Poster id="favorite" translation="[1335, 165]" uri="pkg:/images/icons/favorite_selected.png" visible="false" />
<Group id="detailsView" visible="false"> <Group id="detailsView" visible="false">
<Group translation = "[ 96, 160 ]"> <Group translation = "[ 96, 160 ]">
@ -77,6 +79,7 @@
<field id="recordSelectedChannel" type="boolean" value="false" /> <field id="recordSelectedChannel" type="boolean" value="false" />
<field id="recordSeriesSelectedChannel" type="boolean" value="false" /> <field id="recordSeriesSelectedChannel" type="boolean" value="false" />
<field id="channel" type="node" onchange="channelUpdated" /> <field id="channel" type="node" onchange="channelUpdated" />
<field id="favorite" type="node" onchange="channelUpdated" />
<field id="programDetails" type="node" onchange="programUpdated" /> <field id="programDetails" type="node" onchange="programUpdated" />
<field id="height" type="integer" /> <field id="height" type="integer" />
<field id="hasFocus" type="boolean" onChange="focusChanged" /> <field id="hasFocus" type="boolean" onChange="focusChanged" />

View File

@ -100,10 +100,10 @@ sub onScheduleLoaded()
end sub end sub
sub onProgramFocused() sub onProgramFocused()
m.top.watchChannel = invalid m.top.watchChannel = invalid
channel = m.scheduleGrid.content.GetChild(m.scheduleGrid.programFocusedDetails.focusChannelIndex) channel = m.scheduleGrid.content.GetChild(m.scheduleGrid.programFocusedDetails.focusChannelIndex)
m.detailsPane.channel = channel m.detailsPane.channel = channel
m.top.focusedChannel = channel
' Exit if Channels not yet loaded ' Exit if Channels not yet loaded
if channel.getChildCount() = 0 if channel.getChildCount() = 0

View File

@ -18,6 +18,7 @@
</children> </children>
<interface> <interface>
<field id="watchChannel" type="node" alwaysNotify="false" /> <field id="watchChannel" type="node" alwaysNotify="false" />
<field id="focusedChannel" type="node" alwaysNotify="false" />
<field id="filter" type="string" value="All" onChange="channelFilterSet" /> <field id="filter" type="string" value="All" onChange="channelFilterSet" />
</interface> </interface>
<script type="text/brightscript" uri="schedule.brs" /> <script type="text/brightscript" uri="schedule.brs" />

View File

@ -206,9 +206,11 @@ sub setFavoriteColor()
if fave <> invalid and fave if fave <> invalid and fave
fave_button.textColor = "#00ff00ff" fave_button.textColor = "#00ff00ff"
fave_button.focusedTextColor = "#269926ff" fave_button.focusedTextColor = "#269926ff"
fave_button.text = tr("Favorite")
else else
fave_button.textColor = "0xddddddff" fave_button.textColor = "0xddddddff"
fave_button.focusedTextColor = "#262626ff" fave_button.focusedTextColor = "#262626ff"
fave_button.text = tr("Set Favorite")
end if end if
end sub end sub
@ -218,9 +220,11 @@ sub setWatchedColor()
if watched if watched
watched_button.textColor = "#ff0000ff" watched_button.textColor = "#ff0000ff"
watched_button.focusedTextColor = "#992626ff" watched_button.focusedTextColor = "#992626ff"
watched_button.text = tr("Watched")
else else
watched_button.textColor = "0xddddddff" watched_button.textColor = "0xddddddff"
watched_button.focusedTextColor = "#262626ff" watched_button.focusedTextColor = "#262626ff"
watched_button.text = tr("Set Watched")
end if end if
end sub end sub

View File

@ -33,7 +33,7 @@
<ButtonGroupHoriz id="buttons" itemSpacings="[10]"> <ButtonGroupHoriz id="buttons" itemSpacings="[10]">
<Button text="Play" id="play-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" /> <Button text="Play" id="play-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" />
<Button text="Options" id="options-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" /> <Button text="Options" id="options-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" />
<Button text="Watched" id="watched-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" /> <Button text="Watched" id="watched-button" iconUri="" focusedIconUri="" maxWidth="350" minWidth="300" />
<Button text="Favorite" id="favorite-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" /> <Button text="Favorite" id="favorite-button" iconUri="" focusedIconUri="" maxWidth="300" minWidth="300" />
</ButtonGroupHoriz> </ButtonGroupHoriz>
<Label id="tagline" /> <Label id="tagline" />

BIN
images/icons/favorite.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 867 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

View File

@ -3335,5 +3335,774 @@
<translation>Beim Abspielen dieses Elements trat ein Fehler auf.</translation> <translation>Beim Abspielen dieses Elements trat ein Fehler auf.</translation>
<extracomment>Dialog detail when error occurs during playback</extracomment> <extracomment>Dialog detail when error occurs during playback</extracomment>
</message> </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>Serien</translation>
</message>
<message>
<source>Movies</source>
<translation>Filme</translation>
</message>
<message>
<source>Special Features</source>
<translation>Besonderheiten</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>Ä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>Filtern</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>Alterseinstufung</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 dieses Elements trat ein Fehler auf.</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>Gespeichertes Löschen</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Zugangsdaten speichern?</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Abmelden</translation>
</message>
<message>
<source>Change Server</source>
<translation>Server wechseln</translation>
</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 Favorite</source>
<translation>Als Favoriten markieren</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</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>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>Serien</translation>
</message>
<message>
<source>Movies</source>
<translation>Filme</translation>
</message>
<message>
<source>Special Features</source>
<translation>Besonderheiten</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>Ä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>Filtern</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>Alterseinstufung</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 dieses Elements trat ein Fehler auf.</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>Gespeichertes Löschen</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Zugangsdaten speichern?</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Abmelden</translation>
</message>
<message>
<source>Change Server</source>
<translation>Server wechseln</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 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>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 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>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> </context>
</TS> </TS>

View File

@ -493,5 +493,54 @@
<source>Disabled</source> <source>Disabled</source>
<translation>Disabled</translation> <translation>Disabled</translation>
</message> </message>
<message>
<source>User Interface</source>
<translation>User Interface</translation>
<extracomment>Title for User Interface section in user setting screen.</extracomment>
</message>
<message>
<source>Media Grid</source>
<translation>Media Grid</translation>
<extracomment>UI -> Media Grid section in user setting screen.</extracomment>
</message>
<message>
<source>Media Grid Options</source>
<translation>Media Grid Options</translation>
</message>
<message>
<source>Item Titles</source>
<translation>Item Titles</translation>
<extracomment>UI -> Media Grid -> Item Title 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>Always show the titles below the poster images. (If disabled, title will be shown under hilighted item only)</translation>
<extracomment>Description for option in Setting Screen</extracomment>
</message>
<message>
<source>Set Favorite</source>
<translation>Set Favorite</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</extracomment>
</message>
<message>
<source>Set Watched</source>
<translation>Set Watched</translation>
<extracomment>Button Text - When pressed, marks item as Warched</extracomment>
</message>
<message>
<source>Go to series</source>
<translation>Go to series</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Series Detail Page</extracomment>
</message>
<message>
<source>Go to season</source>
<translation>Go to season</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Season Page</extracomment>
</message>
<message>
<source>Go to episode</source>
<translation>Go to episode</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Episode Detail Page</extracomment>
</message>
</context> </context>
</TS> </TS>

View File

@ -14,15 +14,15 @@
</message> </message>
<message> <message>
<source>Connect to Server</source> <source>Connect to Server</source>
<translation>Conectar con el Servidor</translation> <translation>Conectar al Servidor</translation>
</message> </message>
<message> <message>
<source>Ends at %1</source> <source>Ends at %1</source>
<translation>Finaliza a las %1</translation> <translation>Termina en %1</translation>
</message> </message>
<message> <message>
<source>Enter Configuration</source> <source>Enter Configuration</source>
<translation>Entrar en la configuración</translation> <translation>Entrar a Configuración</translation>
</message> </message>
<message> <message>
<source>Favorite</source> <source>Favorite</source>
@ -66,7 +66,7 @@
</message> </message>
<message> <message>
<source>Sign In</source> <source>Sign In</source>
<translation>Iniciar sesión</translation> <translation>Iniciar Sesión</translation>
</message> </message>
<message> <message>
<source>Submit</source> <source>Submit</source>
@ -94,19 +94,19 @@
</message> </message>
<message> <message>
<source>My Media</source> <source>My Media</source>
<translation>Mi contenido</translation> <translation>Mi Contenido</translation>
</message> </message>
<message> <message>
<source>Continue Watching</source> <source>Continue Watching</source>
<translation>Continuar viendo</translation> <translation>Seguir viendo</translation>
</message> </message>
<message> <message>
<source>Next Up</source> <source>Next Up</source>
<translation>Siguiente</translation> <translation>A Continuación</translation>
</message> </message>
<message> <message>
<source>Latest in</source> <source>Latest in</source>
<translation>Reciente en</translation> <translation>Lo último en</translation>
</message> </message>
<message> <message>
<source>Home</source> <source>Home</source>
@ -190,7 +190,7 @@
</message> </message>
<message> <message>
<source>Sort Order</source> <source>Sort Order</source>
<translation>Orden</translation> <translation>Orden de Clasificación</translation>
</message> </message>
<message> <message>
<source>Descending</source> <source>Descending</source>
@ -206,7 +206,7 @@
</message> </message>
<message> <message>
<source>Username</source> <source>Username</source>
<translation>Nombre de usuario</translation> <translation>Usuario</translation>
</message> </message>
<message> <message>
<source>Genres</source> <source>Genres</source>
@ -1236,7 +1236,7 @@
</message> </message>
<message> <message>
<source>Press &apos;OK&apos; to Close</source> <source>Press &apos;OK&apos; to Close</source>
<translation>Presiona &apos;OK&apos; para cerrar</translation> <translation>Presiona &apos;Aceptar&apos; para cerrar</translation>
</message> </message>
<message> <message>
<source>Cast &amp; Crew</source> <source>Cast &amp; Crew</source>
@ -1363,5 +1363,395 @@
<source>Change Server</source> <source>Change Server</source>
<translation>Cambiar de servidor</translation> <translation>Cambiar de servidor</translation>
</message> </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>Set Favorite</source>
<translation>Agregar a Favoritos</translation>
<extracomment>Button Text - When pressed, sets item as Favorite</extracomment>
</message>
<message>
<source>Disabled</source>
<translation>Desactivado</translation>
</message>
<message>
<source>Enabled</source>
<translation>Activado</translation>
</message>
<message>
<source>Ended at</source>
<translation>Termina a las</translation>
<extracomment>(Past Tense) For defining time when a program will ended (e.g. Ended at 08:00) </extracomment>
</message>
<message>
<source>today</source>
<translation>Hoy</translation>
<extracomment>Current day</extracomment>
</message>
<message>
<source>Sign Out</source>
<translation>Cerrar Sesión</translation>
</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 series</source>
<translation>Ir a Series</translation>
<extracomment>Continue Watching Popup Menu - Navigate to the Series Detail Page</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>Always show the titles below the poster images. (If disabled, title will be shown under hilighted item only)</source>
<translation>Mostrar siempre los títulos debajo de las imágenes del póster. (Si está deshabilitado, el título se mostrará solo debajo del elemento resaltado)</translation>
<extracomment>Description for option in Setting Screen</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>Media Grid Options</source>
<translation>Opciones de la Cuadrícula de Medios</translation>
</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>User Interface</source>
<translation>Interfaz de Usuario</translation>
<extracomment>Title for User Interface section in user setting screen.</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>Admite reproducción directa de contenido MPEG 2 (por ejemplo, TV en vivo). Esto evitará la transcodificación de contenido MPEG 2, pero utiliza mucho más ancho de banda</translation>
<extracomment>Settings Menu - Description for option</extracomment>
</message>
<message>
<source>MPEG 2 Support</source>
<translation>Soporte de MPEG 2</translation>
<extracomment>Settings Menu - Title for option</extracomment>
</message>
<message>
<source>Playback</source>
<translation>Reproducir</translation>
<extracomment>Title for Playback section in user setting screen.</extracomment>
</message>
<message>
<source>Version</source>
<translation>Versión</translation>
</message>
<message>
<source>An error was encountered while playing this item. Server did not provide required transcoding data.</source>
<translation>Se encontró un error al reproducir este elemento. El servidor no proporcionó los datos de transcodificación requeridos.</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 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>...or enter server URL manually:</source>
<translation>... o introduce la URL manualmente:</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>Escoge un servidor Jellyfin de 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>Enter the server name or ip address</source>
<translation>Introduce el nombre del servidor o la dirección IP</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>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>Unknown</source>
<translation>Desconocido</translation>
<extracomment>Title for a cast member for which we have no information for</extracomment>
</message>
<message>
<source>Not found</source>
<translation>No encontrado</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>Conectando al Servidor</translation>
<extracomment>Message to display to user while client is attempting to connect to the server</extracomment>
</message>
<message>
<source>Close</source>
<translation>Cerrar</translation>
</message>
<message>
<source>Cancel Series Recording</source>
<translation>Cancelar Grabación de Episodios</translation>
</message>
<message>
<source>Cancel Recording</source>
<translation>Cancelar Grabación</translation>
</message>
<message>
<source>Record Series</source>
<translation>Grabar Episodios</translation>
</message>
<message>
<source>Record</source>
<translation>Grabar</translation>
</message>
<message>
<source>View Channel</source>
<translation>Ver Canal</translation>
</message>
<message>
<source>TV Guide</source>
<translation>Guía de TV</translation>
<extracomment>Menu option for showing Live TV Guide / Schedule</extracomment>
</message>
<message>
<source>Channels</source>
<translation>Canales</translation>
<extracomment>Menu option for showing Live TV Channel List</extracomment>
</message>
<message>
<source>Repeat</source>
<translation>Repetir</translation>
<extracomment>If TV Shows has previously been broadcasted</extracomment>
</message>
<message>
<source>Live</source>
<translation>En Directo</translation>
<extracomment>If TV Show is being broadcast live (not pre-recorded)</extracomment>
</message>
<message>
<source>Ends at</source>
<translation>Terminó el</translation>
<extracomment>(Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00) </extracomment>
</message>
<message>
<source>Starts</source>
<translation>Empieza el</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>Empieza 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>Started</source>
<translation>Empezó el</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>Empezó a las</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>Sábado</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Friday</source>
<translation>Viernes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Thursday</source>
<translation>Jueves</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Wednesday</source>
<translation>Miércoles</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Tuesday</source>
<translation>Martes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Monday</source>
<translation>Lunes</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>Sunday</source>
<translation>Domingo</translation>
<extracomment>Day of Week</extracomment>
</message>
<message>
<source>tomorrow</source>
<translation>Mañana</translation>
<extracomment>Next day</extracomment>
</message>
<message>
<source>yesterday</source>
<translation>Ayer</translation>
<extracomment>Previous day</extracomment>
</message>
<message>
<source>TV Shows</source>
<translation>Programas de TV</translation>
</message>
<message>
<source>Movies</source>
<translation>Películas</translation>
</message>
<message>
<source>Special Features</source>
<translation>Contenido Adicional</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>Contenido similar</translation>
</message>
<message>
<source>Cast &amp; Crew</source>
<translation>Reparto y Equipo</translation>
</message>
<message>
<source>Age</source>
<translation>Edad</translation>
</message>
<message>
<source>Died</source>
<translation>Fallecimiento</translation>
</message>
<message>
<source>Born</source>
<translation>Nacimiento</translation>
</message>
<message>
<comment>Title of Tab for options to filter library content</comment>
<source>TAB_FILTER</source>
<translation>Filtro</translation>
</message>
<message>
<comment>Title of Tab for options to sort library content</comment>
<source>TAB_SORT</source>
<translation>Ordenar</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>
<source>RUNTIME</source>
<translation>Duración</translation>
</message>
<message>
<source>RELEASE_DATE</source>
<translation>Fecha de Lanzamiento</translation>
</message>
<message>
<source>PLAY_COUNT</source>
<translation>Número de Reproducciones</translation>
</message>
<message>
<source>OFFICIAL_RATING</source>
<translation>Clasificación Parental</translation>
</message>
<message>
<source>DATE_PLAYED</source>
<translation>Reproducido el</translation>
</message>
<message>
<source>DATE_ADDED</source>
<translation>Añadido el</translation>
</message>
<message>
<source>CRITIC_RATING</source>
<translation>Clasificación de los Críticos</translation>
</message>
<message>
<source>IMDB_RATING</source>
<translation>Calificación de IMDb</translation>
</message>
<message>
<comment>Name or Title field of media item</comment>
<source>TITLE</source>
<translation>Nombre</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>Este %1 no contiene elementos</translation>
</message>
<message>
<source>Unable to load Channel Data from the server</source>
<translation>No se pueden cargar los Datos del Canal desde el servidor</translation>
</message>
<message>
<source>Error loading Channel Data</source>
<translation>Error al cargar los Datos del Canal</translation>
</message>
<message>
<source>Loading Channel Data</source>
<translation>Cargando Datos del Canal</translation>
</message>
<message>
<source>An error was encountered while playing this item.</source>
<translation>Se encontró un error al reproducir este elemento.</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>Hubo un error al extraer los datos de este elemento del servidor.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</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>Error Retrieving Content</source>
<translation>Error al Recuperar Contenido</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>On Now</source>
<translation>Transmitiendo Ahora</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Eliminar Guardado</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>¿Guardar Credenciales?</translation>
</message>
<message>
<source>Change Server</source>
<translation>Cambiar Servidor</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -1982,5 +1982,9 @@
<source>Save Credentials?</source> <source>Save Credentials?</source>
<translation>Enregistrer les identifiants ?</translation> <translation>Enregistrer les identifiants ?</translation>
</message> </message>
<message>
<source>Save Credentials?</source>
<translation>Sauvegarder les informations d&apos;identification ?</translation>
</message>
</context> </context>
</TS> </TS>

View File

@ -2519,6 +2519,392 @@ elemeket</translation>
<source>Movies</source> <source>Movies</source>
<translation>Filmek</translation> <translation>Filmek</translation>
</message> </message>
<message>
<source>Special Features</source>
<translation>Sajátosságok</translation>
<message>
<source>Press &apos;OK&apos; to Close</source>
<translation>Nyomj &apos;OK&apos; -t a bezáráshoz</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>Lejátszás dátuma</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>
<message>
<source>Error Retrieving Content</source>
<translation>Hiba a tartalom lekérésekor</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>On Now</source>
<translation>Most</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Mentettek Törlése</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Hitelesítő adatok mentése?</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Hitelesítő adatok mentése?</translation>
</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>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>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>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>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> <message>
<source>Special Features</source> <source>Special Features</source>
<translation>Sajátosságok</translation> <translation>Sajátosságok</translation>

View File

@ -1729,5 +1729,40 @@ não contém itens</translation>
<source>Change Server</source> <source>Change Server</source>
<translation>Mudar servidor</translation> <translation>Mudar servidor</translation>
</message> </message>
<message>
<source>There was an error retrieving the data for this item from the server.</source>
<translation>Ocorreu um erro ao recuperar os dados para este item do servidor.</translation>
<extracomment>Dialog detail when unable to load Content from Server</extracomment>
</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>Error Retrieving Content</source>
<translation>Erro ao Recuperar Conteúdo</translation>
<extracomment>Dialog title when unable to load Content from Server</extracomment>
</message>
<message>
<source>On Now</source>
<translation>Ligado agora</translation>
</message>
<message>
<source>Delete Saved</source>
<translation>Remover salvo</translation>
</message>
<message>
<source>Save Credentials?</source>
<translation>Salvar credenciais?</translation>
</message>
<message>
<source>Sign Out</source>
<translation>Sair</translation>
</message>
<message>
<source>Change Server</source>
<translation>Mudar servidor</translation>
</message>
</context> </context>
</TS> </TS>

202
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,26 @@
"settingName": "playback.mpeg2", "settingName": "playback.mpeg2",
"type": "bool", "type": "bool",
"default": "false" "default": "false"
} }
]
},
{
"title": "User Interface",
"description": "Settings relating to how the how the applications looks",
"children": [
{
"title": "Media Grid",
"description": "Media Grid Options",
"children": [
{
"title": "Item Titles",
"description": "Always show the titles below the poster images. (If disabled, title will be shown under hilighted item only)",
"settingName": "itemgrid.alwaysShowTitles",
"type": "bool",
"default": "false"
}
]
}
] ]
} }
] ]

View File

@ -306,7 +306,6 @@ end function
function CreateSeriesDetailsGroup(series) function CreateSeriesDetailsGroup(series)
group = CreateObject("roSGNode", "TVShowDetails") group = CreateObject("roSGNode", "TVShowDetails")
group.overhangTitle = series.title
group.optionsAvailable = false group.optionsAvailable = false
m.global.sceneManager.callFunc("pushScene", group) m.global.sceneManager.callFunc("pushScene", group)
@ -324,7 +323,6 @@ end function
function CreateSeasonDetailsGroup(series, season) function CreateSeasonDetailsGroup(series, season)
group = CreateObject("roSGNode", "TVEpisodes") group = CreateObject("roSGNode", "TVEpisodes")
group.overhangTitle = series.title + " " + season.title
group.optionsAvailable = false group.optionsAvailable = false
m.global.sceneManager.callFunc("pushScene", group) m.global.sceneManager.callFunc("pushScene", group)

View File

@ -19,8 +19,8 @@ end function
sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1) sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1)
video.content = createObject("RoSGNode", "ContentNode") video.content = createObject("RoSGNode", "ContentNode")
meta = ItemMetaData(video.id) meta = ItemMetaData(video.id)
m.videotype = meta.type
if meta = invalid if meta = invalid
video.content = invalid video.content = invalid
return return
@ -58,9 +58,89 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
group.callFunc("refresh") group.callFunc("refresh")
video.content = invalid video.content = invalid
return return
else if dialogResult = 3
'get series ID based off episiode ID
params = {
ids: video.Id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.series_id = item.SeriesId
end for
'Get series json data
params = {
ids: m.series_id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.tmp = item
end for
'Create Series Scene
group = CreateSeriesDetailsGroup(m.tmp)
video.content = invalid
return
else if dialogResult = 4
'get Season/Series ID based off episiode ID
params = {
ids: video.Id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.season_id = item.SeasonId
m.series_id = item.SeriesId
end for
'Get Series json data
params = {
ids: m.season_id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.Season_tmp = item
end for
'Get Season json data
params = {
ids: m.series_id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.Series_tmp = item
end for
'Create Season Scene
group = CreateSeasonDetailsGroup(m.Series_tmp, m.Season_tmp)
video.content = invalid
return
else if dialogResult = 5
'get episiode ID
params = {
ids: video.Id
}
url = Substitute("Users/{0}/Items/", get_setting("active_user"))
resp = APIRequest(url, params)
data = getJson(resp)
for each item in data.Items
m.episode_id = item
end for
'Create Episode Scene
group = CreateMovieDetailsGroup(m.episode_id)
video.content = invalid
return
end if end if
end if end if
end if end if
video.content.PlayStart = int(playbackPosition / 10000000) video.content.PlayStart = int(playbackPosition / 10000000)
' Call PlayInfo from server ' Call PlayInfo from server
@ -112,7 +192,7 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
protocol = LCase(playbackInfo.MediaSources[0].Protocol) protocol = LCase(playbackInfo.MediaSources[0].Protocol)
if protocol <> "file" if protocol <> "file"
uriRegex = CreateObject("roRegex", "^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$", "") uriRegex = CreateObject("roRegex", "^(.*:)//([A-Za-z0-9\-\.]+)(:[0-9]+)?(.*)$", "")
uri = uriRegex.Match(playbackinfo.MediaSources[0].Path) uri = uriRegex.Match(playbackInfo.MediaSources[0].Path)
' proto $1, host $2, port $3, the-rest $4 ' proto $1, host $2, port $3, the-rest $4
localhost = CreateObject("roRegex", "^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$", "i") localhost = CreateObject("roRegex", "^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$", "i")
' https://stackoverflow.com/questions/8426171/what-regex-will-match-all-loopback-addresses ' https://stackoverflow.com/questions/8426171/what-regex-will-match-all-loopback-addresses
@ -123,7 +203,7 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
video.content.url = buildURL(uri[4]) video.content.url = buildURL(uri[4])
else else
fully_external = true fully_external = true
video.content.url = playbackinfo.MediaSources[0].Path video.content.url = playbackInfo.MediaSources[0].Path
end if end if
else: else:
params.append({ params.append({
@ -178,8 +258,8 @@ end function
'Opens dialog asking user if they want to resume video or start playback over 'Opens dialog asking user if they want to resume video or start playback over
function startPlayBackOver(time as longinteger) as integer function startPlayBackOver(time as longinteger) as integer
if m.scene.focusedChild.overhangTitle = "Home" if m.videotype = "Episode" or m.videotype = "Series"
return option_dialog(["Resume playing at " + ticksToHuman(time) + ".", "Start over from the beginning.", "Watched"]) return option_dialog([tr("Resume playing at ") + ticksToHuman(time) + ".", tr("Start over from the beginning."), tr("Watched"), tr("Go to series"), tr("Go to season"), tr("Go to episode")])
else else
return option_dialog(["Resume playing at " + ticksToHuman(time) + ".", "Start over from the beginning."]) return option_dialog(["Resume playing at " + ticksToHuman(time) + ".", "Start over from the beginning."])
end if end if

View File

@ -110,6 +110,7 @@ function ItemMetaData(id as string)
else if data.type = "TvChannel" or data.type = "Program" else if data.type = "TvChannel" or data.type = "Program"
tmp = CreateObject("roSGNode", "ChannelData") tmp = CreateObject("roSGNode", "ChannelData")
tmp.image = PosterImage(data.id) tmp.image = PosterImage(data.id)
tmp.isFavorite = data.UserData.isFavorite
tmp.json = data tmp.json = data
return tmp return tmp
else if data.type = "Person" else if data.type = "Person"