Coder Social home page Coder Social logo

jellyfin / jellyfin-chromecast Goto Github PK

View Code? Open in Web Editor NEW
111.0 10.0 39.0 5.57 MB

Chromecast Client for Jellyfin

Home Page: https://jellyfin.org

License: GNU General Public License v2.0

JavaScript 2.77% CSS 3.47% HTML 1.36% TypeScript 92.40%
caf chromecast hacktoberfest jellyfin typescript cast googlecast

jellyfin-chromecast's Introduction

Jellyfin

The Free Software Media System


Logo Banner

GPL 2.0 License Current Release Translation Status Azure Builds Docker Pull Count
Donate Submit Feature Requests Chat on Matrix Join our Subreddit Release RSS Feed Master Commits RSS Feed


Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps. Jellyfin is descended from Emby's 3.5.2 release and ported to the .NET Core framework to enable full cross-platform support. There are no strings attached, no premium licenses or features, and no hidden agendas: just a team who want to build something better and work together to achieve it. We welcome anyone who is interested in joining us in our quest!

For further details, please see our documentation page. To receive the latest updates, get help with Jellyfin, and join the community, please visit one of our communication channels. For more information about the project, please see our about page.

Want to get started?
Check out our downloads page or our installation guide, then see our quick start guide. You can also build from source.

Something not working right?
Open an Issue on GitHub.

Want to contribute?
Check out our contributing choose-your-own-adventure to see where you can help, then see our contributing guide and our community standards.

New idea or improvement?
Check out our feature request hub.

Don't see Jellyfin in your language?
Check out our Weblate instance to help translate Jellyfin and its subprojects.

Detailed Translation Status

Jellyfin Server

This repository contains the code for Jellyfin's backend server. Note that this is only one of many projects under the Jellyfin GitHub organization on GitHub. If you want to contribute, you can start by checking out our documentation to see what to work on.

Server Development

These instructions will help you get set up with a local development environment in order to contribute to this repository. Before you start, please be sure to completely read our guidelines on development contributions. Note that this project is supported on all major operating systems except FreeBSD, which is still incompatible.

Prerequisites

Before the project can be built, you must first install the .NET 8.0 SDK on your system.

Instructions to run this project from the command line are included here, but you will also need to install an IDE if you want to debug the server while it is running. Any IDE that supports .NET 6 development will work, but two options are recent versions of Visual Studio (at least 2022) and Visual Studio Code.

ffmpeg will also need to be installed.

Cloning the Repository

After dependencies are installed you will need to clone a local copy of this repository. If you just want to run the server from source you can clone this repository directly, but if you are intending to contribute code changes to the project, you should set up your own fork of the repository. The following example shows how you can clone the repository directly over HTTPS.

git clone https://github.com/jellyfin/jellyfin.git

Installing the Web Client

The server is configured to host the static files required for the web client in addition to serving the backend by default. Before you can run the server, you will need to get a copy of the web client since they are not included in this repository directly.

Note that it is also possible to host the web client separately from the web server with some additional configuration, in which case you can skip this step.

There are three options to get the files for the web client.

  1. Download one of the finished builds from the Azure DevOps pipeline. You can download the build for a specific release by looking at the branches tab of the pipelines page.
  2. Build them from source following the instructions on the jellyfin-web repository
  3. Get the pre-built files from an existing installation of the server. For example, with a Windows server installation the client files are located at C:\Program Files\Jellyfin\Server\jellyfin-web

Running The Server

The following instructions will help you get the project up and running via the command line, or your preferred IDE.

Running With Visual Studio

To run the project with Visual Studio you can open the Solution (.sln) file and then press F5 to run the server.

Running With Visual Studio Code

To run the project with Visual Studio Code you will first need to open the repository directory with Visual Studio Code using the Open Folder... option.

Second, you need to install the recommended extensions for the workspace. Note that extension recommendations are classified as either "Workspace Recommendations" or "Other Recommendations", but only the "Workspace Recommendations" are required.

After the required extensions are installed, you can run the server by pressing F5.

Running From The Command Line

To run the server from the command line you can use the dotnet run command. The example below shows how to do this if you have cloned the repository into a directory named jellyfin (the default directory name) and should work on all operating systems.

cd jellyfin                          # Move into the repository directory
dotnet run --project Jellyfin.Server --webdir /absolute/path/to/jellyfin-web/dist # Run the server startup project

A second option is to build the project and then run the resulting executable file directly. When running the executable directly you can easily add command line options. Add the --help flag to list details on all the supported command line options.

  1. Build the project
dotnet build                       # Build the project
cd Jellyfin.Server/bin/Debug/net8.0 # Change into the build output directory
  1. Execute the build output. On Linux, Mac, etc. use ./jellyfin and on Windows use jellyfin.exe.

Accessing the Hosted Web Client

If the Server is configured to host the Web Client, and the Server is running, the Web Client can be accessed at http://localhost:8096 by default.

API documentation can be viewed at http://localhost:8096/api-docs/swagger/index.html

Running from GH-Codespaces

As Jellyfin will run on a container on a github hosted server, JF needs to handle some things differently.

NOTE: Depending on the selected configuration (if you just click 'create codespace' it will create a default configuration one) it might take 20-30 secounds to load all extensions and prepare the enviorment while vscode is already open. Just give it some time and wait until you see Downloading .NET version(s) 7.0.15~x64 ...... Done! in the output tab.

NOTE: If you want to access the JF instance from outside, like with a WebClient on another PC, remember to set the "ports" in the lower VsCode window to public.

NOTE: When first opening the server instance with any WebUI, you will be send to the login instead of the setup page. Refresh the login page once and you should be redirected to the Setup.

There are two configurations for you to chose from.

Default - Development Jellyfin Server

This creates a container that has everything to run and debug the Jellyfin Media server but does not setup anything else. Each time you create a new container you have to run though the whole setup again. There is also no ffmpeg, webclient or media preloaded. Use the .NET Launch (nowebclient) lunch config to start the server.

Keep in mind that as this has no web client you have to connect to it via an extenal client. This can be just another codespace container running the WebUI. vuejs does not work from the getgo as it does not support the setup steps.

Development Jellyfin Server ffmpeg

this extens the default server with an default installation of ffmpeg6 though the means described here: https://jellyfin.org/docs/general/installation/linux#repository-manual If you want to install a specific ffmpeg version, follow the comments embedded in the .devcontainer/Dev - Server Ffmpeg/install.ffmpeg.sh file.

Use the ghcs .NET Launch (nowebclient, ffmpeg) launch config to run with the jellyfin-ffmpeg enabled.

Running The Tests

This repository also includes unit tests that are used to validate functionality as part of a CI pipeline on Azure. There are several ways to run these tests.

  1. Run tests from the command line using dotnet test
  2. Run tests in Visual Studio using the Test Explorer
  3. Run individual tests in Visual Studio Code using the associated CodeLens annotation

Advanced Configuration

The following sections describe some more advanced scenarios for running the server from source that build upon the standard instructions above.

Hosting The Web Client Separately

It is not necessary to host the frontend web client as part of the backend server. Hosting these two components separately may be useful for frontend developers who would prefer to host the client in a separate webpack development server for a tighter development loop. See the jellyfin-web repo for instructions on how to do this.

To instruct the server not to host the web content, there is a nowebclient configuration flag that must be set. This can specified using the command line switch --nowebclient or the environment variable JELLYFIN_NOWEBCONTENT=true.

Since this is a common scenario, there is also a separate launch profile defined for Visual Studio called Jellyfin.Server (nowebcontent) that can be selected from the 'Start Debugging' dropdown in the main toolbar.

NOTE: The setup wizard can not be run if the web client is hosted separately.


This project is supported by:

DigitalOcean ย  JetBrains logo

jellyfin-chromecast's People

Contributors

angelblue05 avatar anthonylavado avatar bfayers avatar crobibero avatar cvium avatar dbsleiman avatar dependabot[bot] avatar dkanada avatar ferferga avatar froghut avatar hawken93 avatar jasonmeisel avatar joshuaboniface avatar justaman avatar lukepulverenti avatar nielsvanvelzen avatar renovate[bot] avatar rhysmdnz avatar sky-high avatar thornbill avatar tim-vk avatar tnyeanderson avatar youknowblom avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jellyfin-chromecast's Issues

Jellyfin is unable to play back Advanced Substation Alpha Subtitles on Chromecast

