Drunken Coder

Creating a media-enabled Ubuntu NAS

Posted 03/19/2013

I wanted a media-server that would stream to any devices I have on my local network, and allow my housemates & I to download torrents and share files on a central shared machine.


I have a Wii that is jailbroken, and running WiiMC. These instructions will also enable media-playing for XBOX360 & a PS3. I also don’t really like Webmin, but wanted web-based administration to be simple, with advanced stuff requiring SSH. This tutorial can also give you an overview of quick debian-based server administration.

Curly

NAS-box’s name is “Stooge”. There are many like him, but his name is “Stooge”.

He’s gonna be head-and-shoulders better than any ready-made device, fer reals. I made mine from a ultra-low-power microITX box I had laying around. Let’s go!

Get stooge talkin’ on your network

Basic software

First, I installed Ubuntu Server 12.10. Do this the normal way. Make sure you are hooked up to your network, and all drives are attached, and mount your massive storage partition on /share. When you get to the “Software selection” (tasksel) menu, choose “OpenSSH server” and “Samba file server”. If you want to use LAMP for a “welcome” page & mysql for mediatomb, choose that, too.

Root password

Login as your primary user, and give yourself a root password:

sudo passwd root

Share Directory

Make a directory where you keep all your goodies. I mounted a big drive in /share. I also wanted permissions to not really be a problem. Since samba guest is nobody.nogroup, and I want all to be able to mess with stuff, I did it like this:

sudo mkdir -p /share/incoming/incomplete
sudo chown -R nobody.nogroup /share
sudo find /share -type f -exec chmod 6664 {} +
sudo find /share -type d -exec chmod 6775 {} +

Now, everything in that dir will be totally read/writable to peeps with the right permissions, and have suid-bit set, so nobody.nogroup ends up owning it, and all files saved there have correct permissions.

Network

We need a reliable address to get to our server. You can use a DNS, static DHCP lease (based on MAC) or a static IP on the NAS.

