audio/strawberry: new port of Qt5-based music player
...which is descended from clementine. PR: 246342 Submitted by: Daniel Menelkir <menelkir@itroll.org> (maintainer)
This commit is contained in:
parent
7b5a976e87
commit
629e77287b
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=535673
@ -770,6 +770,7 @@
|
|||||||
SUBDIR += stegosaurus-lv2
|
SUBDIR += stegosaurus-lv2
|
||||||
SUBDIR += stk
|
SUBDIR += stk
|
||||||
SUBDIR += stone-phaser-lv2
|
SUBDIR += stone-phaser-lv2
|
||||||
|
SUBDIR += strawberry
|
||||||
SUBDIR += streamripper
|
SUBDIR += streamripper
|
||||||
SUBDIR += streamtranscoder
|
SUBDIR += streamtranscoder
|
||||||
SUBDIR += string-machine-lv2
|
SUBDIR += string-machine-lv2
|
||||||
|
99
audio/strawberry/Makefile
Normal file
99
audio/strawberry/Makefile
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
PORTNAME= strawberry
|
||||||
|
DISTVERSION= 0.6.11
|
||||||
|
CATEGORIES= audio
|
||||||
|
MASTER_SITES= https://github.com/strawberrymusicplayer/${PORTNAME}/releases/download/${DISTVERSION}/ \
|
||||||
|
https://files.jkvinge.net/packages/strawberry/
|
||||||
|
|
||||||
|
MAINTAINER= menelkir@itroll.org
|
||||||
|
COMMENT= Fork of clementine with many features
|
||||||
|
|
||||||
|
LICENSE= GPLv3
|
||||||
|
LICENSE_FILE= ${WRKSRC}/COPYING
|
||||||
|
|
||||||
|
BUILD_DEPENDS= boost-libs>0:devel/boost-libs
|
||||||
|
LIB_DEPENDS= libgnutls.so:security/gnutls \
|
||||||
|
libprotobuf.so:devel/protobuf \
|
||||||
|
libtag.so:audio/taglib
|
||||||
|
TEST_DEPENDS= googletest>=0:devel/googletest
|
||||||
|
|
||||||
|
USES= compiler:c++11-lang cmake desktop-file-utils gnome \
|
||||||
|
gettext-runtime gettext-tools iconv pkgconfig \
|
||||||
|
qt:5 sqlite pkgconfig tar:xz xorg
|
||||||
|
|
||||||
|
USE_GNOME= glib20
|
||||||
|
USE_GSTREAMER1= yes
|
||||||
|
USE_QT= buildtools_build concurrent core dbus gui network \
|
||||||
|
linguisttools qmake_build sql testlib_build widgets x11extras
|
||||||
|
USE_XORG= ice sm x11 xcb xext
|
||||||
|
INSTALLS_ICONS= yes
|
||||||
|
|
||||||
|
CMAKE_ARGS= -DUSE_SYSTEM_TAGLIB=ON -DENABLE_UDISKS2=OFF -DENABLE_XINE=OFF \
|
||||||
|
-DENABLE_GSTREAMER:BOOL=true \
|
||||||
|
-DENABLE_TRANSLATIONS:BOOL=true
|
||||||
|
|
||||||
|
TEST_TARGET= strawberry_test
|
||||||
|
|
||||||
|
# NLS is not optional, as of 0.6.11,
|
||||||
|
# src/core/utilities.cpp always includes iconv.h and calls iconv_*().
|
||||||
|
|
||||||
|
# GSTREAMER is not optional, as of 0.6.11, disabling it kills the build on
|
||||||
|
# src/core/mainwindow.cpp:229:7:
|
||||||
|
# error: member initializer 'transcode_dialog_' does not name a non-static data member or base class
|
||||||
|
# transcode_dialog_([=]() {
|
||||||
|
|
||||||
|
OPTIONS_DEFINE= APPLEDEV AUDIOCD IPOD MOODBAR MTPDEV MUSICBRAINZ \
|
||||||
|
SUBSONIC TIDAL VLC
|
||||||
|
APPLEDEV_IMPLIES= IPOD
|
||||||
|
OPTIONS_DEFAULT= PULSEAUDIO
|
||||||
|
|
||||||
|
BACKEND_DESC= Multimedia backend(s)
|
||||||
|
|
||||||
|
OPTIONS_MULTI= SOUND
|
||||||
|
OPTIONS_MULTI_SOUND= ALSA PULSEAUDIO
|
||||||
|
|
||||||
|
APPLEDEV_DESC= Enable support for more recent Apple devices
|
||||||
|
AUDIOCD_DESC= Enable support for Audio CDs
|
||||||
|
IPOD_DESC= Enable support for iPod Classic
|
||||||
|
MOODBAR_DESC= Enable moodbar
|
||||||
|
MTPDEV_DESC= Enable support for Media Transport Protocol
|
||||||
|
MUSICBRAINZ_DESC= Enable tag fetching from MusicBrainz
|
||||||
|
SUBSONIC_DESC= Enable support for Subsonic music streamer
|
||||||
|
TIDAL_DESC= Enable support for TIDAL music service
|
||||||
|
VLC_DESC= Multimedia support via (lib)vlc
|
||||||
|
|
||||||
|
APPLEDEV_CMAKE_BOOL= ENABLE_IMOBILEDEVICE
|
||||||
|
APPLEDEV_LIB_DEPENDS= libimobiledevice.so:comms/libimobiledevice \
|
||||||
|
libplist.so:devel/libplist \
|
||||||
|
libusbmuxd.so:comms/libusbmuxd
|
||||||
|
|
||||||
|
ALSA_CMAKE_BOOL= ENABLE_ALSA
|
||||||
|
ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib
|
||||||
|
|
||||||
|
AUDIOCD_CMAKE_BOOL= ENABLE_AUDIOCD
|
||||||
|
AUDIOCD_LIB_DEPENDS= libcdio.so:sysutils/libcdio
|
||||||
|
|
||||||
|
IPOD_CMAKE_BOOL= ENABLE_LIBGPOD
|
||||||
|
IPOD_LIB_DEPENDS= libgpod.so:audio/libgpod
|
||||||
|
|
||||||
|
MTPDEV_CMAKE_BOOL= ENABLE_LIBMTP
|
||||||
|
MTPDEV_LIB_DEPENDS= libmtp.so:multimedia/libmtp
|
||||||
|
|
||||||
|
MOODBAR_CMAKE_BOOL= ENABLE_MOODBAR
|
||||||
|
MOODBAR_LIB_DEPENDS= libfftw3.so:math/fftw3
|
||||||
|
|
||||||
|
MUSICBRAINZ_CMAKE_BOOL= ENABLE_CHROMAPRINT
|
||||||
|
MUSICBRAINZ_LIB_DEPENDS= libchromaprint.so:audio/chromaprint
|
||||||
|
|
||||||
|
PULSEAUDIO_CMAKE_BOOL= ENABLE_LIBPULSE
|
||||||
|
PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio
|
||||||
|
|
||||||
|
SUBSONIC_CMAKE_BOOL= ENABLE_SUBSONIC
|
||||||
|
|
||||||
|
TIDAL_CMAKE_BOOL= ENABLE_TIDAL
|
||||||
|
|
||||||
|
VLC_CMAKE_BOOL= ENABLE_VLC
|
||||||
|
VLC_LIB_DEPENDS= libvlc.so:multimedia/vlc
|
||||||
|
|
||||||
|
.include <bsd.port.mk>
|
3
audio/strawberry/distinfo
Normal file
3
audio/strawberry/distinfo
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
TIMESTAMP = 1589641083
|
||||||
|
SHA256 (strawberry-0.6.11.tar.xz) = 84b71b33b5f80b7e86682e49f15289c2c00ab89d47e3722f762dda0d6965a201
|
||||||
|
SIZE (strawberry-0.6.11.tar.xz) = 9295808
|
@ -0,0 +1,84 @@
|
|||||||
|
--- src/collection/collectionmodel.cpp.orig 2020-05-16 18:39:26 UTC
|
||||||
|
+++ src/collection/collectionmodel.cpp
|
||||||
|
@@ -119,12 +119,14 @@ CollectionModel::CollectionModel(CollectionBackend *ba
|
||||||
|
}
|
||||||
|
|
||||||
|
QIcon nocover = IconLoader::Load("cdcase");
|
||||||
|
- no_cover_icon_ = nocover.pixmap(nocover.availableSizes().last()).scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
- //no_cover_icon_ = QPixmap(":/pictures/noalbumart.png").scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
+ if (!nocover.isNull()) {
|
||||||
|
+ no_cover_icon_ = nocover.pixmap(nocover.availableSizes().last()).scaled(kPrettyCoverSize, kPrettyCoverSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (sIconCache == nullptr) {
|
||||||
|
+ if (app_ && !sIconCache) {
|
||||||
|
sIconCache = new QNetworkDiskCache(this);
|
||||||
|
sIconCache->setCacheDirectory(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/" + kPixmapDiskCacheDir);
|
||||||
|
+ connect(app_, SIGNAL(ClearPixmapDiskCache()), SLOT(ClearDiskCache()));
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(backend_, SIGNAL(SongsDiscovered(SongList)), SLOT(SongsDiscovered(SongList)));
|
||||||
|
@@ -139,8 +141,6 @@ CollectionModel::CollectionModel(CollectionBackend *ba
|
||||||
|
backend_->UpdateTotalArtistCountAsync();
|
||||||
|
backend_->UpdateTotalAlbumCountAsync();
|
||||||
|
|
||||||
|
- connect(app_, SIGNAL(ClearPixmapDiskCache()), SLOT(ClearDiskCache()));
|
||||||
|
-
|
||||||
|
ReloadSettings();
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -189,7 +189,9 @@ void CollectionModel::ReloadSettings() {
|
||||||
|
|
||||||
|
QPixmapCache::setCacheLimit(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsCacheSize, CollectionSettingsPage::kSettingsCacheSizeUnit, CollectionSettingsPage::kSettingsCacheSizeDefault) / 1024);
|
||||||
|
|
||||||
|
- sIconCache->setMaximumCacheSize(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsDiskCacheSize, CollectionSettingsPage::kSettingsDiskCacheSizeUnit, CollectionSettingsPage::kSettingsDiskCacheSizeDefault));
|
||||||
|
+ if (sIconCache) {
|
||||||
|
+ sIconCache->setMaximumCacheSize(MaximumCacheSize(&s, CollectionSettingsPage::kSettingsDiskCacheSize, CollectionSettingsPage::kSettingsDiskCacheSizeUnit, CollectionSettingsPage::kSettingsDiskCacheSizeDefault));
|
||||||
|
+ }
|
||||||
|
|
||||||
|
s.endGroup();
|
||||||
|
|
||||||
|
@@ -510,7 +512,7 @@ void CollectionModel::SongsDeleted(const SongList &son
|
||||||
|
// Remove from pixmap cache
|
||||||
|
const QString cache_key = AlbumIconPixmapCacheKey(ItemToIndex(node));
|
||||||
|
QPixmapCache::remove(cache_key);
|
||||||
|
- if (use_disk_cache_) sIconCache->remove(QUrl(cache_key));
|
||||||
|
+ if (use_disk_cache_ && sIconCache) sIconCache->remove(QUrl(cache_key));
|
||||||
|
if (pending_cache_keys_.contains(cache_key)) {
|
||||||
|
pending_cache_keys_.remove(cache_key);
|
||||||
|
}
|
||||||
|
@@ -585,7 +587,7 @@ QVariant CollectionModel::AlbumIcon(const QModelIndex
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try to load it from the disk cache
|
||||||
|
- if (use_disk_cache_) {
|
||||||
|
+ if (use_disk_cache_ && sIconCache) {
|
||||||
|
std::unique_ptr<QIODevice> cache(sIconCache->data(QUrl(cache_key)));
|
||||||
|
if (cache) {
|
||||||
|
QImage cached_image;
|
||||||
|
@@ -637,7 +639,7 @@ void CollectionModel::AlbumCoverLoaded(const quint64 i
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have a valid cover not already in the disk cache
|
||||||
|
- if (use_disk_cache_) {
|
||||||
|
+ if (use_disk_cache_ && sIconCache) {
|
||||||
|
std::unique_ptr<QIODevice> cached_img(sIconCache->data(QUrl(cache_key)));
|
||||||
|
if (!cached_img && !result.image_scaled.isNull()) {
|
||||||
|
QNetworkCacheMetaData item_metadata;
|
||||||
|
@@ -1556,6 +1558,7 @@ int CollectionModel::MaximumCacheSize(QSettings *s, co
|
||||||
|
} while (unit > 0);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
void CollectionModel::GetChildSongs(CollectionItem *item, QList<QUrl> *urls, SongList *songs, QSet<int> *song_ids) const {
|
||||||
|
@@ -1686,7 +1689,7 @@ void CollectionModel::TotalAlbumCountUpdatedSlot(const
|
||||||
|
}
|
||||||
|
|
||||||
|
void CollectionModel::ClearDiskCache() {
|
||||||
|
- sIconCache->clear();
|
||||||
|
+ if (sIconCache) sIconCache->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
QDataStream &operator<<(QDataStream &s, const CollectionModel::Grouping &g) {
|
33
audio/strawberry/files/patch-src_organise_organiseformat.cpp
Normal file
33
audio/strawberry/files/patch-src_organise_organiseformat.cpp
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
--- src/organise/organiseformat.cpp.orig 2020-04-27 23:42:16 UTC
|
||||||
|
+++ src/organise/organiseformat.cpp
|
||||||
|
@@ -35,6 +35,7 @@
|
||||||
|
#include <QPalette>
|
||||||
|
#include <QValidator>
|
||||||
|
#include <QTextEdit>
|
||||||
|
+#include <QTextDocument>
|
||||||
|
#include <QTextFormat>
|
||||||
|
|
||||||
|
#include "core/arraysize.h"
|
||||||
|
@@ -44,8 +45,6 @@
|
||||||
|
|
||||||
|
#include "organiseformat.h"
|
||||||
|
|
||||||
|
-class QTextDocument;
|
||||||
|
-
|
||||||
|
const char *OrganiseFormat::kTagPattern = "\\%([a-zA-Z]*)";
|
||||||
|
const char *OrganiseFormat::kBlockPattern = "\\{([^{}]+)\\}";
|
||||||
|
const QStringList OrganiseFormat::kKnownTags = QStringList() << "title"
|
||||||
|
@@ -145,7 +144,12 @@ QString OrganiseFormat::GetFilenameForSong(const Song
|
||||||
|
|
||||||
|
QFileInfo info(filename);
|
||||||
|
QString extension = info.suffix();
|
||||||
|
- QString filepath = info.path() + "/" + info.completeBaseName();
|
||||||
|
+ QString filepath;
|
||||||
|
+ if (!info.path().isEmpty() && info.path() != ".") {
|
||||||
|
+ filepath.append(info.path());
|
||||||
|
+ filepath.append("/");
|
||||||
|
+ }
|
||||||
|
+ filepath.append(info.completeBaseName());
|
||||||
|
|
||||||
|
// Fix any parts of the path that start with dots.
|
||||||
|
QStringList parts_old = filepath.split("/");
|
10
audio/strawberry/files/patch-tests_CMakeLists.txt
Normal file
10
audio/strawberry/files/patch-tests_CMakeLists.txt
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
--- tests/CMakeLists.txt.orig 2020-04-27 23:42:17 UTC
|
||||||
|
+++ tests/CMakeLists.txt
|
||||||
|
@@ -87,7 +87,6 @@ if(Qt5Test_FOUND AND GTEST_FOUND AND GMOCK_LIBRARY)
|
||||||
|
add_test_file(src/song_test.cpp false)
|
||||||
|
add_test_file(src/collectionbackend_test.cpp false)
|
||||||
|
add_test_file(src/collectionmodel_test.cpp true)
|
||||||
|
- add_test_file(src/playlist_test.cpp true)
|
||||||
|
add_test_file(src/songplaylistitem_test.cpp false)
|
||||||
|
add_test_file(src/organiseformat_test.cpp false)
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
--- tests/src/collectionmodel_test.cpp.orig 2020-04-27 23:42:17 UTC
|
||||||
|
+++ tests/src/collectionmodel_test.cpp
|
||||||
|
@@ -75,6 +75,8 @@ class CollectionModelTest : public ::testing::Test {
|
||||||
|
Song AddSong(const QString& title, const QString& artist, const QString& album, int length) {
|
||||||
|
Song song;
|
||||||
|
song.Init(title, artist, album, length);
|
||||||
|
+ song.set_mtime(0);
|
||||||
|
+ song.set_ctime(0);
|
||||||
|
return AddSong(song);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -111,6 +113,8 @@ TEST_F(CollectionModelTest, CompilationAlbums) {
|
||||||
|
Song song;
|
||||||
|
song.Init("Title", "Artist", "Album", 123);
|
||||||
|
song.set_compilation(true);
|
||||||
|
+ song.set_mtime(0);
|
||||||
|
+ song.set_ctime(0);
|
||||||
|
|
||||||
|
AddSong(song);
|
||||||
|
model_->Init(false);
|
||||||
|
@@ -200,6 +204,8 @@ TEST_F(CollectionModelTest, VariousArtistSongs) {
|
||||||
|
QString n = QString::number(i+1);
|
||||||
|
Song song;
|
||||||
|
song.Init("Title " + n, "Artist " + n, "Album", 0);
|
||||||
|
+ song.set_mtime(0);
|
||||||
|
+ song.set_ctime(0);
|
||||||
|
songs << song;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,24 @@
|
|||||||
|
--- tests/src/organiseformat_test.cpp.orig 2019-06-29 18:18:34 UTC
|
||||||
|
+++ tests/src/organiseformat_test.cpp
|
||||||
|
@@ -59,6 +59,7 @@ TEST_F(OrganiseFormatTest, BasicReplace) {
|
||||||
|
format_.set_format("%album %albumartist %artist %bitrate %comment %composer %performer %grouping %disc %genre %length %samplerate %bitdepth %title %track %year");
|
||||||
|
|
||||||
|
ASSERT_TRUE(format_.IsValid());
|
||||||
|
+
|
||||||
|
EXPECT_EQ("album_albumartist_artist_123_comment_composer_performer_grouping_789_genre_987_654_32_title_321_2010", format_.GetFilenameForSong(song_));
|
||||||
|
|
||||||
|
}
|
||||||
|
@@ -135,11 +136,12 @@ TEST_F(OrganiseFormatTest, ReplaceNonAscii) {
|
||||||
|
|
||||||
|
format_.set_remove_non_ascii(false);
|
||||||
|
EXPECT_EQ(QString::fromUtf8("Röyksopp"), format_.GetFilenameForSong(song_));
|
||||||
|
+
|
||||||
|
format_.set_remove_non_ascii(true);
|
||||||
|
EXPECT_EQ("Royksopp", format_.GetFilenameForSong(song_));
|
||||||
|
|
||||||
|
song_.set_artist(QString::fromUtf8("Владимир Высоцкий"));
|
||||||
|
- EXPECT_EQ("_________________", format_.GetFilenameForSong(song_));
|
||||||
|
+ EXPECT_EQ("????????_????????", format_.GetFilenameForSong(song_));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
31
audio/strawberry/files/patch-tests_src_playlist__test.cpp
Normal file
31
audio/strawberry/files/patch-tests_src_playlist__test.cpp
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
--- tests/src/playlist_test.cpp.orig 2020-04-27 23:42:17 UTC
|
||||||
|
+++ tests/src/playlist_test.cpp
|
||||||
|
@@ -53,15 +53,15 @@ class PlaylistTest : public ::testing::Test {
|
||||||
|
Song metadata;
|
||||||
|
metadata.Init(title, artist, album, length);
|
||||||
|
|
||||||
|
- //MockPlaylistItem* ret = new MockPlaylistItem;
|
||||||
|
+ MockPlaylistItem *ret = new MockPlaylistItem;
|
||||||
|
//EXPECT_CALL(*ret, Metadata()).WillRepeatedly(Return(metadata));
|
||||||
|
|
||||||
|
- //return ret;
|
||||||
|
+ return ret;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
- std::shared_ptr<PlaylistItem> MakeMockItemP(const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const {
|
||||||
|
- return std::shared_ptr<PlaylistItem>(MakeMockItem(title, artist, album, length));
|
||||||
|
+ PlaylistItemPtr MakeMockItemP(const QString& title, const QString& artist = QString(), const QString& album = QString(), int length = 123) const {
|
||||||
|
+ return PlaylistItemPtr(MakeMockItem(title, artist, album, length));
|
||||||
|
}
|
||||||
|
|
||||||
|
Playlist playlist_;
|
||||||
|
@@ -76,7 +76,7 @@ TEST_F(PlaylistTest, Basic) {
|
||||||
|
TEST_F(PlaylistTest, InsertItems) {
|
||||||
|
|
||||||
|
MockPlaylistItem* item = MakeMockItem("Title", "Artist", "Album", 123);
|
||||||
|
- std::shared_ptr<PlaylistItem> item_ptr(item);
|
||||||
|
+ PlaylistItemPtr item_ptr(item);
|
||||||
|
|
||||||
|
// Insert the item
|
||||||
|
EXPECT_EQ(0, playlist_.rowCount(QModelIndex()));
|
3
audio/strawberry/pkg-descr
Normal file
3
audio/strawberry/pkg-descr
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Strawberry is a fork of clementine with many features.
|
||||||
|
|
||||||
|
WWW: https://www.strawberrymusicplayer.org/
|
9
audio/strawberry/pkg-plist
Normal file
9
audio/strawberry/pkg-plist
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
bin/strawberry
|
||||||
|
bin/strawberry-tagreader
|
||||||
|
share/applications/org.strawberrymusicplayer.strawberry.desktop
|
||||||
|
share/icons/hicolor/128x128/apps/strawberry.png
|
||||||
|
share/icons/hicolor/48x48/apps/strawberry.png
|
||||||
|
share/icons/hicolor/64x64/apps/strawberry.png
|
||||||
|
share/man/man1/strawberry-tagreader.1.gz
|
||||||
|
share/man/man1/strawberry.1.gz
|
||||||
|
share/metainfo/org.strawberrymusicplayer.strawberry.appdata.xml
|
Loading…
Reference in New Issue
Block a user