Merge pull request #1699 from cewert/update-master-bugfix
This commit is contained in:
commit
ade479fcae
2
Makefile
2
Makefile
|
@ -3,7 +3,7 @@
|
||||||
# If you want to get_images, you'll also need convert from ImageMagick
|
# If you want to get_images, you'll also need convert from ImageMagick
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
||||||
VERSION := 2.0.3
|
VERSION := 2.0.4
|
||||||
|
|
||||||
## usage
|
## usage
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,8 @@ sub loadItems()
|
||||||
tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" })
|
tmp.image = PosterImage(item.id, { "maxHeight": 425, "maxWidth": 290, "quality": "90" })
|
||||||
else if item.type = "Episode"
|
else if item.type = "Episode"
|
||||||
tmp = CreateObject("roSGNode", "TVEpisode")
|
tmp = CreateObject("roSGNode", "TVEpisode")
|
||||||
|
else if LCase(item.Type) = "recording"
|
||||||
|
tmp = CreateObject("roSGNode", "RecordingData")
|
||||||
else if item.Type = "Genre"
|
else if item.Type = "Genre"
|
||||||
tmp = CreateObject("roSGNode", "ContentNode")
|
tmp = CreateObject("roSGNode", "ContentNode")
|
||||||
tmp.title = item.name
|
tmp.title = item.name
|
||||||
|
|
|
@ -82,8 +82,8 @@ sub LoadItems_AddVideoContent(video as object, mediaSourceId as dynamic, audio_s
|
||||||
|
|
||||||
videotype = LCase(meta.type)
|
videotype = LCase(meta.type)
|
||||||
|
|
||||||
' Check for any Live TV streams coming from other places other than the TV Guide
|
' Check for any Live TV streams or Recordings coming from other places other than the TV Guide
|
||||||
if isValid(meta.json) and isValid(meta.json.ChannelId)
|
if videotype = "recording" or (isValid(meta.json) and isValid(meta.json.ChannelId))
|
||||||
if isValid(meta.json.EpisodeTitle)
|
if isValid(meta.json.EpisodeTitle)
|
||||||
meta.title = meta.json.EpisodeTitle
|
meta.title = meta.json.EpisodeTitle
|
||||||
else if isValid(meta.json.Name)
|
else if isValid(meta.json.Name)
|
||||||
|
|
|
@ -31,7 +31,7 @@ sub setData()
|
||||||
m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png"
|
m.top.iconUrl = "pkg:/images/media_type_icons/folder_white.png"
|
||||||
end if
|
end if
|
||||||
|
|
||||||
else if datum.type = "Episode" or datum.type = "MusicVideo"
|
else if datum.type = "Episode" or LCase(datum.type) = "recording" or datum.type = "MusicVideo"
|
||||||
m.top.isWatched = datum.UserData.Played
|
m.top.isWatched = datum.UserData.Played
|
||||||
|
|
||||||
imgParams = {}
|
imgParams = {}
|
||||||
|
|
20
components/data/RecordingData.bs
Normal file
20
components/data/RecordingData.bs
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import "pkg:/source/utils/misc.bs"
|
||||||
|
|
||||||
|
sub setFields()
|
||||||
|
datum = m.top.json
|
||||||
|
|
||||||
|
m.top.id = datum.id
|
||||||
|
m.top.title = datum.name
|
||||||
|
m.top.showID = datum.SeriesID
|
||||||
|
m.top.seasonID = datum.SeasonID
|
||||||
|
m.top.overview = datum.overview
|
||||||
|
m.top.favorite = datum.UserData.isFavorite
|
||||||
|
end sub
|
||||||
|
|
||||||
|
sub setPoster()
|
||||||
|
if isValid(m.top.image)
|
||||||
|
m.top.posterURL = m.top.image.url
|
||||||
|
else
|
||||||
|
m.top.posterURL = ""
|
||||||
|
end if
|
||||||
|
end sub
|
18
components/data/RecordingData.xml
Normal file
18
components/data/RecordingData.xml
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<component name="RecordingData" extends="ContentNode">
|
||||||
|
<interface>
|
||||||
|
<field id="id" type="string" />
|
||||||
|
<field id="title" type="string" />
|
||||||
|
<field id="image" type="node" onChange="setPoster" />
|
||||||
|
<field id="posterURL" type="string" />
|
||||||
|
<field id="showID" type="string" />
|
||||||
|
<field id="seasonID" type="string" />
|
||||||
|
<field id="overview" type="string" />
|
||||||
|
<field id="type" type="string" value="Recording" />
|
||||||
|
<field id="startingPoint" type="longinteger" value="0" />
|
||||||
|
<field id="json" type="assocarray" onChange="setFields" />
|
||||||
|
<field id="selectedVideoStreamId" type="string" />
|
||||||
|
<field id="selectedAudioStreamIndex" type="integer" />
|
||||||
|
<field id="favorite" type="boolean" />
|
||||||
|
</interface>
|
||||||
|
</component>
|
|
@ -121,7 +121,7 @@ sub itemContentChanged()
|
||||||
return
|
return
|
||||||
end if
|
end if
|
||||||
|
|
||||||
if itemData.type = "Episode"
|
if itemData.type = "Episode" or LCase(itemData.type) = "recording"
|
||||||
m.itemText.text = itemData.json.SeriesName
|
m.itemText.text = itemData.json.SeriesName
|
||||||
|
|
||||||
if itemData.PlayedPercentage > 0
|
if itemData.PlayedPercentage > 0
|
||||||
|
|
|
@ -145,6 +145,11 @@ sub playQueue()
|
||||||
return
|
return
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
if nextItemMediaType = "recording"
|
||||||
|
CreateVideoPlayerView()
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
|
||||||
if nextItemMediaType = "trailer"
|
if nextItemMediaType = "trailer"
|
||||||
CreateVideoPlayerView()
|
CreateVideoPlayerView()
|
||||||
return
|
return
|
||||||
|
|
2
manifest
2
manifest
|
@ -3,7 +3,7 @@
|
||||||
title=Jellyfin
|
title=Jellyfin
|
||||||
major_version=2
|
major_version=2
|
||||||
minor_version=0
|
minor_version=0
|
||||||
build_version=3
|
build_version=4
|
||||||
|
|
||||||
### Main Menu Icons / Channel Poster Artwork
|
### Main Menu Icons / Channel Poster Artwork
|
||||||
|
|
||||||
|
|
4
package-lock.json
generated
4
package-lock.json
generated
|
@ -1,12 +1,12 @@
|
||||||
{
|
{
|
||||||
"name": "jellyfin-roku",
|
"name": "jellyfin-roku",
|
||||||
"version": "2.0.2",
|
"version": "2.0.4",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "jellyfin-roku",
|
"name": "jellyfin-roku",
|
||||||
"version": "2.0.2",
|
"version": "2.0.4",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-2.0",
|
"license": "GPL-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "jellyfin-roku",
|
"name": "jellyfin-roku",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"version": "2.0.3",
|
"version": "2.0.4",
|
||||||
"description": "Roku app for Jellyfin media server",
|
"description": "Roku app for Jellyfin media server",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@rokucommunity/bslib": "0.1.1",
|
"@rokucommunity/bslib": "0.1.1",
|
||||||
|
|
|
@ -165,7 +165,7 @@ sub Main (args as dynamic) as void
|
||||||
m.global.queueManager.callFunc("clear") ' empty queue/playlist
|
m.global.queueManager.callFunc("clear") ' empty queue/playlist
|
||||||
m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off
|
m.global.queueManager.callFunc("resetShuffle") ' turn shuffle off
|
||||||
|
|
||||||
if itemType = "episode" or itemType = "movie" or itemType = "video"
|
if itemType = "episode" or itemType = "recording" or itemType = "movie" or itemType = "video"
|
||||||
quickplay.video(itemNode)
|
quickplay.video(itemNode)
|
||||||
' restore focus
|
' restore focus
|
||||||
if LCase(group.subtype()) = "tvepisodes"
|
if LCase(group.subtype()) = "tvepisodes"
|
||||||
|
@ -241,8 +241,8 @@ sub Main (args as dynamic) as void
|
||||||
else if selectedItemType = "UserView" or selectedItemType = "Folder" or selectedItemType = "Channel" or selectedItemType = "Boxset"
|
else if selectedItemType = "UserView" or selectedItemType = "Folder" or selectedItemType = "Channel" or selectedItemType = "Boxset"
|
||||||
group = CreateItemGrid(selectedItem)
|
group = CreateItemGrid(selectedItem)
|
||||||
sceneManager.callFunc("pushScene", group)
|
sceneManager.callFunc("pushScene", group)
|
||||||
else if selectedItemType = "Episode"
|
else if selectedItemType = "Episode" or LCase(selectedItemType) = "recording"
|
||||||
' User has selected a TV episode they want us to play
|
' User has selected a TV episode or Recording they want us to play
|
||||||
audio_stream_idx = 0
|
audio_stream_idx = 0
|
||||||
if isValid(selectedItem.selectedAudioStreamIndex) and selectedItem.selectedAudioStreamIndex > 0
|
if isValid(selectedItem.selectedAudioStreamIndex) and selectedItem.selectedAudioStreamIndex > 0
|
||||||
audio_stream_idx = selectedItem.selectedAudioStreamIndex
|
audio_stream_idx = selectedItem.selectedAudioStreamIndex
|
||||||
|
@ -481,7 +481,7 @@ sub Main (args as dynamic) as void
|
||||||
startLoadingSpinner()
|
startLoadingSpinner()
|
||||||
node = getMsgPicker(msg)
|
node = getMsgPicker(msg)
|
||||||
' TODO - swap this based on target.mediatype
|
' TODO - swap this based on target.mediatype
|
||||||
' types: [ Series (Show), Episode, Movie, Audio, Person, Studio, MusicArtist ]
|
' types: [ Series (Show), Episode, Movie, Audio, Person, Studio, MusicArtist, Recording ]
|
||||||
if node.type = "Series"
|
if node.type = "Series"
|
||||||
group = CreateSeriesDetailsGroup(node.id)
|
group = CreateSeriesDetailsGroup(node.id)
|
||||||
else if node.type = "Movie"
|
else if node.type = "Movie"
|
||||||
|
@ -505,6 +505,9 @@ sub Main (args as dynamic) as void
|
||||||
else if node.type = "Episode"
|
else if node.type = "Episode"
|
||||||
group = CreateVideoPlayerGroup(node.id)
|
group = CreateVideoPlayerGroup(node.id)
|
||||||
sceneManager.callFunc("pushScene", group)
|
sceneManager.callFunc("pushScene", group)
|
||||||
|
else if LCase(node.type) = "recording"
|
||||||
|
group = CreateVideoPlayerGroup(node.id)
|
||||||
|
sceneManager.callFunc("pushScene", group)
|
||||||
else if node.type = "Audio"
|
else if node.type = "Audio"
|
||||||
selectedIndex = msg.getData()
|
selectedIndex = msg.getData()
|
||||||
screenContent = msg.getRoSGNode()
|
screenContent = msg.getRoSGNode()
|
||||||
|
|
|
@ -95,6 +95,11 @@ function ItemMetaData(id as string)
|
||||||
tmp.image = PosterImage(data.id, imgParams)
|
tmp.image = PosterImage(data.id, imgParams)
|
||||||
tmp.json = data
|
tmp.json = data
|
||||||
return tmp
|
return tmp
|
||||||
|
else if LCase(data.type) = "recording"
|
||||||
|
tmp = CreateObject("roSGNode", "RecordingData")
|
||||||
|
tmp.image = PosterImage(data.id, imgParams)
|
||||||
|
tmp.json = data
|
||||||
|
return tmp
|
||||||
else if data.type = "BoxSet" or data.type = "Playlist"
|
else if data.type = "BoxSet" or data.type = "Playlist"
|
||||||
tmp = CreateObject("roSGNode", "CollectionData")
|
tmp = CreateObject("roSGNode", "CollectionData")
|
||||||
tmp.image = PosterImage(data.id, imgParams)
|
tmp.image = PosterImage(data.id, imgParams)
|
||||||
|
|
6
source/static/whatsNew/2.0.4.json
Normal file
6
source/static/whatsNew/2.0.4.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"description": "Prevent app crash when attempting to play in-process recordings",
|
||||||
|
"author": "VTRunner"
|
||||||
|
}
|
||||||
|
]
|
|
@ -408,7 +408,7 @@ namespace quickplay
|
||||||
' get watched episodes by the person
|
' get watched episodes by the person
|
||||||
personEpisodes = api.users.GetItemsByQuery(m.global.session.user.id, {
|
personEpisodes = api.users.GetItemsByQuery(m.global.session.user.id, {
|
||||||
"personIds": itemNode.id,
|
"personIds": itemNode.id,
|
||||||
"includeItemTypes": "Episode",
|
"includeItemTypes": ["Episode", "Recording"],
|
||||||
"isPlayed": true,
|
"isPlayed": true,
|
||||||
"excludeItemTypes": "Season,Series",
|
"excludeItemTypes": "Season,Series",
|
||||||
"recursive": true,
|
"recursive": true,
|
||||||
|
@ -474,7 +474,7 @@ namespace quickplay
|
||||||
if not isValid(itemNode) or not isValid(itemNode.id) then return
|
if not isValid(itemNode) or not isValid(itemNode.id) then return
|
||||||
|
|
||||||
paramArray = {
|
paramArray = {
|
||||||
"includeItemTypes": ["Episode", "Movie", "Video"],
|
"includeItemTypes": ["Episode", "Recording", "Movie", "Video"],
|
||||||
"videoTypes": "VideoFile",
|
"videoTypes": "VideoFile",
|
||||||
"sortBy": "Random",
|
"sortBy": "Random",
|
||||||
"limit": 2000,
|
"limit": 2000,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user