Feed on
Posts
Comments

Running the embedded version of Plex Media Player requires several compromises when a better experience can be obtained by using a full OS install. So I went through the steps to install PMP on an Ubuntu installation. Not only do I have a powerful playback appliance for Plex but I also have a computer where I can use a browser or any other application where I would want the computer displayed on a TV.

I’m going to assume that the reader is familiar with Linux install, setup, and use so I’m going into extensive detail in these steps.

  • If you are coming from a previous embedded installation, you should grab autostart.sh, plexmediaplayer.conf, mpv.conf, and inputmaps
    • It is easiest if you turn on SMB sharing and access the shares. The autostart.sh is in the Configfiles share and the others are in the PMPConfig share
  • Install Ubuntu
    • It is much more convenient to set it to auto-login when you create the user so you don’t have to type in the password when you reboot the device
  • Reboot after install completes (it should ask you to do this)
  • Open System Preferences (power icon in upper right -> tools looking icon in lower left of menu)
    • In Power change Blank screen to Never to disable the auto-lock
    • Change the desktop background (the default background is such high saturation that it produces a noticeable afterimage on your retina after looking away)
    • In Notifications turn off the two types of notifications
    • In Privacy edit the problem reporting and turn it off. It should then say Never when complete. This disables the dialog displaying over the video.
  • Disable the update notification dialog (so it doesn’t show up in the middle of your playback)
    • In terminal, execute cd ~/.config/autostart
    • cp /etc/xdg/autostart/update-notifier.desktop .
    • Edit that file update-notifier.desktop and add a line Hidden=true to the end
  • Run software update (likely need another reboot)
  • This is an opportune point to configure Bluetooth devices and WiFi should you use them
  • Mostly follow these instructions: https://github.com/plexinc/plex-media-player#building-on-linux
    • In the first, with the list of things to install, add python to the list
    • You may use the OS provided Qt or install it from the installer
      • When you download the Qt installer, you must make it executable before you can open it. Ctrl-I will show a dialog and in the Permissions, check the box to make it executable
      • When installing QT, select version 5.12.3 (you can unselect the android versions)
    • When doing the building mpv steps, execute ./use-mpv-release && ./use-ffmpeg-release before the rebuild step to use the a release version over development
    • When building PMP itself, the -DQTROOT will be -DQTROOT=/home/username/Qt/5.12.3/gcc_64/ (substitute in your username)
  • If your are coming from a previous installation, create the dir ~/.local/share/plexmediaplayer and put the plex config files in there
  • In the PMP checkout, copy the resources/desktop/plexmediaplayer.desktop to the desktop
    • Execute this shortcut because it must be run once to become trusted. You’ll need to make it executable first just like above
  • Create a bin directory in your home dir and in it create the file setupAndLaunchPMP.sh with the contents:
#!/bin/sh

# Put any previous setup commands you had in here such as came from your old autostart.sh file

sleep 2

plexmediaplayer
  • Make sure the file is executable
  • Go into the startup applications
    • Make a login item to execute the above script on login

Updating

  • Updating Ubuntu itself can be done by launching the Software Updater application
  • PMP can be updated by:
    • Opening the terminal and change directory into the PMP source you grab earlier
    • git pull
    • cd build
    • make -j4
    • sudo make install
    • Then restart PMP and you are updated

Switch to ALSA Audio

Ubuntu comes with PulseAudio configured but PulseAudio doesn’t support matching the channel count of the output with the source audio. So if you configure it to output 7.1 and you play content that’s in stereo, it will up-convert your stereo content to 7.1 and, to my ears, definitively do it incorrectly. I’d much rather have my AVR get stereo and it do the pro-logic decode or whatever processing I have configured on it.

  • Disable pulse audio
    • cp /etc/pulse/client.conf ~/.config/pulse
    • Edit ~/.config/pulse/client.conf
    • Change the line ; autospawn = yes to autospawn = no
    • Change the line ; daemon-binary = /usr/bin/pulseaudio to daemon-binary = /bin/true
  • In PMP’s settings:
    • In Audio, disable all the codecs for audio passthrough
    • In Audio, set the output device. Mine was HDA Intel PCH, HDMI 0/HDMI Audio Output (the first HDMI one)
    • Set Audio -> Channels to Auto Select Channels
    • In Video -> Sync Mode, set this to Display (resample audio)
  • Reboot to ensure all the steps are working
    • Run a ps ax | grep pulse and ensure that the only line you get (if any) is the grep command

Using Passthrough

