Merge pull request #1699 from cewert/update-master-bugfix

This commit is contained in:
Charles Ewert 2024-02-09 09:58:06 -05:00 committed by GitHub
commit ade479fcae
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 74 additions and 15 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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 = {}

View 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

View 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>

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -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": {

View File

@ -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",

View File

@ -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()

View File

@ -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)

View File

@ -0,0 +1,6 @@
[
{
"description": "Prevent app crash when attempting to play in-process recordings",
"author": "VTRunner"
}
]

View File

@ -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,