Shanling Q1: I need help

A great retro-styled hi-fi music player with a tiny problem

18 November 2021

Over a year ago I acquired an amazing gadget: the Shanling Q1 Portable Hi-Fi Player

See official product page for specs, photos, etc.

As an audiophile, I knew that one day I would buy a device like this. Many devices of this calibre are far more expensive, and spending lots of money on something is not exactly one of my favourite things to do. For years I stuck with the under-100€ options. I had a few Archos devices, that were great until they died. I went through two Sandisk devices (the Sansa Clip devices are my first choice when recommending portable music players to friends). Then, I saw the Kickstarter for this device, and began looking at their devices. I initially wanted the M0, a smaller device, but then decided on the larger, newer, Q1 thinking that it would receive more support and firmware upgrades.

I was not disappointed. With the right headphones, the difference in quality is noticeable. Especially when you can get hold of some hi-res music files, which was my main impetus for getting a device like this: the number of hi-res (read: 24-bit) albums in my collection was growing, and my Sandisk player couldn’t decode them.

As a player, it is wonderful. As a DAC, it is useful.

No complaints.

Well, almost no complaints…

The Problem?

FONTS AND GLYPHS

This device is manufactured in China, and the font used for the interface is a CJK font. Chinese, Japanese, and Korean do not use the same punctuation rules as English or French, for example, and the way the apostrophe is handled is a minor annoyance.

In my collection, depending on the source of the tag, I have encountered 2 different apostrophes:

this is U+2019 Single Quotation Mark: This IS the preferred apostrophe (according to glyphnerds and the lords of MusicBrainz) and THIS is the glyph that causes the space to be inserted.

' this is U+0027 Apostrophe: aka “apostrophe-quote” but it is NOT the preferred apostrophe. BUT it is the apostrophe that I get when I type and is very frequently used (I think it all depends on key mappings that most of us don’t really think about).

Most of us will not see the difference on our computers unless we are using a monospace font.

For example:

