DB
Table of contents
The DB class
This class manages the database. No arguments are needed when constructing. After this, db.init
should always be called. This is a hack to allow for an async/await
use.
Methods
init
Description: Opens the database and creates a new one if there is none. Also sets up event handlers to close the database on exit. Should be called immediately after constructing.
Arguments: None
Return value: None
create
Description: Creates a new database at databasePath
.
Arguments: None
Return value: None
delete
Description: Removes the database from the file system.
Arguments: None
Return value: None
close
Description: Closes the database
Arguments: None
Return value: None
openPath
Description: If path is a file, adds the track to a database. If it is a folder, recursively walks through it, adding all the contained tracks. While files in the same folder should be processed in a synchronized way (assuming that albums are in a same folder), files in different folders may be processed using async calls. Should return when all children processes are terminated.
Arguments: path
Return value: None
createTrack
Description: Checks if path
is a valid file format and has valid metadata, and inserts a new track into the database. If there is no corresponding album, creates a new one. Tracks that don’t have album info should be added to an album called ‘Unknown’.
Arguments: path
Return value: None
createAlbum
Description: Inserts a new album into the database. Also tries to add a cover, if there is any in firstTrack
’s metadata or in the album directory. If there is no corresponding artist, creates a new one. Note: it is assumed that tracks in the same album also share the same folder.
Arguments: firstTrack
, directory
Return value: albumID
deleteAlbum
Description: Removes an album from the database, as well as all the tracks and genres associated with it.
Arguments: albumID
Return value: None
createArtist
Description: Adds an artists to the database.
Arguments: name
Return value: artistID
createGenre
Description: Adds a new genre to the database.
Arguments: albumID
, genre
Return value: None
addCover
Description: Adds a new cover to coverFolder
, with the filename [albumID].[extension]
, and to albumDirectory
(querying the database if none was supplied), with the filename cover.[ext]
, according to sourceType
. Updates database so that it points to coverFolder/[albumID].[ext]
.
Arguments: source
, sourceType
(path
or data
),albumID
, albumDirectory
(optional)
Return value: None
getLibrary
Description: Gets all the albums that match query
and genre
. Also returns a small amount of matching tracks and all the genres in library.
Arguments: query
, genre
Return value: {albums, tracks, genres}
getAlbum
Description: Gets all the information about an album, including genres, artist and tracks.
Arguments: albumID
Return value: album
getAlbumTracks
Description: Gets the tracks mapped to albumID
.
Arguments: albumID
Return value: tracks
updateAlbumInfo
Description: Updates an album’s information to match up with the given one. Tracks whose format is mp3
should updated to reflect changes.
Arguments albumID
, albumInfo
Return value: None
updateTrackInfo
Description: Updates the track’s entry on the database and, if the track itself is in mp3
format, changes its tags using node-id3
module.
Arguments: trackID
, trackInfo
Return value: None
Structure
The initial SQL script to be run defines four tables: albums, tracks, artists and genres:
CREATE TABLE albums (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
directory TEXT,
artistID INTEGER,
discCount INTEGER,
coverPath TEXT
);
CREATE TABLE tracks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT,
composer TEXT,
albumID INTEGER,
trackOrder INTEGER,
disc INTEGER,
path TEXT
);
CREATE TABLE artists (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT
);
CREATE TABLE genres (
albumID INTEGER,
genre TEXT,
UNIQUE(albumID, genre)
);
Paths
The paths used by the DB
class are these:
-
databaseFolder = [userData]/database/
-
databasePath = [userData]/database/database.db
-
coverFolder = [userData]/database/covers
File formats
The DB
class is in charge of checking whether a file may be used as a track or as an image. The following formats are supported:
-
Music:
.flac
,.mp3
,.opus
,.ogg
,.aac
,.m4a
-
Image:
.png
,.jpeg
,.jpg
,.jfif
,.webp
,.gif
,.svg
,.bmp
,.ico