Compare commits
No commits in common. "rawhide" and "f27" have entirely different histories.
4 changed files with 743 additions and 109 deletions
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -1,7 +1 @@
|
|||
/ampache_browser-1.0.0.tar.gz
|
||||
/ampache_browser-1.0.2.tar.gz
|
||||
/ampache_browser-1.0.3.tar.gz
|
||||
/ampache_browser-1.0.4.tar.gz
|
||||
/ampache_browser-1.0.6.tar.gz
|
||||
/ampache_browser-1.0.7.tar.gz
|
||||
/ampache_browser-1.0.8.tar.gz
|
||||
|
|
|
|||
731
ampache_browser-1.0-branch-20180408.patch
Normal file
731
ampache_browser-1.0-branch-20180408.patch
Normal file
|
|
@ -0,0 +1,731 @@
|
|||
diff -Naur ampache_browser-1.0.0-orig/CMakeLists.txt ampache_browser-1.0-branch-20180408/CMakeLists.txt
|
||||
--- ampache_browser-1.0.0-orig/CMakeLists.txt 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/CMakeLists.txt 2018-04-08 00:28:17.018973008 +0200
|
||||
@@ -3,12 +3,12 @@
|
||||
# Project: Ampache Browser
|
||||
# License: GNU GPLv3
|
||||
#
|
||||
-# Copyright (C) 2015 - 2017 Róbert Čerňanský
|
||||
+# Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
-project(ampache_browser VERSION 1.0.0)
|
||||
+project(ampache_browser VERSION 1.0.1)
|
||||
set(VERSION_EXTRA "")
|
||||
set(soVersion 0)
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/include/internal/data/providers/ampache.h ampache_browser-1.0-branch-20180408/include/internal/data/providers/ampache.h
|
||||
--- ampache_browser-1.0.0-orig/include/internal/data/providers/ampache.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/include/internal/data/providers/ampache.h 2018-04-08 00:28:18.629937302 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@
|
||||
/**
|
||||
* @brief Request album arts from the server.
|
||||
*
|
||||
- * @note If this method is called before the the ::initialized event it immediately raises ::readyAlbumArts with
|
||||
+ * @note If this method is called before ::initialized event it immediately raises ::readyAlbumArts with
|
||||
* zero loaded arts.
|
||||
*
|
||||
* @param idsAndUrls Identifiers of the album art images that shall be requested paired with their URLs. IDs are
|
||||
@@ -290,6 +290,7 @@
|
||||
std::vector<std::unique_ptr<ArtistData>> createArtists(QXmlStreamReader& xmlStreamReader) const;
|
||||
void processTracks(QXmlStreamReader& xmlStreamReader, bool error);
|
||||
std::vector<std::unique_ptr<TrackData>> createTracks(QXmlStreamReader& xmlStreamReader) const;
|
||||
+ void IfNoPendingClearFinishedAlbumArtsAndRaiseReady();
|
||||
std::string assembleUrlBase() const;
|
||||
};
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/include/internal/data/repositories/repository.h ampache_browser-1.0-branch-20180408/include/internal/data/repositories/repository.h
|
||||
--- ampache_browser-1.0.0-orig/include/internal/data/repositories/repository.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/include/internal/data/repositories/repository.h 2018-04-08 00:28:18.924930764 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -588,16 +588,27 @@
|
||||
offset++;
|
||||
}
|
||||
|
||||
- auto offsetAndLimit = std::pair<int, int>{myLoadOffset, data.size()};
|
||||
- if (data.size() != static_cast<unsigned int>(myLimit)) {
|
||||
+ // if the server returns less entries than requested, we assume the missing ones are lost (theoretically they
|
||||
+ // could be deleted sooner than we were able to load them); in that case we store the number of lost entries and
|
||||
+ // inform that total number of entries has changed (SMELL: we still report the original total
|
||||
+ // number of entries in maxCount() though); however if happens that the server returns more entries than requested,
|
||||
+ // we assume that the server ignores 'limit' in the load request and work with returned entries as if they were
|
||||
+ // requested
|
||||
+ if (data.size() < static_cast<unsigned int>(myLimit)) {
|
||||
myNumberOfUnavailableEntries += myLimit - data.size();
|
||||
dataSizeChanged();
|
||||
+ } else if (data.size() > static_cast<unsigned int>(myLimit)) {
|
||||
+ infrastructure::LOG_WARN(
|
||||
+ "Server does not respect 'limit' parameter. Performance during loading may be degraded.");
|
||||
}
|
||||
|
||||
myUnfilteredFilter->processUpdatedSourceData(myLoadOffset, data.size());
|
||||
if (isFiltered()) {
|
||||
myFilter->processUpdatedSourceData(myLoadOffset, data.size());
|
||||
}
|
||||
+
|
||||
+ auto offsetAndLimit = std::pair<int, int>{myLoadOffset, data.size()};
|
||||
+
|
||||
myLoadOffset = -1;
|
||||
myLoadProgress += data.size();
|
||||
infrastructure::LOG_DBG("Load progress: %d.", myLoadProgress);
|
||||
diff -Naur ampache_browser-1.0.0-orig/include/internal/infrastructure/logging/logging.h ampache_browser-1.0-branch-20180408/include/internal/infrastructure/logging/logging.h
|
||||
--- ampache_browser-1.0.0-orig/include/internal/infrastructure/logging/logging.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/include/internal/infrastructure/logging/logging.h 2018-04-08 00:28:19.611915537 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
namespace infrastructure {
|
||||
|
||||
/**
|
||||
- * @brief Sets the maximal loggin level.
|
||||
+ * @brief Sets the maximal logging level.
|
||||
*
|
||||
* If a log method with lower level than maxLogLevel is called, no message is logged.
|
||||
*
|
||||
diff -Naur ampache_browser-1.0.0-orig/NEWS ampache_browser-1.0-branch-20180408/NEWS
|
||||
--- ampache_browser-1.0.0-orig/NEWS 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/NEWS 2018-04-08 00:28:17.165969750 +0200
|
||||
@@ -2,6 +2,25 @@
|
||||
====================================
|
||||
|
||||
|
||||
+Version 1.0.1 [????-??-??]
|
||||
+--------------------------
|
||||
+
|
||||
+* Fix issues when Nextcloud's Music app is used as Ampache server.
|
||||
+
|
||||
+ Fix crash if server ignores 'limit' parameter and sends more data than it was requested.
|
||||
+
|
||||
+ Fix crash when server returns empty album art URL for not available album arts.
|
||||
+
|
||||
+ Fix crash when album art URL can not be parsed.
|
||||
+
|
||||
+* Ensure the loading error status message is not overwritten.
|
||||
+
|
||||
+ If error occures during loading an error message is shown in status line. Sometimes happened that this message
|
||||
+ was later overwritten by "Loaded" message when loading finished. This is now fixed so that the error message always
|
||||
+ stays displayed after loading has finished.
|
||||
+
|
||||
+
|
||||
+
|
||||
Version 1.0.0 [2017-07-26]
|
||||
--------------------------
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/data_loader.cc ampache_browser-1.0-branch-20180408/src/application/data_loader.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/data_loader.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/data_loader.cc 2018-04-08 00:28:20.492896011 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -241,6 +241,10 @@
|
||||
|
||||
|
||||
void DataLoader::fireFinished(LoadingResult loadingResult) {
|
||||
+ if (myState == Idle) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
LOG_INF("Data loader finished with result %d.", loadingResult);
|
||||
myState = Idle;
|
||||
finished(loadingResult);
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/album_model.cc ampache_browser-1.0-branch-20180408/src/application/models/album_model.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/album_model.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/album_model.cc 2018-04-08 00:28:20.687891689 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
|
||||
|
||||
|
||||
-void AlbumModel::onLoaded(pair<int, int>) {
|
||||
- auto finishedRequestGroup = myAlbumRequests->setFinished();
|
||||
- dataChanged(createIndex(finishedRequestGroup.getLower(), 0), createIndex(finishedRequestGroup.getUpper(), 0));
|
||||
+void AlbumModel::onLoaded(pair<int, int> offsetAndLimit) {
|
||||
+ myAlbumRequests->setFinished(offsetAndLimit.first, offsetAndLimit.second);
|
||||
+ dataChanged(createIndex(offsetAndLimit.first, 0), createIndex(offsetAndLimit.first + offsetAndLimit.second - 1, 0));
|
||||
}
|
||||
|
||||
|
||||
@@ -143,13 +143,14 @@
|
||||
|
||||
|
||||
void AlbumModel::onArtsLoaded(pair<int, int> offsetAndCount) {
|
||||
- auto finishedRequestGroup = myArtRequests->setFinished();
|
||||
+ myArtRequests->setFinished(offsetAndCount.first, offsetAndCount.second);
|
||||
if (myIsInUnfilteredArtsLoadMode) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (offsetAndCount.second != 0) {
|
||||
- dataChanged(createIndex(finishedRequestGroup.getLower(), 0), createIndex(finishedRequestGroup.getUpper(), 0));
|
||||
+ dataChanged(createIndex(offsetAndCount.first, 0),
|
||||
+ createIndex(offsetAndCount.first + offsetAndCount.second - 1, 0));
|
||||
}
|
||||
|
||||
if (!myArtRequests->isInProgress()) {
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/artist_model.cc ampache_browser-1.0-branch-20180408/src/application/models/artist_model.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/artist_model.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/artist_model.cc 2018-04-08 00:28:20.736890603 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -90,9 +90,9 @@
|
||||
|
||||
|
||||
|
||||
-void ArtistModel::onLoaded(pair<int, int>) {
|
||||
- auto finishedRequestGroup = myRequests->setFinished();
|
||||
- dataChanged(createIndex(finishedRequestGroup.getLower(), 0), createIndex(finishedRequestGroup.getUpper(), 0));
|
||||
+void ArtistModel::onLoaded(pair<int, int> offsetAndLimit) {
|
||||
+ myRequests->setFinished(offsetAndLimit.first, offsetAndLimit.second);
|
||||
+ dataChanged(createIndex(offsetAndLimit.first, 0), createIndex(offsetAndLimit.first + offsetAndLimit.second - 1, 0));
|
||||
}
|
||||
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/request_groups.cc ampache_browser-1.0-branch-20180408/src/application/models/request_groups.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/request_groups.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/request_groups.cc 2018-04-08 00:28:20.883887345 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -27,20 +27,15 @@
|
||||
|
||||
|
||||
|
||||
-void RequestGroups::cutAndPlaceOnTop(RequestGroup requestGroup) {
|
||||
- auto intersectingGroupIdxs = findIntersectingGroupIdxs(requestGroup);
|
||||
- for (auto idx = intersectingGroupIdxs.size(); idx-- > 0;) {
|
||||
- auto intersectingGroupIdx = intersectingGroupIdxs[idx];
|
||||
- auto intersectingGroup = myRequestGroups[intersectingGroupIdx];
|
||||
- pair<RequestGroup, RequestGroup> remainderGroups = intersectingGroup.substract(requestGroup);
|
||||
- myRequestGroups.erase(myRequestGroups.begin() + intersectingGroupIdx);
|
||||
- if (!remainderGroups.second.isEmpty()) {
|
||||
- myRequestGroups.insert(myRequestGroups.begin() + intersectingGroupIdx, remainderGroups.second);
|
||||
- }
|
||||
- if (!remainderGroups.first.isEmpty()) {
|
||||
- myRequestGroups.insert(myRequestGroups.begin() + intersectingGroupIdx, remainderGroups.first);
|
||||
- }
|
||||
- }
|
||||
+void RequestGroups::cut(RequestGroup requestGroup) {
|
||||
+ cutRequestGroup(requestGroup);
|
||||
+ chop();
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
+void RequestGroups::moveOnTop(RequestGroup requestGroup) {
|
||||
+ cutRequestGroup(requestGroup);
|
||||
myRequestGroups.push_back(requestGroup);
|
||||
chop();
|
||||
}
|
||||
@@ -89,6 +84,25 @@
|
||||
}
|
||||
|
||||
|
||||
+
|
||||
+void RequestGroups::cutRequestGroup(RequestGroup requestGroup) {
|
||||
+ auto intersectingGroupIdxs = findIntersectingGroupIdxs(requestGroup);
|
||||
+ for (auto idx = intersectingGroupIdxs.size(); idx-- > 0;) {
|
||||
+ auto intersectingGroupIdx = intersectingGroupIdxs[idx];
|
||||
+ auto intersectingGroup = myRequestGroups[intersectingGroupIdx];
|
||||
+ pair<RequestGroup, RequestGroup> remainderGroups = intersectingGroup.substract(requestGroup);
|
||||
+
|
||||
+ myRequestGroups.erase(myRequestGroups.begin() + intersectingGroupIdx);
|
||||
+ if (!remainderGroups.second.isEmpty()) {
|
||||
+ myRequestGroups.insert(myRequestGroups.begin() + intersectingGroupIdx, remainderGroups.second);
|
||||
+ }
|
||||
+ if (!remainderGroups.first.isEmpty()) {
|
||||
+ myRequestGroups.insert(myRequestGroups.begin() + intersectingGroupIdx, remainderGroups.first);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
|
||||
void RequestGroups::chop() {
|
||||
if (myGranularity == 0) {
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/request_groups.h ampache_browser-1.0-branch-20180408/src/application/models/request_groups.h
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/request_groups.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/request_groups.h 2018-04-08 00:28:20.933886236 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -44,18 +44,30 @@
|
||||
*/
|
||||
bool isEmpty() const;
|
||||
|
||||
+
|
||||
/**
|
||||
- * @brief Cuts @p requestGroup from the set and places it on top.
|
||||
+ * @brief Cuts @p requestGroup from the set.
|
||||
*
|
||||
- * The operation modifies/removes affected groups as needed. For example of @p requestGroup is big, spreading
|
||||
- * over (intersecting with) several groups in the set, those are removed and groups intersecting on bounds are
|
||||
- * shrinked accordingly.
|
||||
+ * The operation modifies/removes affected groups as needed. For example if @p requestGroup is big, spreading
|
||||
+ * over (intersecting with) several groups in the set, inner intersecting groups are removed and groups
|
||||
+ * intersecting on bounds are shrinked accordingly.
|
||||
*
|
||||
- * The entire set is then modified so that no group is bigger than the set granularity.
|
||||
+ * @note The entire set is then modified so that no group is bigger than the set granularity.
|
||||
+ *
|
||||
+ * @param requestGroup Group that shall be cut.
|
||||
+ */
|
||||
+ void cut(RequestGroup requestGroup);
|
||||
+
|
||||
+ /**
|
||||
+ * @brief Cuts @p requestGroup from the set and places it on top.
|
||||
+ *
|
||||
+ * @note The entire set is then modified so that no group is bigger than the set granularity.
|
||||
*
|
||||
* @param requestGroup The group that shall be cut and moved.
|
||||
+ *
|
||||
+ * @sa cut()
|
||||
*/
|
||||
- void cutAndPlaceOnTop(RequestGroup requestGroup);
|
||||
+ void moveOnTop(RequestGroup requestGroup);
|
||||
|
||||
/**
|
||||
* @brief Make grup determined by @p offset bigger by one.
|
||||
@@ -88,6 +100,7 @@
|
||||
// stored groups
|
||||
std::vector<RequestGroup> myRequestGroups;
|
||||
|
||||
+ void cutRequestGroup(RequestGroup requestGroup);
|
||||
void chop();
|
||||
void appendOnTop(std::vector<RequestGroup>& groups, RequestGroup groupToPlace);
|
||||
int findOwningGroupIdx(int offset) const;
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/requests.cc ampache_browser-1.0-branch-20180408/src/application/models/requests.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/requests.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/requests.cc 2018-04-08 00:28:20.983885128 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
}
|
||||
|
||||
if (offset < myLastEnqueuedOffset) {
|
||||
- myRequestGroups->cutAndPlaceOnTop(RequestGroup{offset, offset});
|
||||
+ myRequestGroups->moveOnTop(RequestGroup{offset, offset});
|
||||
} else if (offset > myLastEnqueuedOffset + 1) {
|
||||
- myRequestGroups->cutAndPlaceOnTop(RequestGroup{offset, offset});
|
||||
+ myRequestGroups->moveOnTop(RequestGroup{offset, offset});
|
||||
} else {
|
||||
myRequestGroups->extend(offset);
|
||||
}
|
||||
@@ -55,10 +55,15 @@
|
||||
|
||||
|
||||
|
||||
-// SMELL: Not necesary to expose RequestGroup. Return just pair and Requests will be the only
|
||||
-// "interface" class to request handling. Same for readyToExecute event.
|
||||
-RequestGroup Requests::setFinished() {
|
||||
- auto finishedRequestGroup = myCurrentRequestGroup;
|
||||
+void Requests::setFinished(int offset, int count) {
|
||||
+ auto finishedRequestGroup = RequestGroup{offset, offset + count - 1};
|
||||
+
|
||||
+ // finished requests may be different from what was ready to execution; if there were some requests finished which
|
||||
+ // were not ready remainderGroups will contain them; they have to be cut from myRequestGroups
|
||||
+ auto remainderGroups = finishedRequestGroup.substract(myCurrentRequestGroup);
|
||||
+ myRequestGroups->cut(remainderGroups.first);
|
||||
+ myRequestGroups->cut(remainderGroups.second);
|
||||
+
|
||||
if (!myRequestGroups->isEmpty()) {
|
||||
myCurrentRequestGroup = myRequestGroups->pop();
|
||||
readyToExecute(myCurrentRequestGroup);
|
||||
@@ -66,7 +71,6 @@
|
||||
myCurrentRequestGroup = RequestGroup{};
|
||||
myLastEnqueuedOffset = numeric_limits<int>::max();
|
||||
}
|
||||
- return finishedRequestGroup;
|
||||
}
|
||||
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/requests.h ampache_browser-1.0-branch-20180408/src/application/models/requests.h
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/requests.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/requests.h 2018-04-08 00:28:21.031884065 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@
|
||||
|
||||
Requests& operator=(const Requests& other) = delete;
|
||||
|
||||
+ // SMELL: Not necesary to expose RequestGroup. Use just pair<> as parameter and Requests will be the only
|
||||
+ // "interface" class to request handling. Same for readyToExecute event.
|
||||
/**
|
||||
* @brief A group of requests is ready to be executed.
|
||||
*
|
||||
@@ -82,11 +84,15 @@
|
||||
/**
|
||||
* @brief Inform the instance that the operation started upon ::readyToExecute event has finished.
|
||||
*
|
||||
- * @return Group of requests for which the operation was previously ready to be executed.
|
||||
+ * Ready to execute requests which are not reported as finished will be set as finished (will not be
|
||||
+ * executed again). Finished requests which were not ready to execute will also be set as finished.
|
||||
+ *
|
||||
+ * @param offset The number of first finished request (may be different from what was originally requested).
|
||||
+ * @param count The count of finished requests (may be different from what was originally requested).
|
||||
*
|
||||
* @sa ::readyToExecute
|
||||
*/
|
||||
- RequestGroup setFinished();
|
||||
+ void setFinished(int offset, int count);
|
||||
|
||||
/**
|
||||
* @brief Returns true if some operation is being executed.
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/application/models/track_model.cc ampache_browser-1.0-branch-20180408/src/application/models/track_model.cc
|
||||
--- ampache_browser-1.0.0-orig/src/application/models/track_model.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/application/models/track_model.cc 2018-04-08 00:28:21.080882978 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -121,9 +121,9 @@
|
||||
|
||||
|
||||
|
||||
-void TrackModel::onLoaded(pair<int, int>) {
|
||||
- auto finishedRequestGroup = myRequests->setFinished();
|
||||
- dataChanged(createIndex(finishedRequestGroup.getLower(), 0), createIndex(finishedRequestGroup.getUpper(), 0));
|
||||
+void TrackModel::onLoaded(pair<int, int> offsetAndLimit) {
|
||||
+ myRequests->setFinished(offsetAndLimit.first, offsetAndLimit.second);
|
||||
+ dataChanged(createIndex(offsetAndLimit.first, 0), createIndex(offsetAndLimit.first + offsetAndLimit.second - 1, 0));
|
||||
}
|
||||
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/data/indices.cc ampache_browser-1.0-branch-20180408/src/data/indices.cc
|
||||
--- ampache_browser-1.0.0-orig/src/data/indices.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/data/indices.cc 2018-04-08 00:28:22.065861147 +0200
|
||||
@@ -19,8 +19,8 @@
|
||||
|
||||
void Indices::addArtists(const vector<reference_wrapper<Artist>>& artists) {
|
||||
for (auto& artist: artists) {
|
||||
- myArtistAlbums[artist.get()] = move(AlbumDataUnorderedSet{});
|
||||
- myArtistTracks[artist.get()] = move(TrackDataUnorderedSet{});
|
||||
+ myArtistAlbums[artist.get()] = AlbumDataUnorderedSet{};
|
||||
+ myArtistTracks[artist.get()] = TrackDataUnorderedSet{};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
void Indices::addAlbums(const vector<reference_wrapper<Album>>& albums) {
|
||||
for (auto& album: albums) {
|
||||
- myAlbumTracks[album.get()] = move(TrackDataUnorderedSet{});
|
||||
+ myAlbumTracks[album.get()] = TrackDataUnorderedSet{};
|
||||
}
|
||||
}
|
||||
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache.cc ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache.cc
|
||||
--- ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache.cc 2018-04-08 00:28:22.212857889 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -125,11 +125,24 @@
|
||||
return;
|
||||
}
|
||||
|
||||
+ // SMELL: size specified on multiple places
|
||||
+ QPixmap notAvailablePixmap{100, 100};
|
||||
+ notAvailablePixmap.fill(QColor(230, 225, 220));
|
||||
+
|
||||
LOG_DBG("Getting %d album arts.", idsAndUrls.size());
|
||||
for (auto& idAndUrl: idsAndUrls) {
|
||||
- myPendingAlbumArts.insert(idAndUrl.first);
|
||||
- myNetworkRequestFn(idAndUrl.second, myAlbumArtsNetworkRequestCb);
|
||||
+ if (idAndUrl.second.empty()) {
|
||||
+ // SMELL: If the server did not provide any Art URL then it would be better if client (frontend/model)
|
||||
+ // created the replacement Art (with the "Not Available" image of its choice). Currently, Ampache (3.8.3)
|
||||
+ // provides URLs for not available Arts as well; Nextcloud's Music app (0.5.6) sends empty URLs for
|
||||
+ // not available Arts.
|
||||
+ myFinishedAlbumArts.emplace(idAndUrl.first, notAvailablePixmap);
|
||||
+ } else {
|
||||
+ myPendingAlbumArts.insert(idAndUrl.first);
|
||||
+ myNetworkRequestFn(idAndUrl.second, myAlbumArtsNetworkRequestCb);
|
||||
+ }
|
||||
}
|
||||
+ IfNoPendingClearFinishedAlbumArtsAndRaiseReady();
|
||||
}
|
||||
|
||||
|
||||
@@ -168,8 +181,20 @@
|
||||
void Ampache::onAlbumArtsNetworkRequestFinished(const string& artUrl, const char* content, int contentSize) {
|
||||
LOG_DBG("Album art request has returned with network content of length %d.", contentSize);
|
||||
|
||||
- auto scaleAlbumArtRunnable = new ScaleAlbumArtRunnable(AmpacheUrl{artUrl}.parseIdValue(),
|
||||
- QByteArray{content, contentSize});
|
||||
+ // SMELL: Format of Album Art URL is not server's public API. Entire url should be the ID (mapped to album ID).
|
||||
+ // Ampache (3.8.3) passes the album ID in parameter 'id'; Nextcloud's Music app (0.5.6) in parameter 'filter'
|
||||
+ auto id = AmpacheUrl{artUrl}.parseIdValue();
|
||||
+ id = id.empty() ? AmpacheUrl{artUrl}.parseFilterValue() : id;
|
||||
+
|
||||
+ // give up if we could not parse ID
|
||||
+ if (id.empty()) {
|
||||
+ myFinishedAlbumArts.clear(); // returning empty finished album arts list means error
|
||||
+ myPendingAlbumArts.clear();
|
||||
+ IfNoPendingClearFinishedAlbumArtsAndRaiseReady();
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ auto scaleAlbumArtRunnable = new ScaleAlbumArtRunnable(id, QByteArray{content, contentSize});
|
||||
scaleAlbumArtRunnable->setAutoDelete(false);
|
||||
connect(scaleAlbumArtRunnable, SIGNAL(finished(ScaleAlbumArtRunnable*)), this,
|
||||
SLOT(onScaleAlbumArtRunnableFinished(ScaleAlbumArtRunnable*)));
|
||||
@@ -190,12 +215,7 @@
|
||||
myFinishedAlbumArts.emplace(albumId, art);
|
||||
myPendingAlbumArts.erase(albumId);
|
||||
|
||||
- if (myPendingAlbumArts.empty()) {
|
||||
- auto finishedAlbumArts = myFinishedAlbumArts;
|
||||
- myFinishedAlbumArts.clear();
|
||||
-
|
||||
- readyAlbumArts(finishedAlbumArts);
|
||||
- }
|
||||
+ IfNoPendingClearFinishedAlbumArtsAndRaiseReady();
|
||||
}
|
||||
|
||||
|
||||
@@ -387,16 +407,16 @@
|
||||
if (xmlElement == "album") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- id = attributes.value("id").toString().toStdString();
|
||||
+ id = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
} else if (xmlElement == "artist") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- artistId = attributes.value("id").toString().toStdString();
|
||||
+ artistId = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
}
|
||||
else {
|
||||
- auto value = xmlStreamReader.readElementText().toStdString();
|
||||
+ auto value = xmlStreamReader.readElementText().trimmed().toStdString();
|
||||
|
||||
if (xmlElement == "name") {
|
||||
albumName = value;
|
||||
@@ -419,6 +439,7 @@
|
||||
} catch (const invalid_argument& ex) {}
|
||||
catch (const out_of_range& ex) {}
|
||||
} else if (xmlElement == "art") {
|
||||
+ // TODO: Sanitize URL.
|
||||
artUrl = value;
|
||||
}
|
||||
}
|
||||
@@ -478,11 +499,11 @@
|
||||
if (xmlElement == "artist") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- id = attributes.value("id").toString().toStdString();
|
||||
+ id = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
}
|
||||
else {
|
||||
- auto value = xmlStreamReader.readElementText().toStdString();
|
||||
+ auto value = xmlStreamReader.readElementText().trimmed().toStdString();
|
||||
|
||||
if (xmlElement == "name") {
|
||||
artistName = value;
|
||||
@@ -558,21 +579,21 @@
|
||||
if (xmlElement == "song") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- id = attributes.value("id").toString().toStdString();
|
||||
+ id = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
} else if (xmlElement == "artist") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- artistId = attributes.value("id").toString().toStdString();
|
||||
+ artistId = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
} else if (xmlElement == "album") {
|
||||
QXmlStreamAttributes attributes = xmlStreamReader.attributes();
|
||||
if (attributes.hasAttribute("id")) {
|
||||
- albumId = attributes.value("id").toString().toStdString();
|
||||
+ albumId = attributes.value("id").toString().trimmed().toStdString();
|
||||
}
|
||||
}
|
||||
else {
|
||||
- auto value = xmlStreamReader.readElementText().toStdString();
|
||||
+ auto value = xmlStreamReader.readElementText().trimmed().toStdString();
|
||||
|
||||
if (xmlElement == "title") {
|
||||
title = value;
|
||||
@@ -583,6 +604,7 @@
|
||||
} catch (const invalid_argument& ex) {}
|
||||
catch (const out_of_range& ex) {}
|
||||
} else if (xmlElement == "url") {
|
||||
+ // TODO: Sanitize URL.
|
||||
url = value;
|
||||
}
|
||||
}
|
||||
@@ -596,6 +618,17 @@
|
||||
}
|
||||
|
||||
|
||||
+
|
||||
+void Ampache::IfNoPendingClearFinishedAlbumArtsAndRaiseReady() {
|
||||
+ if (myPendingAlbumArts.empty()) {
|
||||
+ auto finishedAlbumArts = myFinishedAlbumArts;
|
||||
+ myFinishedAlbumArts.clear();
|
||||
+
|
||||
+ readyAlbumArts(finishedAlbumArts);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
|
||||
string Ampache::assembleUrlBase() const {
|
||||
return myConnectionInfo.getServerUrl() + "/server/xml.server.php?action=";
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache_url.cc ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache_url.cc
|
||||
--- ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache_url.cc 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache_url.cc 2018-04-08 00:28:22.261856803 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,12 @@
|
||||
|
||||
|
||||
|
||||
+string AmpacheUrl::parseFilterValue() const {
|
||||
+ return parseValue(PARAM_FILTER);
|
||||
+}
|
||||
+
|
||||
+
|
||||
+
|
||||
string AmpacheUrl::parseActionValue() const {
|
||||
return parseValue(PARAM_ACTION);
|
||||
}
|
||||
@@ -92,6 +98,7 @@
|
||||
const string AmpacheUrl::PARAM_SSID = "ssid";
|
||||
const string AmpacheUrl::PARAM_AUTH = "auth";
|
||||
const string AmpacheUrl::PARAM_ID = "id";
|
||||
+const string AmpacheUrl::PARAM_FILTER = "filter";
|
||||
const string AmpacheUrl::PARAM_ACTION = "action";
|
||||
|
||||
}
|
||||
diff -Naur ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache_url.h ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache_url.h
|
||||
--- ampache_browser-1.0.0-orig/src/data/providers/ampache/ampache_url.h 2017-07-26 17:44:25.000000001 +0200
|
||||
+++ ampache_browser-1.0-branch-20180408/src/data/providers/ampache/ampache_url.h 2018-04-08 00:28:22.310855717 +0200
|
||||
@@ -3,7 +3,7 @@
|
||||
// Project: Ampache Browser
|
||||
// License: GNU GPLv3
|
||||
//
|
||||
-// Copyright (C) 2015 - 2016 Róbert Čerňanský
|
||||
+// Copyright (C) 2015 - 2018 Róbert Čerňanský
|
||||
|
||||
|
||||
|
||||
@@ -39,6 +39,14 @@
|
||||
*/
|
||||
std::string parseIdValue() const;
|
||||
|
||||
+
|
||||
+ /**
|
||||
+ * @brief Gets value of parameter 'filter'.
|
||||
+ *
|
||||
+ * @return std::string
|
||||
+ */
|
||||
+ std::string parseFilterValue() const;
|
||||
+
|
||||
/**
|
||||
* @brief Gets value of parameter 'action'.
|
||||
*
|
||||
@@ -74,6 +82,7 @@
|
||||
static const std::string PARAM_SSID;
|
||||
static const std::string PARAM_AUTH;
|
||||
static const std::string PARAM_ID;
|
||||
+ static const std::string PARAM_FILTER;
|
||||
static const std::string PARAM_ACTION;
|
||||
|
||||
// arguments from the constructor
|
||||
|
|
@ -1,28 +1,24 @@
|
|||
# Force out of source build
|
||||
%undefine __cmake_in_source_build
|
||||
|
||||
Name: ampache_browser
|
||||
|
||||
# Lib and several dirs use this derived name. A change of this name
|
||||
# is likely to break API users due to not finding files any longer.
|
||||
%global vername %{name}_1
|
||||
|
||||
Version: 1.0.8
|
||||
Release: 4%{?dist}
|
||||
Version: 1.0.0
|
||||
Release: 3.20180408%{?dist}
|
||||
Summary: C++ and Qt based client library for Ampache access
|
||||
|
||||
License: GPL-3.0-only
|
||||
License: GPLv3
|
||||
URL: http://ampache-browser.org
|
||||
Source0: https://github.com/ampache-browser/ampache_browser/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
||||
# Source0: https://github.com/ampache-browser/ampache_browser/archive/v%{version}/%{name}-%{version}.tar.gz
|
||||
|
||||
# https://github.com/ampache-browser/ampache_browser/tree/v1.0
|
||||
Patch0: ampache_browser-1.0-branch-20180408.patch
|
||||
|
||||
BuildRequires: cmake
|
||||
BuildRequires: gcc-c++
|
||||
%if 0%{?fedora} || 0%{?rhel} >= 9
|
||||
BuildRequires: qt6-qtbase-devel
|
||||
%else
|
||||
BuildRequires: gcc-toolset-12
|
||||
BuildRequires: qt5-qtbase-devel
|
||||
%endif
|
||||
BuildRequires: qt5-devel
|
||||
|
||||
%description
|
||||
Ampache Browser is a library that implements desktop client access to
|
||||
|
|
@ -44,17 +40,12 @@ developing applications that use %{name}.
|
|||
|
||||
|
||||
%build
|
||||
%if 0%{?rhel} == 8
|
||||
. /opt/rh/gcc-toolset-12/enable
|
||||
%endif
|
||||
|
||||
%cmake %{?el8:-D USE_QT6=OFF} .
|
||||
%cmake_build
|
||||
%cmake .
|
||||
%make_build
|
||||
|
||||
|
||||
%install
|
||||
%cmake_install
|
||||
|
||||
%make_install
|
||||
find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
|
||||
|
||||
|
||||
|
|
@ -74,88 +65,6 @@ find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'
|
|||
%{_libdir}/cmake/%{vername}
|
||||
|
||||
%changelog
|
||||
* Fri Jan 16 2026 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.8-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_44_Mass_Rebuild
|
||||
|
||||
* Wed Jul 23 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.8-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild
|
||||
|
||||
* Thu Jan 16 2025 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.8-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild
|
||||
|
||||
* Wed Jan 1 2025 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.8-1
|
||||
- Update to 1.0.8.
|
||||
|
||||
* Mon Jul 29 2024 Miroslav Suchý <msuchy@redhat.com> - 1.0.7-6
|
||||
- convert license to SPDX
|
||||
|
||||
* Wed Jul 17 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.7-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
|
||||
|
||||
* Thu Jun 27 2024 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.7-4
|
||||
- Build with Qt 6.
|
||||
|
||||
* Mon Jan 22 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.7-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Fri Jan 19 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.7-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
|
||||
|
||||
* Sat Dec 30 2023 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.7-1
|
||||
- Update to 1.0.7.
|
||||
|
||||
* Sat Nov 4 2023 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.6-1
|
||||
- Update to 1.0.6 for Qt 6 support but build with USE_QT6=OFF.
|
||||
|
||||
* Wed Jul 19 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.4-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
|
||||
|
||||
* Wed Jan 18 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.4-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
|
||||
|
||||
* Sat Dec 10 2022 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.4-1
|
||||
- Update to 1.0.4 (no build needed, just a potential compilation fix).
|
||||
|
||||
* Wed Jul 20 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.3-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
* Wed Jan 19 2022 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.3-4
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
|
||||
|
||||
* Wed Jul 21 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.3-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
|
||||
|
||||
* Tue Jan 26 2021 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.3-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
|
||||
|
||||
* Tue Oct 6 2020 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.3-1
|
||||
- Update to 1.0.3 (only the GCC 10 fix).
|
||||
|
||||
* Mon Jul 27 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.2-7
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
|
||||
|
||||
* Tue Jun 23 2020 Robert Scheck <robert@fedoraproject.org> - 1.0.2-6
|
||||
- Added build-time conditionals for RHEL/CentOS 7 (#1846719)
|
||||
- Corrected build requirement from qt5-devel to qt5-qtbase-devel
|
||||
|
||||
* Tue Jan 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.2-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
|
||||
|
||||
* Sat Dec 14 2019 Jeff Law <law@redhat.com> - 1.0.2-4
|
||||
- Add missing #include for gcc-10
|
||||
|
||||
* Wed Jul 24 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.2-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
|
||||
|
||||
* Thu Jan 31 2019 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.2-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
|
||||
|
||||
* Sun Dec 30 2018 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.2-1
|
||||
- Update to 1.0.2.
|
||||
|
||||
* Thu Jul 12 2018 Fedora Release Engineering <releng@fedoraproject.org> - 1.0.0-4.20180408
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
|
||||
|
||||
* Sat Apr 7 2018 Michael Schwendt <mschwendt@fedoraproject.org> - 1.0.0-3.20180408
|
||||
- Merge fixes from v1.0 branch.
|
||||
- Replace ldconfig scriptlets with %%ldconfig_scriptlets macro.
|
||||
|
|
|
|||
2
sources
2
sources
|
|
@ -1 +1 @@
|
|||
SHA512 (ampache_browser-1.0.8.tar.gz) = 81bceb8eac5581bb2c0af8ef40a5fcb7c52d4b0a00417fe1a4976893d8748ba84d2f865bbc523723cd85d46ccd28adabaf8129fd798896b8c20246828678308d
|
||||
SHA512 (ampache_browser-1.0.0.tar.gz) = 9757052a98134177f185fb8214f64c72f601d27c0b5fc924b5ff0fdaac849e188c03f81b4806e14f97c102b1b74791813272aceed97b3f8a5ecfadc374ea0269
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue