MediaServer Setup Notes

Maybe someone will find my notes helpful

Configuration Overview

Win 8
Classic Shell
Installed SABnzbd/Sickbeard/CouchPotato/uTorrent/Plex Media Server

SABnzbd/Sickbeard/CouchPotato in startup folder

Internal 3TB drive mounted as Z:

Video stored in

I just move movies around after CouchPotato renames/adds metadata

I have plex media server set to scan/index media files every 15 minutes. Sickbeard is also set to notify Plex on new download

Downloaded files are initially on the C: drive

C:DownloadsAudio - Reserved for when I get around to setting up Headphones
C:DownloadsComplete - Default folder for downloads without a category
C:DownloadsIncomplete - Working folder for SABnzbd
C:DownloadsMovie - Destination for movie category - where CouchPotato looks for downloaded files
C:DownloadsTorrent - Working folder for uTorrent
C:DownloadsTV - Destination for TV category

Installed taking default settings


port 8080
make sure API key is available. required for Sick Beard and CouchPotato

Temporary Download Folder: C:Downloadsincomplete
Completed Download Folder: C:Downloadscomplete
Post-Processing Scripts Folder: C:SickBeardautoProcessTV

Launch Browser on Startup: Unchecked

Add Server – Follow config from usenet provider

audio Default Default Default C:DownloadsAudio
movie Default Default Default C:DownloadsMovie
tv Default Default sabToSickBeard.exe C:DownloadsTV

Add DOGnzb bookmark feed

Extracted to C:SickBeard
made shortcut to SickBeard.exe in startup folder

Port 8081
Enable API key

Search Settings
NZB Method: SABnzbd
SABnzbd URL: http://localhost:8080/
SABnzbd API Key: *** The Key Copied from SABnzbd ***
SABnzbd Category: tv

Search Providers
Configure Custom Newznam Providers
Name / URL / API Key
Provider Priorities
Sick Beard Index
Womble’s Index

Everything else unchecked

Post Processing
TV Download Dir: Z:VideoTV
Rename Episodes: Checked
Name Pattern: Custom…
Season %0S/%SN – S%0SE%0E – %EN
Multi-Episode Style: Duplicate

Custom Air-By-Date: checked
Show Name – 2011-03-09 – Ep Name

Metadata Type: XBMC
All boxes checked
Use Banners: Unchecked

Plex Media Server
Enable: Checked
Update Library: Checked
Plex Media Server IP:Port: Machine IP Address

Enable: Checked
Notify on Download: Checked
Prowl API key: *** API Key from ***

Installed taking defaults

Check Show Advanced Settings

port 8082

Preferred Words: x264
Ignored Words: german, dutch, french, truefrench, danish, swedish, spanish, italian, korean, dubbed, swesub, korsub, dksubs, GERMAN, DUBBED, R5, R5BR, R5BD, DVDScr, CAM, TS, TV-ripm, cd1, cd2

Newznab: checked
Add nmatrix and DOGnzb URL and API key
Nzbindex: Checked

I made a Custom quality profile named “Custom”
I prefer in order

1080p 600 2400
720p 600 2400
BR-Rip 600 2400
DVD-Rip 600 2400

Sabnzbd: Checked
Host: *** IP Address of machine ***
API Key: *** API Key copied from SABnzbd ***
Category: movie

Run Every: 10
To: Z:VideoMovies
Folder Naming: ()
File Naming: .
Cleanup: checked
From: C:DownloadsMovie
Force Every: 1

Rename .NFO: Checked
NFO Naming: .orig.

XBMC: Checked
NFO: checked

Prowl: Checked
Api Key: *** API Key from ***

Plex: checked
Host: *** IP Address of machine ***

IMDB: Checked
URL: *** RSS URL of IMDB Watchlist ***

Movie Library Manager: Checked
Movie Folder: one for each of the following-

Installed latest PlexPass version (details in plexpass forum)
Took default settings

In plex web that popped up after install

signed in with username

