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();