Compare commits

...

7 Commits

Author SHA1 Message Date
Jonas Kvinge
fac323a4a5 Release 1.2.1 2024-11-21 16:05:21 +01:00
Jonas Kvinge
a26066d70f Disconnect tagreader reply metaobject connection in lambda
Otherwise the tagreader reply is deleted to early causing crashes.
2024-11-21 15:59:07 +01:00
Strawberry Bot
d500d38e63 Update translations 2024-11-20 19:10:59 +01:00
Jonas Kvinge
295d4d9d05 Update strawberry_en_US.ts 2024-11-20 19:09:45 +01:00
Jonas Kvinge
01aaa0ba0b Disable SPMediaKeyTap
Workaround issue #1606
2024-11-20 18:12:20 +01:00
Jonas Kvinge
7b23118475 BehaviourSettingsPage: Disable song progress on taskbar for macOS 2024-11-19 06:52:23 +01:00
Jonas Kvinge
0c7806ab0a Turn on git revision 2024-11-17 07:34:18 +01:00
19 changed files with 418 additions and 465 deletions

View File

@@ -271,9 +271,9 @@ else()
add_definitions(-DKDSINGLEAPPLICATION_STATIC_BUILD) add_definitions(-DKDSINGLEAPPLICATION_STATIC_BUILD)
endif() endif()
if(APPLE) # if(APPLE)
find_package(SPMediaKeyTap REQUIRED) # find_package(SPMediaKeyTap REQUIRED)
endif() # endif()
if(WIN32) if(WIN32)
find_package(getopt-win REQUIRED) find_package(getopt-win REQUIRED)
@@ -1537,7 +1537,6 @@ if(APPLE)
"-framework DiskArbitration" "-framework DiskArbitration"
"-framework IOKit" "-framework IOKit"
"-framework ScriptingBridge" "-framework ScriptingBridge"
SPMediaKeyTap
) )
endif() endif()

View File

