MPS-110NF "Bazzix"/"Denver" music player on Linux

Some notes on the MPS-110NF music player, in particular when using it on Linux. The player is sold under the brand "Denver" or "Bazzix" in different places.

The manual for this player is very terse and printed in a tiny size; so here's what I figured out. (TL;DR: It plays OGG, it works well with Linux)

Basics

Navigation

Navigating between files can become unreliable when the file system is broken. The file system driver has a lower tolerance for that than Linux.

Managing music with Banshee

The Banshee music player seems to get things right — if your USB automounting works. :)

For Banshee to recognize the device as a player and to know the supported filetypes, add the file .is_audio_player to the player's root directory, with the following content:

name="Bazzix"
output_formats=audio/ogg,audio/mpeg,audio/mp3,audio/x-ms-wma

From there on, Banshee will recognize the device just fine. The output_formats line will tell Banshee that the player understands OGG files, so that it won't try to convert to MP3 first.

Managing music on the player — command line

You want the full control! You despise using GUI applications! You're up for a surprise!

The player plays files in the order in which they were created, not in the alphabetical order of the filenames.

Files easily end up in the wrong order, but it's luckily fixable by "touching" (renaming to a temporary name and back) all files in a directory in the right order.

I conveniently placed this script on the player:

#!/usr/bin/python2
"""Recursively touches all file entries in alphabetical order.

Usage:
  ./sortfiles.py /mnt/bazzix
"""
import os
import sys

def walk(basedir):
  for dirpath, dirnames, filenames in os.walk(basedir):
    touchfiles(dirpath, filenames)

def touchfiles(basedir, files):
  for filename in sorted(files):
    tempname = "temp_%s" % filename
    full_filename = os.path.join(basedir, filename)
    full_tempname = os.path.join(basedir, tempname)
    # Touch the directory entry.
    print full_filename
    os.rename(full_filename, full_tempname)
    os.rename(full_tempname, full_filename)

def main(args):
  if not args:
    sys.exit("Needs directory argument, e.g. /mnt/bazzix")
  walk(args[0])

if __name__ == "__main__":
  main(sys.argv[1:])

Other people recommend to run the tool fatsort on the block device. This tool aims to solve exactly the same problem, but fsck.vfat frequently complained about the results and I ended up with broken file systems.