2012-02-12 14:41:50 +01:00
|
|
|
/* This file is part of Clementine.
|
2014-11-01 19:30:40 +01:00
|
|
|
Copyright 2012-2013, Andreas <asfa194@gmail.com>
|
2012-02-12 14:41:50 +01:00
|
|
|
Copyright 2012, David Sansome <me@davidsansome.com>
|
2014-11-02 19:36:21 +01:00
|
|
|
Copyright 2012, Marti Raudsepp <marti@juffo.org>
|
2014-11-01 19:30:40 +01:00
|
|
|
Copyright 2012, 2014, John Maguire <john.maguire@gmail.com>
|
|
|
|
Copyright 2013, Arnaud Bienner <arnaud.bienner@gmail.com>
|
2014-11-02 19:36:21 +01:00
|
|
|
Copyright 2014, Krzysztof Sobiecki <sobkas@gmail.com>
|
2012-02-12 14:41:50 +01:00
|
|
|
|
|
|
|
Clementine is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
Clementine is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "application.h"
|
|
|
|
|
2016-02-12 17:25:01 +01:00
|
|
|
#include "covers/amazoncoverprovider.h"
|
|
|
|
#include "covers/musicbrainzcoverprovider.h"
|
|
|
|
|
2014-03-27 18:55:58 +01:00
|
|
|
#ifdef HAVE_LIBLASTFM
|
2016-02-12 17:25:01 +01:00
|
|
|
#include "covers/lastfmcoverprovider.h"
|
2014-12-18 23:35:21 +01:00
|
|
|
#include "internet/lastfm/lastfmservice.h"
|
2014-03-27 18:55:58 +01:00
|
|
|
#endif // HAVE_LIBLASTFM
|
|
|
|
|
2012-05-27 22:15:58 +02:00
|
|
|
#ifdef HAVE_MOODBAR
|
2014-02-07 16:34:20 +01:00
|
|
|
#include "moodbar/moodbarcontroller.h"
|
|
|
|
#include "moodbar/moodbarloader.h"
|
2012-05-27 22:15:58 +02:00
|
|
|
#endif
|
|
|
|
|
2013-09-29 10:43:34 +02:00
|
|
|
bool Application::kIsPortable = false;
|
|
|
|
|
2012-02-12 14:41:50 +01:00
|
|
|
Application::Application(QObject* parent)
|
2014-02-07 16:34:20 +01:00
|
|
|
: QObject(parent),
|
2016-02-11 16:11:31 +01:00
|
|
|
tag_reader_client_([&](){
|
|
|
|
TagReaderClient* client = new TagReaderClient(this);
|
|
|
|
MoveToNewThread(client);
|
|
|
|
client->Start();
|
|
|
|
return client;
|
|
|
|
}),
|
|
|
|
database_([&]() {
|
|
|
|
Database* db = new Database(this, this);
|
|
|
|
MoveToNewThread(db);
|
|
|
|
DoInAMinuteOrSo(db, SLOT(DoBackup()));
|
|
|
|
return db;
|
|
|
|
}),
|
|
|
|
album_cover_loader_([&]() {
|
|
|
|
AlbumCoverLoader* loader = new AlbumCoverLoader(this);
|
|
|
|
MoveToNewThread(loader);
|
|
|
|
return loader;
|
|
|
|
}),
|
|
|
|
playlist_backend_([&]() {
|
|
|
|
PlaylistBackend* backend = new PlaylistBackend(this, this);
|
|
|
|
MoveToThread(backend, database_->thread());
|
|
|
|
return backend;
|
|
|
|
}),
|
|
|
|
podcast_backend_([&]() {
|
|
|
|
PodcastBackend* backend = new PodcastBackend(this, this);
|
|
|
|
MoveToThread(backend, database_->thread());
|
|
|
|
return backend;
|
|
|
|
}),
|
|
|
|
appearance_([=]() { return new Appearance(this); }),
|
2016-02-12 17:25:01 +01:00
|
|
|
cover_providers_([=]() {
|
|
|
|
CoverProviders* cover_providers = new CoverProviders(this);
|
|
|
|
// Initialize the repository of cover providers.
|
|
|
|
cover_providers->AddProvider(new AmazonCoverProvider);
|
|
|
|
cover_providers->AddProvider(new MusicbrainzCoverProvider);
|
|
|
|
#ifdef HAVE_LIBLASTFM
|
|
|
|
cover_providers->AddProvider(new LastFmCoverProvider(this));
|
|
|
|
#endif
|
|
|
|
return cover_providers;
|
|
|
|
}),
|
2016-02-11 16:11:31 +01:00
|
|
|
task_manager_([=]() { return new TaskManager(this); }),
|
|
|
|
player_([=]() { return new Player(this, this); }),
|
|
|
|
playlist_manager_([=]() { return new PlaylistManager(this); }),
|
|
|
|
current_art_loader_([=]() { return new CurrentArtLoader(this, this); }),
|
|
|
|
global_search_([=]() { return new GlobalSearch(this, this); }),
|
|
|
|
internet_model_([=]() { return new InternetModel(this, this); }),
|
|
|
|
library_([=]() { return new Library(this, this); }),
|
|
|
|
device_manager_([=]() { return new DeviceManager(this, this); }),
|
|
|
|
podcast_updater_([=]() { return new PodcastUpdater(this, this); }),
|
|
|
|
podcast_deleter_([=]() {
|
|
|
|
PodcastDeleter* deleter = new PodcastDeleter(this, this);
|
|
|
|
MoveToNewThread(deleter);
|
|
|
|
return deleter;
|
|
|
|
}),
|
|
|
|
podcast_downloader_([=]() {
|
|
|
|
return new PodcastDownloader(this, this);
|
|
|
|
}),
|
|
|
|
gpodder_sync_([=]() { return new GPodderSync(this, this); }),
|
|
|
|
moodbar_loader_([=]() {
|
2012-05-27 22:15:58 +02:00
|
|
|
#ifdef HAVE_MOODBAR
|
2016-02-11 16:11:31 +01:00
|
|
|
return new MoodbarLoader(this, this);
|
|
|
|
#else
|
|
|
|
return nullptr;
|
2012-05-27 22:15:58 +02:00
|
|
|
#endif
|
2016-02-11 16:11:31 +01:00
|
|
|
}),
|
|
|
|
moodbar_controller_([=]() {
|
|
|
|
#ifdef HAVE_MOODBAR
|
|
|
|
return new MoodbarController(this, this);
|
|
|
|
#else
|
|
|
|
return nullptr;
|
|
|
|
#endif
|
|
|
|
}),
|
|
|
|
network_remote_([=]() {
|
|
|
|
NetworkRemote* remote = new NetworkRemote(this);
|
|
|
|
MoveToNewThread(remote);
|
|
|
|
return remote;
|
|
|
|
}),
|
|
|
|
network_remote_helper_([=]() {
|
|
|
|
return new NetworkRemoteHelper(this);
|
|
|
|
}),
|
|
|
|
scrobbler_([=]() {
|
|
|
|
#ifdef HAVE_LIBLASTFM
|
|
|
|
return new LastFMService(this, this);
|
|
|
|
#else
|
|
|
|
return nullptr;
|
|
|
|
#endif
|
|
|
|
}) {
|
|
|
|
// This must be before library_->Init();
|
2014-02-07 16:34:20 +01:00
|
|
|
// In the constructor the helper waits for the signal
|
|
|
|
// PlaylistManagerInitialized
|
2013-01-22 22:58:32 +01:00
|
|
|
// to start the remote. Without the playlist manager clementine can
|
|
|
|
// crash when a client connects before the manager is initialized!
|
2016-02-11 16:11:31 +01:00
|
|
|
network_remote_helper_.get();
|
2012-02-12 14:41:50 +01:00
|
|
|
library_->Init();
|
2016-02-12 13:07:05 +01:00
|
|
|
|
|
|
|
// TODO(John Maguire): Make this not a weird singleton.
|
|
|
|
tag_reader_client_.get();
|
2012-02-12 14:41:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Application::~Application() {
|
|
|
|
// It's important that the device manager is deleted before the database.
|
|
|
|
// Deleting the database deletes all objects that have been created in its
|
|
|
|
// thread, including some device library backends.
|
2016-02-11 16:11:31 +01:00
|
|
|
device_manager_.reset();
|
2012-02-12 14:41:50 +01:00
|
|
|
|
2014-02-10 14:29:07 +01:00
|
|
|
for (QThread* thread : threads_) {
|
|
|
|
thread->quit();
|
|
|
|
}
|
2012-02-12 14:41:50 +01:00
|
|
|
|
2014-02-10 14:29:07 +01:00
|
|
|
for (QThread* thread : threads_) {
|
|
|
|
thread->wait();
|
|
|
|
}
|
2012-02-12 14:41:50 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Application::MoveToNewThread(QObject* object) {
|
|
|
|
QThread* thread = new QThread(this);
|
|
|
|
|
|
|
|
MoveToThread(object, thread);
|
|
|
|
|
|
|
|
thread->start();
|
|
|
|
threads_ << thread;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Application::MoveToThread(QObject* object, QThread* thread) {
|
2014-02-06 16:49:49 +01:00
|
|
|
object->setParent(nullptr);
|
2012-02-12 14:41:50 +01:00
|
|
|
object->moveToThread(thread);
|
|
|
|
}
|
|
|
|
|
2014-02-07 16:34:20 +01:00
|
|
|
void Application::AddError(const QString& message) { emit ErrorAdded(message); }
|
2012-02-12 14:41:50 +01:00
|
|
|
|
2013-07-27 19:23:55 +02:00
|
|
|
QString Application::language_without_region() const {
|
|
|
|
const int underscore = language_name_.indexOf('_');
|
|
|
|
if (underscore != -1) {
|
|
|
|
return language_name_.left(underscore);
|
|
|
|
}
|
|
|
|
return language_name_;
|
|
|
|
}
|
|
|
|
|
2012-02-12 14:41:50 +01:00
|
|
|
LibraryBackend* Application::library_backend() const {
|
|
|
|
return library()->backend();
|
|
|
|
}
|
|
|
|
|
2014-02-07 16:34:20 +01:00
|
|
|
LibraryModel* Application::library_model() const { return library()->model(); }
|
2012-03-09 13:15:24 +01:00
|
|
|
|
2014-02-07 16:34:20 +01:00
|
|
|
void Application::ReloadSettings() { emit SettingsChanged(); }
|
2012-03-10 23:39:24 +01:00
|
|
|
|
|
|
|
void Application::OpenSettingsDialogAtPage(SettingsDialog::Page page) {
|
|
|
|
emit SettingsDialogRequested(page);
|
|
|
|
}
|