Add Section
TV Shows - Z:VideoTV
Movies - Z:VideoMovies
Anime - Z:VideoMoviesAnime
Children's - Z:VideoMoviesChildrens
Classic Movies - Z:VideoMoviesClassic
Documentary - Z:VideoMoviesDocumentary

Settings (wrench and screwdriver in upper right)
Plex Media Server
Update my library periodically: checked
Library update interval: every 15 minutes

Local Quality: 3Mbps, 720p
Remote Quality: 1.5Mbps, 480p
Direct Play: checked
Direct Stream: checked

What is the perfect HTPC setup for a cord cutter?

It doesn’t exist.
With that out of the way, here’s a bit of a link dump of how I’ve come about as close as I can.

I don’t like DVDs or VHS or Blu-Ray. It’s cumbersome, it’s fragile, it’s outdated. I don’t like being a slave to TV listings. I’d rather watch TV or Movies on my schedule.

Overview: Parts that actually get used
PC (Plex Server / Subsonic Server / VNC Server / SABnzbd / Sickbeard / Couchpotato / Headphones)
Roku 3 (Plex Client / Netflix / Amazon Prime / Revision 3 / TWiT / Spotify / Pandora)
iPad / iPhone (Plex Client / iSub Client)
Android Tablet (Plex Client/ Subsonic Client)

Overview: Other stuff that works, but not as well as what I actually use
Raspberry Pi (Plex Client-rasplex / XBMC Player-openelec)
BoxeeBox (XBMC Fork – Media playback from fileshare)
Xbox (original xbox with xecuter modchip and a really old xbmc)
Chromecast (useless at the moment)

PC Hardware
I picked up a Gateway DX4870 and swapped out the internal hard drives for ones I had from previous builds
PC Specs: Windows 8 x64 / Intel Core i5 3330 @ 3.0GHz / 8 GB ram / 500GB hybrid system drive / 3TB internal data drive / 4TB external drive

Living Room
TV – 24 in Sony Bravia LCD TV
Roku 3
Bookshelf Stereo with RCA Line In
Unused – Blu-Ray Player / VCR

Cutting the cord does no good if you don’t have anything to watch.

Video Content
Legit – Streaming

Acquire Content – Local Video – Legit
Capture VHS – Dazzle DVD Recorder
Recorded / DVR –

Acquire Content – Local Video – Semi-Legit
Note: Ripping DVDs is semi-legit due to DMCA’s prohibition of breaking encryption related to copy protection. It’s paid for. Morally guilt-free, but technically illegal.

Local Content Server – Video

Manage Local Content – Video

Audio Content
Legit – Streaming

Acquire Content – Local Audio
Rip CD –
Buy MP3 –

Local Content Management – Audio

Local Content Server – Audio

Unfortunately, not everything is available through legit means.

If you’re gonna pirate stuff, might as well keep up on what’s new.

A lot of people like usenet for downloading content. I would imagine the following set of servers would get pretty good results. Block accounts are cheaper if you’re not pirating 24/7.
Main Block Account –
Backup Block Account –
Backup Block Account –
Free 10 day retention – 1mbit – 2 connection

Download Usenet content with SABnzbd –
For finding movies to download as they come available –
For finding TV to download as it comes available –
For finding albums to download as they’re available –

Need indexes to find nzb files for SABnzbd to download
VIP Account

Free Account

Related Subreddits

HTTP Live Streaming Windows Desktop to Roku Using VLC

I should stop reading Reddit when I’ve got some time to kill. It ends up eating into time I don’t have to kill.

HTTP Live Streaming (HLS) looks pretty easy to do with VLC.

It requires having a local web server. xampp is my favorite way to install apache on windows. You could also use IIS.

In these examples, my laptop is and I’m using C:xampphtdocsstream for the output folder. You will need to adjust for your environment.

If you don’t care about audio, you can use the built-in screen:// source for VLC