I attempted to use passthrough repeatedly on my NUC8 but no matter what I tried it would not passthrough any HD-audio codecs (TrueHD/DTS-HD) but it had no issue with AC3, EAC3, and DTS. My NUC4 has no issues with any of the codecs so, including the HD-audio ones, go figure.

  • First follow above settings to use ALSA
  • In PMP’s settings:
    • In Audio, ensure you have the passthrough codecs selected in audio
    • In Video -> Sync Mode, set this to Audio
      • I have tried fiddling with the video-sync=display-vdrop setting here and it appears to work better than audio but this requires modification to PMP’s source code.

Customization

mpv.conf

Modifications to the mpv.conf file allow a great amount of control to how the playback performs. Most notably if the hardware is capable enough, it can greatly enhance the quality of video scaling and playback in general. There are a great many posts on this topic (such as this one) but at the moment I am using the following:

video-output-levels=limited

demuxer-mkv-subtitle-preroll

profile=gpu-hq
deband=yes

interpolation=yes
tscale=oversample

scale=ewa_lanczossharp

audio-stream-silence=yes

Explanations

  • video-output-levels=limited: I have my TV configured to accept the limited color space. Similarly I’ve configured the graphics card to output full. See this forum post for more details. I have a xrandr --output DP-1 --set "Broadcast RGB" "Full" in my setupAndLaunchPMP.sh file
  • demuxer-mkv-subtitle-preroll Appears to show subtitles immediately after a seek instead of waiting for the next set of subtitles before display.
  • profile=gpu-hq An easy profile to gain a lot of playback enhancements.
  • deband=yes Reduce any visible banding artifacts
  • interpolation=yes Provides from interpolation for cases where the display framerate cannot be matched to the source.
  • tscale=oversample Configuration for the interpolation to use a simple mechanism. This does not do motion enhancement or the so-called “soap opera effect.”
  • scale=ewa_lanczossharp Overrides the scaler used in the gpu-hq profile with one that yields better quality
  • audio-stream-silence=yes Plays silence while the video is paused. This appears to resolve a small audio drop I experience sometimes after I resume from pause

plexmediaplayer.conf

Almost all of these are accessible in the UI but a few are not. Among the latter, ones I have changed are:

  • Video
    • audio_delay.24hz, audio_delay.25hz, audio_delay.50hz, audio_delay.normal to set audio delay at various refresh rates to ensure A/V sync in playback.
    • refreshrate.avoid_25hz_30hz I set the to false because the 29.97Hz refresh rate appears to yield the best playback experience for a DVD remux.
    • refreshrate.delay I’ve set this because my TV takes a few second between a refresh rate change and display of the video

Inputmaps

You can copy the example input map to the inputmaps dir and modify it to change the actions taken on a keypress. This is going to be very user specific but essentially I’ve set keymaps to do:

  • cycle_subtitles
  • cycle_audio
  • host:cycle_setting video.aspect

The actions these take should be fairly self explanatory.

Conclusion

That’s it. I feel this technique of running a full OS instead of the embedded LibreELEC OS provides a better experience to the end user in the long run. It’s significantly easier to setup BlueTooth devices in Ubuntu than it is in LibreELEC as well as any other hardware setup I might wast to do.

Hopefully you have find this guide useful and enjoy your playback setup.

Edits

  • 2019-12-02: Added disabling the problem reporting dialog

One of the more annoying issues that can impact novices on Linux systems is handling permissions across multiple users. One of the contexts where I see this the most is on the Plex forums where users have to deal with allowing the Plex Media Server to see their media when it runs as a different user. Years ago I solved this problem on my system with using ACLs and I’ve never had to deal with the permissions on my media since.

Enable ACLs

The common filesystems on Linux systems tend to support ACLs but they are often disabled. For many they can be turned on by adding acl to the mount options in the /etc/fstab.  Ubuntu’s documentation has better instructions than I can give here.  For those using ZFS, you can run zfs set acltype=posixacl filesystemName and it’ll enable the ACLs for you immediately (no need to re-mount the filesystem).

ACL Setup

The easiest solution is to setup the ACLs on the root directory and then use a command that copies the ACLs down the directory tree.  So first enter the root media directory and execute:

setfacl -m o:- .
setfacl -m d:o:- .
setfacl -m m:- .
setfacl -m d:m:- .
setfacl -m u:$USER:rwX .
setfacl -m d:u:$USER:rwX .
setfacl -m u:plex:rX .
setfacl -m d:u:plex:rX .

