Plex DVR with the Official Xbox One Digital TV Tuner - The Direct (and working!) Approach

With the recent release of version 4.16 of the linux kernel, the drivers needed to use the Xbox One Tuner are now distributed with the kernel.

At the time of writing, the only mainstream distribution using this version of the kernel is the Fedora 28 beta (due for mainstream release early May).

With this driver now part of the kernel, Plex appears to recognise the tuner as a community supported tuner and functions correctly using it directly. We still need to download and install the “dvb-demod-mn88472-02.fw” firmware file however as without this, while the tuner will be recognised in Plex, scanning for channels will always return zero results.

The VM Setup

As in the previous parts I am using Vagrant to create a VM for testing. The Vagrantfile should be customised with any required shared directories.

This Vagrantfile requires the installation of the vagrant-reload plugin.

vagrant plugin install vagrant-reload

This is required for the config.vm.provision :reload line, which we need as we are upgrading the kernel as part of the initial updates stage, and the version of kernel-modules which is installed matches the updated kernel instead of the running kernel. This should hopefully not be required once we out out of the beta distribution.

After running vagrant up from the directory with the following two files, you should be able to configure the Live TV & DVR feature using the steps for a community supported tuner.

The Plex web interface will be available at http://192.168.0.88:32400/web/.

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  
  # Every Vagrant virtual environment requires a box to build off of.
  config.vm.box = "fedora/28-beta-cloud-base"

  # set up the VM as a bridged network with a fixed IP
  config.vm.network "public_network", bridge: 'eno1', ip: "192.168.0.88"

  # Configure the memory and CPU requirements for Virtualbox - was starting with 512M!
  config.vm.provider "virtualbox" do |v|
    v.memory = 2048
    v.cpus = 1
  end

  # Pass through our USB device
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--usb", "on"]
    vb.customize ["modifyvm", :id, "--usbxhci", "on"]
    vb.customize ["usbfilter", "add", "0",
      "--target", :id,
      "--name", "MicrosoftUSB",
      "--serialnumber", "0123456789"]
  end

  # Disable the default share. 
  config.vm.synced_folder '.', '/vagrant', disabled: true

  # Provision the VM using a shell script
  config.vm.provision :shell, path: "Vagrant_bootstrap.sh"
  config.vm.provision :reload
end

Vagrant_bootstrap.sh

#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'

# Make sure we are up to date
dnf update -y

# Add the udev configuration file
if [ -f /etc/udev/rules.d/99-usb-tv.rules ]; then
  echo 'Udev already condifigured'
else
  echo 'ACTION=="add", ATTR{serial}=="007287190615", SYMLINK+="usbMicrosoftTV"' > /etc/udev/rules.d/99-usb-tv.rules
fi

# Install the kernel modules
if [ dnf list --installed kernel-modules  > /dev/null 2>&1 ]; then
  dnf install -y kernel-modules
else
  echo 'Kernel modules already installed'
fi

# Add additional firmware files
# Without this, the tuner will still be recognised by plex, but trying to scan
# for channels will always find none. 
if [ ! -f /lib/firmware/dvb-demod-mn88472-02.fw ]; then
  curl --silent http://palosaari.fi/linux/v4l-dvb/firmware/MN88472/02/088b891ac9273ff8c6818fca27b24d81/dvb-demod-mn88472-02.fw --output /lib/firmware/dvb-demod-mn88472-02.fw
  restorecon -r /lib/firmware/
fi

# Install Plex
dnf install -y "https://downloads.plex.tv/plex-media-server/1.12.3.4973-215c28d86/plexmediaserver-1.12.3.4973-215c28d86.x86_64.rpm"