[packages/libechonest] - patch for C++17 compatibility; release 2

qboosh qboosh at pld-linux.org
Sat Oct 4 12:45:01 CEST 2025


commit c255966616fcfecfe0726fcbd1e793f776a1ae53
Author: Jakub Bogusz <qboosh at pld-linux.org>
Date:   Sat Oct 4 12:48:11 2025 +0200

    - patch for C++17 compatibility; release 2

 libechonest-throw.patch | 1063 +++++++++++++++++++++++++++++++++++++++++++++++
 libechonest.spec        |   20 +-
 2 files changed, 1072 insertions(+), 11 deletions(-)
---
diff --git a/libechonest.spec b/libechonest.spec
index 523211e..a6069ed 100644
--- a/libechonest.spec
+++ b/libechonest.spec
@@ -8,12 +8,13 @@ Summary:	C++/Qt4 wrapper for the Echo Nest API
 Summary(pl.UTF-8):	Obudowanie C++/Qt4 dla API Echo Nest
 Name:		libechonest
 Version:	2.3.1
-Release:	1
+Release:	2
 License:	GPL v2+
 Group:		Libraries
 Source0:	http://files.lfranchi.com/%{name}-%{version}.tar.bz2
 # Source0-md5:	d8c60545b056145dc66882971a0acf9c
-URL:		https://projects.kde.org/projects/playground/libs/libechonest
+Patch0:		%{name}-throw.patch
+URL:		https://invent.kde.org/unmaintained/libechonest
 BuildRequires:	cmake >= 2.6
 BuildRequires:	libstdc++-devel
 BuildRequires:	pkgconfig
