Movie Box - Offline Movie Server for Roku

Stream movies from a Raspberry Pi without using a network connection. Useful during power outages, hiking in remote locations (with a HMDI monitor strapped to your pack, or locations with restricted or no available network.

This combines my HMS and Clortho projects with a simple installation script to setup an old Pi I have laying around so that it will stream movies from a USB drive directly to the Roku. No network, no switches, no USB hubs needed.

You should download or checkout the movie-box project at GitHub.

Hardware Needed

  • Raspberry Pi or other Debian based system. I used a Model B.
  • Power supply for the Pi. Use the largest you have around, I used an Apple charger.
  • Roku player. I used is a model N1000
  • USB Keyboard
  • USB drive. I used a small 16GB Sandisk drive.
  • Ethernet cable.
  • HDMI cable compatible with your TV or Monitor.
  • A TV or Monitor.
  • (optionally) an amplifier for sound.

Installation

Start out with a fresh SD card and install Raspian Jessie Lite to the card and make sure that it boots when connected to the TV, Keyboard, and power supply.

Format the USB drive with the ext4 filesystem and copy the contents of this repository over to a directory on it named /movie-box/. Then create a Movies directory and install the files and movies you want to stream, following the directions for configuring HMS cover images .

You should have a directory tree that looks something like:

├── lost+found
├── movie-box
│   ├── clortho
│   │   ├── COPYING
│   │   ├── README
│   │   ├── requirements.txt
│   │   └── src
│   │       └── clortho.py
│   ├── config
│   │   ├── clortho
│   │   │   └── clortho.service
│   │   └── debian
│   │       ├── dnsmasq.conf
│   │       ├── interfaces
│   │       └── lighttpd.conf
│   ├── HMS
│   │   ├── HMS
│   │   │   ├── app.mk
│   │   │   ├── images
│   │   │   │   ├── MainMenu_Icon_CenterFocus_HD.png
│   │   │   │   ├── MainMenu_Icon_CenterFocus_SD.png
│   │   │   │   ├── MainMenu_Icon_Side_HD.png
│   │   │   │   ├── MainMenu_Icon_Side_SD.png
│   │   │   │   ├── Overhang_Background_HD.png
│   │   │   │   ├── Overhang_Background_SD.png
│   │   │   │   ├── Overhang_Logo_HD.png
│   │   │   │   └── Overhang_Logo_SD.png
│   │   │   ├── Makefile
│   │   │   ├── manifest
│   │   │   └── source
│   │   │       ├── appMain.brs
│   │   │       ├── appMediaServer.brs
│   │   │       ├── checkServerUrl.brs
│   │   │       ├── deviceInfo.brs
│   │   │       ├── generalDlgs.brs
│   │   │       ├── generalUtils.brs
│   │   │       ├── getDirectoryListing.brs
│   │   │       ├── searchScreen.brs
│   │   │       └── urlUtils.brs
│   │   ├── LICENSE
│   │   ├── README
│   │   └── scripts
│   │       ├── makebif.py
│   │       └── nobif.py
│   ├── install-on-debian.sh
│   ├── README.md
│   ├── TODO
└── Movies
    ├── HarryPotter
    │   ├── HarryPotter-Year1-SorcerersStone.m4v
    │   ├── HarryPotter-Year1-SorcerersStone-SD.bif
    │   ├── HarryPotter-Year1-SorcerersStone-SD.jpg
    │   ├── HarryPotter-Year2-ChamberOfSecrets.m4v
    │   ├── HarryPotter-Year2-ChamberOfSecrets-SD.bif
    │   ├── HarryPotter-Year2-ChamberOfSecrets-SD.jpg
    │   ├── HarryPotter-Year3-PrisonerOfAzkaban.m4v
    │   ├── HarryPotter-Year3-PrisonerOfAzkaban-SD.bif
    │   ├── HarryPotter-Year3-PrisonerOfAzkaban-SD.jpg
    │   ├── HarryPotter-Year4-GobletOfFire.m4v
    │   ├── HarryPotter-Year4-GobletOfFire-SD.bif
    │   ├── HarryPotter-Year4-GobletOfFire-SD.jpg
    │   ├── HarryPotter-Year5-OrderOfThePhoenix.m4v
    │   ├── HarryPotter-Year5-OrderOfThePhoenix-SD.bif
    │   ├── HarryPotter-Year5-OrderOfThePhoenix-SD.jpg
    │   ├── HarryPotter-Year6-HalfBloodPrince.m4v
    │   ├── HarryPotter-Year6-HalfBloodPrince-SD.bif
    │   ├── HarryPotter-Year6-HalfBloodPrince-SD.jpg
    │   ├── HarryPotter-Year7-DeathlyHollows-Part1.m4v
    │   ├── HarryPotter-Year7-DeathlyHollows-Part1-SD.bif
    │   ├── HarryPotter-Year7-DeathlyHollows-Part1-SD.jpg
    │   ├── HarryPotter-Year7-DeathlyHollows-Part2.m4v
    │   ├── HarryPotter-Year7-DeathlyHollows-Part2-SD.bif
    │   ├── HarryPotter-Year7-DeathlyHollows-Part2-SD.jpg
    │   └── movies
    ├── Placeholder
    │   └── episodes
    ├── Search-HD.png
    ├── Search-SD.png
    ├── Setup-HD.png
    └── Setup-SD.png

HMS v3.0 and before have a 1-off error when using a single directory, as you can see above I’ve added a Placeholder directory until I can debug and fix it.

Next you need to label the filesystem containing the Movies directory. You can do this using the e2label utility – e2label /dev/sdX1 movie-box. It is important that this is labeled correctly, otherwise the movie partition won’t be mounted when the Pi reboots.

Roku Developer Mode

Since HMS isn’t an official Roku channel it has to be installed directly to the device using Developer Mode. You can enable this mode by booting the Roku and hitting the following keys on the remote (quickly, otherwise they will be ignored): HOME HOME HOME UP UP Righ Left Right Left Right

This will enter developer mode and ask you to set a password. Set it to password (or edit the install script so that the ROKU_DEV_PASSWORD matches what you set.

Install Movie Box

Turn off the Roku player for now, connect the Pi to the TV and your LAN (it needs to download some packages first). Log into the Pi, sudo to root, and then insert the USB drive you created above and mount it on a temporary directory like /mnt/usb1. eg. mkdir /mnt/usb1 && mount /dev/sda1 /mnt/usb1

Then run the install script: cd /mnt/usb1 && ./install-on-debian.sh. The script will download a few packages, then prompt you to unplug your LAN and connect the Ethernet cable to the Roku. After this point you don’t want to plug in the LAN unless you temporarily disable the dnsmasq service.

If everything went according to plan you should now be able to reboot everything and select the HMS application on the Roku. When you first boot it will complain about not being able to connect to the internet. This is normal, it actually is connected to the Pi, but it cannot talk to the Roku servers so it gets confused. Hit OK and then HOME to get back to the menu.

You can check that the Roku actually got an IP address by looking in the settings->player info menu. The IP address should be something like 192.168.0.67

Troubleshooting

If you have problems with playback check the lighttpd logs in /var/log/lighttpd/

If there are problems with getting an IP on the Roku check that dnsmasq is running and dhcpcd is not by using systemctl status dnsmasq and systemctl status dhcpcd

If you need to reconnect your LAN you should run:

  • systemctl stop dnsmasq && systemctl start dhcpcd

This keeps the DHCP server, provided by dnsmasq, from interfering with the DHCP server on your LAN.