The above does the following (each description corresponds to a pair of lines above):

  1. Remove the permissions for other users and their default permissions
  2. Clear out the permissions mask
  3. Add the your user with full permissions
  4. Add the plex user with read and execute permissions (execute needed to enter directories).

The default entries define the ACL entries that a new file or directory receives.  From the above, your user will automatically get full permissions to the file and the plex user will get read access.  Once the permissions for the root directory are as desired, you can copy them to all subdirectories and files (shamelessly stolen from this SO post):

find . -mindepth 1 -type d| xargs -n 50 setfacl -b --set-file=<(getfacl . | sed -e 's/x$/X/')
find . -mindepth 1 -type f| xargs -n 50 setfacl -b --set-file=<(getfacl . | grep -v '^default:' | sed -e 's/x$/X/')

The above takes all the ACL entries from the current directory, translates the lower-case x at the end to a capital X (this means only apply the execute permission to directories and executable files), and then use this result to overwrite the ACL entries on every sub-directory.  The second command is similar but it applies to files instead and removes all default entries (because files cannot have default entries as they only apply to directories).

The Result

The permissions for my media files are exactly as I desire regardless of how they are created.  I don’t have to worry about umasks, sticky bits on the group, group membership, or too permissive files.  I can have a umask of 077 where files are created without allowing any permissions to any other user, and with the ACL setup, the plex user will still be able to read the media files.  If I rsync the files over preserving permissions, the group name and permissions don’t matter; the plex user will still be able to read the media files.  Basically, everything I do, apart from modifying ACL entries, the plex user will still be able to read the media files.  This truly is a set it and forget it kind of setup.

When I first subscribed to Netflix’s streaming service, it was a great way to watch movies and shows that I had missed through other sources. I started regularly visiting sites that tracked what’s been added to the service and adding items as a result. Then it changed.

Competition
It seems strange but the addition of competition in streaming service providers seems to have been a detriment for the consumer. Prior to this, the content owners had a choice of whether they wanted to get streaming royalties at a price that Netflix was wiling to pay or get none at all. Then when competing services started to arise, particularly Amazon, these content owners could play the services off of one another to get a higher royalty and offer exclusivity at a premium. With this change, the consumer must subscribe to multiple streaming services to get the equivalent content that used to be available on a single service.

This is only going to get worse as Disney is starting their own service and when they do they are likely to pull all of their content off of Netflix. This includes Marvel, Pixar, and Star Wars which I’ve noticed tended to be the most popular movies on Netflix. In order to continue to receive this content, the consumer must subscribe to yet another service.

Original Content
With the rise in royalties demanded by the content owners, streaming services turned to creating their own content. With their own content they don’t have to concern themselves with the negotiation of royalties or content disappearing from their service when the contract ends. This content is, by its nature, exclusive to that one service in perpetuity. This brings another reason to force the consumer to subscribe to multiple services.

Ratings
The ratings and recommendation system that Netflix uses has always been problematic. This has become more so with anything that has “Netflix Original” attached. I’ve noticed these originals, whether they are actually owned by Netflix or whether Netflix is an exclusive distributor in that region, always have a high rating. Furthermore, there seems to be no connection whatsoever between the item’s rating and the actual quality of that media. I’ve seen several series/movies labeled with “Netflix Original” all with high ratings ranging from decent to poor to some of the worst things I have ever seen.

I came to the conclusion that the “Netflix Original” ratings were being gamed or artificially inflated. I did start to notice that the written user reviews on Netflix tended to be more accurate so I started using those to determine if the series/movie was worth my time. Now Netflix is removing these reviews so I no longer have a mechanism to determine whether something is worth watching. I had already wasted too many hours on something that’s not worth watching when I had some semblance of whether it would be good or not but now it’s walking blindly through a sea of mediocrity in search of something worth my time.

Quantity vs Quality
I started to notice a trend among the original content present on both Netflix and Amazon. Netflix has some series that I like to watch but Amazon has some series that I truly love. I cannot say that I love a series on Netflix. It seems as if Netflix is going for quantity in their series over quality. Since I set a high bar for what I’ll spend my time watching, this means there’s little content on Netflix worth the investment. This, combined with the ratings, means that watching something on Netflix has degraded to watching something that’s passable as opposed to watching something that’s good.

