Skip to content
qooxtunes is a webinterface addon for XBMC. It leverages the powerful qooxdoo framework to present the user with a RIA interface that emulates some of the best features of iTunes for library management.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
addon
artwork
client
tools
CHANGELOG
LICENSE
README
TODO

README

-------------------------------------------------------------------------------
qooxtunes
-------------------------------------------------------------------------------

qooxtunes is a webinterface addon for XBMC.  It leverages the powerful qooxdoo 
framework to present the user with a RIA interface that emulates some of the
best features of iTunes for library management.  It currently only supports 
music, but it could be extended to handle video and photos.


-------------------------------------------------------------------------------
server software
-------------------------------------------------------------------------------

qooxtunes is a unique webinterface addon in that it starts up a python-based web
service that runs on a separate TCP/IP port from the standard XBMC
JSON-RPC API.

This secondary web service is designed to do a few things that the standard
API does not provide:
  - downloading song files in a ZIP archive
  - listing m3u playlists
  - reading/creating/editing/deleting m3u playlists and playlist folders
  - saving metadata changes to multiple songs at once

The web service is found in qooxtunes-ws.py, and it uses some additional
libraries:
  - SimpleJSONRPCServer.py (part of the jsonrpclib project,
    https://code.google.com/p/jsonrpclib/)
  - zipstream2.py (a quick-and-dirty modification to SpiderOak's zipstream
    module, https://github.com/gourneau/SpiderOak-zipstream)

This web service brings with it some limitations:
 - the code only works with XBMC Frodo, since it makes direct database
   access; the filenames and/or schemas could change between versions
 - the code currently only works with sqlite databases
 - because the web service runs on another port from the main web
   application, it is considered "cross-origin".  The web service uses
   the appropriate CORS headers, but be advised that some browsers
   will not support this mechanism.
   http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

Obviously, I would love to get everything directly from the built-in
JSON-RPC API, but until all these features are available in the API, this
secondary web service will be required.


-------------------------------------------------------------------------------
client software
-------------------------------------------------------------------------------

The client software uses the qooxdoo framework (qooxdoo.org).

To build it, you need to download a copy of the library and unpack it into
the client/qx directory (e.g. client/qx/qooxdoo-3.0.1-sdk).

Then from the client directory, type "./generate.py build".  If you want to
do any debugging, I recommend doing "./generate.py source-hybrid".  This will
compile the necessary qooxdoo classes into an optimized JS file, but will leave
your class files separate for easy debugging.

You can deploy the code by running tools/deploy.sh.  Note that you will need 
to edit the file to set the appropriate path to your addon.  This script will
also deploy the server-side python code.

The deploy script deploys the code in such a way that the build code (the
compiled and optimized code) is in the default location.  But it also puts
the debuggable source version into place.

Access the build version at

 http://localhost:8080/

Access the source version at

 http://localhost:8080/source/

Note about SmartTableModel:

I included a copy of the SmartTableModel code in the source tree.  We are not
actually using that copy during the build; the qooxdoo config.json
is configured to pull the SmartTableModel code from the contrib repo. 
I just felt better having the source here as a "just in case" sort of thing.
You can’t perform that action at this time.