@@ -2,7 +2,7 @@ Strawberry Music Player
======================= =======================
ChangeLog ChangeLog
Version 1.2.1-rc1 (2024.11.16): Version 1.2.1 (2024.11.21):
This release features major restructuring of the codebase, moving source files, This release features major restructuring of the codebase, moving source files,
rewriting CMake build files, dropping Qt 5 support, external tagreader, rewriting CMake build files, dropping Qt 5 support, external tagreader,
@@ -19,6 +19,8 @@ and dropping some unmaintained parts such as VLC.
* Fixed crash when enabling Tidal, Spotify, Qobuz or Subsonic services. * Fixed crash when enabling Tidal, Spotify, Qobuz or Subsonic services.
* Fixed passing filenames to strawberry on command line not resolving to absolute paths. * Fixed passing filenames to strawberry on command line not resolving to absolute paths.
* (macOS) Fixed program not starting for users with long usernames. * (macOS) Fixed program not starting for users with long usernames.
* (macoS) Fixed crash when pressing caps lock (#1606).
* (macOS) Remove "song progress on taskbar" option in behaviour settings.
Enhancements: Enhancements:

View File

@@ -1,7 +1,7 @@
set(STRAWBERRY_VERSION_MAJOR 1) set(STRAWBERRY_VERSION_MAJOR 1)
set(STRAWBERRY_VERSION_MINOR 2) set(STRAWBERRY_VERSION_MINOR 2)
set(STRAWBERRY_VERSION_PATCH 1) set(STRAWBERRY_VERSION_PATCH 1)
set(STRAWBERRY_VERSION_PRERELEASE rc1) #set(STRAWBERRY_VERSION_PRERELEASE rc1)
set(INCLUDE_GIT_REVISION OFF) set(INCLUDE_GIT_REVISION OFF)

View File

@@ -51,6 +51,7 @@
</screenshots> </screenshots>
<update_contact>eclipseo@fedoraproject.org</update_contact> <update_contact>eclipseo@fedoraproject.org</update_contact>
<releases> <releases>
<release version="1.2.1" date="2024-11-21"/>
<release version="1.1.3" date="2024-09-21"/> <release version="1.1.3" date="2024-09-21"/>
<release version="1.1.2" date="2024-09-12"/> <release version="1.1.2" date="2024-09-12"/>
<release version="1.1.1" date="2024-07-22"/> <release version="1.1.1" date="2024-07-22"/>

View File

@@ -41,7 +41,7 @@
#import <QuartzCore/CALayer.h> #import <QuartzCore/CALayer.h>
#import <SPMediaKeyTap.h> //#import <SPMediaKeyTap.h>
#include "config.h" #include "config.h"
@@ -145,18 +145,18 @@ QDebug operator<<(QDebug dbg, NSObject *object) {
[[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; [[NSAppleEventManager sharedAppleEventManager] setEventHandler:self andSelector:@selector(handleURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];
key_tap_ = [[SPMediaKeyTap alloc] initWithDelegate:self]; // key_tap_ = [[SPMediaKeyTap alloc] initWithDelegate:self];
if ([SPMediaKeyTap usesGlobalMediaKeyTap]) { // if ([SPMediaKeyTap usesGlobalMediaKeyTap]) {
if ([key_tap_ startWatchingMediaKeys]) { // if ([key_tap_ startWatchingMediaKeys]) {
qLog(Debug) << "Media key monitoring started"; // qLog(Debug) << "Media key monitoring started";
} // }
else { // else {
qLog(Warning) << "Failed to start media key monitoring"; // qLog(Warning) << "Failed to start media key monitoring";
} // }
} // }
else { // else {
qLog(Warning) << "Media key monitoring disabled"; // qLog(Warning) << "Media key monitoring disabled";
} // }
} }
@@ -192,10 +192,10 @@ QDebug operator<<(QDebug dbg, NSObject *object) {
} }
- (void) mediaKeyTap: (SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event { // - (void) mediaKeyTap: (SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event {
#pragma unused(keyTap) // #pragma unused(keyTap)
[self handleMediaEvent:event]; // [self handleMediaEvent:event];
} // }
- (BOOL) handleMediaEvent:(NSEvent*)event { - (BOOL) handleMediaEvent:(NSEvent*)event {
// if it is not a media key event, then ignore // if it is not a media key event, then ignore

View File

@@ -2197,7 +2197,11 @@ void MainWindow::RenumberTracks() {
song.set_track(track); song.set_track(track);
TagReaderReplyPtr reply = app_->tagreader_client()->WriteFileAsync(song.url().toLocalFile(), song); TagReaderReplyPtr reply = app_->tagreader_client()->WriteFileAsync(song.url().toLocalFile(), song);
QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index); QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index);
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index]() { SongSaveComplete(reply, persistent_index); }, Qt::QueuedConnection); SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index, connection]() {
SongSaveComplete(reply, persistent_index);
QObject::disconnect(*connection);
}, Qt::QueuedConnection);
} }
++track; ++track;
} }
@@ -2228,7 +2232,11 @@ void MainWindow::SelectionSetValue() {
if (song.url().isLocalFile() && Playlist::set_column_value(song, column, column_value)) { if (song.url().isLocalFile() && Playlist::set_column_value(song, column, column_value)) {
TagReaderReplyPtr reply = app_->tagreader_client()->WriteFileAsync(song.url().toLocalFile(), song); TagReaderReplyPtr reply = app_->tagreader_client()->WriteFileAsync(song.url().toLocalFile(), song);
QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index); QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index);
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index]() { SongSaveComplete(reply, persistent_index); }, Qt::QueuedConnection); SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index, connection]() {
SongSaveComplete(reply, persistent_index);
QObject::disconnect(*connection);
}, Qt::QueuedConnection);
} }
else if (song.source() == Song::Source::Stream) { else if (song.source() == Song::Source::Stream) {
app_->playlist_manager()->current()->setData(source_index, column_value, 0); app_->playlist_manager()->current()->setData(source_index, column_value, 0);

View File

@@ -22,6 +22,7 @@
#include "config.h" #include "config.h"
#include <utility> #include <utility>
#include <memory>
#include <QtGlobal> #include <QtGlobal>
#include <QGuiApplication> #include <QGuiApplication>
@@ -79,6 +80,7 @@
#include "coverfromurldialog.h" #include "coverfromurldialog.h"
#include "currentalbumcoverloader.h" #include "currentalbumcoverloader.h"
using std::make_shared;
using namespace Qt::Literals::StringLiterals; using namespace Qt::Literals::StringLiterals;
QSet<QString> *AlbumCoverChoiceController::sImageExtensions = nullptr; QSet<QString> *AlbumCoverChoiceController::sImageExtensions = nullptr;
@@ -743,7 +745,11 @@ void AlbumCoverChoiceController::SaveCoverEmbeddedToSong(const Song &song, const
cover_save_tasks_.append(song); cover_save_tasks_.append(song);
const bool art_embedded = !image_data.isNull(); const bool art_embedded = !image_data.isNull();
TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(song.url().toLocalFile(), SaveTagCoverData(cover_filename, image_data, mime_type)); TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(song.url().toLocalFile(), SaveTagCoverData(cover_filename, image_data, mime_type));
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, song, art_embedded]() { SaveEmbeddedCoverFinished(reply, song, art_embedded); }); SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, song, art_embedded, connection]() {
SaveEmbeddedCoverFinished(reply, song, art_embedded);
QObject::disconnect(*connection);
});
} }

