Published 2025-03-24.
Last modified 2025-04-05.
Time to read: 4 minutes.
posts
collection.
I have been using Plex on one of my home Ubuntu servers for years to serve movies and images. The experience has been OK.
Emby (formerly Media Browser) is a media server designed to organize, play, and stream audio and video to a variety of devices. Emby's source code was mostly open with some closed-source components.
As of version 3.5.3 [September 19, 2018] Emby has been relicensed and is now closed-source, while open source components will be moved to plugins. Due to this, a free open source fork of Emby was created called Jellyfin.
I previously reviewed and rejected Jellyfin.
Advantages Over Plex
- Emby has a more capable free tier than Plex. Plex charges a monthly fee for simple features, like the ability to restrict access to selected media for certain users.
- Plex provides only a main content menu, plus another content menu for each server, linked from the main content menu. This becomes awkward to work with when there are many content libraries, and navigation to the end of the chain can take considerable time when using a Roku remote. In contrast, the Emby content menus are much quicker to navigate, and are just as easy to set up as Plex menus.
- Emby photo libraries can display animated GIFs.
- The length of time that Emby slideshows display each image can be customized.
-
I was surprised at how much better the quality of the video provided by Emby is compared to that provided by Plex.
@chrisrobbins1970
compared Emby to Plex, and I agree with most of his points. Since@chrisrobbins1970
posted his comparison:- Emby added theme music.
- Emby provides a decent music player.
- Emby allows users to define libraries that contain a mixture of photos and videos. In contrast, Plex requires users to define separate libraries for photos and videos. I did not appreciate how important this feature was until I used it.
Deficiencies
-
Playing a video on the web client often results in a black screen, or this message:
- The iOS, Android and Windows clients will not play any video or show any photos without an Emby Premiere license. The Roku client and all of the Plex clients do not have this restriction. (The Plex iOS client costs about $5).
- There is no facility for searching for a plugin by name when viewing Settings / Advanced / Plugins / Catalog.
-
The thumbnail image for a video cannot be selected from the video.
This is a very common feature for programs that display videos.
Unlike built-in frame (
.bif
) files, which are low-resolution images that are displayed when scrubbing back and forth through a video, thumbnail images are displayed when viewing lists of videos so the user can select one to play. - There is no onscreen volume control for the web client or the Roku client.
- The up/down keys do not adjust the web client's volume, unlike the Plex web client.
- The volume keys on Roku remotes do not work with Emby, although they work with Plex and Jellyfin.
Installation
I installed Emby on my Ubuntu 24.04 server, which was already running Plex server.
Gojira
has 12 TB SSD, 64 GB RAM, on an MSI Z790 motherboard,
and has two GPUs: the Intel Raptor Lake GPU integrated with the Intel Core i7-14700K, and a GeForce GTX 760 video card.
The TV I usually watch video content runs Roku.
$ VER=4.8.11.0
$ wget -O emby-server-deb_${VER}_amd64.deb \ https://github.com/MediaBrowser/Emby.Releases/releases/download/$VER/emby-server-deb_${VER}_amd64.deb
$ sudo dpkg -i emby-server-deb_$VER_amd64.deb --2025-03-24 17:56:40-- https://github.com/MediaBrowser/Emby.Releases/releases/download/4.8.11.0/emby-server-deb_4.8.11.0_amd64.deb Resolving github.com (github.com)... 140.82.113.4 Connecting to github.com (github.com)|140.82.113.4|:443... connected. HTTP request sent, awaiting response... 302 Found Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/25282228/316b78a0-57a6-4077-8041-24ab36d8af11?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250324%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250324T215537Z&X-Amz-Expires=300&X-Amz-Signature=cde72c7cdba61ff051bc0c6a0bc3a4ab4c838dd14bf7b777df594ea2c43a518b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Demby-server-deb_4.8.11.0_amd64.deb&response-content-type=application%2Foctet-stream [following] --2025-03-24 17:56:40-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/25282228/316b78a0-57a6-4077-8041-24ab36d8af11?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=releaseassetproduction%2F20250324%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250324T215537Z&X-Amz-Expires=300&X-Amz-Signature=cde72c7cdba61ff051bc0c6a0bc3a4ab4c838dd14bf7b777df594ea2c43a518b&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3B%20filename%3Demby-server-deb_4.8.11.0_amd64.deb&response-content-type=application%2Foctet-stream Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.108.133, ... Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 173043244 (165M) [application/octet-stream] Saving to: ‘emby-server-deb_4.8.11.0_amd64.deb’
emby-server-deb_4.8.11.0_amd64.deb 100%[=====================================================================================>] 165.03M 54.2MB/s in 3.0s
2025-03-24 17:56:43 (54.2 MB/s) - ‘emby-server-deb_4.8.11.0_amd64.deb’ saved [173043244/173043244]
The above installed Emby in /opt/
.
CSS files live in subdirectories within system/
.
Firewall and Ports
Like Jellyfin, Emby can be accessed via port 8096.
If your server has a firewall, you need to open the appropriate ports.
Ubuntu 8.04 introduced the ufw
firewall,
and today it is the default firewall for Ubuntu.
The default ports used by Emby are:
- 8096/tcp is the default for HTTP traffic. You can change this in the dashboard.
- 8920/tcp is the default for HTTPS traffic. You can change this in the dashboard.
- 8920/udp is used for secure (https) service auto-discovery. This is not configurable.
- 7359/udp is used for server discovery by client apps. This is not configurable.
I had already been using ufw
before installing Emby.
At that time, the ufw
status was:
$ sudo ufw status Status: active
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere 9000 ALLOW Anywhere 9443 ALLOW Anywhere 32400 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6) 9000 (v6) ALLOW Anywhere (v6) 9443 (v6) ALLOW Anywhere (v6) 32400 (v6) ALLOW Anywhere (v6)
To open the default ports that Emby needed on my server, I typed:
$ sudo ufw allow 8096,8920/tcp Rule added Rule added (v6)
$ sudo ufw allow 7359/udp Rule added Rule added (v6)
Now the status was:
$ sudo ufw status Status: active
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx Full ALLOW Anywhere 9000 ALLOW Anywhere 9443 ALLOW Anywhere 32400 ALLOW Anywhere 8096/tcp ALLOW Anywhere 8920/tcp ALLOW Anywhere 7359/udp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6) 9000 (v6) ALLOW Anywhere (v6) 9443 (v6) ALLOW Anywhere (v6) 32400 (v6) ALLOW Anywhere (v6) 8096/tcp (v6) ALLOW Anywhere (v6) 7359/udp (v6) ALLOW Anywhere (v6)
Like any service, you can start
it, stop
it, and restart
it.
To stop it, type:
$ sudo service emby stop
Automatically Resizing Slideshow Images
Plex automatically sizes images so they fill the screen. Emby does not do this by default. Unlike Plex, Emby can use custom CSS. To make slideshows fill the screen without distorting the aspect ratio, modify the CSS. This is easy to do for people who have any familiarity with CSS.
Slideshow CSS files live within modules/
.
The full path for Slideshow CSS is /opt/
This is a compressed file.
I used js-beautify
to uncompress (format) the CSS so I could work on it more easily.
$ npm -g install js-beautify added 53 packages in 1s
This is the js-beautify
help message:
$ js-beautify -h
js-beautify@1.15.4
CLI Options: -f, --file Input file(s) (Pass '-' for stdin) -r, --replace Write output in-place, replacing input -o, --outfile Write output to file (default stdout) --config Path to config file --type [js|css|html] ["js"] -q, --quiet Suppress logging to stdout -h, --help Show this help -v, --version Show the version
Beautifier Options: -s, --indent-size Indentation size [4] -c, --indent-char Indentation character [" "] -t, --indent-with-tabs Indent with tabs, overrides -s and -c -e, --eol Character(s) to use as line terminators. [first newline in file, otherwise "\n] -n, --end-with-newline End output with newline --indent-empty-lines Keep indentation on empty lines --templating List of templating languages (auto,none,angular,django,erb,handlebars,php,smarty) ["auto", auto = none in JavaScript, auto = all except angular in html (and inline javascript/css)] --editorconfig Use EditorConfig to set up the options -l, --indent-level Initial indentation level [0] -p, --preserve-newlines Preserve line-breaks (--no-preserve-newlines disables) -m, --max-preserve-newlines Number of line-breaks to be preserved in one chunk [10] -P, --space-in-paren Add padding spaces within paren, ie. f( a, b ) -E, --space-in-empty-paren Add a single space inside empty paren, ie. f( ) -j, --jslint-happy Enable jslint-stricter mode -a, --space-after-anon-function Add a space before an anonymous function's parens, ie. function () --space_after_named_function Add a space before a named function's parens, ie. function example () -b, --brace-style [collapse|expand|end-expand|none][,preserve-inline] [collapse,preserve-inline] -u, --unindent-chained-methods Don't indent chained method calls -B, --break-chained-methods Break chained method calls across subsequent lines -k, --keep-array-indentation Preserve array indentation -x, --unescape-strings Decode printable characters encoded in xNN notation -w, --wrap-line-length Wrap lines that exceed N characters [0] -X, --e4x Pass E4X xml literals through untouched --good-stuff Warm the cockles of Crockford's heart -C, --comma-first Put commas at the beginning of new line instead of end -O, --operator-position Set operator position (before-newline|after-newline|preserve-newline) [before-newline]
The following renames style.css
to style.css-
,
formats the CSS in style.css-
,
and saves the formatted version as style.css
.
$ cd /opt/emby-server/system/dashboard-ui/modules/slideshow
$ sudo mv style.css{,-}
$ sudo js-beautify \ -LN \ -s 2 \ -f style.css- \ -o style.css
The following highlights the modification to style.css
,
whereby the value of height
on line 36 is changed to inherit
:
34: .slideshowCardImage { 35: width: auto !important; 36: height: inherit !important; 37: }
Emby will serve the modified CSS the next time a slideshow starts.
References
- User documentation.
- Community.
- Plugins extend the capabilities of Emby.
- The Roku app documentation is rather thin.
- The Emby Setup Guide for Roku was posted in the Emby community forum, which is inconsistent with the other client documentation. The images in the Emby Setup Guide for Roku are all broken. This document was clearly slapped together and was never looked at again. It needs to be rejuvinated and moved to the same area as all the other client documentation.
- Developer documentation.