Let's imagine you want to make your DLNA server running on QNAP be available through the internet and to listen to music in foobar2000 Mobile player from it.
You assigned internet address to your NAS (e.g. using DDNS service) and exposed a port of DLNA server via port forwarding in your router configuration then you can add your NAS to foobar2000 media server list like http://mynas.myqnapcloud.com:8888
.
However most likely the player will not find it or will reject loading of any content. There are two reasons:
-
Due to your server was added manually, foobar2000 tries to fetch device description by default path
/DeviceDescription.xml
.DLNA server may have any other entry point, e.g. native QNAP DLNA server has
/rootDesc.xml
. The server informs a client about this entry point when it is discovered by the client in the local network. But in our case the server cannot inform foobar2000 about its entry point and so the player just uses the default one. -
DLNA server returns XML responses containing hard-coded local URLs of the content and player is not able to reach them outside of local network.
This adapter solves these two problems.
-
Node.js v8 (install from QNAP App Center)
-
Export npm bin folder to
PATH
:export PATH=/share/CACHEDEV1_DATA/.qpkg/nodejsv8/node/bin:$PATH
If you have installed Entware then it is possible to export
PATH
from/opt/etc/profile
to make it available every time when connecting via SSH.
Connect to NAS via SSH as admin and run:
$ npm install -g qnap-dlna-adapter-for-foobar2k-mobile
Connect to NAS via SSH.
Create config file. Example:
{
"deviceDescriptionPath": "/DeviceDescription.xml",
"dlnaHostname": "http://127.0.0.1",
"dlnaPort": 8200,
"externalHostname": "http://example.com",
"listenHostname": "0.0.0.0",
"port": 8888
}
$ dlna-adapter-for-foobar2k-mobile-start [options] [PATH_TO_CONFIG_FILE]
If PATH_TO_CONFIG_FILE
is not specified then default path ~/dlna-adapter.config.json
will be used.
Options:
--verbose
— Print all incoming requests.
$ dlna-adapter-for-foobar2k-mobile-stop
The adapter is an express web-server. Once it is started it does the following:
-
Redirects
/
and/DeviceDescription.xml
requests to<deviceDescriptionPath>
which is understandable by the DLNA server. All other requests are passing through the adapter without redirection. -
Replaces all occurrences of
<dlnaHostname>:<dlnaPort>
with<externalHostname>:<port>
in XML output of all http requests. So the player will fetch audio files from QNAP server's external URL.
Expose <port>
in your router and add <externalHostname>:<port>
to foobar2000's media server list.
<dlnaPort>
is not needed to be exposed anymore.
⏪
Theoretically this adapter can work not only with foobar2000 but I did not check that.
For QNAP DLNA server (native):
{
"deviceDescriptionPath": "/rootDesc.xml",
"dlnaHostname": "<NAS local address, e.g. http://192.168.1.66>",
"dlnaPort": 8200,
"...": "..."
}
For Asset UPnP:
{
"deviceDescriptionPath": "/DeviceDescription.xml",
"dlnaHostname": "http://127.0.0.1",
"dlnaPort": 26125,
"...": "..."
}