[text]"C:Program Files (x86)VideoLANVLCvlc.exe" -I dummy screen:// :screen-fps=10 vlc://quit –sout=#transcode{width=1280,height=720,fps=10,vcodec=h264,venc=x264{aud,profile=baseline,level=30,keyint=10,ref=1},acodec=mp3,ab=96}:std{access=livehttp{seglen=1,delsegs=true,numsegs=5,index=C:xampphtdocsstreammystream.m3u8,index-url=},mux=ts{use-key-frames},dst=C:xampphtdocsstreammystream-########.ts}[/text]

To capture both screen and audio and video with VLC requires using dshow. Free and works:

NOTE: If the screen width isn’t an exact multiple of 8, the video grabbed by dshow won’t play correctly in VLC. It will look garbled like black with diagonal lines.
For example: my laptop’s resolution is 1366×768. 1360 is a multiple of 8, but 1366 isn’t. It wasn’t until I had dshow scale the output to 1280×720 that I was able to get usable video into VLC.

"last_init_config_was"="default/from reg read config as: 768×1366 -> 720×1280 (0top 768b 0l 1366r) 10fps, dedupe? 0, millis between dedupe polling 10, m_bReReadRegistry? 0 "

Now that I can view the dshow video without trouble, I’m ready to encode to h.264 and segment for HLS.


@echo off
rem Start Stream
del /q C:xampphtdocsstream*
"C:Program Files (x86)VideoLANVLCvlc.exe" -I dummy dshow:// :dshow-vdev=screen-capture-recorder :dshow-adev=virtual-audio-capturer :dshow-aspect-ratio=16:9 vlc://quit –sout=#transcode{width=1280,height=720,fps=10,vcodec=h264,venc=x264{aud,profile=baseline,level=30,keyint=10,ref=1},acodec=mp3,ab=96}:std{access=livehttp{seglen=1,delsegs=true,numsegs=5,index=C:xampphtdocsstreammystream.m3u8,index-url=},mux=ts{use-key-frames},dst=C:xampphtdocsstreammystream-########.ts}

Note: Some devices honor the video stream’s stated aspect ratio, even if the video dimensions are different. My screen is 16:10, but I’m smooshing to 16:9. To make this work correctly, I had to specify the dshow aspect ratio as 16:9. No amount of fussing with it on the transcode side will fix this. It defaults to 4:3.


Next Step: Roku
Sign up for roku developer account and download the SDK.

The simplevideoplayer example will play HLS and is simple enough for this.

Comment out the other video source lines in appMain.brs and change the URL under Apple’s HLS test stream to your local webserver.
Note: For some reason, this did not play unless I had srt = “” set.


