Giter Club home page Giter Club logo

jellyfin-docs's Introduction

Jellyfin Documentation

Part of the Jellyfin Project

This repository has been deprecated. Please use the jellyfin.org repository instead.

This repository houses all documentation for Jellyfin available at jellyfin.org and written in markdown.

Getting Started

The site is built with DocFX using DocFX Flavored Markdown. See the content section here for a quick tutorial on DocFX.

Since the site is mostly written with simple Markdown files, the easiest and fastest way to contribute is to just edit the source files directory on GitHub. For example, you could edit this README page by going to its edit page on GitHub.

Editing directly on GitHub provides a feature to preview your changes for the current document, but if you want to see your changes within the context of the actual website or make more advanced changes to the site, you will need to run a copy of the site locally.

To run the site locally, you will first need to clone this repository using git.

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

Next, you will need to install DocFx as a command line tool. Once installed, you can run the following command from the root directory of your cloned repository.

docfx --serve

This will build the site and start up a development server to test out your changes available at http://localhost:8080.

Linting

This repository is configured to use markdownlint for linting Markdown files.

If you are editing files within Visual Studio Code, you can install the markdownlint extension to see the linting errors as you work.

You can also easily run the linter manually using the associated markdownlint CLI.

npm install -g markdownlint-cli
markdownlint **/*.md --ignore node_modules --ignore src

Layout

The following sections explain the documentation content available for each area of the site.

Plugin API

Describe all available API surfaces and class from plugin development.

ApiSpec

apispec is used to overwrite specific plugin API page contexts.

Docs

docs is the main custom documentation directory. All uids for the custom documentation are relative to this directory, with administration and contributing shortened to admin and contrib respectively. So for example to reference the file general/administration/installing.md one would use xref:admin-installing with an optional anchor like xref:admin-installing#arch.

Administration

Should be used for documentation related to server setup including non-default configs for more advanced users.

Contributing

Should be used for documentation related to development, translations, releases, and other ways to contribute to the project.

Clients

Any documentation related to the clients.

Server

Any documentation related to managing the server or explaining certain features.

Media

Naming conventions for all supported media types, such as movies or podcasts.

Plugin

Any plugin documentation.

jellyfin-docs's People

Contributors

1337joe avatar anthonylavado avatar arbitrate3280 avatar artiume avatar carif avatar crobibero avatar ctalvio avatar daullmer avatar dkanada avatar erayan avatar essasetic avatar gotton avatar iwalton3 avatar joshuaboniface avatar justaman avatar jwillikers avatar mark-monteiro avatar mcarlton00 avatar nielsvanvelzen avatar nvllsvm avatar nyanmisaka avatar prplhaz4 avatar rexbron avatar shadowghost avatar theg00s3 avatar thibaultnocchi avatar thornbill avatar timgels avatar tontonjo avatar winux1 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  avatar  avatar  avatar

jellyfin-docs's Issues

Remove link to third party plugin LazyMan due to potential copyright issues

I'd like to suggest removing the link to LazyMan from the third party plugins listed here:

https://jellyfin.readthedocs.io/en/latest/server/plugins/#lazyman

From the reddit page for LazyMan:

A simple program that lets you stream every NHL and MLB game from your favorite media player for free

While this may be acceptable in some countries, in other countries I cannot imagine where this would be legal 100% of the time. Further, while I do not disagree with the 'service' existing, it doesn't appear in the best interest for the JF project to endorse it by having it listed in the docs. This is the same stance that the Kodi team follows.

[Request] Document Secure Connection Mode options

As the title says - at least document the implications of changing modes...DLNA, HDHR and Chromecast appear to be impacted in strange ways.

Ref: jellyfin/jellyfin#2259, jellyfin/jellyfin#1396 (comment)

URL returned to the Client - 10.5.0

x Status ping test DLNA (SSDP NOTIFY) HDHR (ffmpeg) Chromecast
Disabled ✔️ http://server-ip:8096 http://server-ip:8096 http://127.0.0.1:8096
Preferred https://server-ip:8096 FAIL None FAIL https://127.0.0.1:8096 FAIL
Required 🔶
Handled by RP 🔶

Not an issue, a fix

Apologies i have no idea where to share my experience with your (amazing) software but i am not at all familiar with git. Thought the documentation could probably benefit from my experience:

Setup:

  • Asustor AS-5002t (Intel J1800 with QuickSync)
  • running with Docker CE and Portainer
  • original video with 17000kbps to transcode to 8mbps

What happens:

  • activating HW transcode (Intel QuickSync) should free resources from the CPU and improve transcode speed
  • unfortunately it is not the case. video freezes every other second

Fix:

  • add a device on portainer pointing:
    host: /dev/renderD128
    container: /dev/dri/renderD128
  • select VAAPI on the web interface instead of QuickSync

after this change the video is working beautifully. no buffering anymore.

DocFX CI builds fail

The last time DocFX Build pipeline ran succesfully was run #20200216.4 . This ran with DocFX release 2.48.1.

With run #20200217.1 DocFX release 2.49. is used, which fails parsing several triple-slash-comments.

Any way to revert to 2.48.1 until this is fixed ?

[Request] Search Analysis

While using the search, I got some odd behavior. An image was missing and so I pulled a new image.

Reviewing the logs, it looked like some inefficiencies and calls are occurring. I recently updated to master and cleared my cache with the update, I am finding slow system response as the cache rebuilds and I am reviewing logs while it rebuilds.

[2020-02-25 23:46:24.866 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:01.126996. "http://domain/Artists?searchTerm=thieves&IncludePeople=false&IncludeMedia=false&IncludeGenres=false&IncludeStudios=false&IncludeArtists=true&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1&userId=bd3cd6572a584e08b43f6d2652e0c2c6"
[2020-02-25 23:46:25.216 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:01.4779472. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&MediaTypes=Video&ExcludeItemTypes=Movie%2CEpisode&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:25.234 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:01.4971402. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&IncludeItemTypes=Playlist&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:25.926 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:00.5061166. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&IncludeItemTypes=Episode&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:25.927 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:04.1363007. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&IncludeItemTypes=Episode&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:26.243 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:00.7172261. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&MediaTypes=Photo&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:26.338 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:02.6438431. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&IncludeItemTypes=Audio&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"
[2020-02-25 23:46:26.338 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:00.8399665. "http://domain/Users/bd3cd6572a584e08b43f6d2652e0c2c6/Items?searchTerm=thieves&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false&IncludeItemTypes=Audio&Limit=24&Fields=PrimaryImageAspectRatio%2CCanDelete%2CBasicSyncInfo%2CMediaSourceCount&Recursive=true&EnableTotalRecordCount=false&ImageTypeLimit=1"

These are calls to each library type to get results back on the keyword. I searched for thieves. Looks like it'd be pretty easy to add in searches for stuff like genres

[2020-02-25 23:46:36.399 +00:00] [ERR] Error processing request
System.Net.Http.HttpRequestException: Resource temporarily unavailable
 ---> System.Net.Sockets.SocketException (11): Resource temporarily unavailable
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   --- End of inner exception stack trace ---
   at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean allowHttp2, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancellationToken)
   at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
   at System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task`1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts)
   at Emby.Server.Implementations.HttpClientManager.HttpClientManager.SendAsyncInternal(HttpRequestOptions options, HttpMethod httpMethod)
   at Emby.Server.Implementations.HttpClientManager.HttpClientManager.SendAsync(HttpRequestOptions options, HttpMethod httpMethod)
   at MediaBrowser.Providers.Manager.ProviderManager.SaveImage(BaseItem item, String url, ImageType type, Nullable`1 imageIndex, CancellationToken cancellationToken)
   at Emby.Server.Implementations.Library.LibraryManager.ConvertImageToLocal(BaseItem item, ItemImageInfo image, Int32 imageIndex)
   at Emby.Drawing.ImageProcessor.ProcessImage(ImageProcessingOptions options)
   at MediaBrowser.Api.Images.ImageService.GetImageResult(BaseItem item, Guid itemId, ImageRequest request, ItemImageInfo image, Boolean cropwhitespace, IReadOnlyCollection`1 supportedFormats, Nullable`1 cacheDuration, IDictionary`2 headers, Boolean isHeadRequest)
   at Emby.Server.Implementations.Services.ServiceExecGeneral.GetTaskResult(Task task)
   at Emby.Server.Implementations.Services.ServiceHandler.ProcessRequestAsync(HttpListenerHost httpHost, IRequest httpReq, HttpResponse httpRes, ILogger logger, CancellationToken cancellationToken)
   at Emby.Server.Implementations.HttpServer.HttpListenerHost.RequestHandler(IHttpRequest httpReq, String urlString, String host, String localPath, CancellationToken cancellationToken)

This was an ungraceful return. Looks like no image was returned for an object. On the search page, the picture was missing. I did recently update the server and that cleared the cache. So perhaps this was lost in the cache?

[2020-02-25 23:46:36.402 +00:00] [WRN] HTTP Response 500 to "192.168.1.1". Time (slow): 0:00:10.0163711. "http://domain/Items/f5aab68a012efd583775248aeb625d1c/Images/Primary?tag=9da574074fa69f3e4bed5a9e4cda5f19&quality=90"
[2020-02-25 23:47:35.097 +00:00] [INF] GetPostedPlaybackInfo profile: DeviceProfile { 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: 120000000, MaxStaticBitrate: 100000000, MusicStreamingTranscodingBitrate: 192000, MaxStaticMusicBitrate: null, SonyAggregationFlags: null, ProtocolInfo: null, TimelineOffsetSeconds: 0, RequiresPlainVideoItems: False, RequiresPlainFolders: False, EnableMSMediaReceiverRegistrar: False, IgnoreTranscodeByteRangeRequests: False, XmlRootAttributes: [], DirectPlayProfiles: [DirectPlayProfile { Container: "mp4,m4v", AudioCodec: "aac,opus,flac,vorbis", VideoCodec: "h264,vp8,vp9", Type: Video }, DirectPlayProfile { Container: "opus", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "mp3", AudioCodec: "mp3", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "aac", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "m4a,m4b", AudioCodec: "aac", VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "flac", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webma,webm", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "wav", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "ogg", AudioCodec: null, VideoCodec: null, Type: Audio }, DirectPlayProfile { Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: "VP8", Type: Video }, DirectPlayProfile { Container: "webm", AudioCodec: "vorbis,opus", VideoCodec: "VP9", Type: Video }], TranscodingProfiles: [TranscodingProfile { Container: "ts", Type: Audio, VideoCodec: null, AudioCodec: "aac", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 1, SegmentLength: 0, BreakOnNonKeyFrames: True }, 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 }, 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 }, 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 }, 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 }, TranscodingProfile { Container: "opus", Type: Audio, VideoCodec: null, AudioCodec: "opus", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False }, TranscodingProfile { Container: "mp3", Type: Audio, VideoCodec: null, AudioCodec: "mp3", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False }, TranscodingProfile { Container: "aac", Type: Audio, VideoCodec: null, AudioCodec: "aac", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False }, TranscodingProfile { Container: "wav", Type: Audio, VideoCodec: null, AudioCodec: "wav", Protocol: "http", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Static, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 0, SegmentLength: 0, BreakOnNonKeyFrames: False }, TranscodingProfile { Container: "ts", Type: Video, VideoCodec: "h264", AudioCodec: "aac", Protocol: "hls", EstimateContentLength: False, EnableMpegtsM2TsMode: False, TranscodeSeekInfo: Auto, CopyTimestamps: False, Context: Streaming, EnableSubtitlesInManifest: False, MaxAudioChannels: "2", MinSegments: 1, SegmentLength: 0, BreakOnNonKeyFrames: True }, 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 }, TranscodingProfile { Container: "mp4", Type: Video, VideoCodec: "h264", AudioCodec: "aac,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 }], ContainerProfiles: [], CodecProfiles: [CodecProfile { Type: VideoAudio, Conditions: [ProfileCondition { Condition: Equals, Property: IsSecondaryAudio, Value: "false", IsRequired: False }], ApplyConditions: [], Codec: "aac", Container: null }, CodecProfile { Type: VideoAudio, Conditions: [ProfileCondition { Condition: Equals, Property: IsSecondaryAudio, Value: "false", IsRequired: False }], ApplyConditions: [], Codec: null, Container: null }, CodecProfile { Type: Video, Conditions: [ProfileCondition { Condition: NotEquals, Property: IsAnamorphic, Value: "true", IsRequired: False }, ProfileCondition { Condition: EqualsAny, Property: VideoProfile, Value: "high|main|baseline|constrained baseline", IsRequired: False }, ProfileCondition { Condition: LessThanEqual, Property: VideoLevel, Value: "51", IsRequired: False }], ApplyConditions: [], Codec: "h264", Container: null }], ResponseProfiles: [ResponseProfile { Container: "m4v", AudioCodec: null, VideoCodec: null, Type: Video, OrgPn: null, MimeType: "video/mp4", Conditions: [] }], SubtitleProfiles: [SubtitleProfile { Format: "vtt", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ass", Method: External, DidlMode: null, Language: null, Container: null }, SubtitleProfile { Format: "ssa", Method: External, DidlMode: null, Language: null, Container: null }] }

This is the server's reaction to the void metadata. This is one nasty gram too. The header is extremely loooong.

[2020-02-25 23:47:35.099 +00:00] [INF] User policy for "artiume". EnablePlaybackRemuxing: True EnableVideoPlaybackTranscoding: True EnableAudioPlaybackTranscoding: True
[2020-02-25 23:47:35.099 +00:00] [INF] Profile: "Unknown Profile", Path: "/media/movies/P/Princess of Thieves (2001)/Princess of Thieves (2001) Bluray-720p.mp4", isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[2020-02-25 23:47:35.099 +00:00] [INF] RemoteClientBitrateLimit: 1000000, RemoteIp: "192.168.1.1", IsInLocalNetwork: True
[2020-02-25 23:47:35.099 +00:00] [INF] Profile: "Unknown Profile", Path: "/media/movies/P/Princess of Thieves (2001)/Princess of Thieves (2001) Bluray-720p.mp4", isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[2020-02-25 23:47:35.099 +00:00] [INF] RemoteClientBitrateLimit: 1000000, RemoteIp: "192.168.1.1", IsInLocalNetwork: True
[2020-02-25 23:47:35.099 +00:00] [INF] Profile: "Unknown Profile", Path: "/media/movies/P/Princess of Thieves (2001)/Princess of Thieves (2001) Bluray-720p.mp4", isEligibleForDirectPlay: True, isEligibleForDirectStream: True
[2020-02-25 23:47:38.267 +00:00] [INF] Getting image size for item "Movie" "/media/movies/P/Princess of Thieves (2001)/poster.jpg"
[2020-02-25 23:47:38.301 +00:00] [INF] Getting image size for item "Movie" "/media/movies/P/Princess of Thieves (2001)/fanart.jpg"
[2020-02-25 23:47:44.518 +00:00] [INF] Getting image size for item "Movie" "/media/movies/P/Princess of Thieves (2001)/landscape.jpg"
[2020-02-25 23:47:44.942 +00:00] [WRN] HTTP Response 200 to "192.168.1.1". Time (slow): 0:00:09.6398925. "http://domain/Items/0047b22b4256ae48bbbdc881005b33c4/Images/Primary?tag=c3aa4d5d63599c5f2d3ba758138adf47&quality=90"
[2020-02-25 23:50:52.348 +00:00] [INF] WS "http://domain/socket?api_key=91fbc9c&deviceId=TW96aWxsYS81LjAgKFgxMTsgVWJ1bnR1OyBMaW51eCB4ODZfNjQ7IHJ2OjcwLjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNzAuMHwxNTc1Mzc3MzQ5NjU4". UserAgent: "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:73.0) Gecko/20100101 Firefox/73.0"

This is after finding what I was looking for and requesting a new image Primary cover. For some reason, media gets processed as a Profile. The concern I have for this section is that after fetching the new image, the dialog window failed to close. I didn't check the console to see if any issues were occurring.

Cannot setup a reverse proxy using the documentation

I used this documentation : https://jellyfin.readthedocs.io/en/latest/administrator-docs/reverse-proxy/ .

Some items were not clear to me.

  • the doc should state prerequisite : a running http server + own a domain name. If a subdomain is the only way to reverse proxy then it should also state so.
  • the doc seems to assume the machine running jellyfin is also the machine running the reverse proxy. So this should be written clearly.
  • the doc should highlight which part of code snippet should be adapted, eg "jellyfin.example.com" is to be adapted.

Anyway so i figured i can add a VirualHost on my machine running jellyfin, pointed a DNS subdomain to this machine IP, added the code snippet, activated the site.

If I go to jellyfin.my-site.xxx, i will obtain : "INTERNAL SERVER ERROR'. Server log says, "[Tue Mar 05 23:28:28.924719 2019] [proxy:warn] [pid 24036] [client xx.xxx.xx.xxx:56940] AH01144: No protocol handler was valid for the URL /embywebsocket. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule."

At the moment i did not figured issue yet, but almost certain the doc does not explain what to do. (Missing prerequisite?)

However rather than my little issue the reason i open this ticket is to discuss the documentation.

Traefik RP Doku Leads to 403

Describe the bug

Okay, if you follow the instructions found un the official Docu for Reverse Proxys for Traefik all you get once done is an https upgraded 403 response.
Side note: My setup uses a self signed cert for LAN access (yes, I have Jellyfin behind a Proxy for my LAN only with now remote sharing. pls don't judge me 😟 )

To Reproduce

  1. Setup the required docker container as shown in the Reverse Proxys section to Traefik
  2. try to access Jellyfin
  3. profit?

alternative (that yields the same result without RP)

  1. simply run docker run -p 8096:8096 -v jellyfin_config:/config -v /host/media:/media jellyfin/jellyfin:10.3.7
  2. try access Jellyfin
  3. get greeted by a 403 Forbidden page :-(

Expected behaviour

Setup the docker-compose files and toml file as shown by the docu => allows the user to access jellyfin

Screenshots

jellyfin
traefik

Config- / Compose-Files

Traefik

version: '3.7'

services:
  traefik:
    image: traefik:alpine
    command: --web --docker --docker.domain="local.lan" --logLevel="INFO"
    networks:
      - traefik
    ports:
      - 80:80
      - 443:443
    expose:
      - 8080
    volumes:
      - ./certs:/certs
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
    restart: unless-stopped
    labels:
      - "traefik.frontend.rule=Host:traefik.local.lan"
      - "traefik.port=8080"
      - "traefik.backend=Traefik-Admin"
      - "traefik.frontend.entryPoints=https"
      - "traefik.frontend.headers.forceSTSHeader=true"
      - "traefik.frontend.headers.STSSeconds=86400"
      - "traefik.frontend.headers.STSIncludeSubdomains=true"
      - "traefik.frontend.headers.STSPreload=true"

networks:
  traefik:
    external: true
logLevel = "DEBUG"
defaultEntryPoints = ["http", "https"]

[docker]
domain = "local.lan"
watch = true

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]
    minVersion = "VersionTLS12"
    cipherSuites = [
      "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
      "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
      "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
      "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
      "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
      "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
      "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"
    ]
    [[entryPoints.https.tls.certificates]]
    certFile = "/certs/local_lan_wildcard.crt"
    keyFile  = "/certs/local_lan_wildcard.key"

Jellyfin

version: '3.7'
services:
  jellyfin:
    image: jellyfin/jellyfin:10.3.7
    environment:
      - TZ=Europe/Vienna
    expose:
      - 8096
    labels:
      - "traefik.frontend.rule=Host:jellyfin.local.lan"
      - "traefik.port=8096"
      - "traefik.backend=JellyFin"
      - "traefik.frontend.entryPoints=https"
      - "traefik.frontend.headers.forceSTSHeader=true"
      - "traefik.frontend.headers.STSSeconds=86400"
      - "traefik.frontend.headers.STSIncludeSubdomains=true"
      - "traefik.frontend.headers.STSPreload=true"
    volumes:
      - type: volume
        source: jellyfin_config
        target: /config
      - type: volume
        source: jellyfin_cache
        target: /cache
      - type: bind
        source: /mnt/nfs_media
        target: /media
    restart: unless-stopped
    networks:
      - traefik

volumes:
  jellyfin_config:
    external: true
  jellyfin_cache:
    external: true

networks:
  traefik:
    external: true

System (please complete the following information):

  • OS: Docker
  • Browser: Firefox, (+ extra tests in Edge, I only have FF installed sry)
  • Jellyfin Version: 10.3.7
  • Reverse proxy: Traefik

Additional context

This Issue seems to be related to jellyfin#255, yet not really as it seems to be a bit of a different behaviour.

Should I have opened this issue in the wrong repo then I'm terribly sorry, same goes for the case if this whole issue is only limited to my setup and me missing something

Final Note I’m sure it is not Traefiks fault, since I use it as a reverse proxy for Portainer and have no problems there 🤔
For Jellyfin I'll change back to using network_mode: "host" and life with just http for the meantime ☹️

Add reverse proxy configuration

Running jellyfin behind a reverse proxy is a common practice. I think the docs should show working configurations for Apache2 and nginx.

I have a quite well working Apache2 VirtualHost configuration:

<VirtualHost *:80>
	ServerAdmin [email protected]
	ServerName jellyfin.example.com

	Redirect permanent / https://jellyfin.example.com

	ErrorLog /var/log/apache2/jellyfin.example.com-error.log
	CustomLog /var/log/apache2/jellyfin.example.com-access.log combined

</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin [email protected]
	ServerName jellyfin.example.com

	ProxyPreserveHost On

	ProxyPass "/embywebsocket" "ws://127.0.0.1:8096/embywebsocket"
	ProxyPassReverse "/embywebsocket" "ws://127.0.0.1:8096/embywebsocket"

	ProxyPass "/" "http://127.0.0.1:8096/"
	ProxyPassReverse "/" "http://127.0.0.1:8096/"

	SSLEngine on
	SSLCertificateFile /etc/apache2/ssl/jellyfin.example.com.crt
	SSLCertificateKeyFile /etc/apache2/ssl/jellyfin.example.com.key

	ErrorLog /var/log/apache2/jellyfin.example.com-error.log
	CustomLog /var/log/apache2/jellyfin.example.com-access.log combined
</VirtualHost>
</IfModule>

It works with: Mozilla Firefox 60 / Linux, Mozilla Firefox 64 / Android, Google Chrome 71 / Android
It does not work with PS4 and the Emby Android Mobile or TV app. The UI can be displayed but no video.

Maybe we can use this example as a base and improve it to work with more clients.

Update Nginx configurations

Nginx configuration for subpath needs to be updated due to base URL changing in the recent update.
I had to add /jellyfin/ for the proxy_pass too.
I'm not sure about Nginx without subpath and the other configurations tho.

Improve client apps page

Add some more information to the client apps page

  • Indicate current workable state (functional/non-functional/unknown)
  • Links to install instructions

[documentation] Add instructions to run generic Linux

Sorry if this is inappropriate or if there is a better place to put this, but, after trying to install 10.2.2. Debian package on MX Linux 18.1 (and failing...due to it being a non-systemd distro), I started playing with the generic linux build. The documentation to date suggests using the "portable" build for linux, but unfortunately does not explain how to install or use it. When downloading it I see nothing obvious to run (there is a jellyfin.dll, but I don't see a jellyfin or jellyfin.exe for Windows users). It appears the desired download should be the "linux-amd64" variant.

The following is what I did to get it working (mostly), although there are still some holes I don't know how to fill. Can the following (or similar) be added to the documentation? Can the "to-dos" be filled in while we're at it? Again, apologies as I'm not the least bit familiar with how readthedocs gets updated. The following is more of a walkthrough, not sure this is how you want to handle documentation.


The basic process to get the generic linux build working is as follows.

Create a directory in opt for jellyfin and it's files as a root user, and change into it. The following assumes the directory is called "jellyfin"

# mkdir /opt/jellyfin
# cd /opt/jellyfin

Download the latest generic linux build from the Jellyfin release page. The generic linux build ends with "linux-amd64.tar.gz". The rest of these instructions assume version 10.2.2 is being installed (i.e. jellyfin_10.2.2_linux-amd64.tar.gz). Download the generic build, then extract the archive:

# wget https://github.com/jellyfin/jellyfin/releases/download/v10.2.2/jellyfin_10.2.2_linux-amd64.tar.gz
# tar xvzf jellyfin_10.2.2_linux-amd64.tar.gz

Create a symbolic link to the Jellyfin 10.2.2 directory. This allows an upgrade by repeating the above steps and enabling it by simply re-creating the symbolic link to the new version.
# ln -s jellyfin_10.2.2 jellyfin

If you're curious, at this point you can run the executable with the --help parameter to see all command line options. Hint: This may help you follow what is being done in the next steps.
# ./jellyfin/jellyfin --help

Create four sub-directories for Jellyfin data:
# mkdir data cache config log

If you are running Debian or a derivative, you must also download and install the Jellyfin specific ffmpeg. Be sure to download the latest release that matches your OS (4.0.3-5 for Debian Stretch assumed below).

# wget https://github.com/jellyfin/jellyfin-ffmpeg/releases/download/v4.0.3-5/jellyfin-ffmpeg_4.0.3-5-stretch_amd64.deb
# dpkg --install jellyfin-ffmpeg_4.0.3-5-stretch_amd64.deb

Due to the number of command line options that must be passed, it is easiest to create a small script (here called jellyfin.sh) to run Jellyfin. Modify the paths as needed (the following assumes the use of the Jellyfin specific ffmpeg).
# cat jellyfin.sh

#!/bin/bash
JELLYFINDIR="/opt/jellyfin"
FFMPEGDIR="/usr/share/jellyfin-ffmpeg"

$JELLYFINDIR/jellyfin/jellyfin \
  -d $JELLYFINDIR/data \
  -C $JELLYFINDIR/cache \
  -c $JELLYFINDIR/config \
  -l $JELLYFINDIR/log \
  --ffmpeg $FFMPEGDIR/ffmpeg \
  --ffprobe $FFMPEGDIR/ffprobe

Assuming you desire Jellyfin to run as a non-root user, chmod all files and directories to your normal login user and group. Also make the startup script above executable.

# chown -R user:group *
# chmod u+x jellyfin.sh

Finally you can drop down to your normal user and run it. You will see lots of log information when run, this is normal. Setup is as usual in the web browser.
$ ./jellyfin.sh


To-Dos:
How does the "--service" parameter work? I expected this would make Jellyfin run as a background task, but adding this parameter doesn't seem to do anything.

What is required for a functional restart script? Is this why I don't see a 'Restart' option in the WebUI?

Thanks for hearing me out ;-).

DLNA Docs

Good writeup from reddit user arham_qureshi here with permission for somebody else to adapt. Could use some slight cleaning up and generalization, but lots of good info.

Describe how to enable/disable debug logging in the server

As a stopgap measure we should be saying this much in documentation:

In the logging.json file under the configdir (default datadir/config), you change:

"MinimumLevel": "Information",

to

"MinimumLevel": "Debug",

And then restart Jellyfin. The debug messages show up in the log with the tag DBG.

And hide the option from Web UI (or make it a link pointing to the documentation).

Originally posted by @JustAMan in jellyfin/jellyfin#1130 (comment)

Document how to mount folders for use with jellyfin

I think there have been some reliance on just giving emby a network path and having emby fix it. With jellyfin we have consensus that this is the task of the OS. So to be user friendly we need documentation on how to do this with some different OSes.

  • docker
  • debian stretch / buster
  • arch
  • windows (add network drive, right?)

(feel free to add more)
and for a few different network share types.

  • nfs
  • smb/cifs
  • ceph

(feel free to add more)

I'm kind of old school, so I would do this in fstab. I'm unfamiliar with docker so any extra steps needed for docker needs to be documented.

Undocumented rule for naming movies to be seen as one = "Movie Name (19XX) - .dvd.iso"

Couldn't get a movie with a dvd iso and a 480p MKV file to be seen as one in Emby or in Jellyfin. After talking to those cool cats in the Riot channel, we discovered that in order for the server to see multiple versions of a movie as one you must follow the rule of naming your movie as "movie name (19XX) - .dvd.iso". I was following this wiki instruction:

https://web.archive.org/web/20181216114832/https://github.com/MediaBrowser/Wiki/wiki/Movie-naming

to no avail. Luckily we found the solution. Seems like this should be updated in documentation or the code needs to be changed/updated. THank you! :)

[Request] Document Playback Flow

I think it would go a long way towards helping people test, debug and fix things themselves if we had some high-level flows documented.

For each of these bullets - what file contains the entrypoint into these activities?

When a user clicks a movie in the web client:

  • How does JF determine which network the client is on?
  • How are client features identified?
  • How is playback method determined? (DirectPlay, DirectStream, Transcode?)

Several anchors reference non-existent sections

The DocFX compiler reports the following:

[19-09-11 09:23:12.019]Warning:[BuildCommand.Postprocess.HandlePostProcessorsWithIncremental.HandlePostProcessors.Processing html.ValidateBookmark](docs/faq.md#L28)Invalid link: '[requesting features](xref:contrib-issues#requesting-features)'. The file docs/contributing/issues.md doesn't contain a bookmark named 'requesting-features'.
[19-09-11 09:23:12.020]Warning:[BuildCommand.Postprocess.HandlePostProcessorsWithIncremental.HandlePostProcessors.Processing html.ValidateBookmark](index.md#L36)Invalid link: '[Docker](xref:admin-installing#docker-hub)'. The file docs/administration/installing.md doesn't contain a bookmark named 'docker-hub'.
[19-09-11 09:23:12.020]Warning:[BuildCommand.Postprocess.HandlePostProcessorsWithIncremental.HandlePostProcessors.Processing html.ValidateBookmark](index.md#L63)Invalid link: '[Requesting Features](xref:contrib-issues#requesting-features)'. The file docs/contributing/issues.md doesn't contain a bookmark named 'requesting-features'.

Subfolders are being written to in docker (not really a bug)

This one is not really a bug, but a security problem!
As because of this:
docker/for-linux#788

Adding a folder with submounts read only like:
-v /media:/media:ro
doesn't make mountpoints underneath /media, like /media/movies, read only, if movies is a mountpoint.
This should be documented here:
https://jellyfin.readthedocs.io/en/latest/administrator-docs/installing/#docker-hub

I was wondering, as jellyfin wrote nfo files and posters to a bind mount that I thought is read only, although it isn't!

I know of many people having their media added to jellyfin like this, who believe, their media is safe this way!

QoS

Hi there,

I've moved from Plex to Jellyfin as I prefer the FOSS approach.
I just asked myself how a proper QoS could be configured?
So far I managed to create a policy according to the ports I have found here: [https://jellyfin.org/docs/general/networking/index.html](Jellyfin Networking).

Any proper solutions/ideas?

Translating the docs to other languages

Hey, is there any plans to allow the community to translate the docs to other languages? I've only checked the weblate instance and there isn't one for the documentation. It would also be nice if we could translate the website, but that's another issue.

Right now I'm sure that most of the people who even know about Jellyfin can speak english. But for the future, once it gets more popular, it would be nice to remove this barrier.

Mirror Docker Hub README here and update regularly

I'd like to change some things in the docker hub readme, namely clarifying the need to enable --net=host for DLNA to work.

I think the cleanest way to do this would be to mirror the existing Docker Hub README here and just manually copy changes back when needed.

Add documentation about image types

Jellyfin has a lot of image types:

  • Primary
  • Art
  • Backdrop
  • Banner
  • Box
  • BoxRear
  • Disc
  • Logo
  • Menu
  • Screenshot
  • Thumb

Some of those I know of what they are meant for; primary is the cover, logo is as it says a logo.
However, for most I still have no idea where they are used and what aspect ratio is required. Recommended resolution would also be nice.

My suggestion here is to create a new page in the documentation explaining all those different image types with their use case and optimal aspect ratio / resolution.

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.