I wanted my router to be aware of my domain-name (so people can type http://stooge.local into browser to see welcome page.) I also wanted to be able to move the address around from my router, and have it work for all & also be default on new linux setup on this box. I used DHCP, and setup a static lease on my router (which has a mini DNS server.) Another option would be to edit /etc/network/interfaces on the NAS, and add a static IP, like this:

iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0
gateway 192.168.1.1 

You already did this during the setup phase, if you set a static IP.

Reboot, and you should be able to SSH to your new box from the comfort of your regular computer.

Install stuff

Before we start, lets just install everything we are going to need. I did this by SSHing to my NAS:

ssh stooge.local

Now, I installed all the tools I would use to configure it.

sudo apt-get install swat mediatomb transmission-remote-cli transmission-daemon

Transmission (torrents)

I wanted everything to go into /share/incoming/incomplete, and get moved to /share/incoming, so people could tell that things aren’t done.

Transmission will overwrite configuration, so stop it, first: sudo stop transmission-daemon

Make your config (sudo vim /etc/transmission-daemon/settings.json) looks like this:

{
    "rpc-username": "YOUR_USER",
    "rpc-password": "SECRET", 
    "alt-speed-down": 50, 
    "alt-speed-enabled": false, 
    "alt-speed-time-begin": 540, 
    "alt-speed-time-day": 127, 
    "alt-speed-time-enabled": false, 
    "alt-speed-time-end": 1020, 
    "alt-speed-up": 50, 
    "bind-address-ipv4": "0.0.0.0", 
    "bind-address-ipv6": "::", 
    "blocklist-enabled": true, 
    "blocklist-url": "http://list.iblocklist.com/?list=nzldzlpkgrcncdomnttb&fileformat=p2p&archiveformat=gz", 
    "cache-size-mb": 4, 
    "dht-enabled": true, 
    "download-dir": "/share/incoming", 
    "download-limit": 100, 
    "download-limit-enabled": 0, 
    "download-queue-enabled": true, 
    "download-queue-size": 5, 
    "encryption": 1, 
    "idle-seeding-limit": 30, 
    "idle-seeding-limit-enabled": false, 
    "incomplete-dir": "/share/incoming/incomplete", 
    "incomplete-dir-enabled": true, 
    "lpd-enabled": false, 
    "max-peers-global": 200, 
    "message-level": 2, 
    "peer-congestion-algorithm": "", 
    "peer-limit-global": 240, 
    "peer-limit-per-torrent": 60, 
    "peer-port": 51413, 
    "peer-port-random-high": 65535, 
    "peer-port-random-low": 49152, 
    "peer-port-random-on-start": false, 
    "peer-socket-tos": "default", 
    "pex-enabled": true, 
    "port-forwarding-enabled": true, 
    "preallocation": 1, 
    "prefetch-enabled": 1, 
    "queue-stalled-enabled": true, 
    "queue-stalled-minutes": 30, 
    "ratio-limit": 1, 
    "ratio-limit-enabled": true, 
    "rename-partial-files": true, 
    "rpc-authentication-required": true, 
    "rpc-bind-address": "0.0.0.0", 
    "rpc-enabled": true, 
    "rpc-port": 9091, 
    "rpc-url": "/transmission/",
    "rpc-whitelist": "127.0.0.1", 
    "rpc-whitelist-enabled": false, 
    "scrape-paused-torrents-enabled": true, 
    "script-torrent-done-enabled": false, 
    "script-torrent-done-filename": "", 
    "seed-queue-enabled": false, 
    "seed-queue-size": 10, 
    "speed-limit-down": 100, 
    "speed-limit-down-enabled": false, 
    "speed-limit-up": 100, 
    "speed-limit-up-enabled": false, 
    "start-added-torrents": true, 
    "trash-original-torrent-files": false, 
    "umask": 18, 
    "upload-limit": 100, 
    "upload-limit-enabled": 0, 
    "upload-slots-per-torrent": 14, 
    "utp-enabled": true
}

You can set YOUR_USER & SECRET to whatever you want. Feel free to play aroud with your settings, they are the same as regular Transmission. I actually just copied/pasted from a desktop version of Transmission that was all setup how I wanted.

More with Permissions

I add the transmission & mediatomb users to nogroup:

sudo adduser debian-transmission nogroup
sudo adduser mediatomb nogroup

Now, they can write to the share directory.

Welcome page

I made a cute lil (responsive for easy phone-use) welcome page using PHP. I wanted it to show freespace, and give local users all the info they need to connect. I put a nice template here. Extract it in /var/www:

cd /var/www
wget http://blog.jetboystudio.com/articles/nas/nas-welcome.zip
unzip nas-welcome.zip
rm nas-welcome.zip

You may need some sudo's, if you don’t have write access to /var/www

Make sure to change your transmission username & password. All the other stuff uses javascript to fill in the right addresses. You can definitely add more features, like polling Transmission’s web-RPC to get info about running torrents, etc. I didn’t need all that.

You can see the page at http://192.168.1.5/ (if that is your NAS IP.)

It gives you some links to plugins that will let you add torrents form your computer. Use the settings in the grey box on the top-right. Tested the chrome plugin & standalone, both worked great, just like a native client.

Samba (Windows Networking)

Visit your welcome page, and click “Samba” button. When it asks you to login, use “root” and the password you set earlier.

This is SWAT. It has a lot of options. I basically setup 2 shares. One is “share” which has everything in it, and points to /share (my massive harddrive mount) and 1 for the web interface, that points to /var/www, so I can very easily mess with the welcome page. I made these both guest-access and browseable (no security, closed LAN.)

If you don’t want to click around in SWAT, you can use mine. Save it as /etc/samba/smb.conf on the NAS. Be sure to have a look at the global section, either way, as I added some nice speed-optimization flags, etc.

[global]
    server string = %h server (Samba, Ubuntu)
    map to guest = Bad Password
    obey pam restrictions = Yes
    pam password change = Yes
    passwd program = /usr/bin/passwd %u
    passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
    unix password sync = Yes
    syslog = 0
    log file = /var/log/samba/log.%m
    max log size = 1000
    min receivefile size = 65535
    max xmit = 65535
    max open files = 65535
    socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=65535 SO_RCVBUF=65535
    dns proxy = No
    usershare allow guests = Yes
    panic action = /usr/share/samba/panic-action %d
    idmap config * : backend = tdb
    aio read size = 16384
    aio write size = 16384
    aio write behind = true
    max connections = 65535
    use sendfile = Yes

[share]
    comment = All shared stuff
    path = /share/
    read only = No
    guest ok = Yes

[web]
    comment = Website for this box
    path = /var/www
    read only = No
    guest ok = Yes

MediaTomb (UPnP)

Follow the directions here to get an easy transcode-everything setup for PS3/XBOX/VLC. Here is exactly how I did it:

sudo apt-get install mencoder ffmpeg mediainfo lsdvd

then made my /etc/mediatomb/config.xml look like this:

<?xml version="1.0" encoding="UTF-8"?>
<config version="2" xmlns="http://mediatomb.cc/config/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mediatomb.cc/config/2 http://mediatomb.cc/config/2.xsd"><!--
     Read /usr/share/doc/mediatomb-common/README.gz section 6 for more
     information on creating and using config.xml configration files.
    -->
  <server>
    <ui enabled="yes" show-tooltips="yes">
      <accounts enabled="yes" session-timeout="30">
        <account user="YOUR_USER" password="SECRET"/>
      </accounts>
    </ui>
    <name>Stooge</name>
    <udn>uuid:e9a55b5a-a212-4957-9ed6-ec5b316ff609</udn>
    <home>/var/lib/mediatomb</home>
    <webroot>/usr/share/mediatomb/web</webroot>
    <storage caching="yes">
      <sqlite3 enabled="no">
        <database-file>mediatomb.db</database-file>
      </sqlite3>
      <mysql enabled="yes">
        <host>localhost</host>
        <username>mediatomb</username>
        <database>mediatomb</database>
      </mysql>
    </storage>
    <!-- For PS3 support change to "yes" -->
    <protocolInfo extend="yes"/>
    <!--
       Uncomment the lines below to get rid of jerky avi playback on the
       DSM320 or to enable subtitles support on the DSM units
    -->
    <custom-http-headers>
      <add header="X-User-Agent: redsonic"/>
    </custom-http-headers>

    <manufacturerURL>redsonic.com</manufacturerURL>
    <modelNumber>105</modelNumber>
    
   <!-- Uncomment the line below if you have a Telegent TG100 --><!--
       <upnp-string-limit>101</upnp-string-limit>
    -->
    <extended-runtime-options>
      <ffmpegthumbnailer enabled="yes">
        <thumbnail-size>128</thumbnail-size>
        <seek-percentage>5</seek-percentage>
        <filmstrip-overlay>yes</filmstrip-overlay>
        <workaround-bugs>no</workaround-bugs>
      </ffmpegthumbnailer>
      <mark-played-items enabled="no" suppress-cds-updates="yes">
        <string mode="prepend">*</string>
      </mark-played-items>
    </extended-runtime-options>
  </server>
  <import hidden-files="no">
    <scripting script-charset="UTF-8">
      <common-script>/usr/share/mediatomb/js/common.js</common-script>
      <playlist-script>/usr/share/mediatomb/js/playlists.js</playlist-script>
      <virtual-layout type="builtin">
        <import-script>/usr/share/mediatomb/js/import.js</import-script>
        <dvd-script>/usr/share/mediatomb/js/import-dvd.js</dvd-script>
      </virtual-layout>
    </scripting>
    <mappings>
    <extension-mimetype ignore-unknown="no">
        <map from="mp3" to="audio/mpeg"/>
        <map from="wmv" to="video/transcode"/>
        <map from="flv" to="video/transcode"/>
        <map from="mkv" to="video/transcode"/>
        <map from="rm"  to="video/transcode"/>
        <map from="iso" to="video/transcode"/>
        <map from="ogm" to="video/transcode"/>
        <map from="mp4" to="video/transcode"/> 
        <map from="avi" to="video/transcode"/>
      </extension-mimetype>
      <mimetype-upnpclass>
        <map from="audio/*" to="object.item.audioItem.musicTrack"/>
        <map from="video/*" to="object.item.videoItem"/>
        <map from="image/*" to="object.item.imageItem"/>
      </mimetype-upnpclass>
      <mimetype-contenttype>
        <treat mimetype="audio/mpeg" as="mp3"/>
        <treat mimetype="video/transcode" as="mpg"/>
      </mimetype-contenttype>
   </mappings>
    <online-content><!-- Make sure to setup a transcoding profile for flv -->
      <YouTube enabled="no" refresh="28800" update-at-start="no" purge-after="604800" racy-content="exclude" format="flv" hd="no">
        <favorites user="mediatomb"/>
        <standardfeed feed="most_viewed" time-range="today"/>
        <playlists user="mediatomb"/>
        <uploads user="mediatomb"/>
        <standardfeed feed="recently_featured" time-range="today"/>
      </YouTube>
      <Weborama enabled="no" refresh="28800" update-at-start="no">
        <playlist name="Active" type="playlist" mood="active"/>
        <playlist name="Metal" type="playlist">
          <filter>
            <genres>metal</genres>
          </filter>
        </playlist>
      </Weborama>
      <AppleTrailers enabled="no" refresh="43200" update-at-start="no" resolution="640"/>
    </online-content>
  </import>
  <transcoding enabled="yes">
    <mimetype-profile-mappings>
      <transcode mimetype="video/transcode" using="multifunctional"/>
    </mimetype-profile-mappings>
    <profiles>
      <profile name="multifunctional" enabled="yes" type="external">
        <mimetype>video/mpeg</mimetype>
        <first-resource>yes</first-resource>
        <agent command="/usr/local/bin/mediatomb-multifunctional.sh" arguments="%in %out"/>
        <buffer size="102400" chunk-size="51200" fill-size="20480"/>
      </profile>
    </profiles>
 </transcoding>
</config>

Make sure to replace YOUR_USER & SECRET & use the UUID that was originally in there in <udn>

I used mysql instead of flakey sqlite, so I enabled all those options. Make a mysql user mediatomb with no password, and grant all permissions to local. I did this in phpmyadmin.

I also made a /usr/local/bin/mediatomb-multifunctional.sh that looked like this:

#!/bin/bash
#
# General all-covering MediaTomb transcoding script.
#
#############################################################################
# Edit the parameters below to suit your needs.
#############################################################################

# Subtitles imply transcoding; set to 1 to disable subtitle rendering.
# For divx this doesn't matter much but for mp4, mkv and DVD it does.
DISABLESUBS=1

# Change this to enable different DVD subtitle languages.
SUBS="nl,en"

# Change this line to set the average bitrate.
# Use something like 8000 for wired connections; lower to 2000 for wireless.
AVBIT=8000

# Change this line to set the maximum bitrate.
# Use something like 12000 for wired connections; lower to 5000 for wireless.
MVBIT=12000

# Change this line to set the MPEG audio bitrate in kbps. AC3 is fixed to 384.
AABIT=256

# Change this line to set your favourite subtitle font.
SFONT="/etc/mediatomb/DejaVuSans.ttf"

# Change this line to set the size of subtitles. 20-25 is okay.
SUBSIZE=20

# Enable downscaling of transcoded content to 720 pixels wide (DVD format)?
DOWNSCALE=1

# If downscaling is enabled, anything over this width (pixels) will be downscaled.
MAXSIZE=900

# Enable logging to file?
LOGGING=1

# If logging is enabled, log to which file?
LOGFILE="/var/log/mediatomb-transcode.log"

#############################################################################
# Do not change anything below this line.
#############################################################################
# Variables
#############################################################################

FILE=$1
VERSION="0.12"

MENCODER=$(which mencoder)
MEDIAINFO=$(which mediainfo)
FFMPEG=$(which ffmpeg)
LSDVD=$(which lsdvd)
XML=$(which xmlstarlet)

M_TR_M="-oac lavc -ovc lavc -of mpeg -lavcopts \
    abitrate=${AABIT}:vcodec=mpeg2video:keyint=1:vbitrate=${AVBIT}:\
    vrc_maxrate=${MVBIT}:vrc_buf_size=1835 \
    -mpegopts muxrate=12000 -af lavcresample=44100 "
M_TR_A="-oac lavc -ovc copy -of mpeg -lavcopts \
    abitrate=${AABIT} -af lavcresample=44100 "
M_RE_M="-oac copy -ovc copy -of mpeg -mpegopts format=dvd -noskip -mc 0 "
F_TR_M="-acodec ac3 -ab 384k -vcodec copy -vbsf h264_mp4toannexb -f mpegts -y "
F_RE_M="-acodec copy -vcodec copy -vbsf h264_mp4toannexb -f mpegts -y "
SUBOPTS="-slang ${SUBS} "
SRTOPTS="-font ${SFONT} -subfont-autoscale 0 \
    -subfont-text-scale ${SUBSIZE} -subpos 100 "
SIZEOPTS="-vf harddup,scale=720:-2 "
NOSIZEOPTS="-vf harddup "
S24FPS="23.976"
S24OPT="-ofps 24000/1001 "
S30FPS="29.970"
S30OPT="-ofps 30000/1001 "

VCODEC=""
ACODEC=""
VWIDTH=""
VFPS=""
QPEL=""
AVCPROF=""

OPTS=("")

declare -i MODE=0

#############################################################################
# Functions
#############################################################################

function log {
        if [ "${LOGGING}" == "1" ] ; then
                echo -e "$(date +'%Y/%m/%d %H:%m:%S') \t $1" >> ${LOGFILE}
        fi
}

function mediainfo {
        MIOUT=$(mktemp /tmp/tmp.mediainfo.XXXXXX)
        log "Logging mediainfo XML to ${MIOUT}."
        ${MEDIAINFO} --output=xml "${FILE}" > ${MIOUT}
        VCODEC=$(${XML} sel -t -m ".//track[@type='Video']" -v "Format" ${MIOUT} )
        ACODEC=$(${XML} sel -t -m ".//track[@type='Audio']" -v "Format" ${MIOUT} )
        VWIDTH=$(${XML} sel -t -m ".//track[@type='Video']" -v "Width" \ 
            ${MIOUT} | sed 's/ pixels//' )
        VFPS=$(${XML} sel -t -m ".//track[@type='Video']" -v "Frame_rate" \ 
            ${MIOUT} | sed 's/ fps//' )
        AVCPROF=$(${XML} sel -t -m ".//track[@type='Video']" -v "Format_profile" \
            ${MIOUT} | sed 's/[^0-9]//g' )
        QPEL=$(${XML} sel -t -m ".//track[@type='Video']" -v "Format_settings__QPel" \
            ${MIOUT} )
        log "Variables found: \
            ${VCODEC} | ${ACODEC} | ${VWIDTH} | ${VFPS} | ${AVCPROF} | ${QPEL} "
        rm -f ${MIOUT}
}

function tropts {
        if [ "${DOWNSCALE}" == "1" -a ${VWIDTH} -gt ${MAXSIZE} ] ; then
                log "Rescaling to 720 pixels wide."
                OPTS+=(${SIZEOPTS})
        else
                log "Rescaling disabled or file within limits."
                OPTS+=(${NOSIZEOPTS})
        fi
        if [ "${VFPS}" == "${S24FPS}" ] ; then
                log "Framerate adjusted for mencoder."
                OPTS+=(${S24OPT})
        else if [ "${VFPS}" == "${S30FPS}" ] ; then
                log "Framerate adjusted for mencoder."
                OPTS+=(${S30OPT})
        else
                log "Framerate acceptable for mencoder."
        fi
        fi
}

function getmode {
        # Fixed case: DVD ISO.
        if [ "${FEXT}" == "ISO" ] ; then
                CHAPTER=$(${LSDVD} "${FILE}" | grep Longest | sed 's/.* //')
                log "DVD iso image found: Longest chapter is ${CHAPTER}."
                MODE+=${DISABLESUBS}1000000
                return 0
        fi
        # Fixed case: subtitle found: transcode by default.
        if [ "${DISABLESUBS}" == "0" -a -e "$(echo $FILE | sed 's/...$/sub/')" ] ; then
                log "SRT subtitle found."
                SUB=$(echo $FILE | sed 's/...$/sub/')
                MODE+=100000
                return 0
        elif [ "${DISABLESUBS}" == "0" -a -e "$(echo $FILE | sed 's/...$/srt/')" ] ; then
                log "SUB subtitle found."
                SUB=$(echo $FILE | sed 's/...$/srt/')
                MODE+=100000
                return 0
        fi

        log "No subtitles found, or subtitle rendering disabled."
        mediainfo

        case ${VCODEC} in
        "AVC")
                if [ "${AVCPROF}" -gt "41" ] ; then
                        # Cannot handle h.264 4.1+
                        MODE+=10000     
                else          
                        # We can handle the rest                          
                        MODE+=1         
                fi ;;
        "MPEG-4 Visual")
                if [ "${QPEL}" == "No" ] ; then
                        # No QPEL: we could remux the video         
                        MODE+=100       
                else            
                        # QPEL: just transcode it all                        
                        MODE+=10000     
                fi ;;
        * )
                        # Transcode everything we don't know
                        MODE+=10000 ;;  
        esac

        case ${ACODEC} in
        "AC-3" | "MPEG Audio" )      
                        # These should be wellknown                   
                        MODE+=1 ;;      
        * )
                if [ "${MODE}" -lt "100" ] ; then    
                        # If video is AVC, transcode audio in m2ts   
                        MODE+=10        
                else     
                        # Otherwise in other container                       
                        MODE+=1000      
                fi ;;
        esac

}