‘Apple’s HLS test stream
urls = [""%5D
qualities = ["HD"]
streamformat = "hls"
title = "Apple BipBop Test Stream"
srt = ""

Nexus 7 USB Webcam with Torque Track Recorder

I’ve never wanted to embed a tablet in my dash more than I do right now.

While browsing reddit a couple days ago, I came across this post about using a USB webcam with an OTG adapter.

Which lead me to this page about Nexus 7 webcam.

I am a huge fan of Torque OBDII reader for android (Torque Pro) with Torque Track Recorder. It kinda sucks on my original Motorola Droid so I wanted to get it working on my Nexus 7. Which got me really excited about hooking up a webcam to my nexus 7. (I currently have an iPhone 4 so that’s not an option)

So I rooted my nexus 7.

A couple Google searches later, I was reading about swapping cameras on android. This was really helpful to know to look for nvcamera.conf

which lead me to this google+ post about usb=/dev/video0 in nvcamera.conf


Once i knew what I was modifying, I had to mount /system as rw
mount -o remount rw /system

A reboot later and I was looking at myself through a USB webcam in Torque Track Recorder

I’ll export video tonight. I wasn’t expecting to see wifi sync!


# format, cameraName=device,direction,orientation,type
# type can be ‘stereo’ for stereo capable, ‘mono’ for not stereo capable,
# ‘usb’ to enable searching for a usb device and where to put it in the list
# if found. Lines must be shorter then 256 characters
camera0=/dev/mi1040,front,270,mono // front camera

The RIPINATOR – Semi-automated DVD Ripping

The Ripinator!!!

My fiance and I have a stack of DVDs. They’re dusty and inconvenient. I wanted to rip them to my network storage so I can easily watch them from my Boxee Box. It’s not that I’m lazy, but I hate doing repetative things if I can automate it.

I’m using Perl with Win32::SerialPort to control the autoloader. I’m using Win32::DriveInfo to get the volume name of the DVD. I’m using TMDB on the off chance the volumename will pull up the movie. I’m using DVDFab 8 to rip mainmovie to an ISO file. I’m using Handbrake to encode to iPad preset. In my testing, this looks just as good as the ISO file and uses only 20-30% of the space.

To use I batch together either all movies, or all TV shows. I rip my movies into my mapped network drive, V:queue and my TV shows into V:TV_queue
I have my faster computers actually do the encoding. Multiple computers. I map the V: drive to the same fileshare. I encode my movies to V:Encoded and my TV shows to V:TV_Encoded



  • Windows
  • Perl
  • Perl Modules – install through Perl Package Manager
    • Win32::SerialPort
    • Win32::DriveInfo
    • TMDB
  • DVDFab 8
  • Handbrake
  • nircmd
  • A big stack of DVDs
  • A large hard drive

Main program. It requires gripper, ripper, and traycmds. I broke this into multiple pieces to make it easier for me to keep track of.
Enumerates all CD/DVD drives attached to the computer and iterates through them probing the gripper arm to each tray. If a tray is detected, the drive number and drive letter are noted.
It then checks the levels of the bins.
If there are discs in the desginated input bin, it will load them into the drives and start the script
If there are discs done ripping, it will unload them into either the reject bin, or the output bin, depending on the exit code
This will continue until either something crashes, a disc is completely unreadable, or there are no more discs left to rip.
Contains subs
Required Setup:
Set COM port on line 218

Returns the version of the autoloader’s firmware
returns the serial number of the autoloader
moves the gripper arm to the top of the unit
Queries the autoloader’s status. See command notes for more info
Gets the current position of the gripper arm
gets a disc from the specified bin
puts a disc in the specified bin
gets a disc from the specified drive
puts a disc in the specified drive
probes the gripper arm to the disc tray, returns drive number
sends a command to the autloader. see command notes for more info
Contains subs
Required Setup:
Put nircmd in C:nircmdnircmd.exe

@allDVDdrives = closeAllDrives()
Closes all CD/DVD drives. Returns an array of all the CD/DVD drives attached to the computer.
Closes the specified drive
opensthe specified drive
gets the volume label of the specified drive
perl $drive $tray
Rips DVD to specified location. makes and removes lock files for ripinator. Looks up TMDB, if available, uses moviename and year for filename, if not, uses volumename.
Required Setup:
Get an API key for TMDB
set $dest_dir where you want ripped DVD ISO files to be stored
set $dvdfab as path to dvdfab.exe
enter TMDB API kay on line 96
perl !e1C
Allows sending commands to the autoloader
Encodes ISO files to iPad preset m4v with handbrake.
Required Setup:
Set machine name, path to handbrake, source and destination folders.
Encodes ISO files to iPad preset m4v with handbrake. Splits each title into a separate file.
Required Setup:
Set machine name, path to handbrake, source and destination folders.

Back Story:
A few years ago, we had a Rimage DVD production robot at work. I dubbed it Trogdor the Burninator. Rimage had some pretty scummy practices… The ink cartridges are standard HP cartridges, but had a little tag in the label that will keep the software from loading if you don’t buy the Rimage branded cartridges. I’m sure they would have gouged even more if they could think of a way to do it. So we replaced it with a newer, nicer one from Primera. It was an improvement in pretty much every way. I got the old one since no one else wanted it. SCORE!

I took it up as a project again. I had saved the old software from Rimage and was able to get it to run for 30 days between wiping and reloading the computer it was attached to. This was enough time to determine that the connection between the printer and the RAS 13 autoloader was RS232 serial. I sniffed the traffic between long enough to figure out which commands did what, and what replies meant. This is by no means definitive, but it’s enough to use an otherwise useless piece of equipment.

Rimage DTP-4500 RAS 13 Serial Port Cable

I suppose this post is a little out of order. It should have preceded Rimage DTP-4500 RAS 13 Initialization Sequence

I had popped the side off my RAS 13 and looked at the port that had been used to control the autoloader. It was a mini din 8 pin port. It was connected to a serial level converter chip. I took this as a sign it used RS232. There were 4 pins actually connected to the chip, 1, 2, 3, and 8. Pin 5 was connected to ground. Picture: Control PCB inside RAS 13

Some trial and error with the breadboard. Picture: Messy Breadboard

Once I had the proof of concept, I wanted to order some connectors to make it a little tidier.

Diagram of cable connection. Note: both ends are looking into male connectors. Check out my Skills of an Artist!

Connectors are pretty easy to find. I ordered from mouser and sparkfun since I was ordering other stuff too.

Perl One-Click DVD Rip with Win32::DriveInfo andDVDFab 8

Continuing my current obsession with ripping DVDs is my perlification of jmos1277’s Automated DVD ripping script using DVDFab

I’m using DVDFab to rip since it doesn’t seem to get tripped up as often with weird copy protection crap.

Luckily, Win32::DriveInfo will give me the volume name of the DVD. If I get time, I’ll rewrite so it checks for duplicates and appends the date&time to get a unique filename for output. It’s a little annoying when 3 discs are all named “DVD_VIDEO”.

I’m not setting it as an autorun action for the DVD drive because I’m going to call it from the ripinator script.

ripdisc.plContinue reading “Perl One-Click DVD Rip with Win32::DriveInfo andDVDFab 8”

Rimage DTP-4500 RAS 13 Serial Control Commands

A continuation of one of my previous projects.

Each command starts with the nonprintable ascii character ESC (x1B) and ends with a capital C.
Each reply starts with the nonprintable ascii character ESC (x1B) and ends with EOT (x04). Since that looks pretty ugly in a terminal, I replace ESC with a + sign and the EOT with an = sign.

In the known command list, the commands aren’t indented and the known replies are indented.

I smacked together a little bit of perl to verify I was understanding the commands correctly.
Continue reading “Rimage DTP-4500 RAS 13 Serial Control Commands”

subsonic + musiccabinet + ubuntu server 12.04 LTS

Subsonic is pretty awesome

Install instructions

I’ve kept notes for when I end up rebuilding this server.

Start by updating the system

[text]sudo apt-get update
sudo apt-get upgrade[/text]

Install Oracle Java 7

[text]sudo apt-get install python-software-properties
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer[/text]

Reference Links

Install Subsonic

sudo dpkg -i subsonic-4.7.deb
sudo service subsonic stop[/text]

Install musiccabinet

[text]sudo apt-get install unzip

sudo cp ~/subsonic-installer-standalone/subsonic-booter.jar /usr/share/subsonic/subsonic-booter-jar-with-dependencies.jar
sudo cp ~/subsonic-installer-standalonesubsonic-main.war /usr/share/subsonic/subsonic.war[/text]

Set a password for the “postgres” database role using the command:

[text]sudo -u postgres psql postgres
password postgres[/text]

Give your password when prompted. The password text will be hidden from the console for security purposes.
Type Control+D to exit the posgreSQL prompt.

Reference Links

Start Subsonic Service

[text]sudo service subsonic start[/text]

Connect to the IP address of the ubuntu server using http on port 4040, default username / password is admin / admin

I have to agree with the musiccabinet installation instructions for the last step “Start and log in to Subsonic as usual (normally via localhost:4040) and click the big “Configure MusicCabinet” header link. It should be pretty self-explanatory from there.” It really is self-explanatory.

I love iSub for streaming to my iPhone, DSub for streaming to my android tablet. I think “donating” to the project is a good idea, but if you don’t feel like it… will enable subsonic after the “trial” has ended.