View File

@@ -24,6 +24,7 @@
#include <algorithm> #include <algorithm>
#include <utility> #include <utility>
#include <chrono> #include <chrono>
#include <memory>
#include <QObject> #include <QObject>
#include <QMainWindow> #include <QMainWindow>
@@ -96,6 +97,7 @@
using namespace std::literals::chrono_literals; using namespace std::literals::chrono_literals;
using namespace Qt::Literals::StringLiterals; using namespace Qt::Literals::StringLiterals;
using std::make_shared;
namespace { namespace {
constexpr char kSettingsGroup[] = "CoverManager"; constexpr char kSettingsGroup[] = "CoverManager";
@@ -855,8 +857,10 @@ void AlbumCoverManager::SaveImageToAlbums(Song *song, const AlbumCoverImageResul
for (const QUrl &url : std::as_const(album_item->urls)) { for (const QUrl &url : std::as_const(album_item->urls)) {
const bool art_embedded = !result.image_data.isEmpty(); const bool art_embedded = !result.image_data.isEmpty();
TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(url.toLocalFile(), SaveTagCoverData(result.image_data, result.mime_type)); TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(url.toLocalFile(), SaveTagCoverData(result.image_data, result.mime_type));
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, album_item, url, art_embedded]() { SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, album_item, url, art_embedded, connection]() {
SaveEmbeddedCoverFinished(reply, album_item, url, art_embedded); SaveEmbeddedCoverFinished(reply, album_item, url, art_embedded);
QObject::disconnect(*connection);
}); });
cover_save_tasks_.insert(album_item, url); cover_save_tasks_.insert(album_item, url);
} }
@@ -1005,8 +1009,10 @@ void AlbumCoverManager::SaveAndSetCover(AlbumItem *album_item, const AlbumCoverI
for (const QUrl &url : urls) { for (const QUrl &url : urls) {
const bool art_embedded = !result.image_data.isEmpty(); const bool art_embedded = !result.image_data.isEmpty();
TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(url.toLocalFile(), SaveTagCoverData(result.cover_url.isValid() ? result.cover_url.toLocalFile() : QString(), result.image_data, result.mime_type)); TagReaderReplyPtr reply = tagreader_client_->SaveCoverAsync(url.toLocalFile(), SaveTagCoverData(result.cover_url.isValid() ? result.cover_url.toLocalFile() : QString(), result.image_data, result.mime_type));
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, album_item, url, art_embedded]() { SharedPtr<QMetaObject::Connection> connection = std::make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, album_item, url, art_embedded, connection]() {
SaveEmbeddedCoverFinished(reply, album_item, url, art_embedded); SaveEmbeddedCoverFinished(reply, album_item, url, art_embedded);
QObject::disconnect(*connection);
}); });
cover_save_tasks_.insert(album_item, url); cover_save_tasks_.insert(album_item, url);
} }