@@ -35,11 +36,6 @@ BuildRequires:	qt5-qmake >= 5
 BuildRequires:	rpmbuild(macros) >= 1.605
 BuildRoot:	%{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
-# Unresolved symbol __stack_chk_fail in libechonest.so.2.1.0
-%ifarch i486
-%define	skip_post_check_so	libechonest.so.%{version}
-%endif
-
 %description
 libechonest is a collection of Qt4 classes designed to make a
 developer's life easy when trying to use the APIs provided by The Echo
@@ -97,6 +93,7 @@ wykorzystujących bibliotekę libechonest5.
 
 %prep
 %setup -q
+%patch -P0 -p1
 
 %build
 %if %{with qt4}
@@ -135,6 +132,7 @@ test "$(pkg-config --modversion libechonest5)" = "%{version}"
 
 %install
 rm -rf $RPM_BUILD_ROOT
+
 %if %{with qt4}
 %{__make} -C build-qt4 install/fast \
 	DESTDIR=$RPM_BUILD_ROOT
@@ -160,11 +158,11 @@ rm -rf $RPM_BUILD_ROOT
 %doc AUTHORS README TODO
 %attr(755,root,root) %{_libdir}/libechonest.so.*.*.*
 # yes, SONAME is "libechonest.so.2.3"
-%attr(755,root,root) %ghost %{_libdir}/libechonest.so.2.3
+%ghost %{_libdir}/libechonest.so.2.3
 
 %files devel
 %defattr(644,root,root,755)
-%attr(755,root,root) %{_libdir}/libechonest.so
+%{_libdir}/libechonest.so
 %{_includedir}/echonest
 %{_pkgconfigdir}/libechonest.pc
 %endif
@@ -175,11 +173,11 @@ rm -rf $RPM_BUILD_ROOT
 %doc AUTHORS README TODO
 %attr(755,root,root) %{_libdir}/libechonest5.so.*.*.*
 # yes, SONAME is "libechonest5.so.2.3"
-%attr(755,root,root) %ghost %{_libdir}/libechonest5.so.2.3
+%ghost %{_libdir}/libechonest5.so.2.3
 
 %files -n libechonest-qt5-devel
 %defattr(644,root,root,755)
-%attr(755,root,root) %{_libdir}/libechonest5.so
+%{_libdir}/libechonest5.so
 %{_includedir}/echonest5
 %{_pkgconfigdir}/libechonest5.pc
 %endif
diff --git a/libechonest-throw.patch b/libechonest-throw.patch
new file mode 100644
index 0000000..390dfd4
--- /dev/null
+++ b/libechonest-throw.patch
@@ -0,0 +1,1063 @@
+--- libechonest-2.3.1/src/Parsing_p.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Parsing_p.h	2025-10-04 12:15:09.872545373 +0200
+@@ -37,92 +37,92 @@ namespace Parser
+     * Internal helper parsing functions for QXmlStreamParser
+     */
+ 
+-    void checkForErrors( QNetworkReply* reply ) throw( ParseError );
++    void checkForErrors( QNetworkReply* reply );
+ 
+     // read the start element and then the status element, throwing
+     //  if the result code is not Success
+-    void readStatus( QXmlStreamReader& xml ) throw( ParseError );
++    void readStatus( QXmlStreamReader& xml );
+ 
+     // parses a <songs></songs> block and turns them into a list of Song object
+-    QVector< Song > parseSongList( QXmlStreamReader& xml ) throw( ParseError );
++    QVector< Song > parseSongList( QXmlStreamReader& xml );
+ 
+     // parses a <song></song> block
+-    Song parseSong( QXmlStreamReader& xml ) throw( ParseError );
++    Song parseSong( QXmlStreamReader& xml );
+ 
+     // parses a <artist_location> block
+-    ArtistLocation parseSongArtistLocation( QXmlStreamReader& xml ) throw( ParseError );
++    ArtistLocation parseSongArtistLocation( QXmlStreamReader& xml );
+ 
+     // parses a <track></track> block
+-    Track parseTrack( QXmlStreamReader& xml ) throw( ParseError );
++    Track parseTrack( QXmlStreamReader& xml );
+ 
+     // parses a <tracks> chunk when asking for a song with tracks bucket
+-    Tracks parseSongTrackBucket( QXmlStreamReader& xml ) throw( ParseError );
++    Tracks parseSongTrackBucket( QXmlStreamReader& xml );
+ 
+     // parses an <audio_summary> chunk
+-    AudioSummary parseAudioSummary( QXmlStreamReader& xml ) throw( ParseError );
++    AudioSummary parseAudioSummary( QXmlStreamReader& xml );
+     // parses the json of the detailed audio summary
+-    void parseDetailedAudioSummary( QNetworkReply* reply, AudioSummary& summary ) throw( ParseError );
++    void parseDetailedAudioSummary( QNetworkReply* reply, AudioSummary& summary );
+ 
+     // parses a list of artists in an <artists></artists> block
+-    Echonest::Artists parseArtists( QXmlStreamReader& xml ) throw( ParseError );
++    Echonest::Artists parseArtists( QXmlStreamReader& xml );
+ 
+     // parses the contents of an artist fetch result, expects to be positioned after the readStatus() call
+     // it could be a profile query, in which case it has a bunch of different artist attributes
+     // or it could be a single fetch, in which case it starts with result number and offset.
+     // the results are saved back into the artist
+-    int parseArtistInfoOrProfile( QXmlStreamReader&, Echonest::Artist& artist ) throw( ParseError );
++    int parseArtistInfoOrProfile( QXmlStreamReader&, Echonest::Artist& artist );
+ 
+     // parse the individual artist attributes
+-    void parseArtistInfo( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
++    void parseArtistInfo( QXmlStreamReader& xml, Echonest::Artist& artist );
+ 
+     // parse each type of artist attribute
+-    void parseAudio( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseBiographies( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseImages( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseNewsOrBlogs( QXmlStreamReader& xml, Echonest::Artist& artist, bool news = true ) throw( ParseError );
+-    void parseReviews( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseTerms( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseUrls( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseArtistSong( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseVideos( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseForeignArtistIds( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
+-    void parseArtistGenres( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( ParseError );
++    void parseAudio( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseBiographies( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseImages( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseNewsOrBlogs( QXmlStreamReader& xml, Echonest::Artist& artist, bool news = true );
++    void parseReviews( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseTerms( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseUrls( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseArtistSong( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseVideos( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseForeignArtistIds( QXmlStreamReader& xml, Echonest::Artist& artist );
++    void parseArtistGenres( QXmlStreamReader& xml, Echonest::Artist& artist );
+ 
+     // parse a list of terms
+-    TermList parseTopTermList( QXmlStreamReader& xml ) throw( ParseError );
+-    QVector< QString > parseTermList( QXmlStreamReader& xml ) throw( ParseError );
++    TermList parseTopTermList( QXmlStreamReader& xml );
++    QVector< QString > parseTermList( QXmlStreamReader& xml );
+ 
+     //parse a list of genres
+-    QVector< QString > parseGenreListStrings( QXmlStreamReader& xml ) throw( ParseError );
++    QVector< QString > parseGenreListStrings( QXmlStreamReader& xml );
+ 
+-    Echonest::Genres parseGenres( QXmlStreamReader& xml ) throw( ParseError );
+-    Echonest::Genre parseGenre( QXmlStreamReader& xml ) throw( ParseError );
++    Echonest::Genres parseGenres( QXmlStreamReader& xml );
++    Echonest::Genre parseGenre( QXmlStreamReader& xml );
+ 
+-    Artists parseArtistSuggestList( QXmlStreamReader& xml ) throw( ParseError );
++    Artists parseArtistSuggestList( QXmlStreamReader& xml );
+ 
+-    License parseLicense( QXmlStreamReader& xml ) throw( ParseError );
++    License parseLicense( QXmlStreamReader& xml );
+ 
+-    QByteArray parsePlaylistSessionId( QXmlStreamReader& xml ) throw( ParseError );
+-    SongList parseDynamicLookahead( QXmlStreamReader& xml ) throw( ParseError );
++    QByteArray parsePlaylistSessionId( QXmlStreamReader& xml );
++    SongList parseDynamicLookahead( QXmlStreamReader& xml );
+ 
+     // Catalog functions
+-    Catalogs parseCatalogList( QXmlStreamReader& xml ) throw( ParseError );
+-    Catalog parseCatalog( QXmlStreamReader& xml, bool justOne = false /* the catalog API is ugly :( */ ) throw( ParseError );
+-    QList<CatalogItem*> parseCatalogItems( QXmlStreamReader& xml ) throw( ParseError );
+-    void parseCatalogRequestItem( QXmlStreamReader& xml, Echonest::CatalogArtist&, Echonest::CatalogSong& ) throw( ParseError );
++    Catalogs parseCatalogList( QXmlStreamReader& xml );
++    Catalog parseCatalog( QXmlStreamReader& xml, bool justOne = false /* the catalog API is ugly :( */ );
++    QList<CatalogItem*> parseCatalogItems( QXmlStreamReader& xml );
++    void parseCatalogRequestItem( QXmlStreamReader& xml, Echonest::CatalogArtist&, Echonest::CatalogSong& );
+     void saveArtistList( Catalog& catalog, QList<CatalogItem*>& );
+     void saveSongList( Catalog& catalog, QList<CatalogItem*>& );
+-    Echonest::CatalogStatus parseCatalogStatus( QXmlStreamReader& xml ) throw( ParseError );
+-    Echonest::CatalogStatusItem parseTicketUpdateInfo( QXmlStreamReader& xml ) throw( ParseError );
+-    QByteArray parseCatalogTicket( QXmlStreamReader& xml ) throw( ParseError );
+-    Catalog parseNewCatalog( QXmlStreamReader& xml ) throw( ParseError );
++    Echonest::CatalogStatus parseCatalogStatus( QXmlStreamReader& xml );
++    Echonest::CatalogStatusItem parseTicketUpdateInfo( QXmlStreamReader& xml );
++    QByteArray parseCatalogTicket( QXmlStreamReader& xml );
++    Catalog parseNewCatalog( QXmlStreamReader& xml );
+ 
+     // parses a <tracks> chunk when asking for a song with tracks bucket in a catalog.read call
+-    Tracks parseCatalogSongTracks( QXmlStreamReader& xml ) throw( ParseError );
++    Tracks parseCatalogSongTracks( QXmlStreamReader& xml );
+ 
+-    SessionInfo parseSessionInfo( QXmlStreamReader& xml ) throw( ParseError );
+-    QVector< QString > parseRulesList( QXmlStreamReader& xml ) throw( ParseError );
+-//     QVector< SessionItem > parseSessionSongItem( QXmlStreamReader& xml, const QString& type ) throw( ParseError );
++    SessionInfo parseSessionInfo( QXmlStreamReader& xml );
++    QVector< QString > parseRulesList( QXmlStreamReader& xml );
++//     QVector< SessionItem > parseSessionSongItem( QXmlStreamReader& xml, const QString& type );
+ 
+ }
+ }
+--- libechonest-2.3.1/src/AudioSummary.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/AudioSummary.h	2025-10-04 12:17:37.748410927 +0200
+@@ -136,7 +136,7 @@ namespace Echonest{
+          *  information such as mode, fadein/fadeout, confidence metrics, 
+          *  and the division of the song into bars, beats, sections, and segments.
+          */
+-        void parseFullAnalysis( QNetworkReply* reply ) throw( ParseError );
++        void parseFullAnalysis( QNetworkReply* reply );
+         
+         /// The following methods *ALL REQUIRE THAT parseFullAnalysis be called first*
+         
+--- libechonest-2.3.1/src/Track.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Track.h	2025-10-04 12:17:54.474986978 +0200
+@@ -213,7 +213,7 @@ public:
+    * Call this function after the QNetworkReply* object returned
+    *  from the parse*, upload*, and analyze* emits its finished() signal
+    */
+-  static Track parseProfile( QNetworkReply* ) throw( ParseError );
++  static Track parseProfile( QNetworkReply* );
+     
+ private:
+     
+--- libechonest-2.3.1/src/Song.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Song.h	2025-10-04 12:18:06.114923920 +0200
+@@ -226,19 +226,19 @@ public:
+    * Parses the reply of the identify call and returns a list of songs found.
+    *
+    */
+-  static QVector< Song > parseIdentify( QNetworkReply* ) throw( ParseError );
++  static QVector< Song > parseIdentify( QNetworkReply* );
+ 
+   /**
+    * Parse the result of the fetchInformation() call.
+    * For each requested SongInformationFlag in the original request, the respective
+    *  data will be saved to this Song object.
+    */
+-  void parseInformation( QNetworkReply* reply ) throw( ParseError );
++  void parseInformation( QNetworkReply* reply );
+ 
+   /**
+    * Parse the result of the search() call.
+    */
+-  static QVector<Song> parseSearch( QNetworkReply* reply ) throw( ParseError );
++  static QVector<Song> parseSearch( QNetworkReply* reply );
+ 
+   QString toString() const;
+ 
+--- libechonest-2.3.1/src/Artist.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Artist.h	2025-10-04 12:18:37.501420551 +0200
+@@ -300,7 +300,7 @@ namespace Echonest{
+          *
+          * @return The number of results available on the server.
+          */
+-        int parseProfile( QNetworkReply* ) throw( ParseError );
++        int parseProfile( QNetworkReply* );
+ 
+         /**
+          * Fetch a list of similar artists given one or more artists for comparison.
+@@ -368,40 +368,40 @@ namespace Echonest{
+          * Parse the result of a fetchSimilar() call, which returns a list of artists similar to the
+          *  original pair.
+          */
+-        static Artists parseSimilar( QNetworkReply* ) throw( ParseError );
++        static Artists parseSimilar( QNetworkReply* );
+ 
+         /**
+          * Parse the result of an artist search.
+          */
+-        static Artists parseSearch( QNetworkReply* ) throw( ParseError );
++        static Artists parseSearch( QNetworkReply* );
+ 
+         /**
+          * Parse the result of a top hottness query.
+          */
+-        static Artists parseTopHottt( QNetworkReply* ) throw( ParseError );
++        static Artists parseTopHottt( QNetworkReply* );
+ 
+         /**
+          * Parse the result of a top terms query.
+          */
+-        static TermList parseTopTerms( QNetworkReply* ) throw( ParseError );
++        static TermList parseTopTerms( QNetworkReply* );
+ 
+         /**
+          * Parse the result of a suggest query
+          *
+          * Returns a list of suggested artists
+          */
+-        static Artists parseSuggest( QNetworkReply* ) throw( ParseError );
++        static Artists parseSuggest( QNetworkReply* );
+ 
+         /**
+          * Parse the result of a termList query. Returns the list of terms delivered.
+          */
+-        static QVector< QString > parseTermList( QNetworkReply* ) throw( ParseError );
++        static QVector< QString > parseTermList( QNetworkReply* );
+ 
+         /**
+          * @Deprecated
+          * Parse the result of a genres query. Returns the list of genres delivered.
+          */
+-        static QVector< QString > parseGenreList( QNetworkReply* ) throw ( ParseError );
++        static QVector< QString > parseGenreList( QNetworkReply* );
+ 
+     private:
+         QUrl setupQuery( const QByteArray& methodName, int numResults = 0, int start = -1 ) const;
+--- libechonest-2.3.1/src/Catalog.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Catalog.h	2025-10-04 12:19:11.964567181 +0200
+@@ -173,17 +173,17 @@ public:
+      * Parses the result of a status call, returning the status information along with information on
+      *  item resolution if available.
+      */
+-    static CatalogStatus parseStatus( QNetworkReply* ) throw( Echonest::ParseError );
++    static CatalogStatus parseStatus( QNetworkReply* );
+     
+     /**
+      * Parses the result of a profile() call. Saves the data to this catalog object.
+      */
+-    void parseProfile( QNetworkReply* ) throw( Echonest::ParseError );
++    void parseProfile( QNetworkReply* );
+     
+     /**
+      * Parses the result of the read*Catalog() calls. Saves the catalog data to this object.
+      */
+-    void parseRead( QNetworkReply * ) throw( Echonest::ParseError );
++    void parseRead( QNetworkReply * );
+     
+     /**
+      * Parse the result of a delete call. Will throw if the catalog was not successfully deleted,
+@@ -191,24 +191,24 @@ public:
+      * 
+      * \return QPair of catalogName, catalogId that was just deleted.
+      */
+-    QPair< QString, QByteArray > parseDelete( QNetworkReply* ) throw( Echonest::ParseError );
++    QPair< QString, QByteArray > parseDelete( QNetworkReply* );
+     
+     /**
+      * Parse the result of the list() API call. Will return a list of catalogs---each catalog only
+      *  has id, name, type, and total tracks information.
+      */
+-    static Catalogs parseList( QNetworkReply* ) throw( Echonest::ParseError );
++    static Catalogs parseList( QNetworkReply* );
+     
+     /**
+      * Parse the result of a catalog call. The calls return a ticket that can be used to check the status
+      *  of the call with status()
+      */
+-    static QByteArray parseTicket( QNetworkReply* ) throw( Echonest::ParseError );
++    static QByteArray parseTicket( QNetworkReply* );
+     
+     /**
+      * Parse the result of a create() call.
+      */
+-    static Catalog parseCreate( QNetworkReply* reply ) throw( Echonest::ParseError );
++    static Catalog parseCreate( QNetworkReply* reply );
+ private:
+     static QNetworkReply* updatePrivate( QUrl&, const CatalogUpdateEntries& entries );
+     QNetworkReply* readPrivate( QUrl& url, int results, int start ) const;
+--- libechonest-2.3.1/src/Playlist.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Playlist.h	2025-10-04 12:21:57.833668592 +0200
+@@ -247,7 +247,7 @@ namespace Echonest{
+          *   to extract session information
+          */
+         QNetworkReply* create( const PlaylistParams& params ) const;
+-        void parseCreate( QNetworkReply* ) throw( ParseError );
++        void parseCreate( QNetworkReply* );
+ 
+         /**
+          * Retart a dynamic playlist with the given parameters.
+@@ -289,7 +289,7 @@ namespace Echonest{
+          * the "next" list and the "lookahead" list. Consult the \ref next() docs
+          * and The Echo Nest documentation for more information.
+          */
+-        FetchPair parseNext( QNetworkReply* reply ) throw( ParseError );
++        FetchPair parseNext( QNetworkReply* reply );
+ 
+         /**
+          * Returns feedback to The Echo Nest for the currently playing dynamic
+@@ -306,7 +306,7 @@ namespace Echonest{
+          *
+          * Will throw an exception if the return code is not successful (as other parse methods do).
+          */
+-        void parseFeedback(QNetworkReply* reply) const throw( ParseError );
++        void parseFeedback(QNetworkReply* reply) const;
+ 
+         /**
+          * Modifies the upcoming tracks in this dynamic playlist session by steering it.
+@@ -322,13 +322,13 @@ namespace Echonest{
+          *
+          * Will throw an exception if the return code is not successful (as other parse methods do).
+          */
+-        void parseSteer(QNetworkReply* reply) const throw( ParseError );
++        void parseSteer(QNetworkReply* reply) const;
+ 
+         /**
+          * Returns a description of this dynamic playlist session
+          */
+         QNetworkReply* fetchInfo() const;
+-        SessionInfo parseInfo( QNetworkReply* reply ) throw( ParseError );
++        SessionInfo parseInfo( QNetworkReply* reply );
+ 
+         /**
+          * Deletes a currently active playlist session. A non-commercial API can have, at most 1,000 active playlist sessions.
+@@ -341,12 +341,12 @@ namespace Echonest{
+          *  you pass format=xspf to \c staticPlaylist().
+          */
+         static QNetworkReply* staticPlaylist( const PlaylistParams& params );
+-        static SongList parseStaticPlaylist( QNetworkReply* reply ) throw( ParseError );
++        static SongList parseStaticPlaylist( QNetworkReply* reply );
+ 
+         /**
+          * Parse an xspf playlist. Returns the full xspf content with no modifications.
+          */
+-        static QByteArray parseXSPFPlaylist( QNetworkReply* reply ) throw( ParseError );
++        static QByteArray parseXSPFPlaylist( QNetworkReply* reply );
+ 
+     private:
+         static QByteArray playlistParamToString( PlaylistParam param );
+--- libechonest-2.3.1/src/Genre.h.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Genre.h	2025-10-04 12:22:26.896844476 +0200
+@@ -63,11 +63,11 @@ namespace Echonest{
+         static QNetworkReply* fetchList( GenreInformation information = GenreInformation(), int numResults = 0 );
+         static QNetworkReply* fetchSearch( const QString& name, GenreInformation information = GenreInformation(), int numResults = 0, int start = -1 );
+ 
+-        static Artists parseArtists( QNetworkReply* ) throw( ParseError );
+-        static Genres parseSimilar( QNetworkReply* ) throw( ParseError );
+-        static Genres parseProfile( QNetworkReply* ) throw( ParseError );
+-        static Genres parseList( QNetworkReply* ) throw( ParseError );
+-        static Genres parseSearch( QNetworkReply* ) throw( ParseError );
++        static Artists parseArtists( QNetworkReply* );
++        static Genres parseSimilar( QNetworkReply* );
++        static Genres parseProfile( QNetworkReply* );
++        static Genres parseList( QNetworkReply* );
++        static Genres parseSearch( QNetworkReply* );
+     private:
+         static QUrl setupStaticQuery( const QByteArray& methodName, int numResults = 0, int start = -1 );
+         QUrl setupQuery( const QByteArray& methodName, int numResults = 0, int start = -1 ) const;
+--- libechonest-2.3.1/src/Song.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Song.cpp	2025-10-04 12:25:50.772406654 +0200
+@@ -247,7 +247,7 @@ QNetworkReply* Echonest::Song::identify(
+     return Echonest::Config::instance()->nam()->post( request, data );
+ }
+ 
+-Echonest::SongList Echonest::Song::parseIdentify( QNetworkReply* reply ) throw( ParseError )
++Echonest::SongList Echonest::Song::parseIdentify( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -287,7 +287,7 @@ Echonest::SongList Echonest::Song::parse
+ 
+ 
+ 
+-void Echonest::Song::parseInformation( QNetworkReply* reply ) throw( ParseError )
++void Echonest::Song::parseInformation( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -313,7 +313,7 @@ void Echonest::Song::parseInformation( Q
+ 
+ }
+ 
+-QVector< Echonest::Song > Echonest::Song::parseSearch( QNetworkReply* reply ) throw( ParseError )
++QVector< Echonest::Song > Echonest::Song::parseSearch( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+--- libechonest-2.3.1/src/Track.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Track.cpp	2025-10-04 12:26:13.875614827 +0200
+@@ -292,7 +292,7 @@ QNetworkReply* Echonest::Track::analyzeT
+ //     return Echonest::Config::instance()->nam()->post( QNetworkRequest( url ), QByteArray() );
+ }
+ 
+-Echonest::Track Echonest::Track::parseProfile( QNetworkReply* finishedReply ) throw( Echonest::ParseError )
++Echonest::Track Echonest::Track::parseProfile( QNetworkReply* finishedReply )
+ {
+     QByteArray data = finishedReply->readAll();
+     qDebug() << data;
+--- libechonest-2.3.1/src/Artist.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Artist.cpp	2025-10-04 12:32:59.653416540 +0200
+@@ -499,7 +499,7 @@ QNetworkReply* Echonest::Artist::suggest
+ }
+ 
+ 
+-int Echonest::Artist::parseProfile( QNetworkReply* reply ) throw( Echonest::ParseError )
++int Echonest::Artist::parseProfile( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -513,7 +513,7 @@ int Echonest::Artist::parseProfile( QNet
+     return numResults;
+ }
+ 
+-Echonest::Artists Echonest::Artist::parseSearch( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Artist::parseSearch( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -528,17 +528,17 @@ Echonest::Artists Echonest::Artist::pars
+     return artists;
+ }
+ 
+-Echonest::Artists Echonest::Artist::parseSimilar( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Artist::parseSimilar( QNetworkReply* reply )
+ {
+     return parseSearch( reply );
+ }
+ 
+-Echonest::Artists Echonest::Artist::parseTopHottt( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Artist::parseTopHottt( QNetworkReply* reply )
+ {
+     return parseSearch( reply );
+ }
+ 
+-Echonest::TermList Echonest::Artist::parseTopTerms( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::TermList Echonest::Artist::parseTopTerms( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -552,7 +552,7 @@ Echonest::TermList Echonest::Artist::par
+     return terms;
+ }
+ 
+-Echonest::Artists Echonest::Artist::parseSuggest( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Artist::parseSuggest( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -566,7 +566,7 @@ Echonest::Artists Echonest::Artist::pars
+     return artists;
+ }
+ 
+-QVector< QString > Echonest::Artist::parseTermList( QNetworkReply* reply ) throw( Echonest::ParseError )
++QVector< QString > Echonest::Artist::parseTermList( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -580,7 +580,7 @@ QVector< QString > Echonest::Artist::par
+     return terms;
+ }
+ 
+-QVector< QString > Echonest::Artist::parseGenreList( QNetworkReply* reply ) throw( Echonest::ParseError )
++QVector< QString > Echonest::Artist::parseGenreList( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+--- libechonest-2.3.1/src/Playlist.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Playlist.cpp	2025-10-04 12:33:16.829990153 +0200
+@@ -50,7 +50,7 @@ QNetworkReply* Echonest::DynamicPlaylist
+     return generateInternal( params, "dynamic/create" );
+ }
+ 
+-void Echonest::DynamicPlaylist::parseCreate(QNetworkReply* reply) throw( Echonest::ParseError )
++void Echonest::DynamicPlaylist::parseCreate(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QByteArray data = reply->readAll();
+@@ -110,7 +110,7 @@ QNetworkReply* Echonest::DynamicPlaylist
+ }
+ 
+ 
+-Echonest::DynamicPlaylist::FetchPair Echonest::DynamicPlaylist::parseNext(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::DynamicPlaylist::FetchPair Echonest::DynamicPlaylist::parseNext(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -141,7 +141,7 @@ QNetworkReply* Echonest::DynamicPlaylist
+     return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
+ }
+ 
+-void Echonest::DynamicPlaylist::parseFeedback(QNetworkReply* reply) const throw( Echonest::ParseError )
++void Echonest::DynamicPlaylist::parseFeedback(QNetworkReply* reply) const
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -214,7 +214,7 @@ QNetworkReply* Echonest::DynamicPlaylist
+     return Echonest::Config::instance()->nam()->get( QNetworkRequest( url ) );
+ }
+ 
+-void Echonest::DynamicPlaylist::parseSteer(QNetworkReply* reply) const throw( Echonest::ParseError )
++void Echonest::DynamicPlaylist::parseSteer(QNetworkReply* reply) const
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -225,7 +225,7 @@ void Echonest::DynamicPlaylist::parseSte
+     reply->deleteLater();
+ }
+ 
+-Echonest::SessionInfo Echonest::DynamicPlaylist::parseInfo(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::SessionInfo Echonest::DynamicPlaylist::parseInfo(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -265,7 +265,7 @@ QNetworkReply* Echonest::DynamicPlaylist
+     return Echonest::DynamicPlaylist::generateInternal( params, "static" );
+ }
+ 
+-Echonest::SongList Echonest::DynamicPlaylist::parseStaticPlaylist(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::SongList Echonest::DynamicPlaylist::parseStaticPlaylist(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -278,7 +278,7 @@ Echonest::SongList Echonest::DynamicPlay
+     return songs;
+ }
+ 
+-QByteArray Echonest::DynamicPlaylist::parseXSPFPlaylist(QNetworkReply* reply) throw( Echonest::ParseError )
++QByteArray Echonest::DynamicPlaylist::parseXSPFPlaylist(QNetworkReply* reply)
+ {
+     QByteArray data = reply->readAll();
+     Echonest::Parser::checkForErrors( reply );
+--- libechonest-2.3.1/src/Parsing.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Parsing.cpp	2025-10-04 12:38:44.094883873 +0200
+@@ -28,7 +28,7 @@
+ #include <QDateTime>
+ #include <QStringBuilder>
+ 
+-void Echonest::Parser::checkForErrors( QNetworkReply* reply ) throw( Echonest::ParseError )
++void Echonest::Parser::checkForErrors( QNetworkReply* reply )
+ {
+     if( !reply )
+         throw ParseError( Echonest::UnknownError );
+@@ -46,7 +46,7 @@ void Echonest::Parser::checkForErrors( Q
+     }
+ }
+ 
+-void Echonest::Parser::readStatus( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++void Echonest::Parser::readStatus( QXmlStreamReader& xml )
+ {
+     if( xml.readNextStartElement() ) {
+         // sanity checks
+@@ -80,7 +80,7 @@ void Echonest::Parser::readStatus( QXmlS
+     }
+ }
+ 
+-QVector< Echonest::Song > Echonest::Parser::parseSongList( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QVector< Echonest::Song > Echonest::Parser::parseSongList( QXmlStreamReader& xml )
+ {
+     QVector< Echonest::Song > songs;
+ 
+@@ -92,7 +92,7 @@ QVector< Echonest::Song > Echonest::Pars
+     return songs;
+ }
+ 
+-Echonest::Song Echonest::Parser::parseSong( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Song Echonest::Parser::parseSong( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "song" ) )
+         throw ParseError( Echonest::UnknownParseError );
+@@ -132,7 +132,7 @@ Echonest::Song Echonest::Parser::parseSo
+ }
+ 
+ 
+-Echonest::ArtistLocation Echonest::Parser::parseSongArtistLocation( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::ArtistLocation Echonest::Parser::parseSongArtistLocation( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "artist_location" ) ) {
+         throw ParseError( Echonest::UnknownParseError );
+@@ -160,7 +160,7 @@ xml.readNext();
+     return location;
+ }
+ 
+-Echonest::Tracks Echonest::Parser::parseSongTrackBucket( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Tracks Echonest::Parser::parseSongTrackBucket( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "tracks" ) ) {
+         throw ParseError( Echonest::UnknownParseError );
+@@ -179,7 +179,7 @@ Echonest::Tracks Echonest::Parser::parse
+ }
+ 
+ 
+-Echonest::Tracks Echonest::Parser::parseCatalogSongTracks( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Tracks Echonest::Parser::parseCatalogSongTracks( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "tracks" ) ) {
+         throw ParseError( Echonest::UnknownParseError );
+@@ -196,7 +196,7 @@ Echonest::Tracks Echonest::Parser::parse
+     return tracks;
+ }
+ 
+-Echonest::Track Echonest::Parser::parseTrack( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Track Echonest::Parser::parseTrack( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "track" ) ) {
+         throw ParseError( Echonest::UnknownParseError );
+@@ -244,7 +244,7 @@ Echonest::Track Echonest::Parser::parseT
+ }
+ 
+ 
+-Echonest::AudioSummary Echonest::Parser::parseAudioSummary( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::AudioSummary Echonest::Parser::parseAudioSummary( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "audio_summary" ) ) {
+         throw ParseError( Echonest::UnknownParseError );
+@@ -303,7 +303,7 @@ inline QVector< T > extractTripleTuple(
+     return tList;
+ }
+ 
+-void Echonest::Parser::parseDetailedAudioSummary( QNetworkReply* reply, Echonest::AudioSummary& summary ) throw( ParseError )
++void Echonest::Parser::parseDetailedAudioSummary( QNetworkReply* reply, Echonest::AudioSummary& summary )
+ {
+    bool ok;
+    QByteArray jsonData = reply->readAll();
+@@ -383,7 +383,7 @@ void Echonest::Parser::parseDetailedAudi
+ }
+ 
+ 
+-Echonest::Artists Echonest::Parser::parseArtists( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Parser::parseArtists( QXmlStreamReader& xml )
+ {
+     // we expect to be in an <artists> start element
+     if( xml.atEnd() || xml.name() != QLatin1String( "artists" ) || !xml.isStartElement() )
+@@ -407,7 +407,7 @@ Echonest::Artists Echonest::Parser::pars
+     return artists;
+ }
+ 
+-int Echonest::Parser::parseArtistInfoOrProfile( QXmlStreamReader& xml , Echonest::Artist& artist  ) throw( Echonest::ParseError )
++int Echonest::Parser::parseArtistInfoOrProfile( QXmlStreamReader& xml , Echonest::Artist& artist  )
+ {
+     if( xml.name() == QLatin1String( "start" ) ) { // this is an individual info query, so lets read it
+         xml.readNextStartElement();
+@@ -436,7 +436,7 @@ int Echonest::Parser::parseArtistInfoOrP
+     return 0;
+ }
+ 
+-void Echonest::Parser::parseArtistInfo( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseArtistInfo( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     // parse each sort of artist information
+     if( xml.name() == QLatin1String( "audio" ) ) {
+@@ -479,7 +479,7 @@ void Echonest::Parser::parseArtistInfo(
+ 
+ // parse each type of artist attribute
+ 
+-void Echonest::Parser::parseAudio( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseAudio( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "audio" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -514,7 +514,7 @@ void Echonest::Parser::parseAudio( QXmlS
+     artist.setAudio( audioList );
+ }
+ 
+-void Echonest::Parser::parseBiographies( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseBiographies( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "biographies" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -543,7 +543,7 @@ void Echonest::Parser::parseBiographies(
+ }
+ 
+ 
+-void Echonest::Parser::parseImages( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseImages( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "images" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -567,7 +567,7 @@ void Echonest::Parser::parseImages( QXml
+     artist.setImages( imgs );
+ }
+ 
+-void Echonest::Parser::parseNewsOrBlogs( QXmlStreamReader& xml, Echonest::Artist& artist, bool news  ) throw( Echonest::ParseError )
++void Echonest::Parser::parseNewsOrBlogs( QXmlStreamReader& xml, Echonest::Artist& artist, bool news  )
+ {
+     if( news && ( xml.atEnd() || xml.name() != QLatin1String( "news" ) || xml.tokenType() != QXmlStreamReader::StartElement ) )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -603,7 +603,7 @@ void Echonest::Parser::parseNewsOrBlogs(
+         artist.setBlogs( newsList );
+ }
+ 
+-void Echonest::Parser::parseReviews( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseReviews( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "reviews" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -637,7 +637,7 @@ void Echonest::Parser::parseReviews( QXm
+     artist.setReviews( reviews );
+ }
+ 
+-void Echonest::Parser::parseArtistSong( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseArtistSong( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "songs" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -662,14 +662,14 @@ void Echonest::Parser::parseArtistSong(
+     artist.setSongs( songs );
+ }
+ 
+-void Echonest::Parser::parseTerms( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseTerms( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "terms" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+     artist.setTerms( parseTopTermList( xml ) );
+ }
+ 
+-Echonest::Artists Echonest::Parser::parseArtistSuggestList( QXmlStreamReader& xml ) throw( ParseError )
++Echonest::Artists Echonest::Parser::parseArtistSuggestList( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "artists" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -694,7 +694,7 @@ Echonest::Artists Echonest::Parser::pars
+ }
+ 
+ 
+-void Echonest::Parser::parseUrls( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseUrls( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "urls" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -720,7 +720,7 @@ void Echonest::Parser::parseUrls( QXmlSt
+     xml.readNextStartElement();
+ }
+ 
+-void Echonest::Parser::parseVideos( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseVideos( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "video" )|| xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -753,7 +753,7 @@ void Echonest::Parser::parseVideos( QXml
+     artist.setVideos( videos );
+ }
+ 
+-Echonest::TermList Echonest::Parser::parseTopTermList( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::TermList Echonest::Parser::parseTopTermList( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "terms" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -783,7 +783,7 @@ Echonest::TermList Echonest::Parser::par
+ }
+ 
+ 
+-QVector< QString > Echonest::Parser::parseTermList( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QVector< QString > Echonest::Parser::parseTermList( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "terms" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -798,7 +798,7 @@ QVector< QString > Echonest::Parser::par
+     return terms;
+ }
+ 
+-QVector< QString > Echonest::Parser::parseGenreListStrings( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QVector< QString > Echonest::Parser::parseGenreListStrings( QXmlStreamReader& xml )
+ {
+     xml.readNextStartElement();
+     xml.readNextStartElement();
+@@ -816,7 +816,7 @@ QVector< QString > Echonest::Parser::par
+     return genres;
+ }
+ 
+-Echonest::Genres Echonest::Parser::parseGenres( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Genres Echonest::Parser::parseGenres( QXmlStreamReader& xml )
+ {
+     if ( xml.name() == QLatin1String( "start" ) )
+         xml.readNextStartElement();
+@@ -839,7 +839,7 @@ Echonest::Genres Echonest::Parser::parse
+     return genres;
+ }
+ 
+-Echonest::Genre Echonest::Parser::parseGenre( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Genre Echonest::Parser::parseGenre( QXmlStreamReader& xml )
+ {
+     Genre g;
+     while ( !( xml.isEndElement() && xml.name() == QLatin1String( "genre" ) ) ) {
+@@ -860,13 +860,13 @@ Echonest::Genre Echonest::Parser::parseG
+     return g;
+ }
+ 
+-void Echonest::Parser::parseArtistGenres( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseArtistGenres( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     Genres genres = parseGenres( xml );
+     artist.setGenres( genres );
+ }
+ 
+-void Echonest::Parser::parseForeignArtistIds( QXmlStreamReader& xml, Echonest::Artist& artist ) throw( Echonest::ParseError )
++void Echonest::Parser::parseForeignArtistIds( QXmlStreamReader& xml, Echonest::Artist& artist )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "foreign_ids" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -890,7 +890,7 @@ void Echonest::Parser::parseForeignArtis
+     artist.setForeignIds( ids );
+ }
+ 
+-Echonest::License Echonest::Parser::parseLicense( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::License Echonest::Parser::parseLicense( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "license" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -911,7 +911,7 @@ Echonest::License Echonest::Parser::pars
+     return license;
+ }
+ 
+-QByteArray Echonest::Parser::parsePlaylistSessionId( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QByteArray Echonest::Parser::parsePlaylistSessionId( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "session_id" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -921,7 +921,7 @@ QByteArray Echonest::Parser::parsePlayli
+     return sessionId;
+ }
+ 
+-Echonest::SongList Echonest::Parser::parseDynamicLookahead( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::SongList Echonest::Parser::parseDynamicLookahead( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -956,8 +956,8 @@ Echonest::SongList Echonest::Parser::par
+     return lookahead;
+ }
+ 
+-// Catalogs parseCatalogList( QXmlStreamReader& xml ) throw( ParseError );
+-Echonest::Catalogs Echonest::Parser::parseCatalogList( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++// Catalogs parseCatalogList( QXmlStreamReader& xml );
++Echonest::Catalogs Echonest::Parser::parseCatalogList( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -984,7 +984,7 @@ Echonest::Catalogs Echonest::Parser::par
+     return catalogs;
+ }
+ 
+-Echonest::Catalog Echonest::Parser::parseCatalog( QXmlStreamReader& xml, bool justOne ) throw( Echonest::ParseError )
++Echonest::Catalog Echonest::Parser::parseCatalog( QXmlStreamReader& xml, bool justOne )
+ {
+     QString cName = justOne ? QLatin1String( "catalog" ) : QLatin1String( "catalogs" );
+     if( xml.atEnd() || xml.name() != cName || !xml.isStartElement() )
+@@ -1020,7 +1020,7 @@ Echonest::Catalog Echonest::Parser::pars
+     return catalog;
+ }
+ 
+-QList<Echonest::CatalogItem*> Echonest::Parser::parseCatalogItems( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QList<Echonest::CatalogItem*> Echonest::Parser::parseCatalogItems( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "items" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1115,7 +1115,7 @@ QList<Echonest::CatalogItem*> Echonest::
+     return items;
+ }
+ 
+-void Echonest::Parser::parseCatalogRequestItem( QXmlStreamReader& xml, Echonest::CatalogArtist& artist, Echonest::CatalogSong& song) throw( Echonest::ParseError )
++void Echonest::Parser::parseCatalogRequestItem( QXmlStreamReader& xml, Echonest::CatalogArtist& artist, Echonest::CatalogSong& song)
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "request" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1168,7 +1168,7 @@ void Echonest::Parser::saveSongList( Ech
+ }
+ 
+ 
+-Echonest::CatalogStatus Echonest::Parser::parseCatalogStatus( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::CatalogStatus Echonest::Parser::parseCatalogStatus( QXmlStreamReader& xml )
+ {
+     Echonest::CatalogStatus status;
+ 
+@@ -1190,7 +1190,7 @@ Echonest::CatalogStatus Echonest::Parser
+     return status;
+ }
+ 
+-Echonest::CatalogStatusItem Echonest::Parser::parseTicketUpdateInfo( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::CatalogStatusItem Echonest::Parser::parseTicketUpdateInfo( QXmlStreamReader& xml )
+ {
+ //     if( xml.atEnd() || xml.name() != "ticket_status" || xml.tokenType() != QXmlStreamReader::StartElement )
+ //         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1198,7 +1198,7 @@ Echonest::CatalogStatusItem Echonest::Pa
+         return Echonest::CatalogStatusItem();
+ }
+ 
+-QByteArray Echonest::Parser::parseCatalogTicket( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QByteArray Echonest::Parser::parseCatalogTicket( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "ticket" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1207,7 +1207,7 @@ QByteArray Echonest::Parser::parseCatalo
+     return ticket;
+ }
+ 
+-Echonest::Catalog Echonest::Parser::parseNewCatalog( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::Catalog Echonest::Parser::parseNewCatalog( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1236,7 +1236,7 @@ Echonest::Catalog Echonest::Parser::pars
+     return c;
+ }
+ 
+-Echonest::SessionInfo Echonest::Parser::parseSessionInfo( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++Echonest::SessionInfo Echonest::Parser::parseSessionInfo( QXmlStreamReader& xml )
+ {
+     Echonest::SessionInfo info;
+ 
+@@ -1284,7 +1284,7 @@ Echonest::SessionInfo Echonest::Parser::
+ }
+ 
+ 
+-QVector< QString > Echonest::Parser::parseRulesList( QXmlStreamReader& xml ) throw( Echonest::ParseError )
++QVector< QString > Echonest::Parser::parseRulesList( QXmlStreamReader& xml )
+ {
+     if( xml.atEnd() || xml.name() != QLatin1String( "rules" ) || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+@@ -1302,7 +1302,7 @@ QVector< QString > Echonest::Parser::par
+ }
+ /*
+  * TODO port to API v2
+-QVector< Echonest::SessionItem > Echonest::Parser::parseSessionSongItem( QXmlStreamReader& xml, const QString& type ) throw( Echonest::ParseError )
++QVector< Echonest::SessionItem > Echonest::Parser::parseSessionSongItem( QXmlStreamReader& xml, const QString& type )
+ {
+     if( xml.atEnd() || xml.name() != type || xml.tokenType() != QXmlStreamReader::StartElement )
+         throw Echonest::ParseError( Echonest::UnknownParseError );
+--- libechonest-2.3.1/src/AudioSummary.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/AudioSummary.cpp	2025-10-04 12:38:54.234828940 +0200
+@@ -185,7 +185,7 @@ void Echonest::AudioSummary::setNumSampl
+     d->num_samples = num;
+ }
+ 
+-void Echonest::AudioSummary::parseFullAnalysis( QNetworkReply* reply ) throw( Echonest::ParseError )
++void Echonest::AudioSummary::parseFullAnalysis( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+     Echonest::Parser::parseDetailedAudioSummary( reply, *this );
+--- libechonest-2.3.1/src/Catalog.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Catalog.cpp	2025-10-04 12:45:13.356108398 +0200
+@@ -216,7 +216,7 @@ QNetworkReply* Echonest::Catalog::readSo
+     return readPrivate( url, results, start );
+ }
+ 
+-QPair< QString, QByteArray > Echonest::Catalog::parseDelete( QNetworkReply* reply ) throw( Echonest::ParseError )
++QPair< QString, QByteArray > Echonest::Catalog::parseDelete( QNetworkReply* reply )
+ {
+     QByteArray data = reply->readAll();
+ //     qDebug() << "DATA:" << data;
+@@ -232,7 +232,7 @@ QPair< QString, QByteArray > Echonest::C
+     return asd;
+ }
+ 
+-Echonest::Catalogs Echonest::Catalog::parseList(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::Catalogs Echonest::Catalog::parseList(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QXmlStreamReader xml( reply->readAll() );
+@@ -244,7 +244,7 @@ Echonest::Catalogs Echonest::Catalog::pa
+     return catalogs;
+ }
+ 
+-void Echonest::Catalog::parseProfile(QNetworkReply* reply) throw( Echonest::ParseError )
++void Echonest::Catalog::parseProfile(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QXmlStreamReader xml( reply->readAll() );
+@@ -255,7 +255,7 @@ void Echonest::Catalog::parseProfile(QNe
+     reply->deleteLater();
+ }
+ 
+-void Echonest::Catalog::parseRead(QNetworkReply* reply) throw( Echonest::ParseError )
++void Echonest::Catalog::parseRead(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QXmlStreamReader xml( reply->readAll() );
+@@ -266,7 +266,7 @@ void Echonest::Catalog::parseRead(QNetwo
+     reply->deleteLater();
+ }
+ 
+-Echonest::CatalogStatus Echonest::Catalog::parseStatus(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::CatalogStatus Echonest::Catalog::parseStatus(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QByteArray data = reply->readAll();
+@@ -279,7 +279,7 @@ Echonest::CatalogStatus Echonest::Catalo
+     return status;
+ }
+ 
+-QByteArray Echonest::Catalog::parseTicket(QNetworkReply* reply) throw( Echonest::ParseError )
++QByteArray Echonest::Catalog::parseTicket(QNetworkReply* reply)
+ {
+     Echonest::Parser::checkForErrors( reply );
+     QByteArray data = reply->readAll();
+@@ -292,7 +292,7 @@ QByteArray Echonest::Catalog::parseTicke
+     return ticket;
+ }
+ 
+-Echonest::Catalog Echonest::Catalog::parseCreate(QNetworkReply* reply) throw( Echonest::ParseError )
++Echonest::Catalog Echonest::Catalog::parseCreate(QNetworkReply* reply)
+ {
+     QByteArray data = reply->readAll();
+ //    qDebug() << data;
+--- libechonest-2.3.1/src/Genre.cpp.orig	2015-02-07 20:59:44.000000000 +0100
++++ libechonest-2.3.1/src/Genre.cpp	2025-10-04 12:46:01.165849390 +0200
+@@ -158,25 +158,25 @@ QNetworkReply* Echonest::Genre::fetchSea
+ }
+ 
+ 
+-Echonest::Artists Echonest::Genre::parseArtists( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Artists Echonest::Genre::parseArtists( QNetworkReply* reply )
+ {
+    return Artist::parseSearch( reply );
+ }
+ 
+ 
+-Echonest::Genres Echonest::Genre::parseSimilar( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Genres Echonest::Genre::parseSimilar( QNetworkReply* reply )
+ {
+     return parseList( reply );
+ }
+ 
+ 
+-Echonest::Genres Echonest::Genre::parseProfile( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Genres Echonest::Genre::parseProfile( QNetworkReply* reply )
+ {
+     return parseList( reply );
+ }
+ 
+ 
+-Echonest::Genres Echonest::Genre::parseList( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Genres Echonest::Genre::parseList( QNetworkReply* reply )
+ {
+     Echonest::Parser::checkForErrors( reply );
+ 
+@@ -191,7 +191,7 @@ Echonest::Genres Echonest::Genre::parseL
+ }
+ 
+ 
+-Echonest::Genres Echonest::Genre::parseSearch( QNetworkReply* reply ) throw( Echonest::ParseError )
++Echonest::Genres Echonest::Genre::parseSearch( QNetworkReply* reply )
+ {
+    return parseList( reply );
+ }
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/libechonest.git/commitdiff/c255966616fcfecfe0726fcbd1e793f776a1ae53



More information about the pld-cvs-commit mailing list