“07 - Jaques Mal Chance (Il n’a pas de chance).flac” and “04 - Don’t Know How.flac” don’t look very different, but 07 - Jaques Mal Chance (Il n'a pas de chance).flac and 04 - Don’t Know How.flac highlight the fact that they aren’t using the same character.

We can recreate the spacing issue on a PC by using a CJK font:

example fonts serif vs sans vs cjk
Serif, Sans, and CJK fonts

Do you see that space? It shouldn' t be there [sic]. Well, no, it should because the device uses a CJK font, what I mean is that it creates a problem for many detail-oriented people.

I posted on a forum about this in April 2021, but was informed that the font would not be changed.

I get it. It might mean creating two versions of the firmware, but with a fallback font. Pain in the ass, likely.

So, being naïve, and imagining that I could remedy the issue, I thought I could either download the firmware and “patch it” with a different font, or mount the embedded NAND and replace something.

Suffice it to say, recognising my naïveté was the only part I got right.

The update file is a compressed zip. In the zip, update.bin and a pdf. In the .bin? firmware_v0.tar.gz. So far so good. In the tar?

recovery-update/
├── global.xml
└── nand
    ├── update000.zip
    ├── update001.zip
    ├── update002.zip
    ├── update003.zip
    ├── update004.zip
    ├── update005.zip
    ├── update006.zip
    ├── update007.zip
    ├── update008.zip
    ├── update009.zip
    ├── update010.zip
    ├── update011.zip
    ├── update012.zip
    ├── update013.zip
    ├── update014.zip
    ├── update015.zip
    ├── update016.zip
    ├── update017.zip
    ├── update018.zip
    ├── update019.zip
    ├── update020.zip
    ├── update021.zip
    ├── update022.zip
    ├── update023.zip
    ├── update024.zip
    ├── update025.zip
    ├── update026.zip
    ├── update027.zip
    ├── update028.zip
    ├── update029.zip
    ├── update030.zip
    ├── update031.zip
    ├── update032.zip
    ├── update033.zip
    ├── update034.zip
    ├── update035.zip
    ├── update036.zip
    ├── update037.zip
    ├── update038.zip
    ├── update039.zip
    ├── update040.zip
    ├── update041.zip
    ├── update042.zip
    ├── update043.zip
    ├── update044.zip
    └── update045.zip

1 directory, 47 files

OK. I see where this is going.

.
├── META-INF
│   ├── CERT.RSA
│   ├── CERT.SF
│   ├── com
│   │   └── android
│   │       └── otacert
│   └── MANIFEST.MF
├── new
├── update000
│   ├── device.xml
│   └── update.xml
├── update000.zip
├── update001
│   └── xImage_001
├── update001.zip
├── update002
│   └── xImage_002
├── update002.zip
├── update003
│   └── xImage_003
├── update003.zip
├── update004
│   └── xImage_004
├── update004.zip
├── update005
│   └── q1system.ubi_001
├── update005.zip
├── update006
│   └── q1system.ubi_002
├── update006.zip
├── update007
│   └── q1system.ubi_003
├── update007.zip
├── update008
│   └── q1system.ubi_004
├── update008.zip
├── update009
│   └── q1system.ubi_005
├── update009.zip
├── update010
│   └── q1system.ubi_006
├── update010.zip
├── update011
│   └── q1system.ubi_007
├── update011.zip
├── update012
│   └── q1system.ubi_008
├── update012.zip
├── update013
│   └── q1system.ubi_009
├── update013.zip
├── update014
│   └── q1system.ubi_010
├── update014.zip
├── update015
│   └── q1system.ubi_011
├── update015.zip
├── update016
│   └── q1system.ubi_012
├── update016.zip
├── update017
│   └── q1system.ubi_013
├── update017.zip
├── update018
│   └── q1system.ubi_014
├── update018.zip
├── update019
│   └── q1system.ubi_015
├── update019.zip
├── update020
│   └── q1system.ubi_016
├── update020.zip
├── update021
│   └── q1system.ubi_017
├── update021.zip
├── update022
│   └── q1system.ubi_018
├── update022.zip
├── update023
│   └── q1system.ubi_019
├── update023.zip
├── update024
│   └── q1system.ubi_020
├── update024.zip
├── update025
│   └── q1system.ubi_021
├── update025.zip
├── update026
│   └── q1system.ubi_022
├── update026.zip
├── update027
│   └── q1system.ubi_023
├── update027.zip
├── update028
│   └── q1system.ubi_024
├── update028.zip
├── update029
│   └── q1system.ubi_025
├── update029.zip
├── update030
│   └── q1system.ubi_026
├── update030.zip
├── update031
│   └── q1system.ubi_027
├── update031.zip
├── update032
│   └── q1system.ubi_028
├── update032.zip
├── update033
│   └── q1system.ubi_029
├── update033.zip
├── update034
│   └── q1system.ubi_030
├── update034.zip
├── update035
│   └── q1system.ubi_031
├── update035.zip
├── update036
│   └── q1system.ubi_032
├── update036.zip
├── update037
│   └── q1system.ubi_033
├── update037.zip
├── update038
│   └── q1system.ubi_034
├── update038.zip
├── update039
│   └── q1system.ubi_035
├── update039.zip
├── update040
│   └── q1system.ubi_036
├── update040.zip
├── update041
│   └── q1system.ubi_037
├── update041.zip
├── update042
│   └── q1system.ubi_038
├── update042.zip
├── update043
│   └── q1system.ubi_039
├── update043.zip
├── update044
│   └── q1system.ubi_040
├── update044.zip
├── update045
│   └── q1system.ubi_041
└── update045.zip

49 directories, 98 files

Right. Some sort of UBIFS image meant for a NAND flash.

Request for help

The more I read through the documentation for UBI and NAND, the clearer it becomes that I am not looking for the right thing. Maybe I just don’t understand the terms. Either way, I need help.

Should I

  1. concatenate the *.zip files somehow and work with that?
  2. concatenate the *.ubi* files and mount that image?
  3. focus on extracting the image from the device, replacing some font file, and reflash it to the device?
    • I can get info about the device, but don’t know how (or if it is possible) to mount it and poke around
  4. do something else?

Thanks for reading, hit me up if you have a clue.

TL;DR: I don’t know squat and I should just leave it be