Value for Price
I look at what I get from Amazon Prime and it has remained worth the money. I originally got it just for the shipping and considered the other perks to be a bonus but I now use several of their Prime offerings. Its price is cheaper than Netflix and I get far more benefit from it. Meanwhile Netflix has a higher price and I go months without finding anything worth watching. With the elimination of the written reviews, Netflix has increased the risk of wasting time watching something poor. This risk vs the reward of enjoying a movie/series has crossed the threshold where it is no longer worth taking the gamble. I no longer have a means to determine whether the media’s rating is artificially inflated or genuine and my time is too valuable to waste it finding out.

Going Forward
As the competing streaming services increase in number, consumers would have to subscribe to more and more of them to continue to receive their desired content. Eventually many will tumble to the fact most services doesn’t provide enough content to warrant paying for the service year-long. One solution is to subscribe to a given service for only part of the year, watch everything they’ve added in the time since they last subscribed, cancel, wait for enough content to be added, repeat.

I’ve determined that it is time for me to start with this strategy and cancel my Netflix streaming account. I’ll likely renewed it several months from now, watch the little content that’s been added which catches my interest, and cancel it again. I’ll likely only have it 2-3 months out of the year because that corresponds with the amount of content that’s worthwhile on their service.

Have you noticed a decline in Apple’s software quality over the past few years?

I have been asking this question of users of Apple’s products among my friends, family, coworkers, and others over the past year or two and the results have been quite telling. They have all reluctantly answered YES. None of them have anything against Apple and they all are long time users of Apple’s products, but they are all tumbling to the fact that the software quality used to be better. It’s not just limited to the Mac side either; they are noticing the same decline on iOS as well.

If only the problems were limited to software. The lack of updates for the desktops are so well covered that it’s not worth going into great detail here. When Apple came out in late 2017 and announced they had designed themselves into a corner with the Pro and were going to come out with something new, but not until 2019, I had to ask:

How hard is it to design a workstation class motherboard with Xeon chips (or slightly modify a reference motherboard), slap it in the old cheese grater case, and put it out in 2018?

This is what Apple should have done or at least announce as it would have made the pro market immensely happy. Instead Apple essentially issued an apology and continually reiterates how important the Mac is to them while still not updating it. Why?
A year ago I built a file server with server grade equipment (Xeon E5 proc, server motherboard, ECC memory, etc…) and it trounces the lowest Mac Pro at less than half the price. How did I pull this off? Simple: I used hardware that’s 4 years newer than the Pro and I didn’t need an overpriced graphics card! Apple has since put out the iMac Pro, but it starts at $5,000 which is quite expensive for what you actually get. With the state of the Pro and the price of the iMac Pro, my colleagues and I ask:

Where’s the reasonably price Mac for the software developer?

The Mini is a whole other question. I know people who bought Minis and make them into cheap headless servers. At $lastJob, I had a Mini so I could do the occasional iOS development and I preferred to use Macs. If the Mini didn’t exist (or had been allowed to be crippled then languish as it has now), I would have been stuck on Windows or Linux. The only reason I got a Mac at all is because of the price point; they would not have bought a normal iMac, much less the iMac Pro or the Pro. For those who will only spend a small amount of money to get into the Apple ecosystem or want a machine to perform some small headless tasks, they ask:

Where’s the budget priced Mac?

Yesterday was WWDC and I no longer really care. I, and many others I know, would previously watch the whole thing live with baited breath to see what was announced. I can recall about 2 hours at work where we all didn’t actually do anything because we were busy watching. We would even take a very late lunch (it started at noon in this timezone) just so we wouldn’t miss anything. Now, I don’t watch it live and neither do most of those I know who used to do so. At best we peruse the news later to see if there was anything of interest. I suppose it is mostly that there have been too many where at the end we ask:

Is that it?

At $currentJob I do a lot of C++ development. Those who do so know that it takes a long time to compile hundreds of C++ files and this is a job that will parallelize quite well. I currently use an iMac for the job but I would like something that’s faster. I don’t use Xcode because, let’s face it, it’s not the best IDE and it’s quite poor at anything that’s not Obj-C or Swift. Instead I use CLion which has it’s own issues (slow tasks which consume the CPU for minutes), but it’s much better than Xcode.
In discussing the situation with my colleagues who have similar desires, one of them was doing something that’s quite compelling. She is running Visual Studio in a headless VM and remotes into it, but uses a Mac for all her other tasks. I looked at this and realized I could build a compute node with a high core-count CPU, maybe a Threadripper, put Windows on it (or Windows on ESXi on it), run VS, and have a fast dev environment. This would be a fast machine, not too expensive, and have a very very real possibility of being faster than the Pro Apple may or may not put out in 2019. This left me pondering:

