You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.8 KiB
Markdown

About
=====
This Python script is able to extract all music tracks from a Runescape cache.
It is not necessary to have the game installed. Only the cache files need to be
present in a directory. Specifically the files `main_file_cache.dat2`,
`main_file_cache.idx17` and `main_file_cache.idx40` are needed.
Usage
=====
If you have Runescape installed, you can find the cache in your user directory
in `jagexcache/runescape/LIVE/`. If you run Runescape under Wine, then they
will be located in
`$WINEPREFIX/drive_c/windows/profiles/josch/jagexcache/runescape/LIVE/`.
Then run the script like this:
./rsmusicextract.py path/to/cache path/for/extracted/files
You can omit the path to extract the music files to, in which case the program
will only list which music tracks are available.
You can also add the `--incomplete` option in which case also incomplete music
tracks will be extracted (or displayed in case you omitted the directory to
extract to).
Combining the music
===================
If an output directory is given, then the script will create it if necessary
and extract the individual music chunks into subdirectories which are named
after the music track they belong to. The chunks are mostly either 3.918 s or
7.836 s long.
Each individual chunk is an ogg vorbis file which, when concatenated, make the
full music track. They are numbered sequentially to concatenate them in the
right order.
The vorbis container format allows to concatenate multiple vorbis files by
simply running (on unix-like operating systems):
cat file1.ogg file2.ogg file3.ogg > combined.ogg
The problem is, that there are some players which either do not support ogg
files of that kind and will only play the very first chunk or which add
split-second pauses between the individual parts. Even using the ffmpeg concat
demuxer will leave audible gaps between the individual chunks. I posted the
following questions to find a solution to this problem:
- http://superuser.com/questions/864911/lossless-concatenation-of-ogg-vorbis-files
- http://stackoverflow.com/questions/27980960/how-to-lossless-concatenate-ogg-vorbis-files
Until that problem is solved, you can concatenate the individual tracks in a
single file by re-encoding the output stream. To not loose any quality, flac
can be used as the codex. The following snippet will combine the individual ogg
chunks in every directory into a single file of the same name:
$ mkdir combined
$ for dir in */; do \
dir=${dir%*/}; \
sox --combine concatenate "$dir"/* -C 8 "combined/$dir.flac"; \
done
Origin
======
This code is inspired by RSCacheTool by Villermen:
https://github.com/Villermen/RSCacheTool
It especially benefits from the reverse engineering that was done to create
that tool.
This script was written because of certain fundamental design shortcomings of
RSCacheTool which made it suboptimal for my use case. For example, to just list
all music tracks, RSCacheTool first has to extract all files from archive 40
which can take up a couple of gigabytes of disk space.
While RSCacheTool aims to be a swiss army knife for Runescape cache files, this
script only wants to provide the means to display and extract the Runescape
music from Runescape cache files.
RSCacheTool also has to be run in two stages to extract and name the music
track. This script does both actions in one go.
This script works "the other way round" compared to RSCacheTool. While
RSCacheTool first extracts all files and allows to rename them later, this
script will first extract the list of all available music and then extract the
necessary files from the archive. This allows to list all available music
tracks without having to extract them first.
Finally, because of its simplicity, this script is only 20% of the length of
RSCacheTool. For example it does not attempt to join the extract music as this
can be done by a small shell invocation as demonstrated above.