Describe the bug
Jellyfin-Chromecast does not display Advanced SSA subtitles on Chromecast

To Reproduce

  1. Select a movie with external Advanced SSA subtitles for playback on Chromecast

Expected behavior
The movie plays back with subtitles, as it does on Firefox, Chrome, and Android

Actual behavior
On Chromecast, no subtitles are shown

System (please complete the following information):

  • OS: Docker
  • Browser: Chromecast Gen. 1
  • Jellyfin Version: 10.4.0
  • Reverse proxy: kubernetes nginx-ingress

Additional context
The problem might be related to jellyfin/jellyfin#1896

Bitrate limit for chromecast Gen1

Describe the bug
CC gen1 is likely to fail on high bitrate files even if they're within spec, it's a weak device

steps

  1. get cc gen1
  2. play high bitrate file
  3. something is guaranteed not going to work

Expected behavior
reasonable max bitrate for the device

Logs
I'm going to my parents where I'll have access to a gen1 device to try and do experiments with

Additional context
This problem hasn't been proven in practice yet but I know it exists, and I would love to see the gen1 have some more useful life left

chromecast reciever controller playback options

Describe the feature you'd like
i would like to see forward/backward skips, pause/resume options at the chromecast reciever so i can use the chromecast remote controller instead of my mobile phone to do the things :)

Additional context
is these even possible?

Google cast receiver ia unable to contact the jellyfin server

Describe the bug
I am not able to cast the movie via chrome browser to Chromecast, as you can see i am connected to the GL room Chromecast but when i try to cast the movie i got this error

Screenshots
Screenshot_2021-11-17-21-42-17-931_com miui gallery

  • OS: Docker, docker image linuxserver/jellyfin:2021.11.17
  • Browser: Chrome
  • Jellyfin Version: 10.8.0
  • Cast client: Chromecast and Xiaomi Tv box with Chromecast integrated

Receiver always starts playback from the beginning

Describe the bug
Receiver always starts playback from the beginning, despite resuming previously played item from web

To Reproduce

  1. Play previously played item with progress
  2. Watch as the receiver will start playing from the beginning

Expected behavior

Resume from the correct tick

System (please complete the following information):

  • OS: Docker
  • Browser: Chrome
  • Jellyfin Version: 10.6.4 (unstable)
  • Cast client: Gen 2

Migrate to CAF?

https://developers.google.com/cast/docs/migrate_v2/receiver

They recommend migrating to CAF and have deprecated v2. While my plan was to use the same html5 player as the other clients, this migration seems like the better choice (CAF does not allow custom players) -- we don't really have a choice either.

EDIT: I think CAF can still use a custom player, but it's unnecessary as the new player support HLS, DASH etc.

Chromecast 2.1.0 (2nd Gen Hardware) never plays on 10.7.1 possibly due to incompatible audio

Describe the bug

Since upgrading to 10.7.1, the stable channel of Chromecast won't instruct the Jellyfin server to transcode surround sound. This causes the Chromecast to hang on a blank screen. The Unstable channel instructs the Jellyfin server to transcode to aac, which then plays correctly.

To Reproduce

Play a file with surround sound to a Chromecast (2nd Gen, Nest Hub seems to work?).

Example ffprobe for file:

  Metadata:
    CREATION_TIME   : 2016-03-09T13:35:28Z
    ENCODER         : Lavf56.1.0
  Duration: 00:48:39.94, start: 0.000000, bitrate: 3660 kb/s
    Chapter #0:0: start 0.000000, end 47.923000
    Metadata:
      title           : 00:00:00.000
    Chapter #0:1: start 48.006000, end 1193.234000
    Metadata:
      title           : 00:00:38.497
    Chapter #0:2: start 1193.317000, end 2187.268000
    Metadata:
      title           : 00:19:53.192
    Chapter #0:3: start 2187.351000, end 2872.912000
    Metadata:
      title           : 00:36:20.595
    Chapter #0:4: start 2872.995000, end 2919.750000
    Metadata:
      title           : 00:47:52.870
    Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)
    Stream #0:1(eng): Audio: aac (HE-AAC), 48000 Hz, 5.1, fltp (default)
    Metadata:
      title           : Surround
    Stream #0:2(eng): Subtitle: ass

Expected behavior

Transcode incompatible audio, as the Unstable channel does.

Logs

Stable Logs (produces issue)