I’ve been a loyal Apple user for ~30 years now and a loyal Apple customer for ~20 years, and I’m concluding that in development of a cross-platform application, I’d be happier on a Windows machine. What’s happened?

Any one of the above taken in isolation is concerning but the four put together is outright worrisome. I’ve silently wished that the above weren’t true hoping that it’ll change, but it seems to be getting worse rather than better. It is with great reservation that I’m now asking:

Are Apple’s best days behind us?

For quite a while, I’ve been having issues with OpenELEC (OE) based devices detecting the 24p frame rate (23.976 frames per second) on my TV. Usually when I play something in 24p and the TV doesn’t switch into this mode, I will reboot the OE player and it would resolve the problem. Then after the TV is turned off and later turned back on, about 1/4 of the time, the problem would resurface. I’ve seen this behavior with both OpenPHT (and it’s predecessor Plex Home Theater) and Plex Media Player. I finally got annoyed enough with the situation that I decided to do something about it.

I read through the code to OpenPHT to see if there is anything that it may be doing wrong. I didn’t spot any issues but it does log enough data that I could piece together the current behavior. My TV has 41 resolution and rate modes detected by my Intel NUC (Haswell). 40 of these modes are natively detected and one was added by myself to support a 50Hz refresh rate at 1080p. I use this last mode for playing British content. Sometimes, OpenPHT would log that it only detected 35 modes and even sometimes that it detected 25. The 35 seemed to correspond to when it read the modes as the TV is being turned off and the 25 if it read the modes after the TV was already off. It fairly regularly read 35 modes when the TV was turned off but occasionally it would read the 25 (race condition). If it read 25, then the 1080p 23.976fps mode was not among them. It did not seem to read these modes during or after the TV was turned on. It reads these modes through a tool called xbmc-randr.

Then I noticed something interesting: If I ran xbmc-randr on the command-line myself while the TV was on and OpenPHT did not previously know about all 41 modes, then OpenPHT would often be notified of changes in the display and would read these modes itself. My suspicion is that by manually running xbmc-randr myself, it prompts the OS to reach the EDI modes, and having detected the changes, informs any consumers wishing to be informed of these changes. OpenPHT is definitely one such consumer. I only needed to account for the cases where it does not do the above actions by restarting the computer. This lead me to a solution:

I looked for a keyboard shortcut that I could repurpose to run a script which will itself call xbmc-randr. Since OpenPHT does have the ability to run arbitrary shell scripts, I configured my /storage/.plexht/userdata/keymaps/keyboard.xml with:

<keymap>
  <global>
    <keyboard>
      <return mod="ctrl,alt">System.Exec("/storage/ensureAllRates.py")</return>
      …
    </keyboard>
  </global>
  …
</keymap>

Then my /storage/ensureAllRates.py file contained:

#!/usr/bin/env python2

import re
import subprocess
import sys
import time

expectedCount = 41

def getRateCount():
  list = subprocess.check_output(["grep", "Output 'HDMI1' has", "/storage/.plexht/temp/plexhometheater.log"], universal_newlines=True).split("\n")
  if len(list) < 2:
    return -1

  line = list[-2]
  match = re.search(".*Output 'HDMI1' has (\\d+) modes", line)
  if not match:
    return -1

  return int(match.group(1))

if getRateCount() == expectedCount:
  sys.exit()

subprocess.check_output(["/usr/lib/plexht/xbmc-xrandr"])
time.sleep(2)
if getRateCount() == expectedCount:
  sys.exit()

subprocess.check_output(["shutdown", "-r", "now"])

(If you are running OpenPHT 1.8, I’ve noticed the path is different. You should adjust accordingly.)

Above I have configured ctrl-alt-return to run my script. When this keypress is sent, OpenPHT dutifully ran the it. Then, if OpenPHT got the full list of modes, everything that was the end of it. If it did not, the system was rebooted. Thus far, this script has always resulted in the 24p output mode being known and used when appropriate.

Lastly, I use a Logitech Harmony Hub for my remote needs. One of the features is it runs a series of scripts to switch to and from a device. I configured the script on switching to my OpenPHT player to send the Fullscreen command. Seeing as how this OpenPHT is always full screen, I figured this command is least likely to do anything already. Turns out, it sends 3 keyboard commands, of which none are bound to any action. The last was ctrl-alt-return which I now bound with my above keyboard override. This completed my setup to have this command run every time without any interaction by myself.

Older Posts »