View File

@@ -26,6 +26,7 @@
#include <functional> #include <functional>
#include <iterator> #include <iterator>
#include <limits> #include <limits>
#include <memory>
#include <QtGlobal> #include <QtGlobal>
#include <QtConcurrentRun> #include <QtConcurrentRun>
@@ -99,6 +100,7 @@
#include "edittagdialog.h" #include "edittagdialog.h"
#include "ui_edittagdialog.h" #include "ui_edittagdialog.h"
using std::make_shared;
using namespace Qt::Literals::StringLiterals; using namespace Qt::Literals::StringLiterals;
namespace { namespace {
@@ -1311,7 +1313,11 @@ void EditTagDialog::SaveData() {
save_tags_options |= TagReaderClient::SaveOption::Cover; save_tags_options |= TagReaderClient::SaveOption::Cover;
} }
TagReaderReplyPtr reply = tagreader_client_->WriteFileAsync(ref.current_.url().toLocalFile(), ref.current_, save_tags_options, save_tag_cover_data); TagReaderReplyPtr reply = tagreader_client_->WriteFileAsync(ref.current_.url().toLocalFile(), ref.current_, save_tags_options, save_tag_cover_data);
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, ref]() { SongSaveTagsComplete(reply, ref.current_.url().toLocalFile(), ref.current_, ref.cover_action_); }, Qt::QueuedConnection); SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, ref, connection]() {
SongSaveTagsComplete(reply, ref.current_.url().toLocalFile(), ref.current_, ref.cover_action_);
QObject::disconnect(*connection);
}, Qt::QueuedConnection);
} }
// If the cover was changed, but no tags written, make sure to update the collection. // If the cover was changed, but no tags written, make sure to update the collection.
else if (ref.cover_action_ != UpdateCoverAction::None && !ref.current_.effective_albumartist().isEmpty() && !ref.current_.album().isEmpty()) { else if (ref.cover_action_ != UpdateCoverAction::None && !ref.current_.effective_albumartist().isEmpty() && !ref.current_.album().isEmpty()) {

View File

@@ -4,13 +4,13 @@
#include "globalshortcuts/globalshortcutsbackend-macos.h" #include "globalshortcuts/globalshortcutsbackend-macos.h"
class PlatformInterface; class PlatformInterface;
@class SPMediaKeyTap; //@class SPMediaKeyTap;
@interface AppDelegate : NSObject<NSApplicationDelegate, NSUserNotificationCenterDelegate> { @interface AppDelegate : NSObject<NSApplicationDelegate, NSUserNotificationCenterDelegate> {
PlatformInterface *application_handler_; PlatformInterface *application_handler_;
NSMenu *dock_menu_; NSMenu *dock_menu_;
GlobalShortcutsBackendMacOS *shortcut_handler_; GlobalShortcutsBackendMacOS *shortcut_handler_;
SPMediaKeyTap *key_tap_; //SPMediaKeyTap *key_tap_;
} }
@@ -29,5 +29,5 @@ class PlatformInterface;
- (void) setDockMenu: (NSMenu*)menu; - (void) setDockMenu: (NSMenu*)menu;
- (GlobalShortcutsBackendMacOS*) shortcut_handler; - (GlobalShortcutsBackendMacOS*) shortcut_handler;
- (void) setShortcutHandler: (GlobalShortcutsBackendMacOS*)backend; - (void) setShortcutHandler: (GlobalShortcutsBackendMacOS*)backend;
- (void) mediaKeyTap: (SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event; //- (void) mediaKeyTap: (SPMediaKeyTap*)keyTap receivedMediaKeyEvent:(NSEvent*)event;
@end @end

View File

@@ -434,7 +434,11 @@ bool Playlist::setData(const QModelIndex &idx, const QVariant &value, const int
if (song.url().isLocalFile()) { if (song.url().isLocalFile()) {
TagReaderReplyPtr reply = tagreader_client_->WriteFileAsync(song.url().toLocalFile(), song); TagReaderReplyPtr reply = tagreader_client_->WriteFileAsync(song.url().toLocalFile(), song);
QPersistentModelIndex persistent_index = QPersistentModelIndex(idx); QPersistentModelIndex persistent_index = QPersistentModelIndex(idx);
QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index, item]() { SongSaveComplete(reply, persistent_index, item->OriginalMetadata()); }, Qt::QueuedConnection); SharedPtr<QMetaObject::Connection> connection = make_shared<QMetaObject::Connection>();
*connection = QObject::connect(&*reply, &TagReaderReply::Finished, this, [this, reply, persistent_index, item, connection]() {
SongSaveComplete(reply, persistent_index, item->OriginalMetadata());
QObject::disconnect(*connection);
}, Qt::QueuedConnection);
} }
else if (song.is_radio()) { else if (song.is_radio()) {
item->SetMetadata(song); item->SetMetadata(song);

View File

@@ -72,10 +72,10 @@ BehaviourSettingsPage::BehaviourSettingsPage(SettingsDialog *dialog, QWidget *pa
ui_->checkbox_showtrayicon->hide(); ui_->checkbox_showtrayicon->hide();
ui_->checkbox_trayicon_progress->hide(); ui_->checkbox_trayicon_progress->hide();
ui_->groupbox_startup->hide(); ui_->groupbox_startup->hide();
#else #endif
# ifndef HAVE_DBUS
#if !defined(HAVE_DBUS) || defined(Q_OS_MACOS)
ui_->checkbox_taskbar_progress->hide(); ui_->checkbox_taskbar_progress->hide();
# endif
#endif #endif
#ifdef HAVE_TRANSLATIONS #ifdef HAVE_TRANSLATIONS
@@ -161,9 +161,10 @@ void BehaviourSettingsPage::Load() {
ui_->checkbox_trayicon_progress->setEnabled(systemtray_available && ui_->checkbox_showtrayicon->isChecked()); ui_->checkbox_trayicon_progress->setEnabled(systemtray_available && ui_->checkbox_showtrayicon->isChecked());
ui_->checkbox_trayicon_progress->setChecked(systemtray_available && ui_->checkbox_showtrayicon->isChecked() && s.value(kTrayIconProgress, false).toBool()); ui_->checkbox_trayicon_progress->setChecked(systemtray_available && ui_->checkbox_showtrayicon->isChecked() && s.value(kTrayIconProgress, false).toBool());
ui_->radiobutton_hide->setEnabled(systemtray_available && ui_->checkbox_showtrayicon->isChecked()); ui_->radiobutton_hide->setEnabled(systemtray_available && ui_->checkbox_showtrayicon->isChecked());
#ifdef HAVE_DBUS
ui_->checkbox_taskbar_progress->setChecked(s.value(kTaskbarProgress, true).toBool());
#endif #endif
#if defined(HAVE_DBUS) && !defined(Q_OS_MACOS)
ui_->checkbox_taskbar_progress->setChecked(s.value(kTaskbarProgress, true).toBool());
#endif #endif
ui_->checkbox_resumeplayback->setChecked(s.value(kResumePlayback, false).toBool()); ui_->checkbox_resumeplayback->setChecked(s.value(kResumePlayback, false).toBool());

View File

@@ -384,8 +384,7 @@ void TagReaderClient::SaveSongsPlaycountAsync(const SongList &songs) {
Q_ASSERT(QThread::currentThread() != thread()); Q_ASSERT(QThread::currentThread() != thread());
for (const Song &song : songs) { for (const Song &song : songs) {
TagReaderReplyPtr reply = SaveSongPlaycountAsync(song.url().toLocalFile(), song.playcount()); SaveSongPlaycountAsync(song.url().toLocalFile(), song.playcount());
QObject::connect(&*reply, &TagReaderReply::Finished, &*reply, &TagReaderReply::deleteLater);
} }
} }
@@ -418,8 +417,7 @@ void TagReaderClient::SaveSongsRatingAsync(const SongList &songs) {
Q_ASSERT(QThread::currentThread() != thread()); Q_ASSERT(QThread::currentThread() != thread());
for (const Song &song : songs) { for (const Song &song : songs) {
TagReaderReplyPtr reply = SaveSongRatingAsync(song.url().toLocalFile(), song.rating()); SaveSongRatingAsync(song.url().toLocalFile(), song.rating());
QObject::connect(&*reply, &TagReaderReply::Finished, &*reply, &TagReaderReply::deleteLater);
} }
} }

View File

@@ -40,7 +40,4 @@ void TagReaderLoadCoverDataReply::EmitFinished() {
Q_EMIT TagReaderReply::Finished(filename_, result_); Q_EMIT TagReaderReply::Finished(filename_, result_);
Q_EMIT TagReaderLoadCoverDataReply::Finished(filename_, data_, result_); Q_EMIT TagReaderLoadCoverDataReply::Finished(filename_, data_, result_);
QObject::disconnect(this, &TagReaderReply::Finished, nullptr, nullptr);
QObject::disconnect(this, &TagReaderLoadCoverDataReply::Finished, nullptr, nullptr);
} }

View File

@@ -40,7 +40,4 @@ void TagReaderLoadCoverImageReply::EmitFinished() {
Q_EMIT TagReaderReply::Finished(filename_, result_); Q_EMIT TagReaderReply::Finished(filename_, result_);
Q_EMIT TagReaderLoadCoverImageReply::Finished(filename_, image_, result_); Q_EMIT TagReaderLoadCoverImageReply::Finished(filename_, image_, result_);
QObject::disconnect(this, &TagReaderReply::Finished, nullptr, nullptr);
QObject::disconnect(this, &TagReaderLoadCoverImageReply::Finished, nullptr, nullptr);
} }

View File

@@ -40,7 +40,4 @@ void TagReaderReadFileReply::EmitFinished() {
Q_EMIT TagReaderReply::Finished(filename_, result_); Q_EMIT TagReaderReply::Finished(filename_, result_);
Q_EMIT TagReaderReadFileReply::Finished(filename_, song_, result_); Q_EMIT TagReaderReadFileReply::Finished(filename_, song_, result_);
QObject::disconnect(this, &TagReaderReply::Finished, nullptr, nullptr);
QObject::disconnect(this, &TagReaderReadFileReply::Finished, nullptr, nullptr);
} }

View File

@@ -52,6 +52,4 @@ void TagReaderReply::EmitFinished() {
Q_EMIT TagReaderReply::Finished(filename_, result_); Q_EMIT TagReaderReply::Finished(filename_, result_);
QObject::disconnect(this, &TagReaderReply::Finished, nullptr, nullptr);
} }

