Dune HD

From YobiWiki
Jump to navigation Jump to search

Dune HD Max

Current firmware: 111122_0159_beta

Official Links:

Forums:

News:

Misc Links:

Tuning

DSF

See http://scottjohnson.org/wiki/Dune/Hacking for:

  • packing/unpacking DSF
  • compile your own software
  • make your own binary DSF

See here for misc utilities

optware

Why not being able to do sth like apt-get on the Dune to install many packages? (not tried yet)

Telnet

telnetd binary is already in the firmware, you just need to activate it, e.g. by using dune_service_telnetd.dsf

To start always telnetd at startup:

touch /config/telnetd

You should see now on bottom right of the screen /setup/information: DEBUG MODE

IP control

No UPnP controllable, but much better IMHO, a specific HTTP protocol easy to implement and very complete.
More info on media_url features.

See below for an Android application implementing it for a remote control.
Here is an HTML file implementation for controlling from any browser.
here is a Chrome extension doing the same.
Here is a pretty complete application for Windows.

Finally, one can use YAMJ combined with a skin compatible with the DuneHD IP protocol, which is now my favorite way.

dune_folder.txt

This is a mechanism allowing easy UI customization.
Third party softwares exporting to that format:

Android applications for DuneHD

Can work on remote index but much better if it has a local copy of the index (Zappiti indexes are huge)

AAI image format

Official description: AAImageGen-README.txt and tool AAImageGen.exe
It works well with Wine and can even be called in command line:

wine AAImageGen.exe test.aai # and it'll generate a test.png
wine AAImageGen.exe test.png # and it'll generate a test.aai


Alternate project: aaimageviewer with read/write support, not working under Wine.

Quick Python script to convert AAI images to any other format

#!/usr/bin/env python

import os, sys
import Image
for infile in sys.argv[1:]:
    f, e = os.path.splitext(infile)
    if e != ".aai":
        raise IOError, "Sorry I only accept .aai files"
    try:
        data=open(infile).read()
        size = int(data[:4][::-1].encode('hex'),16), int(data[4:8][::-1].encode('hex'),16)
        # No BGRA so we'll take it as RGBA then swap channels
        im = Image.fromstring("RGBA", size, data[8:], "raw", "RGBA")
        r, g, b, a = im.split()
        im = Image.merge("RGBA", (b, g, r, a))
        # Just change the extension to save under another format
        im.save(f + ".jpg", quality=95)
    except IOError:
        print "cannot convert", infile

Renaming harddrive

By default the internal HDD gets a name based on a UUID à la DuneHDD_6db00183_3f29_4474_ae8a_6b27fbf24304, which is not easy to handle when you want to access it via e.g. Samba.
Drop a dune_folder.txt file on the root of the HDD with as content the shortcut name you want, e.g.:

storage_name = DuneHDD

Then reboot, the shared drive will now be seen as DuneHDD

Internal storage

Some functions and BD Live require an internal storage. This can be defined on a specific partition of the HDD but it's easier to keep a separate disk for that and be able to swap HDDs without worrying about the internal storage. The Dune HD Max has an extra USB port on the main board under the HDD rack metallic plate so we can plug a small 2Gb flash drive there and forget it.
Make sure it's empty otherwise the system will refuse to use it for internal storage (you can still erase everything from the UI then try to reconfigure it as internal storage)
Internal storage is mounted as /permanentfs

Video

See http://hdlandforum.fr/viewtopic.php?f=25&t=1049
My TV supporting all modes, I've setup mode 1080p 50Hz and auto framerate 24/50/60Hz

FlashLite apps

Streaming TV

To test streams, one can use the IP control protocol:

wget -O - "http://dune/cgi-bin/do?cmd=start_file_playback&media_url=http://stream02.gtk.hu/bptv"
wget -O - "http://dune/cgi-bin/do?cmd=start_file_playback&media_url=http://80.249.172.28/autonomia"
wget -O - "http://dune/cgi-bin/do?cmd=start_file_playback&media_url=mms://vipmms9.yacast.net/bfm_bfmtv"

One can create a bookmark such as this one to tell the Dune HD device to play the current URL:

javascript:document.location='http://dune/cgi-bin/do?cmd=start_file_playback&media_url='+encodeURIComponent(location.href)

If you use NoScript Application Boundaries Enforcer, you need to add an exception before "Site LOCAL" in the ABE preferences

Site dune
Accept ALL
Deny