function processmode {
        log "Mode is ${MODE}."
        if [ ! "${MODE}" -lt "10000000" ] ; then
                EXEC="${MENCODER} -dvd-device"
                OPTS+=(dvd://${CHAPTER} ${M_RE_M} -o )
        elif [ ! "${MODE}" -lt "1000000" ] ; then
                EXEC="${MENCODER} -dvd-device"
                OPTS+=(dvd://${CHAPTER} ${SUBOPTS} ${M_TR_M} -o )
        elif [ ! "${MODE}" -lt "100000" ] ; then
                EXEC=${MENCODER}
                tropts
                OPTS+=(${M_TR_M} -sub ${SUB} ${SRTOPTS} -o )
        elif [ ! "${MODE}" -lt "10000" ] ; then
                EXEC=${MENCODER}
                tropts
                OPTS+=(${M_TR_M} -o )
        elif [ ! "${MODE}" -lt "1000" ] ; then
                EXEC=${MENCODER}
                tropts
                OPTS+=(${M_TR_M} -o)
        elif [ ! "${MODE}" -lt "100" ] ; then
                EXEC=${MENCODER}
                OPTS+=(${M_TR_M} -o)
        elif [ ! "${MODE}" -lt "10" ] ; then
                EXEC="${FFMPEG} -i"
                OPTS+=(${F_TR_M})
        elif [ ! "${MODE}" -lt "1" ] ; then
                EXEC="${FFMPEG} -i"
                OPTS+=(${F_RE_M})
        else
                log "I'm sorry Dave, I'm afraid I can't do mode=0."
        fi
}

#############################################################################
# Main method
#############################################################################

log "Starting MediaTomb Multifunctional Transcoder (version ${VERSION})."
FEXT=$(echo $FILE | sed 's/.*\.//' | tr [a-z] [A-Z])
log "${FEXT} file specified: \"${FILE}\""

getmode
processmode

log "Starting exec:"
log "${EXEC} \"${FILE}\" ${OPTS[@]} ${2} &>/dev/null"
exec ${EXEC} "${FILE}" ${OPTS[@]} "${2}" &>/dev/null

Make sure to chmod 755 /usr/local/bin/mediatomb-multifunctional.sh and reboot.

Visit your NAS’s MediaTomb page (UPnP button) and add /share, under “Filesystem”. Set the share to auto-update, timed (so SAMBA changes are propagated.)

Timemachine

I am the only mac (hackintosh) on my network. I followed these directions to get it working.

Wow! That was easy! Time to drink.

Moar stuff

SparkleShare

If you want a privately hosted Dropbox, with no size limit, based on git, then this is your tool! I followed the directions on SparkeShare under “Setting up a host”, and now people who are not used to using git, or just want a local dropbox are all set! An added bonus of the client is that it works with a lot of hosted git services, so I am editing this blog by just saving the file!

LAMP

If you want a local LAMP vhost setup, follow these instructions, and leave out the virtualbox stuff. This will allow you and all your housemates to have a super-easy NAS-accessible LAMP-server, with no local virtualbox install! Put it all in /var/www, and it will be ready for the samba share.

LAN Cable Network

You can install a SAP server (sudo apt-get install minisapserver) to install a streaming multicast LAN-only cable network! This will allow you to stream security cameras, your house’s toilet-cam channel, Maoist progopanda, your Youtube channel, or whatevs to anyone who can view SAP (hint: VLC.) Holy crap! Haven’t played with this, but it’s gonna be awesome.

iTunes

You can add an endpoint/file-server for iTunes, if you hook your NAS up to your stereo by following these instructions. On Ubuntu 12.10, I used forked-daapd instead of mt-daapd, and it had no web front-end (which is fine.) As of now, it is still updating the index (very slowly) so I dunno how cool this is, if your stereo ain’t hooked up to it. UPnP (in VLC) seems like a better option, upon initial playing. To be fair, I have never been a big iTunes fan.


READ THIS NEXT:

Automating TV torrent downloads

I want Stooge, my NAS to be able to keep track of my favorite shows, and download new episodes when they come out.


David KonsumerWritten by David Konsumer who lives and works in Portland and makes rad stuff. You should follow him on Twitter & Github