diff --git a/doc/python/generate_python_docs.py b/doc/python/generate_python_docs.py
index 4f262238b..b96ffa88d 100644
--- a/doc/python/generate_python_docs.py
+++ b/doc/python/generate_python_docs.py
@@ -46,7 +46,8 @@ epydoc.docintrospecter.register_introspecter(is_pyqt_wrapper_class, introspect_p
# Monkey-patch some functions in the HTML docwriter to show a table of contents
-# down the side of each page, instead of in a separate frame.
+# down the side of each page, instead of in a separate frame, and to do external
+# API links.
original_write_header = epydoc.docwriter.html.HTMLWriter.write_header
def my_write_header(self, out, title):
original_write_header(self, out, title)
@@ -89,10 +90,57 @@ def my_write_toc_section(self, out, name, docs, fullname=True):
docs = [x for x in docs if not str(x.canonical_name).startswith('PyQt4')]
original_write_toc_section(self, out, name, docs, fullname=fullname)
+def qt_url(name):
+ if not isinstance(name, str) and \
+ not isinstance(name, epydoc.apidoc.DottedName) and \
+ not isinstance(name, unicode):
+ return None
+
+ parts = str(name).split('.')
+ if len(parts) >= 3 and parts[0] == "PyQt4":
+ parts = parts[2:]
+
+ if not parts or not parts[0].startswith("Q"):
+ return None
+
+ label = '.'.join(parts)
+ url = "http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/"
+ url += "%s.html" % parts[0].lower()
+
+ if len(parts) >= 2:
+ url += "#%s" % parts[1].lower()
+
+ return url
+
+original_translate_identifier_xref = epydoc.docwriter.html._HTMLDocstringLinker.translate_identifier_xref
+def my_translate_identifier_xref(self, identifier, label=None):
+ url = qt_url(identifier)
+ if url:
+ label = '.'.join(identifier.split('.')[2:])
+ return '%s' % (url, label)
+ return original_translate_identifier_xref(self, identifier, label)
+
+original_url = epydoc.docwriter.html.HTMLWriter.url
+def my_url(self, obj):
+ if isinstance(obj, epydoc.apidoc.ValueDoc):
+ url = qt_url(obj.canonical_name)
+ if url:
+ return url
+ return original_url(self, obj)
+
+original__write = epydoc.docwriter.html.HTMLWriter._write
+def my__write(self, write_func, directory, filename, *args):
+ if filename.startswith("http://"):
+ return
+ original__write(self, write_func, directory, filename, *args)
+
+epydoc.docwriter.html.HTMLWriter._write = my__write
epydoc.docwriter.html.HTMLWriter.write_header = my_write_header
epydoc.docwriter.html.HTMLWriter.write_footer = my_write_footer
epydoc.docwriter.html.HTMLWriter.write_navbar = my_write_navbar
epydoc.docwriter.html.HTMLWriter.write_toc_section = my_write_toc_section
+epydoc.docwriter.html._HTMLDocstringLinker.translate_identifier_xref = my_translate_identifier_xref
+epydoc.docwriter.html.HTMLWriter.url = my_url
sys.argv = [
@@ -114,6 +162,10 @@ print "Running '%s'" % ' '.join(sys.argv)
# Parse arguments
(options, names) = epydoc.cli.parse_arguments()
+# Set up the logger
+logger = epydoc.cli.ConsoleLogger(1, 'hide')
+epydoc.log.register_logger(logger)
+
# Write the main docs - this is copied from cli()
epydoc.docstringparser.DEFAULT_DOCFORMAT = options.docformat
docindex = epydoc.docbuilder.build_doc_index(names,
diff --git a/src/core/song.cpp b/src/core/song.cpp
index 0ef51a0cc..4efdfbef0 100644
--- a/src/core/song.cpp
+++ b/src/core/song.cpp
@@ -202,14 +202,14 @@ Song::Song(FileRefFactory* factory)
}
void Song::Init(const QString& title, const QString& artist,
- const QString& album, qint64 length) {
+ const QString& album, qint64 length_nanosec) {
d->valid_ = true;
d->title_ = title;
d->artist_ = artist;
d->album_ = album;
- set_length_nanosec(length);
+ set_length_nanosec(length_nanosec);
}
void Song::Init(const QString& title, const QString& artist,
@@ -224,7 +224,7 @@ void Song::Init(const QString& title, const QString& artist,
d->end_ = end;
}
-void Song::set_genre(int id) {
+void Song::set_genre_id3(int id) {
set_genre(TStringToQString(TagLib::ID3v1::genre(id)));
}
diff --git a/src/core/song.h b/src/core/song.h
index ed4c7139e..2ee4cd3fe 100644
--- a/src/core/song.h
+++ b/src/core/song.h
@@ -124,7 +124,7 @@ class Song {
bool HasProperMediaFile() const;
// Constructors
- void Init(const QString& title, const QString& artist, const QString& album, qint64 length);
+ void Init(const QString& title, const QString& artist, const QString& album, qint64 length_nanosec);
void Init(const QString& title, const QString& artist, const QString& album, qint64 beginning, qint64 end);
void InitFromFile(const QString& filename, int directory_id);
void InitFromQuery(const SqlRow& query, int col = 0);
@@ -246,7 +246,7 @@ class Song {
void set_bpm(float v) { d->bpm_ = v; }
void set_year(int v) { d->year_ = v; }
void set_genre(const QString& v) { d->genre_ = v; }
- void set_genre(int id);
+ void set_genre_id3(int id);
void set_comment(const QString& v) { d->comment_ = v; }
void set_compilation(bool v) { d->compilation_ = v; }
void set_sampler(bool v) { d->sampler_ = v; }
diff --git a/src/radio/jamendoservice.cpp b/src/radio/jamendoservice.cpp
index 55e62d123..e805371f2 100644
--- a/src/radio/jamendoservice.cpp
+++ b/src/radio/jamendoservice.cpp
@@ -340,7 +340,7 @@ Song JamendoService::ReadTrack(const QString& artist,
int genre_id = reader->readElementText().toInt();
// In theory, genre 0 is "blues"; in practice it's invalid.
if (genre_id != 0) {
- song.set_genre(genre_id);
+ song.set_genre_id3(genre_id);
}
} else if (name == "id") {
QString id_text = reader->readElementText();
diff --git a/src/scripting/python/network.sip b/src/scripting/python/network.sip
index 8c8010069..72849c8af 100644
--- a/src/scripting/python/network.sip
+++ b/src/scripting/python/network.sip
@@ -4,6 +4,17 @@ class NetworkAccessManager : QNetworkAccessManager {
#include "core/network.h"
%End
+%Docstring
+A Qt network access manager that should be used to create all network requests
+in Clementine.
+
+Differences from the normal QNetworkAccessManager:
+
+ - Sends a Clementine C{User-Agent} HTTP header.
+ - Uses a thread-safe disk cache in Clementine's user config directory.
+ - Honors the proxy set by the user in the settings dialog.
+%End
+
public:
NetworkAccessManager(QObject* parent /TransferThis/ = 0);
};
diff --git a/src/scripting/python/playlistitem.sip b/src/scripting/python/playlistitem.sip
index b0490ee36..c665f8150 100644
--- a/src/scripting/python/playlistitem.sip
+++ b/src/scripting/python/playlistitem.sip
@@ -30,7 +30,7 @@ L{Playlist.InsertSongsOrLibraryItems()}.
You can get individual PlaylistItems from a L{Playlist} using
L{Playlist.item_at()}. Get the PlaylistItem that is currently playing (in any
playlist) using L{Player.GetCurrentItem()}. These functions are marked as
-returning L{PlaylistItemPtr}s, because in C++ the playlist items are held
+returning C{PlaylistItemPtr}s, because in C++ the playlist items are held
inside and managed by smart pointers. This doesn't affect Python at all
however - you can use a PlaylistItemPtr in just the same way as you would a
PlaylistItem.
diff --git a/src/scripting/python/playlistmanager.sip b/src/scripting/python/playlistmanager.sip
index 8d82472bb..bd9d4da74 100644
--- a/src/scripting/python/playlistmanager.sip
+++ b/src/scripting/python/playlistmanager.sip
@@ -220,7 +220,7 @@ last playlist - this function will silently return if you try.
ChangePlaylistOrder(new_order)
Rearranges the order of the tabs in the tab bar.
-@field new_order: A list of playlist IDs in the new desired order.
+@param new_order: A list of playlist IDs in the new desired order.
@type new_order: list of ints
%End
diff --git a/src/scripting/python/playlistsequence.sip b/src/scripting/python/playlistsequence.sip
index 98292700f..af8143c3e 100644
--- a/src/scripting/python/playlistsequence.sip
+++ b/src/scripting/python/playlistsequence.sip
@@ -5,6 +5,30 @@ struct PlaylistSequence {
#include "playlist/playlistsequence.h"
%End
+%Docstring
+Contains the shuffle and repeat state of the player.
+
+This state is shared between all playlists. You can access the global
+PlaylistSequence instance through the L{PlaylistManager}:
+
+ >>> sequence = clementine.playlists.sequence()
+ ... sequence.SetShuffleMode(clementine.PlaylistSequence.Shuffle_All)
+ ... sequence.SetRepeatMode(clementine.PlaylistSequence.Repeat_Playlist)
+
+The constants defined in this class are:
+
+ - C{Repeat_Off}
+ - C{Repeat_Track} - repeats the current track
+ - C{Repeat_Album} - repeats the current album
+ - C{Repeat_Playlist} - repeats the whole playlist
+ - C{Shuffle_Off}
+ - C{Shuffle_All} - plays tracks in a random order
+ - C{Shuffle_Album} - plays tracks from the current album in a random order
+
+@group Signals: RepeatModeChanged, ShuffleModeChanged
+@group Slots: SetRepeatMode, SetShuffleMode, SetUsingDynamicPlaylist
+%End
+
public:
enum RepeatMode {
Repeat_Off = 0,
@@ -18,22 +42,77 @@ public:
Shuffle_Album = 2,
};
- static const char* kSettingsGroup;
-
RepeatMode repeat_mode() const;
+%Docstring
+repeat_mode() -> int
+Returns the current repeat mode.
+
+@return: one of the C{Repeat_} constants.
+%End
+
ShuffleMode shuffle_mode() const;
+%Docstring
+shuffle_mode() -> int
+Returns the current shuffle mode.
+
+@return: one of the C{Shuffle_} constants.
+%End
QMenu* repeat_menu() const;
+%Docstring
+repeat_menu() -> L{PyQt4.QtGui.QMenu}
+Returns a menu that can be added to a button or another menu to allow the user
+to control the repeat behaviour.
+%End
+
QMenu* shuffle_menu() const;
+%Docstring
+shuffle_menu() -> L{PyQt4.QtGui.QMenu}
+Returns a menu that can be added to a button or another menu to allow the user
+to control the shuffle behaviour.
+%End
public slots:
void SetRepeatMode(PlaylistSequence::RepeatMode mode);
+%Docstring
+SetRepeatMode(mode)
+Changes the repeat mode.
+
+@param mode: one of the C{Repeat_} constants.
+%End
+
void SetShuffleMode(PlaylistSequence::ShuffleMode mode);
+%Docstring
+SetShuffleMode(mode)
+Changes the shuffle mode.
+
+@param mode: one of the C{Shuffle_} constants.
+%End
+
void SetUsingDynamicPlaylist(bool dynamic);
+%Docstring
+SetUsingDynamicPlaylist(dynamic)
+When using dynamic playlists changing the shuffle and repeat modes is not
+allowed, their buttons in the interface are disabled, and the L{repeat_mode()}
+and L{shuffle_mode()} functions always return C{Repeat_Off} and C{Shuffle_Off}.
+
+@type dynamic: bool
+%End
signals:
void RepeatModeChanged(PlaylistSequence::RepeatMode mode);
+%Docstring
+RepeatModeChanged(new_mode)
+Emitted when the repeat mode is changed, either by the user or by a call to
+L{SetRepeatMode()}.
+%End
+
void ShuffleModeChanged(PlaylistSequence::ShuffleMode mode);
+%Docstring
+ShuffleModeChanged(new_mode)
+Emitted when the shuffle mode is changed, either by the user or by a call to
+L{SetShuffleMode()}.
+%End
private:
PlaylistSequence();
diff --git a/src/scripting/python/scriptinterface.sip b/src/scripting/python/scriptinterface.sip
index da65f04c0..5490f970c 100644
--- a/src/scripting/python/scriptinterface.sip
+++ b/src/scripting/python/scriptinterface.sip
@@ -4,6 +4,26 @@ class ScriptInterface : QObject {
#include "scripting/scriptinterface.h"
%End
+%Docstring
+Helper functions that are specific to a single script running inside Clementine.
+
+An instance of this class is created as a global variable in a script's main
+package, similar to the Python global variables C{__name__} and C{__file__}.
+You can access it through C{script}:
+
+ >>> def show_settings_dialog():
+ ... pass
+ ...
+ ... script.SettingsDialogRequested().connect(show_settings_dialog())
+
+The signals in this object are emitted by Clementine when the user does things
+related to your script, such as clicking on the Settings... button. You should
+connect these signals to slots in your Python code and respond to them
+appropriately.
+
+@group Signals: SettingsDialogRequested
+%End
+
%ConvertToSubClassCode
// Any classes that inherit from QObject must be added to this list
@@ -49,11 +69,13 @@ class ScriptInterface : QObject {
}
%End
-public:
- void Abort();
-
signals:
void SettingsDialogRequested();
+%Docstring
+SettingsDialogRequested()
+Emitted when the user clicks the Settings... button in the Script Manager
+dialog.
+%End
private:
ScriptInterface();
diff --git a/src/scripting/python/song.sip b/src/scripting/python/song.sip
index e321b7057..930f7a35c 100644
--- a/src/scripting/python/song.sip
+++ b/src/scripting/python/song.sip
@@ -4,10 +4,94 @@ class Song {
#include "core/song.h"
%End
+%Docstring
+Contains metadata and information about a music file.
+
+Song objects are used throughout Clementine to represent music files and all the
+metadata that goes along with them. A Song contains several groups of
+functions:
+
+ - The B{constructor} functions L{Init()} and L{InitFromFile()} that are used
+ to quickly initialise the contents of a Song, either using the values you
+ provide or by reading the tags in a file on disk.
+ - The B{getters} such as L{title()} and L{artist()} that return the data
+ stored in a Song.
+ - The B{setters} such as L{set_title()} and L{set_artist()} that let you
+ change metadata in a Song. New metadata isn't written to the actual file
+ straight away, you have to call L{Save()} or L{BackgroundSave()} first.
+ - The B{pretty getters} such as L{PrettyTitleWithArtist()} that format the
+ Song's information in various useful ways.
+
+Integer fields in the song like L{track} and L{year} will be C{-1} if they
+don't have a value set.
+
+You can get a Song object for the currently playing track by using
+L{Player.GetCurrentItem()} and L{PlaylistItem.Metadata()}:
+
+ >>> song = clementine.player.GetCurrentItem().Metadata()
+ ... print song.title()
+
+Note that Song objects are dumb containers of information - changing the fields
+in one won't automatically change the information in Clementine's database or
+save the tags to the file. If you want to update information in the database
+such as album art, play count, skip count, rating or whether the song is in a
+compilation, use the methods in L{LibraryBackend}. If you want to save tags
+to a music file, use the L{Save()} or L{BackgroundSave()} methods in this class
+after modifying the relevant fields.
+
+Album art for songs in Clementine is split into three different fields -
+L{art_automatic()}, L{art_manual()} and L{image()}. L{art_automatic()} contains
+the art that was found automatically by the library scanner, for example a jpeg
+file in the same directory as the music file. L{art_manual()} contains the art
+that was set manually by the user - if it is present it always takes priority
+over L{art_automatic()}. These fields contain either a string with the filename
+or URL of an image file, or one of two special values - L{kManuallyUnsetCover}
+or L{kEmbeddedCover}. The convenience functions L{has_manually_unset_cover()}
+and L{has_embedded_cover()} check for these special values. L{image()} is a
+special field that is only currently used by radio services that want to
+display the radio station's logo and override the other two C{art_} fields.
+
+Some songs are marked as being in a compilation. These songs are shown in the
+special "Various Artists" section in the library. There are three different
+ways a song can be marked as being in a compilation. L{set_compilation()} is
+set by the library scanner when it finds two or more music files in the same
+directory with different artists. L{set_sampler()} is set by L{InitFromFile()}
+if the C{sampler} field in the ID3v2 metadata is present.
+L{set_forced_compilation_on()} and L{set_forced_compilation_off()} are set if
+the user chooses C{Show in various artists} from the right-click menu in the
+Library. The L{is_compilation()} function returns True if the song has been
+marked in any of these ways.
+
+@group Class methods: TextForFiletype
+@group Constructors: Init, InitFromFile
+@group Save methods: Save, BackgroundSave
+@group Simple getters: is_valid, id, title, album, artist, albumartist,
+ composer, track, disc, bpm, year, genre, comment, is_compilation, rating,
+ playcount, skipcount, lastplayed, score, cue_path, has_cue, beginning_nanosec,
+ end_nanosec, length_nanosec, bitrate, samplerate, directory_id, filename,
+ basefilename, mtime, ctime, filesize, filetype, art_automatic, art_manual,
+ has_manually_unset_cover, has_embedded_cover, image, IsEditable,
+ IsMetadataEqual
+@group Pretty getters: PrettyTitle, PrettyTitleWithArtist, PrettyLength,
+ PrettyYear, TitleWithCompilationArtist
+@group Simple setters: manually_unset_cover, set_embedded_cover, set_id,
+ set_valid, set_title, set_album, set_artist, set_albumartist, set_composer,
+ set_track, set_disc, set_bpm, set_year, set_genre, set_genre_id3,
+ set_comment, set_compilation, set_sampler, set_beginning_nanosec,
+ set_end_nanosec, set_length_nanosec, set_bitrate, set_samplerate, set_mtime,
+ set_ctime, set_filesize, set_filetype, set_art_automatic, set_art_manual,
+ set_image, set_forced_compilation_on, set_forced_compilation_off, set_rating,
+ set_playcount, set_skipcount, set_lastplayed, set_score, set_cue_path,
+ set_filename, set_basefilename, set_directory_id
+%End
+
public:
Song();
Song(const Song& other);
+ static const QString kManuallyUnsetCover;
+ static const QString kEmbeddedCover;
+
enum FileType {
Type_Unknown,
Type_Asf,
@@ -26,120 +110,567 @@ public:
};
static QString TextForFiletype(FileType type);
+%Docstring
+TextForFiletype(type) -> str
+Returns a textual description of one of the C{Type_} constants.
+
+Example:
+
+ >>> print clementine.Song.TextForFiletype(clementine.Song.Type_OggVorbis)
+ "Ogg Vorbis"
+%End
+
QString TextForFiletype() const;
- // Constructors
- void Init(const QString& title, const QString& artist, const QString& album, int length);
- void Init(const QString& title, const QString& artist, const QString& album, int beginning, int end);
- void InitFromFile(const QString& filename, int directory_id);
+ void Init(const QString& title, const QString& artist, const QString& album, qint64 length_nanosec);
+%Docstring
+Init(title, artist, album, length_nanosec)
+Sets the title, artist, album and length in the Song, and also marks it as
+valid.
+%End
+
+ void Init(const QString& title, const QString& artist, const QString& album, qint64 beginning, qint64 end);
+ void InitFromFile(const QString& filename, int directory_id);
+%Docstring
+InitFromFile(filename, directory_id)
+Loads tags from a music file on disk and marks the Song as valid if it was
+successful.
+
+@param directory_id: The ID of the directory containing this Song in the
+ L{LibraryBackend}. You can pass -1 to this function to indicate the file is
+ not in the library.
+%End
- // Simple accessors
bool is_valid() const;
+%Docstring
+is_valid() -> bool
+Flag used to indicate whether an L{InitFromFile()} call returned successfully.
+%End
+
int id() const;
+%Docstring
+id() -> int
+Identifier for this song in the L{LibraryBackend} - C{-1} if this song is not
+from the library.
+%End
QString title() const;
+%Docstring
+title() -> str
+%End
+
QString album() const;
+%Docstring
+album() -> str
+%End
+
QString artist() const;
+%Docstring
+artist() -> str
+%End
+
QString albumartist() const;
+%Docstring
+albumartist() -> str
+%End
+
QString composer() const;
+%Docstring
+composer() -> str
+%End
+
int track() const;
+%Docstring
+track() -> int
+%End
+
int disc() const;
+%Docstring
+disc() -> int
+%End
+
float bpm() const;
+%Docstring
+bpm() -> float
+%End
+
int year() const;
+%Docstring
+year() -> int
+%End
+
const QString& genre() const;
+%Docstring
+genre() -> str
+%End
+
const QString& comment() const;
+%Docstring
+comment() -> str
+%End
+
bool is_compilation() const;
+%Docstring
+is_compilation() -> bool
+%End
+
float rating() const;
+%Docstring
+rating() -> float
+The song's user-assigned rating between 0.0 and 1.0.
+%End
+
int playcount() const;
+%Docstring
+playcount() -> int
+Number of times this song has been played by Clementine.
+%End
+
int skipcount() const;
+%Docstring
+skipcount() -> int
+Number of times this song has been skipped by the user pressing Next.
+%End
+
int lastplayed() const;
+%Docstring
+lastplayed() -> int
+The time (in seconds since the epoch) this song was last played by Clementine.
+
+You can convert this time to a python C{datetime} object by using
+C{datetime.datetime.fromtimestamp()}.
+%End
+
int score() const;
+%Docstring
+score() -> int
+The automatically generated score assigned to this song based on the
+L{rating()}, L{playcount()} and L{skipcount()}.
+%End
const QString& cue_path() const;
+%Docstring
+cue_path() -> str
+If this song was loaded from a cuesheet then this contains the path to the
+cuesheet.
+
+@see: L{has_cue()}, L{beginning_nanosec()}, L{end_nanosec()}
+%End
+
bool has_cue() const;
+%Docstring
+has_cue() -> bool
+Whether this song was loaded as part of a cuesheet.
- int beginning_nanosec() const;
- int end_nanosec() const;
+@see: L{cue_path()}, L{beginning_nanosec()}, L{end_nanosec()}
+%End
- int length_nanosec() const;
+ qint64 beginning_nanosec() const;
+%Docstring
+beginning_nanosec() -> long
+The index in nanoseconds into the file where this song begins.
+
+This is normally 0 except when the song is part of a cuesheet.
+
+@see: L{has_cue()}, L{end_nanosec()}
+%End
+
+ qint64 end_nanosec() const;
+%Docstring
+end_nanosec() -> long
+The index in nanoseconds into the file where this song ends.
+
+This is normally 0 except when the song is part of a cuesheet.
+
+@see: L{has_cue()}, L{beginning_nanosec()}
+%End
+
+ qint64 length_nanosec() const;
+%Docstring
+length_nanosec() -> long
+The length of the song in nanoseconds.
+%End
int bitrate() const;
+%Docstring
+bitrate() -> int
+%End
+
int samplerate() const;
+%Docstring
+samplerate() -> int
+%End
int directory_id() const;
+%Docstring
+directory_id() -> int
+The ID in the L{LibraryBackend} of the directory containing this song, or -1 if
+the song is not from the library.
+%End
+
const QString& filename() const;
+%Docstring
+filename() -> str
+The filename I{or URL} of this song.
+%End
+
const QString& basefilename() const;
+%Docstring
+basefilename() -> str
+The filename of this song without any directory component.
+%End
+
uint mtime() const;
+%Docstring
+mtime() -> int
+The time in seconds since the epoch that this song was modified.
+
+You can convert this time to a python C{datetime} object by using
+C{datetime.datetime.fromtimestamp()}.
+
+@see: L{ctime()}
+%End
+
uint ctime() const;
+%Docstring
+ctime() -> int
+The time in seconds since the epoch that this song was created.
+
+You can convert this time to a python C{datetime} object by using
+C{datetime.datetime.fromtimestamp()}.
+
+@see: L{mtime()}
+%End
+
int filesize() const;
+%Docstring
+filesize() -> int
+The size of this file in bytes.
+%End
+
FileType filetype() const;
+%Docstring
+filetype() -> FileType
+The type of media file.
+
+@see: L{TextForFiletype}
+%End
QString art_automatic() const;
+%Docstring
+art_automatic() -> str
+The filename or URL of automatically discovered album art, or one of the special
+values L{kManuallyUnsetCover} or L{kEmbeddedCover}.
+
+@see: L{art_manual()}, L{has_manually_unset_cover()}, L{has_embedded_cover()}
+%End
+
QString art_manual() const;
+%Docstring
+art_manual() -> str
+The filename or URL of album art set by the user, or one of the special
+values L{kManuallyUnsetCover} or L{kEmbeddedCover}.
+
+@see: L{art_automatic()}, L{has_manually_unset_cover()}, L{has_embedded_cover()}
+%End
bool has_manually_unset_cover() const;
+%Docstring
+has_manually_unset_cover() -> bool
+Returns True if the album art has been manually unset by the user.
+
+@see: L{art_manual()}, L{manually_unset_cover()}
+%End
+
void manually_unset_cover();
+%Docstring
+manually_unset_cover()
+Marks this song as having a manually unset album cover.
+
+@see: L{art_manual()}, L{has_manually_unset_cover()}
+%End
bool has_embedded_cover() const;
+%Docstring
+has_embedded_cover() -> bool
+Returns True if the album art is embedded within the file.
+
+@see: L{art_automatic()}, L{set_embedded_cover()}
+%End
+
void set_embedded_cover();
+%Docstring
+set_embedded_cover()
+Marks this song as having album art contained within it.
+
+@see: L{art_automatic()}, L{has_embedded_cover()}
+%End
QImage image() const;
+%Docstring
+image() -> L{PyQt4.QtGui.QImage}
+An album art image that overrides L{art_automatic()} and L{art_manual()}.
+%End
// Pretty accessors
QString PrettyTitle() const;
+%Docstring
+PrettyTitle() -> str
+Returns the title of this song if it is set, or else returns the filename.
+%End
+
QString PrettyTitleWithArtist() const;
+%Docstring
+PrettyTitleWithArtist() -> str
+Returns "artist - title" if both are set, otherwise returns L{PrettyTitle()}.
+%End
+
QString PrettyLength() const;
+%Docstring
+PrettyLength() -> str
+Returns the length of the song formatted as "(hh:)mm:ss".
+%End
+
QString PrettyYear() const;
+%Docstring
+PrettyYear() -> str
+Returns the year if it is set, otherwise returns "".
+%End
QString TitleWithCompilationArtist() const;
+%Docstring
+TitleWithCompilationArtist() -> str
+If this song is part of a compilation B{and} the artist is B{not} "Various
+Artists", returns L{PrettyTitleWithArtist()}, otherwise returns L{PrettyTitle()}.
+%End
// Setters
bool IsEditable() const;
+%Docstring
+IsEditable() -> bool
+Returns True if this song is backed by a local file that is writable and is not
+part of a cue sheet.
+%End
+
bool Save() const;
+%Docstring
+Save() -> bool
+Saves the metadata to the file and returns True if it was successful.
+
+@warning: This method is B{blocking} and should not be called from the main
+ thread. Use the L{BackgroundSave()} method instead which works in a
+ background thread.
+%End
+
void BackgroundSave() const;
+%Docstring
+BackgroundSave()
+Saves the metadata to the file in a background thread and returns immediately.
+%End
void set_id(int id);
+%Docstring
+set_id(id)
+%End
+
void set_valid(bool v);
+%Docstring
+set_valid(valid)
+%End
+
void set_title(const QString& v);
+%Docstring
+set_title(title)
+%End
+
void set_album(const QString& v);
- void set_artist(const QString& v);
- void set_albumartist(const QString& v);
- void set_composer(const QString& v);
- void set_track(int v);
- void set_disc(int v);
- void set_bpm(float v);
- void set_year(int v);
- void set_genre(const QString& v);
- void set_genre(int id);
- void set_comment(const QString& v);
- void set_compilation(bool v);
- void set_sampler(bool v);
- void set_beginning_nanosec(int v);
- void set_end_nanosec(int v);
- void set_length_nanosec(int v);
- void set_bitrate(int v);
- void set_samplerate(int v);
- void set_mtime(int v);
- void set_ctime(int v);
- void set_filesize(int v);
- void set_filetype(FileType v);
- void set_art_automatic(const QString& v);
- void set_art_manual(const QString& v);
- void set_image(const QImage& i);
- void set_forced_compilation_on(bool v);
- void set_forced_compilation_off(bool v);
- void set_rating(float v);
- void set_playcount(int v);
- void set_skipcount(int v);
- void set_lastplayed(int v);
- void set_score(int v);
- void set_filename(const QString& v);
- void set_basefilename(const QString& v);
- void set_directory_id(int v);
- void set_cue_path(const QString& v);
+%Docstring
+set_album(album)
+%End
+
+ void set_artist(const QString& v);
+%Docstring
+set_artist(artist)
+%End
+
+ void set_albumartist(const QString& v);
+%Docstring
+set_albumartist(albumartist)
+%End
+
+ void set_composer(const QString& v);
+%Docstring
+set_composer(composer)
+%End
+
+ void set_track(int v);
+%Docstring
+set_track(track)
+%End
+
+ void set_disc(int v);
+%Docstring
+set_disc(disc)
+%End
+
+ void set_bpm(float v);
+%Docstring
+set_bpm(bpm)
+%End
+
+ void set_year(int v);
+%Docstring
+set_year(year)
+%End
+
+ void set_genre(const QString& v);
+%Docstring
+set_genre(genre)
+%End
+
+ void set_genre_id3(int id);
+%Docstring
+set_genre_id3(id)
+Sets the genre from an ID3v1 genre ID. See
+U{Appendix A of the ID3v1 specification}.
+%End
+
+ void set_comment(const QString& v);
+%Docstring
+set_comment(comment)
+%End
+
+ void set_compilation(bool v);
+%Docstring
+set_compilation(compilation)
+%End
+
+ void set_sampler(bool v);
+%Docstring
+set_sampler(sampler)
+%End
+
+ void set_beginning_nanosec(qint64 v);
+%Docstring
+set_beginning_nanosec(nanosec)
+%End
+
+ void set_end_nanosec(qint64 v);
+%Docstring
+set_end_nanosec(nanosec)
+%End
+
+ void set_length_nanosec(qint64 v);
+%Docstring
+set_length_nanosec(nanosec)
+%End
+
+ void set_bitrate(int v);
+%Docstring
+set_bitrate(bitrate)
+%End
+
+ void set_samplerate(int v);
+%Docstring
+set_samplerate(samplerate)
+%End
+
+ void set_mtime(int v);
+%Docstring
+set_mtime(mtime)
+%End
+
+ void set_ctime(int v);
+%Docstring
+set_ctime(ctime)
+%End
+
+ void set_filesize(int v);
+%Docstring
+set_filesize(size)
+%End
+
+ void set_filetype(FileType v);
+%Docstring
+set_filetype(type)
+%End
+
+ void set_art_automatic(const QString& v);
+%Docstring
+set_art_automatic(art)
+%End
+
+ void set_art_manual(const QString& v);
+%Docstring
+set_art_manual(art)
+%End
+
+ void set_image(const QImage& i);
+%Docstring
+set_image(image)
+%End
+
+ void set_forced_compilation_on(bool v);
+%Docstring
+set_forced_compilation_on(compilation)
+%End
+
+ void set_forced_compilation_off(bool v);
+%Docstring
+set_forced_compilation_off(compilation)
+%End
+
+ void set_rating(float v);
+%Docstring
+set_rating(rating)
+%End
+
+ void set_playcount(int v);
+%Docstring
+set_playcount(playcount)
+%End
+
+ void set_skipcount(int v);
+%Docstring
+set_skipcount(skipcount)
+%End
+
+ void set_lastplayed(int v);
+%Docstring
+set_lastplayed(lastplayed)
+%End
+
+ void set_score(int v);
+%Docstring
+set_score(score)
+%End
+
+ void set_filename(const QString& v);
+%Docstring
+set_filename(filename)
+%End
+
+ void set_basefilename(const QString& v);
+%Docstring
+set_basefilename(basefilename)
+%End
+
+ void set_directory_id(int v);
+%Docstring
+set_directory_id(directory_id)
+%End
+
+ void set_cue_path(const QString& v);
+%Docstring
+set_cue_path(cue_path)
+%End
- // Comparison functions
bool IsMetadataEqual(const Song& other) const;
+%Docstring
+IsMetadataEqual(other) -> bool
+Compares the metadata (not including ratings, playcounts, etc) with another
+Song and returns true if they are equal.
+%End
};
typedef QList SongList;
diff --git a/src/scripting/scriptinterface.cpp b/src/scripting/scriptinterface.cpp
index cd41a5ab0..8dd90d6ef 100644
--- a/src/scripting/scriptinterface.cpp
+++ b/src/scripting/scriptinterface.cpp
@@ -27,10 +27,6 @@ ScriptInterface::ScriptInterface(Script* script, QObject* parent)
{
}
-void ScriptInterface::Abort() {
- abort();
-}
-
void ScriptInterface::ShowSettingsDialog() {
emit SettingsDialogRequested();
}
diff --git a/src/scripting/scriptinterface.h b/src/scripting/scriptinterface.h
index 12ab65941..b248c0e5f 100644
--- a/src/scripting/scriptinterface.h
+++ b/src/scripting/scriptinterface.h
@@ -31,9 +31,6 @@ class ScriptInterface : public QObject {
public:
ScriptInterface(Script* script, QObject* parent = 0);
- // Gdb will break here
- void Abort();
-
public slots:
// Callable by C++
void ShowSettingsDialog();