This will work only if the URL is the direct link to the video file.
If you want it running with e.g. Youtube you need first some URL extractor.
One way is to use a Firefox extension such as Unplug.
So you can use first Unplug to get the media URL then use this javascript bookmark.
Hopefully Unplug is opensource so we can get the sources and patch them to add directly a "Open in DuneHD" method:

diff --git a/unplug@compunach/chrome/content/display/download.js b/unplug@compunach/chrome/content/display/download.js
index 6454d30..af644ab 100644
--- a/unplug@compunach/chrome/content/display/download.js
+++ b/unplug@compunach/chrome/content/display/download.js
@@ -580,6 +580,18 @@ UnPlug2DownloadMethods.add_button("open-tab", {
        group : "open"
 });
 
+UnPlug2DownloadMethods.add_button("open-DuneHD", {
+       avail : (function (res) {
+               return (res.download.url ? true : false);
+       }),
+       exec  : (function (res) {
+               UnPlug2SearchPage._win.location = "http://dune/cgi-bin/do?cmd=start_file_playback&media_url="+encodeURIComponent(res.download.url);
+       }),
+       obscurity : 100,
+       css : "open open-over",
+       group : "open"
+});
+
 UnPlug2DownloadMethods.add_button("open-new", {
        avail : (function (res) {
                return (res.download.url ? true : false);
diff --git a/unplug@compunach/chrome/locale/en-US/strings.txt b/unplug@compunach/chrome/locale/en-US/strings.txt
index 6356ced..b72e0a4 100644
--- a/unplug@compunach/chrome/locale/en-US/strings.txt
+++ b/unplug@compunach/chrome/locale/en-US/strings.txt
@@ -32,6 +32,9 @@ save_to_directory=Save to Folder
 dmethod.open-tab=Open in a new tab
 dmethod.open-tab.a=t
 dmethod.open-tab.tip=Open in a new tab.
+dmethod.open-DuneHD=Open in Dune HD
+dmethod.open-DuneHD.a=d
+dmethod.open-DuneHD.tip=Open in Dune HD.
 dmethod.open-new=Open in a new window
 dmethod.open-new.a=n
 dmethod.open-new.tip=Open in a new window.

IPTV

To test streams, one can use the IP control protocol:

wget -O - "http://dune/cgi-bin/do?cmd=start_file_playback&media_url=udp://@239.255.1.138:2276"

I get the BelgacomTV IPTV via a separate network so the idea is to access it via eth0 while the regular network remains the Wi-Fi one.
Once the Wi-Fi connection is active, we ca do the following to be able to use the multicast IPTV network on eth0:

route del -net 224.0.0.0 netmask 240.0.0.0 2>/dev/null
route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 2>/dev/null

Streaming radio

Custom GUI skins

GUI skins can be switched via the setting "Setup / Appearance / Skin", or via "B" RC button on the main screen (and also via "ZOOM" RC button on any screen).

Plugins

Multi-region

I didn't try yet but by playing DVD iso files I got the following experience: a first message telling me that the region was not ok, a kind of mini-reboot and then the DVD file played properly. To be investigated.
dune_service_region_switch.dsf, to change: press 4 times on "Mute" then quickly on 1, 2 or 3 for region A, B or C

YAMJ alone

Actually I almost never use the remote control to navigate the media library directly on the DuneHD.
I prefer to do it either from the PC or from the Android tablet.
We've seen eversion but it doesn't work on the PC neither on DMC for Android so it doesn't really fit my need...
YAMJ produces directly HTML which is ok for the PC as we can control the DuneHD by HTTP requests and it's also ok for the tablet via a web browser or via DMC as there is a script to convert YAMJ output to dune_folder structure as we'll see later.

Installation

I downloaded moviejukebox-2.8.zip from here
Some installation notes here

YAMJ Tuning

I'm using several setups for parents & kids, here e.g. I'll create a "foo" setup

library-foo.xml

Trick is to use Dune IP control in the URL
Example:

<libraries>
    <library>
        <path>/media/nas/video/</path>
        <playerpath>http://ip_of_dune/cgi-bin/do?cmd=launch_media_url&media_url=smb://user:password@ip_of_nas/video/</playerpath>
        <exclude name="sample,tmp/,temp/,RECYCLE.BIN/,/._"/>
        <description>Movies</description>
        <prebuf></prebuf>
        <scrapeLibrary>true</scrapeLibrary>
    </library>
</libraries>

categories-foo.xml

It's a copy of categories-default.xml where I disable most categories, e.g. to keep it simple for my kid
Just change "<enable>false</enable>" into "<enable>false</enable>" for each category to suppress

moviejukebox-foo.properties

The main tuning file
Major stuffs:

# This is the skin property, you will need to change this if you want to change the look of YAMJ
mjb.skin.dir=./skins/default
# new yamj feature to enabled directory hashing layout for image storage.  Results in more speed on larger jukeboxes
mjb.dirHash=true
# Unix/Linux/Mac users will need to install Mediainfo on their own and remove the # from the front of this setting
mediainfo.home=/usr/bin/
# Set to true to have YAMJ monitor your settings and adjust overwrites as needed automatically for you.
mjb.monitorJukeboxProperties=true
# Create TV show Boxsets automatically (group all tv show seasons together as 1 show)
mjb.singleSeriesPage=true
# threading for speed
mjb.MaxThreadsProcess=3
mjb.MaxThreadsDownload=3
mjb.MaxDownloadSlots=.*=2,.*imdb.*=3,.*google.*=3,.*yahoo.*=3,.*themoviedb.*=4,.*thetvdb.*=2,.*apple.*=1

Personal settings

mjb.jukeboxRoot=/media/nas/Jukebox
mjb.libraryRoot=library-foo.xml
mjb.detailsDirName=Movies
mjb.xmlCategoryFile=categories-foo.xml

Reduce further indexes

# Comma-separated list of indexes to generate. Valid indexes include:
#  Other, Genres, Title, Certification, Year, Library, Cast, Director, Writer and Country
mjb.categories.indexList=Other,Title,Library,Set

IMDB/TVDB languages

imdb.site=fr
thetvdb.language=fr
#mjb.internet.plugin=com.moviejukebox.plugin.AllocinePlugin

MovieJukebox-foo.sh

Just MovieJukebox.sh with the proper options

#!/bin/sh
java -Xms256m -Xmx1024m -classpath .:./resources:./lib/* com.moviejukebox.MovieJukebox -p moviejukebox-foo.properties -c "$@"

YAMJ Filename conventions

Cheat sheet, much more details on YAMJ Wiki! Standard:

/Movies/My Movie.avi
/Movies/My Movie/VIDEO_TS/...
/Movies/My Movie/BDMV/STREAM/...
/Movies/My Serie/Season 1/My Serie S01E01.avi
#Special episode:
/Movies/My Serie/Season 1/My Serie S00E01.avi

Separator: " ", "." or "_"

/Movies/My Movie.avi
/Movies/My.Movie.avi
/Movies/My_Movie.avi

Tokens: "[]" or "()"
With Year:

/Movies/My Movie.[YYYY].avi
/Movies/My Movie (YYYY).avi

With Language: (see moviejukebox.properties::filename.scanner.language.keywords.*)

/Movies/My Movie.[YYYY]_FR.avi
/Movies/My Movie.[YYYY]_FRENCH.avi

With video source (See supported keywords)

/Movies/My Movie_DVDRip.avi

Anything after "-" is ignored, usually used for episode title or part title, e.g.

/Movies/My Serie/Season 1/My Serie S01E01 - Title.avi

Trailers:

/Movies/My Movie [...Trailer...].avi
/Movies/My Movie [Bonus - Title of the bonus].avi

NFO:

/Movies/My Movie.nfo
/Movies/My Movie [PART1].nfo
/Movies/My Serie/Season 1/My Serie S01E01.nfo
/Movies/My Serie/Season 1/Season 1.nfo

Movie IDs (instead of using a NFO):

/Movies/My Movie [ID IMDB tt1234567].avi

Posters: replace movie extension by .jpg or .png or (see moviejukebox.properties::poster.scanner.coverArtExtensions)

/Movies/My Movie.jpg
/Movies/My Serie/Season 1/My Serie S01E01.jpg
/Movies/My Serie/Season 1/Season 1.jpg

Fanarts: idem with token .fanart (see skin.properties::mjb.scanner.fanartToken)

/Movies/My Movie.fanart.jpg
/Movies/My Serie/Season 1/My Serie S01E01.fanart.jpg
/Movies/My Serie/Season 1/Season 1.fanart.jpg

Banners: idem with token .banner (see skin.properties::mjb.scanner.bannerToken)

/Movies/My Serie/Season 1/My Serie S01E01.banner.jpg
/Movies/My Serie/Season 1/Season 1.banner.jpg

Videoimages: idem with token .videoimage

/Movies/My Serie/Season 1/My Serie S01E01.videoimage.jpg
/Movies/My Serie/Season 1/My Serie S01E02.videoimage.jpg

Multi-part: CDx, DISCx, DISKx or PARTx

/Movies/My Movie [DISC1].avi
/Movies/My Movie [DISC2].avi
/Movies/My Movie [DISC2-Title of part 2].avi

Sets:

/Movies/My Movie [SET setname].avi
/Movies/My Movie [SET setname-order].avi
/Movies/My Movie [SET setname][SET otherset].avi
/Movies/My Movie [SET MySet].avi
/Movies/My Movie [SET MySet-3].avi
/Movies/Set_MySet_1.jpg # otherwise poster of first movie will be used for set
/Movies/My Serie/Set_My Serie_1.jpg
#Rem: setname="My: Set"? => "My$3A Set"

Excluding a directory:

/Movies/path_to_ignore/.mjbignore
#See also skip instructions in library.xml if used, e.g. *sample*, *tmp/,...

Flag as watched:

/Movies/My Movie.avi.watched

Broken PLAY ALL

One broken thing is the "play all" button for series.
I'll have to convert the .jsp into proper .m3u playlists
and change in e.g. myserie.html

href="myserie S01E01.playlist.jsp"

into sth like

href="http://ip_of_dune/cgi-bin/do?cmd=launch_media_url&media_url=smb://user:password@ip_of_nas/video/myserie S01E01.m3u"

Meanwhile we can remove that button:

--- a/skins/default/skin-options.xsl
+++ b/skins/default/skin-options.xsl
@@ -48,8 +48,8 @@
 
 <!-- Detail Option #3: Where to show Play All link on the details page -->
 <!-- Valid values are: top, bottom, false/none, where top is now the default for movies -->
-<xsl:variable name="skin-playAllMovie">top</xsl:variable>
-<xsl:variable name="skin-playAllTV">bottom</xsl:variable>
+<xsl:variable name="skin-playAllMovie">none</xsl:variable>
+<xsl:variable name="skin-playAllTV">none</xsl:variable>

Force to fetch again default covers

We look for the default covers (well detection only based on filesize for speed reasons, use sha1sum if you want something more robust) in Jukebox and remove the corresponding movie XML file:

find . -size 20524c|awk '{sub(/.jpg/,".xml");sub(/\/.\/..\//,"/"); system( "rm \""$0"\";\n")}'

Pydun

Converts a YAMJ structure into a dune_folder, useful for Android DMC
Quite rough
YAMJ libraries need to get a name (description)

TODO

Try iSkin, a YAMJ skin made for "real" browsers on PC, iOS or Android, which is exactly what I'm looking for!
Check iSkin2 for tablet... iskin2_preview5_zip_87752.zip from this post

Misc

  • Some notes on proper filenames for movie detection
  • Yayman is a GUI for YAMJ but it's not clear what it does, it already renamed all my versioned files in lib/ :-(

Video notes

To identify video files: Mediainfo, available in Debian as mediainfo & mediainfo-gui
MKV tools (mkvmerge, mkvinfo, mkvextract): mkvtoolnix & mkvtoolnix-gui in debian

I had issues to play some 1080p mkv. Remultiplexing them with a newer version of mkvmerge seems enough to fix the issue:

mkvmerge -o new.mkv old.mkv

Dune HD has no problem handling latest mkvmerge versions with metadata compression, the problem seems to be specific to some older versions of mkvmerge.

Still, there is one type of video codec apparently not supported, flagged as "VfW compatible" (Video for Windows) by mkvmerge, mediainfo tells us it's actually codec V_REAL/RV40 == RealVideo 4.0 aka RealVideo 9

To merge 2 avi files (e.g. if the movie was splitted in 2 CDs), use avimerge:

avimerge -o new.avi -i old-cd1.avi old-cd2.avi

Tests

Read tests

Internal HDD: 79MB/s
External HDD USB: 21MB/S (write to internal: 13MB/s)

HDNetwork

It is available only if the player license includes “HDNetwork” option; this can be checked in the player menu Setup > Information. If the “HDNetwork” option is purchased, all the basic player functionality remains available.
This looks like what could be found in conference centers, controlling many screens at once. IMHO you can already achieve the same with the IP control protocol. Probably it's sold as an expensive bundle for those specific customers.