View File

@@ -77,18 +77,6 @@
</context> </context>
<context> <context>
<name>AlbumCoverChoiceController</name> <name>AlbumCoverChoiceController</name>
<message>
<source>Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>All files (*)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Load cover from disk...</source> <source>Load cover from disk...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -551,10 +539,6 @@
<source>Output</source> <source>Output</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Engine</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>ALSA plugin:</source> <source>ALSA plugin:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -1004,6 +988,13 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>CollectionLibrary</name>
<message>
<source>Saving playcounts and ratings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>CollectionModel</name> <name>CollectionModel</name>
<message> <message>
@@ -2703,22 +2694,10 @@ If there are no matches then it will use the largest image in the directory.</so
<source>Global Shortcuts</source> <source>Global Shortcuts</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Use Gnome (GSD) shortcuts when available</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Open...</source> <source>Open...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Use MATE shortcuts when available</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Use KDE (KGlobalAccel) shortcuts when available</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Use X11 shortcuts when available</source> <source>Use X11 shortcuts when available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -2757,27 +2736,11 @@ If there are no matches then it will use the largest image in the directory.</so
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>The &quot;%1&quot; command could not be started.</source> <source>Use KGlobalAccel shortcuts when available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Using X11 shortcuts on %1 is not recommended and can cause keyboard to become unresponsive!</source> <source>Using X11 shortcuts is not recommended and can cause keyboard to become unresponsive! Shortcuts on should usually be used through MPRIS2 / KGlobalAccel.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Shortcuts on %1 are usually used through MPRIS and KGlobalAccel.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Shortcuts on %1 are usually used through Gnome Settings Daemon and should be configured in gnome-settings-daemon instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Shortcuts on %1 are usually used through Gnome Settings Daemon and should be configured in cinnamon-settings-daemon instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source> Shortcuts on %1 are usually used through MATE Settings Daemon and should be configured there instead.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
@@ -3374,10 +3337,6 @@ If there are no matches then it will use the largest image in the directory.</so
<source>Import data from last.fm...</source> <source>Import data from last.fm...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>All Files (*)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Context</source> <source>Context</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -4565,14 +4524,6 @@ If there are no matches then it will use the largest image in the directory.</so
<numerusform></numerusform> <numerusform></numerusform>
</translation> </translation>
</message> </message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Various artists</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PlaylistParser</name> <name>PlaylistParser</name>
@@ -4826,50 +4777,6 @@ Are you sure you want to continue?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>PlaylistUndoCommands::InsertItems</name>
<message numerus="yes">
<source>add %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>PlaylistUndoCommands::MoveItems</name>
<message numerus="yes">
<source>move %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>PlaylistUndoCommands::RemoveItems</name>
<message numerus="yes">
<source>remove %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
</context>
<context>
<name>PlaylistUndoCommands::ShuffleItems</name>
<message>
<source>shuffle songs</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PlaylistUndoCommands::SortItems</name>
<message>
<source>sort songs</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>PlaylistView</name> <name>PlaylistView</name>
<message> <message>
@@ -5311,6 +5218,43 @@ Are you sure you want to continue?</source>
<source>System colors</source> <source>System colors</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Playlist</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Various artists</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<source>add %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>remove %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message numerus="yes">
<source>move %n songs</source>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<source>sort songs</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>shuffle songs</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>QWidget</name> <name>QWidget</name>
@@ -5597,13 +5541,6 @@ Are you sure you want to continue?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>SCollection</name>
<message>
<source>Saving playcounts and ratings</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>SavePlaylistsDialog</name> <name>SavePlaylistsDialog</name>
<message> <message>
@@ -6229,10 +6166,6 @@ Are you sure you want to continue?</source>
</context> </context>
<context> <context>
<name>SongLoader</name> <name>SongLoader</name>
<message>
<source>You need GStreamer for this URL.</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Preload function was not set for blocking operation.</source> <source>Preload function was not set for blocking operation.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -6241,10 +6174,6 @@ Are you sure you want to continue?</source>
<source>File %1 does not exist.</source> <source>File %1 does not exist.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>CD playback is only available with the GStreamer engine.</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Could not open file %1 for reading: %2</source> <source>Could not open file %1 for reading: %2</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@@ -6273,6 +6202,10 @@ Are you sure you want to continue?</source>
<source>Couldn&apos;t link GStreamer source, typefind and fakesink elements for %1</source> <source>Couldn&apos;t link GStreamer source, typefind and fakesink elements for %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Missing CDDA playback.</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SongLoaderInserter</name> <name>SongLoaderInserter</name>

File diff suppressed because it is too large Load Diff