[13:52:56] [INF] [242] Jellyfin.Api.Controllers.MediaInfoController: GetPostedPlaybackInfo profile: {"Name": null, "Id": null, "Identification": null, "FriendlyName": null, "Manufacturer": null, "ManufacturerUrl": null, "ModelName": null, "ModelDescription": null, "ModelNumber": null, "ModelUrl": null, "SerialNumber": null, "EnableAlbumArtInDidl": false, "EnableSingleAlbumArtLimit": false, "EnableSingleSubtitleLimit": false, "SupportedMediaTypes": "Audio,Photo,Video", "UserId": null, "AlbumArtPn": null, "MaxAlbumArtWidth": 0, "MaxAlbumArtHeight": 0, "MaxIconWidth": null, "MaxIconHeight": null, "MaxStreamingBitrate": 11000000, "MaxStaticBitrate": 11000000, "MusicStreamingTranscodingBitrate": 192000, "MaxStaticMusicBitrate": null, "SonyAggregationFlags": null, "ProtocolInfo": null, "TimelineOffsetSeconds": 0, "RequiresPlainVideoItems": false, "RequiresPlainFolders": false, "EnableMSMediaReceiverRegistrar": false, "IgnoreTranscodeByteRangeRequests": false, "XmlRootAttributes": [], "DirectPlayProfiles": [{"Container": "mp4,m4v", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "VideoCodec": "h264,vp8", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "mkv", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "VideoCodec": "h264,vp8", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "mov", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "VideoCodec": "h264", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "opus", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "mp3", "AudioCodec": "mp3", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "aac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "m4a", "AudioCodec": "aac", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "flac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webma,webm", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "wav", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webm", "AudioCodec": "vorbis,opus", "VideoCodec": "VP8", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "flac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}], "TranscodingProfiles": [{"Container": "ts", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": true, "$type": "TranscodingProfile"}, {"Container": "aac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp3", "Type": "Audio", "VideoCodec": null, "AudioCodec": "mp3", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "opus", "Type": "Audio", "VideoCodec": null, "AudioCodec": "opus", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "wav", "Type": "Audio", "VideoCodec": null, "AudioCodec": "wav", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "opus", "Type": "Audio", "VideoCodec": null, "AudioCodec": "opus", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp3", "Type": "Audio", "VideoCodec": null, "AudioCodec": "mp3", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "aac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "wav", "Type": "Audio", "VideoCodec": null, "AudioCodec": "wav", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mkv", "Type": "Video", "VideoCodec": "h264,vp8", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "Protocol": null, "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": true, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mkv", "Type": "Video", "VideoCodec": "h264,vp8", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "Protocol": null, "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": true, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "ts", "Type": "Video", "VideoCodec": "h264", "AudioCodec": "ac3,aac,mp3,opus", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": true, "$type": "TranscodingProfile"}, {"Container": "webm", "Type": "Video", "VideoCodec": "vpx", "AudioCodec": "vorbis", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "6", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp4", "Type": "Video", "VideoCodec": "h264", "AudioCodec": "ac3,aac,mp3,opus,flac,vorbis", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Static", "EnableSubtitlesInManifest": false, "MaxAudioChannels": null, "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}], "ContainerProfiles": [], "CodecProfiles": [{"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "AudioChannels", "Value": "2", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "aac", "Container": null, "$type": "CodecProfile"}, {"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": null, "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "NotEquals", "Property": "IsAnamorphic", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "EqualsAny", "Property": "VideoProfile", "Value": "high|main|baseline|constrained baseline", "IsRequired": true, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "VideoLevel", "Value": "42", "IsRequired": true, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "VideoBitrate", "Value": "30000000", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "h264", "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "LessThanEqual", "Property": "VideoBitrate", "Value": "30000000", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": null, "Container": null, "$type": "CodecProfile"}, {"Type": "Audio", "Conditions": [{"Condition": "LessThanEqual", "Property": "AudioSampleRate", "Value": "96000", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "flac", "Container": null, "$type": "CodecProfile"}], "ResponseProfiles": [{"Container": "m4v", "AudioCodec": null, "VideoCodec": null, "Type": "Video", "OrgPn": null, "MimeType": "video/mp4", "Conditions": [], "$type": "ResponseProfile"}], "SubtitleProfiles": [{"Format": "js", "Method": "External", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}], "$type": "DeviceProfile"}
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for example. EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 10000000, RemoteIp: 192.168.42.124, IsInLocalNetwork: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 10000000, RemoteIp: 192.168.42.124, IsInLocalNetwork: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:52:56] [INF] [242] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:52:56] [INF] [221] Jellyfin.Api.Helpers.TranscodingJobHelper: /usr/lib/jellyfin-ffmpeg/ffmpeg -ss 00:11:01.704 -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i file:"/media/Video_File_With_Surround_Sound.mkv" -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_vaapi -mpegts_m2ts_mode 1 -force_key_frames "expr:gte(t,n_forced*5)" -vf "format=nv12|vaapi,hwupload,scale_vaapi=format=nv12" -copyts -avoid_negative_ts disabled -start_at_zero -b:v 6101365 -maxrate 6101365 -bufsize 12202730 -profile:v:0 high -level 41 -vsync -1 -map_metadata -1 -map_chapters -1 -threads 0 -codec:a:0 copy -y "/config/transcodes/23b7cab40235c48d8e318ff99b90d538.mkv"
[13:52:57] [WRN] [222] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from https://jelly.example.com/Sessions/Playing to 192.168.42.124 in 0:00:00.501338 with Status Code 204
[13:52:57] [INF] [104] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Adding playback tracker : chromecast_1616939568834-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:52:57] [INF] [104] Jellyfin.Plugin.PlaybackReporting.Data.PlaybackTracker: PlaybackTracker : Adding Start Event : 03/28/2021 13:52:57
[13:52:57] [INF] [104] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Creating StartPlaybackTimer Task
[13:52:57] [INF] [104] Trakt.ServerMediator: Playback Started
[13:52:57] [INF] [242] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : Entered
[13:52:57] [INF] [235] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Processing playback tracker : chromecast_1616939568834-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:52:57] [WRN] [235] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from https://jelly.example.com/Sessions/Playing/Progress to 192.168.42.124 in 0:00:00.7087471 with Status Code 204
[13:52:59] [WRN] [235] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from https://jelly.example.com/videos/a8ef6803-2e4a-8969-499f-8b11960796c8/stream.mkv?DeviceId=chromecast_1616939568834&MediaSourceId=a8ef68032e4a8969499f8b11960796c8&Static=false&VideoCodec=h264,vp8&AudioCodec=ac3,aac,mp3,opus,flac,vorbis&AudioStreamIndex=1&VideoBitrate=10680000&AudioBitrate=320000&StartTimeTicks=6617049770&PlaySessionId=3166c33a5d4147f39942865f6bce1b4e&api_key=redacted&SubtitleMethod=Encode&TranscodingMaxAudioChannels=6&CopyTimestamps=true&RequireAvc=false&Tag=a2e2b6ff50ec4b3e04b8655b942cb346&h264-profile=high,main,baseline,constrainedbaseline&h264-level=42&aac-audiochannels=2&TranscodeReasons=VideoCodecNotSupported,AudioCodecNotSupported to 192.168.42.124 in 0:00:02.4997925 with Status Code 200
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: session.RemoteEndPoint : 192.168.42.124
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_playing_id     = a8ef68032e4a8969499f8b11960796c8
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_user_id        = 64d1fe8272fc4061ab19219607c14ef9
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_user_id_int    = 2
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : session_playing_id   = a8ef68032e4a8969499f8b11960796c8
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : session_user_id      = 64d1fe8272fc4061ab19219607c14ef9
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : play_method          = Transcode (v:h264 a:direct)
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : e.ClientName         = Chromecast
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : e.DeviceName         = Chromecast
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemName             = This is the item name
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemId               = a8ef68032e4a8969499f8b11960796c8
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemType             = Episode
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : All matches, playback registered
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Playback tracker found, adding playback info : chromecast_1616939568834-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Saving playback tracking activity in DB
[13:53:17] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : Exited
[13:53:19] [INF] [249] Jellyfin.Api.Helpers.TranscodingJobHelper: Transcoding kill timer stopped for JobId e992fc52ec77494981f973a26b9cee29 PlaySessionId 3166c33a5d4147f39942865f6bce1b4e. Killing transcoding
[13:53:19] [INF] [249] Jellyfin.Api.Helpers.TranscodingJobHelper: Stopping ffmpeg process with q command for /config/transcodes/23b7cab40235c48d8e318ff99b90d538.mkv
[13:53:19] [INF] [249] Jellyfin.Api.Helpers.TranscodingJobHelper: FFmpeg exited with code 0
[13:53:19] [INF] [249] Jellyfin.Api.Helpers.TranscodingJobHelper: Deleting partial stream file(s) /config/transcodes/23b7cab40235c48d8e318ff99b90d538.mkv

Unstable Logs: (doesn't produce issue)

[13:57:41] [INF] [246] Jellyfin.Api.Controllers.MediaInfoController: GetPostedPlaybackInfo profile: {"Name": null, "Id": null, "Identification": null, "FriendlyName": null, "Manufacturer": null, "ManufacturerUrl": null, "ModelName": null, "ModelDescription": null, "ModelNumber": null, "ModelUrl": null, "SerialNumber": null, "EnableAlbumArtInDidl": false, "EnableSingleAlbumArtLimit": false, "EnableSingleSubtitleLimit": false, "SupportedMediaTypes": "Audio,Photo,Video", "UserId": null, "AlbumArtPn": null, "MaxAlbumArtWidth": 0, "MaxAlbumArtHeight": 0, "MaxIconWidth": null, "MaxIconHeight": null, "MaxStreamingBitrate": 33103448, "MaxStaticBitrate": 33103448, "MusicStreamingTranscodingBitrate": 192000, "MaxStaticMusicBitrate": null, "SonyAggregationFlags": null, "ProtocolInfo": null, "TimelineOffsetSeconds": 0, "RequiresPlainVideoItems": false, "RequiresPlainFolders": false, "EnableMSMediaReceiverRegistrar": false, "IgnoreTranscodeByteRangeRequests": false, "XmlRootAttributes": [], "DirectPlayProfiles": [{"Container": "webm", "AudioCodec": "vorbis,opus", "VideoCodec": "VP8", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "mp4,m4v", "AudioCodec": "aac,mp3", "VideoCodec": "h264", "Type": "Video", "$type": "DirectPlayProfile"}, {"Container": "opus", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "mp3", "AudioCodec": "mp3", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "aac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "m4a,m4b", "AudioCodec": "aac", "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "flac", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "webma,webm", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}, {"Container": "wav", "AudioCodec": null, "VideoCodec": null, "Type": "Audio", "$type": "DirectPlayProfile"}], "TranscodingProfiles": [{"Container": "ts", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac,mp3", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "opus", "Type": "Audio", "VideoCodec": null, "AudioCodec": "opus", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "mp3", "Type": "Audio", "VideoCodec": null, "AudioCodec": "mp3", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "aac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "aac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "flac", "Type": "Audio", "VideoCodec": null, "AudioCodec": "flac", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "webma", "Type": "Audio", "VideoCodec": null, "AudioCodec": "webma", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "wav", "Type": "Audio", "VideoCodec": null, "AudioCodec": "wav", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "ts", "Type": "Video", "VideoCodec": "h264", "AudioCodec": "aac,mp3", "Protocol": "hls", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 1, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}, {"Container": "webm", "Type": "Video", "VideoCodec": "vpx", "AudioCodec": "vorbis", "Protocol": "http", "EstimateContentLength": false, "EnableMpegtsM2TsMode": false, "TranscodeSeekInfo": "Auto", "CopyTimestamps": false, "Context": "Streaming", "EnableSubtitlesInManifest": false, "MaxAudioChannels": "2", "MinSegments": 0, "SegmentLength": 0, "BreakOnNonKeyFrames": false, "$type": "TranscodingProfile"}], "ContainerProfiles": [], "CodecProfiles": [{"Type": "Audio", "Conditions": [{"Condition": "LessThanEqual", "Property": "AudioSampleRate", "Value": "96000", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "AudioBitDepth", "Value": "24", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "flac", "Container": null, "$type": "CodecProfile"}, {"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "IsSecondaryAudio", "Value": "2", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "aac", "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "NotEquals", "Property": "IsAnamorphic", "Value": "true", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "EqualsAny", "Property": "VideoProfile", "Value": "high|main|baseline|constrained baseline", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "VideoLevel", "Value": "41", "IsRequired": false, "$type": "ProfileCondition"}, {"Condition": "LessThanEqual", "Property": "Width", "Value": "1920", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": "h264", "Container": null, "$type": "CodecProfile"}, {"Type": "Video", "Conditions": [{"Condition": "LessThanEqual", "Property": "Width", "Value": "1920", "IsRequired": true, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": null, "Container": null, "$type": "CodecProfile"}, {"Type": "VideoAudio", "Conditions": [{"Condition": "Equals", "Property": "IsSecondaryAudio", "Value": "false", "IsRequired": false, "$type": "ProfileCondition"}], "ApplyConditions": [], "Codec": null, "Container": null, "$type": "CodecProfile"}], "ResponseProfiles": [{"Container": "m4v", "AudioCodec": null, "VideoCodec": null, "Type": "Video", "OrgPn": null, "MimeType": "video/mp4", "Conditions": [], "$type": "ResponseProfile"}], "SubtitleProfiles": [{"Format": "vtt", "Method": "External", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}, {"Format": "vtt", "Method": "Hls", "DidlMode": null, "Language": null, "Container": null, "$type": "SubtitleProfile"}], "$type": "DeviceProfile"}
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: User policy for example. EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 10000000, RemoteIp: 192.168.42.124, IsInLocalNetwork: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 10000000, RemoteIp: 192.168.42.124, IsInLocalNetwork: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, Path: /media/Video_File_With_Surround_Sound.mkv, isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[13:57:41] [INF] [246] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: Unknown Profile, No video direct play profiles found for /media/Video_File_With_Surround_Sound.mkv with codec hevc
[13:57:41] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Adding playback tracker : 1616939850952-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:57:41] [INF] [220] Jellyfin.Plugin.PlaybackReporting.Data.PlaybackTracker: PlaybackTracker : Adding Start Event : 03/28/2021 13:57:41
[13:57:41] [INF] [220] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Creating StartPlaybackTimer Task
[13:57:41] [INF] [220] Trakt.ServerMediator: Playback Started
[13:57:41] [INF] [241] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : Entered
[13:57:42] [INF] [180] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Processing playback tracker : 1616939850952-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:57:42] [INF] [180] Jellyfin.Api.Helpers.TranscodingJobHelper: /usr/lib/jellyfin-ffmpeg/ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -vaapi_device /dev/dri/renderD128 -i file:"/media/Video_File_With_Surround_Sound.mkv" -map_metadata -1 -map_chapters -1 -threads 0 -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_vaapi -b:v 6101365 -maxrate 6101365 -bufsize 12202730 -profile:v:0 high -level 41  -force_key_frames:0 "expr:gte(t,0+n_forced*3)" -vf "format=nv12|vaapi,hwupload,scale_vaapi=format=nv12" -start_at_zero -vsync -1 -codec:a:0 aac -ac 2 -ab 384000 -af "volume=2" -copyts -avoid_negative_ts disabled -max_muxing_queue_size 2048 -f hls -max_delay 5000000 -hls_time 3 -hls_segment_type mpegts -start_number 0 -hls_segment_filename "/config/transcodes/4788825d0d82059523c386a2f1b43e27%d.ts" -hls_playlist_type vod -hls_list_size 0 -y "/config/transcodes/4788825d0d82059523c386a2f1b43e27.m3u8"
[13:57:44] [WRN] [241] Jellyfin.Server.Middleware.ResponseTimeMiddleware: Slow HTTP Response from https://jelly.example.com/videos/a8ef6803-2e4a-8969-499f-8b11960796c8/hls1/main/0.ts?DeviceId=1616939850952&MediaSourceId=a8ef68032e4a8969499f8b11960796c8&Static=false&VideoCodec=h264&AudioCodec=aac,mp3&AudioStreamIndex=1&VideoBitrate=32719448&AudioBitrate=384000&MaxWidth=1920&PlaySessionId=e716fad2d8a848f1998535de1a4c6cfe&api_key=redacted&SubtitleMethod=Encode&TranscodingMaxAudioChannels=2&RequireAvc=false&Tag=a2e2b6ff50ec4b3e04b8655b942cb346&SegmentContainer=ts&MinSegments=1&BreakOnNonKeyFrames=False&h264-profile=high,main,baseline,constrainedbaseline&h264-level=41&TranscodeReasons=VideoCodecNotSupported to 192.168.42.124 in 0:00:02.55243 with Status Code 200
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: session.RemoteEndPoint : 192.168.42.124
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_playing_id     = a8ef68032e4a8969499f8b11960796c8
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_user_id        = 64d1fe8272fc4061ab19219607c14ef9
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : event_user_id_int    = 2
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : session_playing_id   = a8ef68032e4a8969499f8b11960796c8
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : session_user_id      = 64d1fe8272fc4061ab19219607c14ef9
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : play_method          = Transcode (v:h264 a:aac)
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : e.ClientName         = Chromecast
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : e.DeviceName         = Google Cast
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemName             = This is the item name
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemId               = a8ef68032e4a8969499f8b11960796c8
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : ItemType             = Episode
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : All matches, playback registered
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Playback tracker found, adding playback info : 1616939850952-64d1fe8272fc4061ab19219607c14ef9-a8ef68032e4a8969499f8b11960796c8
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: Saving playback tracking activity in DB
[13:58:01] [INF] [247] Jellyfin.Plugin.PlaybackReporting.EventMonitorEntryPoint: StartPlaybackTimer : Exited

System (please complete the following information):

  • OS: Docker
  • Browser: Android
  • Jellyfin Version: 10.7.1
  • Cast client: Chromecast 2nd Gen

Cannot play specific track in album when chromecasting audio

Describe the bug
When a cast session is open to any chromecast-compatible device (actual chromecast or Google Home device), selecting any given track in an album will always start play at the first track of the album... and it will play sequentially. The playlist only contains the current track, so the skip buttons are nonfunctional.

System (please complete the following information):

  • OS: Ubuntu 18.04
  • Virtualization: Docker
  • Clients: Browser + ChromeCast
  • Browser: Chromium Version 83.0.4103.97 (Official Build) snap (64-bit)
  • Jellyfin Version: 10.5.5
  • Playback: ...chromecast?
  • Installed Plugins:
    • Anime: 5.0.0.0
    • AudioDB: 10.5.5.0
    • MusicBrainz: 10.5.5.0
    • Open Subtitles: 7.0.0.0
  • Reverse Proxy: nginx
  • Base URL: jellyfin.MYURL.com
  • Networking: erm... whatever the docker container uses.
  • Storage: SMB connection to NAS

To Reproduce

  1. Open an album in a music library consisting of more than one track
  2. Start a chromecast connection to any chromecast-capable device
  3. Click on a track that is not the first track in the album.

Expected behavior
The track that you clicked on should start playing through the device that you're casting to.

Logs
None.

Screenshots

Additional context

Translate Chromecast implementation

I can't find a way to translate the interface for the Chromecast since it appears in English when launching from a mobile client to the TV.

HLS bitrates suck, directstream mkv handles higher bitrates

Describe the bug
I think the cast receiver api is very resource heavy when doing HLS streams. On the gen2 and gen3 I have had 10Mbit/s streams stall out and in the performance tab it seems to be CPU starved. Memory can also be an issue but there's a disconnect in that tab between memory usage and GC, because even with relatively low apparent usage the GC can kick in and stall the program.

To Reproduce

  1. Play HLS stream of something around 10-12 Mbit/s on gen2/gen3, maybe a bit higher for ultra
  2. watch it permanently stall after some amount of time
  3. directstream the same file
  4. great success

Expected behavior
I wish for the same bitrate limits for HLS as the directstream (progressive playback). It seems like HLS is severely capped.

System (please complete the following information):

  • Cast: gen2 & gen3

Additional context
silvermine/videojs-chromecast#73
https://stackoverflow.com/questions/23268808/hls-playback-performance-and-stability-on-chromecast

Unable to build on Windows

Describe the bug

It is not possible to build using npm run build:<prod/dev> since TS_NODE_PROJECT is not recognized as an internal or external command.

To Reproduce

  1. Clone on a Windows install.
  2. Try to build.

Expected behavior

It should build cleanly using the right tsconfig

System (please complete the following information):

  • OS: Windows 10

Additional context

It seems to have been introduced in #117 when cross-env was removed from the build scripts (originally introduced in #97). Maybe the webpack config should not be a typescript file, as mentioned by Simon here #97 (comment)

Chromecast client reports being idle regardless of the actual media playback status

Describe the bug
When casting to a Chromecast device from the Android app or from Google Chrome, regardless of the actual media playback status, when the Chromecast device is queried for its status the result is "Idle (Jellyfin for Google Cast)".

System (please complete the following information):

  • OS: Arch Linux
  • Virtualization: LXC (Proxmox)
  • Clients: Android app or Chrome browser casting to Chromecast (2nd gen)
  • Browser: Google Chrome 84
  • Jellyfin Version: 10.6.3
  • Playback: both transcoding and direct
  • Installed Plugins: AudioDB, Kodi Sync Queue, MusicBrainz, OMDb, Open Subtitles, TVHeadend, TheTVDB
  • Reverse Proxy: nginx
  • Base URL: none
  • Networking: Internal, on the same subnet. Internal DNS points the server's fqdn to the local address of the proxy to avoid hairpin NAT.
  • Storage: NFS

To Reproduce

  1. Open the Jellyfin app on Android or the browser page in Google Chrome.
  2. Click the "cast" icon and select a Chromecast device.
  3. Play a video. Video starts playing on the TV connected to the Chromecast.
  4. Query the Chromecast's status with an application like go-chromecast, for example:
    go-chromecast --device-name "TV" status
  5. The application returns:
    Idle (Jellyfin for Google Cast), volume=1.00 muted=false

Expected behavior
Upon being queried, the device should return the current playback status (playing, buffering, paused, etc). All other applications tested (Youtube, Disney+, MX Player, Spotify) report their status correctly. Examples:

$ go-chromecast --device-name "TV" status
[Ycz6TXrP-W8] YouTube (PLAYING), title="FINALLY... a Ryzen Mini PC!", artist="", time remaining=515s/929s, volume=1.00, muted=false

$ go-chromecast --device-name "TV" status
Prod MXPlayer (PLAYING), title="some_video.mp4", artist="", time remaining=4s/676s, volume=1.00, muted=false

Logs
N/A

Screenshots
N/A

Additional context
While this does not affect the actual playback of media, it's not the expected behaviour, and prevents go-chromecast from controlling media playback, since the device reports as not playing anything:

$ go-chromecast --device-name "TV" pause
unable to pause cast application: media not yet initialised, there is nothing to pause

Migrate to ES6 modules

Goal is to migrate to ES6 modules and webpack. This will break functionality until it is fully done (Only what's on the GH repo. The receiver used in jf-web will still function). @dkanada @MrTimscampi do you know if there's a good way around that?

Files:

  • components/jellyfinactions.js
  • components/maincontroller.js
  • app.js

Pending:

  • components/castDevices.js
  • components/codecsupporthelper.js
  • components/deviceprofilebuilder.js

Two new active devices reported on start of each cast session

On the CAF Nightly when a user initiates a new cast session (before media is selected) two new Active Devices are reported on each cast: The actual cast target (my Nest Hub) with the client name Chromecast 3.0.0, and a ghost "Chromecast." Looking at the dashboard's activity pane, it reports "USER is online from Chromecast" on every connect as if that device is brand new.

If you were to start a cast session, say, three times, there would then be 6 active devices listed at any given time. This behavior wasn't present with the legacy client. Ideally, this "Chromecast" device doesn't get reported at all. [Chromecast 3.0.0 should probably be renamed to Google Cast too?]

image
image

[Feature Request] Have an option to NOT show artwork on the idle screen

Describe the bug

Normally, when you attach to a Chromecast, JF shows artwork from random movies and shows. Sometimes this can be inappropriate content. My kids watch stuff using JF, and due to the rating filter, they don't see stuff they shouldn't, but they can see R-rated movie artwork via the Chromecast.

I'd love to have some sort of option (perhaps globally) where the artwork can be shut off altogether. I know this sounds super boring :)

No audio when casting to Chromecast

Describe the bug
When casting to Chromecast, I get no audio. If I try to adjust the volume, it says "Surround sound enabled." (I'm not sure if this is related, but I figured I'd mention it for clarity). However, my device does not support surround sound (it only has a stereo output). It is very well possible that my device falsely reports that it does support surround sound since it is a Chinese projector. Other applications such as YouTube and Spotify work just fine and play audio correctly.

System (please complete the following information):

  • OS: Xubuntu
  • Virtualization: Docker
  • Clients: Chromecast 2.1.0
  • Browser: N/A
  • Jellyfin Version: 10.6.2
  • Playback: both transcode & direct stream
  • Installed Plugins: nothing relevant (defaults & Trakt)
  • Reverse Proxy: Traefik 2
  • Base URL: none
  • Networking: bridge
  • Storage: local

To Reproduce

  1. Cast anything to Chromecast
  2. See video, hear no audio

Expected behavior
I expected to hear audio.

Logs
The logs do not report any errors, not in the main log and not in the directstream/transcode log. When transcoding a file with 5.1 audio (e.g. for video/subtitle reasons), it copies the 5.1 stream.

Additional context
Direct streaming stereo & 5.1 does not work, and neither does transcoding stereo & 5.1. I have no clue why it's not working. If I cast my screen to the Chromecast on Android and then play the media in the Jellyfin Android app, everything works as expected (I get both video and audio).

If any additional information is required, please let me know.

Weird "burn-in" bug

Describe the bug
When I select a video to play, I notice the last background (which can be either the "Ready to cast" screen or a series-specific background screen), faintly showing under certain colors. This is not always visible so I'm not sure if it happens all the time.

To Reproduce

  1. Play a video.
  2. Squeeze your eyes ?

Expected behavior
A video with no weird background burn-in

Screenshots
image
image
image
https://streamable.com/j38r42

System (please complete the following information):

  • OS: Docker
  • Browser: Android
  • Jellyfin Version: 10.4.3
  • Cast client: Google Cast 3rd Generation

Huge Subtitles

Describe the bug
No matter the subtitles settings in Jellyfin the subtitles on chromecast are always huge. This makes the usage of subtitles on chromecast practically useless since they are covering a lot of the video. On big TVs it's also not practical to read the huge letters.

To Reproduce

  1. Login to Jellyfin, e.g. via Web or Android
  2. Change your preferred subtitles size via profile settings
  3. Cast a movie with subtitles
  4. No matter the preferred subtitles size the displayed subtitles are always the same (huge)

Expected behavior

The subtitles settings should be adjustable similarly to jellyfin's web interface. Many movies have a black stripe on the bottom (and top) of the screen which could be used for the subtitles. Depending on the height of the black stripe the user should be allowed to change the size of the subtitles so that they can fit in.

System (please complete the following information):

  • OS: Android App 1.0.2
  • Browser: Chrome
  • Jellyfin Version: 10.6.3
  • Cast client: Ultra

Typescript migration

Opening this issue to track progress on the ongoing typescript migration:

  • src/app.js
  • src/helpers.js
  • src/components/castDevices.js
  • src/components/codecSupportHelper.js
  • src/components/commandHandler.js
  • src/components/deviceprofileBuilder.js
  • src/components/fetchhelper.js
  • src/components/jellyfinActions.js
  • src/components/maincontroller.js
  • src/components/playbackManager.js

Out of sync subs if jumping around in the video/seeking (Unstable/nightly client)

The subs go out of sync if you go to another location in the media.

I'm using the unstable version, the stable version doesn't work for me.

To Reproduce
Start a tv show, jump around to another spot, the subtitles should be out of sync.

Expected behavior
They stay in sync

Logs
Log.txt
Log transcode.txt

System (please complete the following information):

  • Jellyfin Version: 10.7.5
  • Cast client: Chromecast 2nd generation

Media buttons don't work

The Play/Pause/Stop buttons from my TV remote doesn't work with Jellyfin chromecast app. It works ok with any other Chromecast app.

If anybody can point me in the right directions of how to run a dev environment for Chromecast apps, I could take a shot at fixing this issue.

Progress Bar does not display correct values

Describe the bug

The progress bar of the HUD is showing wrong values in case one of the following situations occurs:

  • Resuming to play a file
  • Changing the file playing
  • Seeking

To Reproduce

  1. Have a file [resumeFile] to resume playing on
  2. Play another file [otherFile]
  3. Whilst playback of [otherFile] select [resumeFile]
  4. Progress bar shows the Progress of [otherFile] instead of [resumeFile]

Other way to reproduce (1):

  1. Open a media file
  2. Seek to a location
  3. Wrong timestamp and progress is being displayed

Other way to reproduce (2):

  1. Open a media file in a playlist (such as a TV-Show)
  2. Playback until some location
  3. Skip to the next title
  4. Wrong timestamp and progress is being displayed here as well

Expected behavior

Correct timestamp and progress should be displayed in the HUD.

Logs
I'm unsure on how to take logs here as this seems to be a bug in the jellyfin-chromecast app which I have no debug interface to.

Screenshots
resuming on TV
TV showing the wrong timestamp, whilst the controller [browser or android app] knows the correct one
resuming on PC

System Information:

  • OS: Docker
  • Browser: Chromium [90.0.4430.93], Jellyfin Android [PlayStore, v2.2.3]
  • Jellyfin Version: 10.7.2
  • Cast client: Ultra

Additional context

Overlays over video on Chromecast

Describe the bug
When watching something on Chromecast overlays appear over the video. There appears to be no way to dismiss them. I have seen both an overlay with the current album-art, title and a progrss bar (which is stuck at zero) and overlays for libraries, shows, seasons or episode information.

To Reproduce

  1. Start playing a video.
  2. Go to home.

Expected behavior

The video continued to play, unobstructed on the Chromecast.

System (please complete the following information):

  • OS: NixOS
  • Browser: Android app
  • Jellyfin Version: 10.4.0

Chromecast won't fully connect with custom CA issued cert

Describe the bug

Jellyfin won't fully establish a Chromecast session with a Jellyfin server using a certificate that has been issued by a personal CA. Switching to Lets Encrypt fixes it, but either case should work. Emby's Chromecast app allows custom CA signed certs.

To Reproduce

  1. Set SSL cert to custom CA signed cert PFX file
  2. Restart Jellyfin
  3. Cast to Chromecast
  4. Jellyfin logo appears on Chromecast, but photo slideshow does not start and video playback does not work.

Expected behavior

Movie/TV art slideshow should start up. Video playback should work.

Logs

I believe this is on the Chromecast app side because nothing appears in the Jellyfin app nor the Chrome app side of things. Only the person controlling the Chromecast app could debug this and see log output.

Screenshots

System (please complete the following information):

  • OS: Fedora 30
  • Browser: Chrome
  • Jellyfin Version: 10.4.0
  • Reverse proxy: none

Additional context

I need to use this cert because of how Jellyfin changed handling of HDHomeRun connections from http to https and Lets Encrypt does not sign SANs with IP addresses at this time.

Using fmp4 causes chromecast gen 2 to freeze

Describe the bug
When hardcoding a transcoding profile to fmp4 over HLS the chromecast locks up completely

{
                 Container: "mp4",
                 Type: "Video",
                 AudioCodec: "aac",
                 VideoCodec: "h264",
                 Context: "Streaming",
                 Protocol: "hls",
                 MaxAudioChannels: physicalAudioChannels.toString(),
                 MinSegments: "1",
                 BreakOnNonKeyFrames: false
}

To Reproduce

  1. Hardcode above profile
  2. Try to play something that requires transcoding

Expected behavior
No freezing and playback works as it should

System (please complete the following information):

  • OS: Docker
  • Browser: Chrome
  • Jellyfin Version: 10.7-unstable
  • Cast client: Gen 2

Higher bitrate video always transcoded

When attempting playback of a large mkv to my Chromecast 2 the media is always transcoded with reason 'ContainerBitrateExceedsLimit'. The file uses working codecs and my network can handle it, because if I disable transcoding altogether the video plays fine.

Server log snippet:

[INF] Bitrate exceeds DirectPlay limit: media bitrate: 12395162, max bitrate: 11000000
[INF] Bitrate exceeds DirectStream limit: media bitrate: 12395162, max bitrate: 11000000

It looks like this limit is hardcoded in app.js:2. I guess this might be suitable for a first generation Chromecast? The Chromecast 2 seems to be able to handle higher rates.

Possible solutions

  • Maybe removing the limit entirely (I think that's what plex did)
  • Different hard coded limits for the various models (1/2/ultra)
  • Server side detection and configuration

Progress bar constantly visible obscuring playback

I recently started to suffer from annoying issue that makes JF unusable for me.

When casting video from my local network server to a Chromecast device, the progress bar at the bottom of the screen, the one with poster, tittle and playback position, never hides itself, remains constantly visible (and the playback position is not being updated with time), obscuring about 20% of screen area, including subtitles.

It doesn't matter if I first connect to Chromecast and then select the media, or if I switch to casting during the playback in my phone.

I have server on Raspberry Pi 4B, connected via stable Ethernet to local router, to which also my Chromecast is connected, on the same local network. I use android app for control.

Steps to reproduce:

  1. Start playback is any video on Chromecast
  2. Wait for it to start playing

Expected result:
Video playback starts, progress bar disappears after few seconds.

Actual results:
Video playback starts, progress bar is constantly visible obscuring screen.

JF Server version 10.7.7, android app version 2.4.2
Raspberry pi 4b, 4gb version running raspberry pi os bullseye. Jellyfin installed from repositories.

HLS+passthrough not working

EDIT: I'm hijacking this issue to continue with this problem

Describe the bug
When chromecast gen2 is set to stereo only / auto mode with 2ch screen, it's still detected as 6ch and ends up with aac 6ch which it doesn't seem to deal with.

The symptoms of this bug is that it seems to play but just skips super fast through. If you're one of the lucky few with access to logs, you'll see: "media_player.js:87 [ 14.293s] [cast.player.api.Host] error: cast.player.api.ErrorCode.PLAYBACK/104"

To Reproduce

  1. chromecast gen2
  2. 2 channel only tv (maybe?)
  3. play something where the source has 6 channels or more

Expected behavior
Honestly I expected either aac/mp3 2ch or ac-3 6ch. I was thinking something like this:

if deviceType == GEN1GEN2:
    if numChannels > 2:
        codecs = ac-3
    else:
        codecs = aac,mp3

System (please complete the following information):

  • OS: debian
  • Browser: chromium
  • Jellyfin Version: 10.6.4
  • Cast client: gen2

Additional context
am available for debugging :) What's needed for ac-3 and can I help with that?

Jellyfin chromecast client unresponsive to any voice commands.

When streaming from Plex to my Google Mini (Nest), I am able to say to "Ok, Google. stop playing" or "OK, Google. cancel" and The stream will terminate. Similarly, "Ok, Google. Pause/Resume" works.

When using Jellyfin, this doesn't work (and never has). The stream pauses long enough for Google to listen and think for a moment, but then the stream continues to play. If you then ask "Ok Google, what's playing?" it will say nothing is playing.

In short, the JF chromecast client doesn't seem to have any intelligence at all to be able to actually interact with google. The only way to control it is from a cast client (i.e. JF app on web or mobile).
This is really inconvenient when needed to stop a playing stream immediately (like a phone call, etc.).

ALAC files and Chromecast: Directplay instead transcode

Play ALAC music files to Chromecast don't work,
Using the web browser works fine.

There's no log information, no transcode process.
Jellyfin panel says it is Directplay, but Chromecast don't handle ALAC.

Who decides if the format is supported,
Does Chromecast or Jellyfin make the choice?

Receiver reporting incorrect progress when playback stops

Describe the bug
Receiver reports incorrect progress when playback stops. It seems the request payload to Sessions/Playing/Stopped always contains PositionTicks: 0 no matter the actual progress.

reportPlaybackStopped in src/components/jellyfinActions.ts is a good start

To Reproduce

  1. Start media
  2. Stop media
  3. Check request payload

Expected behavior

Report correct progress in PositionTicks field

System (please complete the following information):

  • OS: N/A
  • Browser: N/A
  • Jellyfin Version: 10.6.4 (unstable)
  • Cast client: Gen 2

Chromecast with .strm files

DUPE ISSUE jellyfin/jellyfin-android#137
At first I thought this was an issue with the android app as I wasn't able to test in a web browser. Now have confirmed it is an issue with Jellyfin not the app I believe the bug report belongs here.

Describe the bug

.strm files don't work on chromecast. Just a blank screen when casting.

To Reproduce
Try to cast a .strm file.

Expected behavior

Logs
none - jellyfin seems to think it plays fine.

System (please complete the following information):

  • OS: [Ubuntu 18.04]
  • Browser: [Chrome, Android app]
  • Jellyfin Version: [10.3.2]

Additional context

I have tried via https (nginx reverse-proxy)
http via ip:port
It works using emby

Not able to connect to chromecast on 10.7, works on 10.6

Describe the bug

Making this on behalf of people that are going to have this problem and already have.

E.g. https://www.reddit.com/r/jellyfin/comments/ko1s7r/jellyfin_1070_release_candidate_2_incoming_now/ghphrf6/

The problem is that the LocalAddress field is not being used anymore since jellyfin/jellyfin-web#2085
which closes a slew of issues for people that are using reverse proxies and other setups where the jellyfin server doesn't know if the chromecast should be using the address, and if the address is correct.

However, this workaround tries to get around:

  • https issues
  • DNS issues

To Reproduce

The two scenarios that the old behavior tries to fix are DNS and HTTPS scenarios.
For a DNS scenario:

  1. jellyfin server on server.local (192.168.1.2:8096)
  2. jellyfin web on client.local (192.168.1.3) with chrome://flags set to allow casting from http
  3. chromecast on ccast.local (192.168.1.4)
  4. client opens server at http://server.local:8096. This will show that you can cast to chromecast but you get a connection error.

For https scenario:

  1. server.local is now at 192.168.1.2:8443, with snakeoil certificate. Cert installed as CA root so that it seems valid to the server
  2. client.local installs the snakeoil as a CA root, making the certificate seem completely valid.
  3. chrome opens https://192.168.1.2:8443 and can cast without a workaround since it's "secure".
  4. when casting the chromecast refuses to connect and gives a connection error.

For this scenario I state that the cert will be installed as CA root, to show that the client or server will not be able to perform validation to predict if the chromecast will fail. In this case I think http will be closed on jellyfin and a fix is not possible.

For https scenario with snakeoil reverse proxy:

  1. server.local is now at 192.168.1.2:8096 with nginx+snakeoil at 443. Cert installed as CA root so that it seems valid to the server
  2. client.local installs the snakeoil as a CA root, making the certificate seem completely valid.
  3. chrome opens https://192.168.1.2:443 and can cast without a workaround since it's "secure".
  4. when casting the chromecast refuses to connect and gives a connection error.

Here the chromecast could have used the 8096 port to connect successfully, as long as this is not blocked.

Localhost scenario:

  1. desktop.local at 192.168.1.2:8096
  2. chromecast at 192.168.1.3
  3. person on desktop.local opens chrome and connects to localhost:8096 and casts from there
  4. chromecast tries to connect to itself

In this scenario, the workaround would send the LAN address of the server to the chromecast before.

Expected behavior

According to the old behavior:

  1. jellyfin-web judged that the normal address was a DNS name and therefore used LocalAddress instead
  2. server judged that the chromecast was on the same LAN, uses LocalAddress which probably is https and fails anyway
  3. server judged that the chromecast was on the same LAN and therefore used LocalAddress which made the thing work by going directly to server.

Possible fixes

I want to send two addresses to the chromecast. I want to send it the preferred address and the fallback address. Then the chromecast tries them and preferentially selects the normal one. If it fails, it tries the fallback one.

As for LocalAddress I would ideally make a new API instead and call it FallbackAddress or something. Then it should have a toggle button in the settings and a field so it can be overridden. With this thinking we can deprecate LocalAddress from the API and a bunch of the detection code that is bound to fail because it was the wrong approach to begin with.

We don't know for sure if DNS names warrant using LocalAddress. It may be a valid internet name.
We also don't know if HTTPS is an issue. The certificate might be valid.

I think the best here is trial and error.

If jellyfin closes the http port as https is activated, and the certificate is not internet-valid, then there's just no solution.

Not able to DirectPlay HEVC/H265 on Chromecast Ultra

Describe the bug
Chomecast Ultra should support hevc and aac so I have converted some 4K movies to that since my server isn't a monster and would like to direct play these large movies. Problem is Jellyfin always starts to transcode the movie anyway. I only have mkv movies to try with but I have read it should not be a problem if the codec is correct on streams inside it.

It looks like hevc isn't in the "playback profile" jellyfin use when casting to Chromecast Ultra. Is there a workaround for this? Can I somehow try configure my way around this? I have not found any guide on how this works.

The only player I have successfully getting hevc direct playback to work with is jellyfin-mpv-shim. Web-browser built-in player and Chromecast always "fail" for me.

System (please complete the following information):

  • OS: Linux
  • Virtualization: Docker
  • Clients: Browser, Android
  • Browser: Chrome
  • Jellyfin Version: 10.7.0-rc1
  • Installed Plugins: none
  • Reverse Proxy: nginx]
  • Networking: Bridge/NAT
  • Storage: local

To Reproduce

  1. Connect to Chromecast Ultra in Chrome or Android app.
  2. Play a movie with HEVC and AAC streams
  3. Jellyfin starts to transcode

Expected behavior
Direct replay or direct stream (don't know the difference) and no transcoding.

Logs
[2020-12-13 21:23:33.364 +00:00] [INF] [113] Jellyfin.Api.Helpers.MediaInfoHelper: Profile: "Unknown Profile", No video direct play profiles found for "/data/media/movies/The Prestige (2006)/movie.mkv" with codec "hevc"

Multiple transcodes after seeking causes stuttering/buffering

Describe the bug

I'm running Jellyfin on a Raspberry Pi 4. I've set up Jellyfin to use the OpenMAX HWA for encoding for H264 (the Pi 4 does not have any HWA decoding available). When I start casting a video to my TV, playback is fine and smooth. There is one transcode running in the background.

If I seek forward to another part of the video, Jellyfin starts a second transcode process that starts at the seek-to point. However, the Pi 4 cannot encode two H264 streams simultaneously in realtime, so, after seeking, the video will play ok for a few seconds, then pause for a few seconds, play for a few seconds, and so on.

I've tried enabling the "Throttle Transcodes" option in the Jellyfin transcoding configuration, but this doesn't change anything.

If I ssh into the RPi and run kill -STOP $PID_OF_OTHER_FFMPEG, I can get smooth streaming performance, but of course this isn't something I should have to do; at any rate, a few minutes after doing this, playback fails and stops completely; I assume Jellyfin gets upset that it can't communicate with the main ffmpeg process, or something.

If I stop everything, on an otherwise-idle system, and run the same ffmpeg command Jellyfin uses, I note that ffmpeg is only able to encode at around 1.4x or so of real-time speed, which supports the idea that it cannot transcode two streams simultaneously in real-time.

To Reproduce

  1. Enable HWA encoding on a Raspberry Pi 4 running Jellyfin
  2. Use an app (I used the Android app, but I imagine the behavior will be the same with others) to start casting to a Chromecast.
  3. Immediately seek forward in the video by 10 minutes or so.
  4. Playback continues at the expected location, but every few seconds playback will pause for buffering.

Expected behavior

Playback should be smooth after seeking.

I understand why Jellyfin continues the "main" transcode process after seeking, but this just isn't ever going to work properly on some hardware, so ideally there should be a way to disable that behavior, or Jellyfin should be able to drop the priority & thread count of the "non foreground" transcode so the "foreground" transcode gets as much CPU time as it needs.

Additionally, I would expect Jellyfin to just not transcode at all when the target device supports the content being played, which I believe is the case for the file in question.

Logs

No particularly relevant logs, but this shows the multiple transcodes running:

$ ps ax|grep ffmpeg
26964 ?        Rl    14:15 /usr/lib/jellyfin-ffmpeg/ffmpeg -i file:/path/to/some/video.mkv -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_omx -force_key_frames expr:gte(t,n_forced*5) -vf scale=trunc(min(max(iw\,ih*dar)\,1920)/2)*2:trunc(ow/dar/2)*2 -copyts -avoid_negative_ts disabled -start_at_zero -b:v 10360000 -maxrate 10360000 -bufsize 20720000 -vsync -1 -map_metadata -1 -map_chapters -1 -threads 0 -codec:a:0 copy -y /var/lib/jellyfin/transcoding-temp/3e42065231dfb44d07fc2a2b7705a711.mkv
27847 ?        Rl    10:11 /usr/lib/jellyfin-ffmpeg/ffmpeg -ss 01:18:18.054 -i file:/path/to/some/video.mkv -map 0:0 -map 0:1 -map -0:s -codec:v:0 h264_omx -force_key_frames expr:gte(t,n_forced*5) -vf scale=trunc(min(max(iw\,ih*dar)\,1920)/2)*2:trunc(ow/dar/2)*2 -copyts -avoid_negative_ts disabled -start_at_zero -b:v 10360000 -maxrate 10360000 -bufsize 20720000 -vsync -1 -map_metadata -1 -map_chapters -1 -threads 0 -codec:a:0 copy -y /var/lib/jellyfin/transcoding-temp/f1a381d261bb38a375db214d8cde353f.mkv

Screenshots
n/a

System (please complete the following information):

  • OS: Raspbian buster
  • Browser: n/a
  • Jellyfin Version: 10.5.5 (from Debian packages)
  • Cast client: Cromecast Ultra, cast initiated from Android app

Additional context

(Context included in bug description)

Chromecast client does not respect "Queue repeat" value.

Describe the bug
Regardless of what I have selected for the "repeat" setting (the right-most of the three icons right above the volume bar in the android app (fullscreen, shuffle, repeat), the chromecast app does not stop at the end of the media and will play the show or movie again and again.

To Reproduce
Play a show or movie using the chromecast client. At the end, do not stop it, and watch it start to play again.

Expected behavior
Media playback should stop at the end of the playlist unless the "repeat" option is set to some mode that warrants repeating things.

System (please complete the following information):

  • OS: Ubuntu (x64) 20.04
  • Browser: Android app, Chome, it doesn't matter
  • Jellyfin Version: 10.7.6
  • Cast client: Ultra (I had assumed they were all the same, but I have only noticed this happening on my CC Ultra).

Can't control Chromecast media playback and Android crashes

This is probably related to issues like these:
#57
#67

And my original issue that was closed:
#29
(why my issue was closed instead of the duplicate 67 I have no idea....)

But not the exact parameters. I'm running the latest 10.7.0 on Windows and 2.2.3 on Android 11.
I just upgraded from 10.6.1 to 10.7.0 because I was/am still experiencing issues with my Google Mini/Nest products not reporting anything playing when Cast to them from JF.
Casting is usually started from Chrome on Windows, though the issue appears regardless of how I can get the cast to happen.
This means that the Google devices not only can't pause/ff/rw, etc, but they don't even register that media is playing if you say "Ok Google, what's playing?" and you cannot stop playback via voice, you are required to open up the JF app and terminate playback which is a huge drawback when you need to take a call, etc.

I researched the issues above after upgrading to 10.7.0 and after changing the the Playback Chromecast version to Nightly (and refreshing, and starting playback from a new incognito session, etc), nothing has changed. The Google devices still don't recognize any media playing from JF.

Additionally, this problem is conflated with 2.2.3 of the Android app. When Chromecast version is set to stable, everything works normal (albeit the issue at hand of not being able to control playback). However, if I use the Nightly version then the Android app will crash on playback. Specifically what happens is after choosing the cast location and then beginning playback the media controls will show on the screen but no playback will happen (i.e. the counter stays a 0:00). If you attempt to press play again or skip forward or otherwise interact, the entire app crashes.

The only reason I care about this is that it appears the only way to get the Google devices to register the media is to use the Nightly version. Additionally, I am unable to get this to work from Chrome on Windows. Therefore, I am still having the same issues as #29 and #67 and both have been closed.

System (please complete the following information):

  • OS: Windows
  • Virtualization: none
  • Clients: Latest Chrome on Windows, Android 2.2.3, Google Mini/Nest clients.
  • Browser: Chrome 89.0.4389.82
  • Jellyfin Version: 10.7.0
  • Playback: any
  • Installed Plugins: none
  • Reverse Proxy: nginx
  • Base URL: none
  • Networking: host
  • Storage: local

Casting music to a Chromecast Audio, wrong track plays and playback stops after the track

Describe the bug
When casting music to Chromecast Audio using the Android app, no matter what track you pick the first track on the album is played. After that it stops. You can add songs to the playlist, but they will not play afterwards.

If you click on the play button on an album it will then play the full album through in order.

System (please complete the following information):

  • OS: Android.
  • Virtualization: Nope.
  • Clients: Android.
  • Jellyfin Version: 10.5.4

To Reproduce

  1. Cast to a Chromecast Audio
  2. Click on a track other than the first on an album
  3. Watch it play the first track on the album

Expected behavior
It should play the track you choose.

Allow server to interact with and manage Chromecast clients

It would be ideal if the server had the ability to interact with chromecast clients the same way it can with others, eg allow the server to send play/pause/seek commands as well as be able to pop up a message using the send message feature.

It is fairly annoying to be able to control all the native clients from the server to a certain extent with basic media controls but have no ability to manage chromecasts. Someone could just leave something playing with autoplay and it would just go until it eventually ran out of media.

Casting from Jellyfin server from behind reverse proxy

This isn't really a bug, but a call for advice. I logged this bug in the main Jellyfin repo and got a depressing answer. I had also logged a feature request that I linked to from a comment on that bug, that probably has a very slim chance of getting implemented.

jellyfin/jellyfin#4917

Can anyone suggest a course of action for me that will allow me to cast locally-hosted media from Jellyfin?

TL/DR: Chromecasts have hard-coded DNS servers, and are about to deprecate playing media from non-HTTPS sources, and my ISP doesn't allow NAT loopback, so I can't play my locally-hosted media on my Chromecasts.

chromecast playback can't be controlled via google home

Maybe this is a feature request not a bug. If so create the issue there.
Describe the bug
When Jellyfin is playing media on my chromecast, I cannot control playback with google home. I also do not get a notification on my phone telling me that there is media playing on the chromecast. For all other applications streaming media through the chromecast (netflix, youtube, etc.) I can simply say "hey google, pause the tv". With jellyfin though google just tells me there is currently no media playing.

System (please complete the following information):

  • OS: Debian (Lubuntu)
  • Virtualization: Docker
  • Clients: Browser, Android, google devices(chromecast, home minis)
  • Browser: Chrome
  • Jellyfin Version: 10.6.4
  • Playback: [irect Play
  • Installed Plugins: none
  • Reverse Proxy: no
  • Base URL: none
  • Networking: Bridge/NAT
  • Storage: local

To Reproduce

  1. start media playback on google home device
  2. ask google device to pause playback
  3. google tells me there is no media playing on device

Expected behavior

I expect playback to pause

Logs

Screenshots

Additional context

When chromecasting to group of devices, information about media not displayed

Describe the bug
When casting a single audio track, information about the track will be shown on the screen. If you have more than one cast-compatible device in a group through Google Home that includes a device with a screen, the device with the screen will not show relevant information about the playing media. Pictures are included below.

System (please complete the following information):

  • OS: Ubuntu 18.04
  • Virtualization: Docker
  • Clients: Browser + ChromeCast
  • Browser: Chromium Version 83.0.4103.97 (Official Build) snap (64-bit)
  • Jellyfin Version: 10.5.5
  • Playback: ...chromecast?
  • Installed Plugins:
    • Anime: 5.0.0.0
    • AudioDB: 10.5.5.0
    • MusicBrainz: 10.5.5.0
    • Open Subtitles: 7.0.0.0
  • Reverse Proxy: nginx
  • Base URL: jellyfin.MYURL.com
  • Networking: erm... whatever the docker container uses.
  • Storage: SMB connection to NAS

To Reproduce

  1. In the Google Home app, make sure that you have a group of Chromecast-enabled devices. This group should contain at least one device with a screen; either a Hub or a regular Chromecast hooked to a TV.
  2. In Jellyfin, select the group as a cast target.
    Screenshot from 2020-06-17 19-01-50
  3. Play media.
  4. See that no information is provided on the screen of the device(s) that you are casting to. Pictures at the bottom.

Expected behavior
I should see information about the currently-playing media on the screen.

Logs
None.

Screenshots / Photos
Configuring a group in the Google Home app:
Screenshot_20200617-185453

Verifying devices in the group in the Google Home app:
Screenshot_20200617-185508

Screen display when casting to one device specifically (Google Home Hub):
image

Screen display when casting to one device specifically (Chromecast):
image

Screen display when casting to group of devices (Google Home Hub) -- it is playing audio when this picture was taken:
image

Screen display when casting to a group of devices (Chromecast):
image

Additional context

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.