2018-02-27 18:06:05 +01:00
/*
* Strawberry Music Player
* This file was part of Clementine .
* Copyright 2010 , David Sansome < me @ davidsansome . com >
2021-03-20 21:14:47 +01:00
* Copyright 2019 - 2021 , Jonas Kvinge < jonas @ jkvinge . net >
2018-02-27 18:06:05 +01:00
*
* Strawberry 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 .
*
* Strawberry 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 Strawberry . If not , see < http : //www.gnu.org/licenses/>.
2018-08-09 18:39:44 +02:00
*
2018-02-27 18:06:05 +01:00
*/
# include "config.h"
2018-05-01 00:41:33 +02:00
# include <QtGlobal>
2019-07-08 22:10:43 +02:00
# include <QGuiApplication>
2021-02-26 21:03:51 +01:00
# include <QtConcurrentRun>
# include <QFuture>
# include <QFutureWatcher>
2019-07-08 22:10:43 +02:00
# include <QScreen>
2020-01-05 19:14:25 +01:00
# include <QWindow>
2018-05-01 00:41:33 +02:00
# include <QWidget>
2018-02-27 18:06:05 +01:00
# include <QDialog>
2018-05-01 00:41:33 +02:00
# include <QDir>
2020-02-09 02:29:35 +01:00
# include <QFile>
2018-05-01 00:41:33 +02:00
# include <QFileInfo>
2018-02-27 18:06:05 +01:00
# include <QMimeData>
2020-02-09 02:29:35 +01:00
# include <QSet>
# include <QList>
2018-05-01 00:41:33 +02:00
# include <QVariant>
# include <QString>
2020-07-18 04:05:07 +02:00
# include <QRegularExpression>
2018-05-01 00:41:33 +02:00
# include <QUrl>
# include <QImage>
# include <QImageWriter>
# include <QPixmap>
# include <QIcon>
# include <QRect>
# include <QFileDialog>
# include <QLabel>
2020-02-09 02:29:35 +01:00
# include <QAction>
2021-02-26 21:03:51 +01:00
# include <QActionGroup>
# include <QMenu>
2020-02-09 02:29:35 +01:00
# include <QSettings>
2018-05-01 00:41:33 +02:00
# include <QtEvents>
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
# include "core/utilities.h"
# include "core/imageutils.h"
# include "core/application.h"
2018-05-01 00:41:33 +02:00
# include "core/song.h"
2018-02-27 18:06:05 +01:00
# include "core/iconloader.h"
2018-05-01 00:41:33 +02:00
# include "collection/collectionbackend.h"
2019-03-11 23:07:11 +01:00
# include "settings/collectionsettingspage.h"
2020-08-04 21:18:14 +02:00
# include "organize/organizeformat.h"
2019-07-07 21:14:24 +02:00
# include "internet/internetservices.h"
# include "internet/internetservice.h"
2018-05-01 00:41:33 +02:00
# include "albumcoverchoicecontroller.h"
# include "albumcoverfetcher.h"
# include "albumcoverloader.h"
# include "albumcoversearcher.h"
2021-02-26 21:03:51 +01:00
# include "albumcoverimageresult.h"
2018-05-01 00:41:33 +02:00
# include "coverfromurldialog.h"
2019-07-07 21:14:24 +02:00
# include "currentalbumcoverloader.h"
2018-02-27 18:06:05 +01:00
const char * AlbumCoverChoiceController : : kLoadImageFileFilter = QT_TR_NOOP ( " Images (*.png *.jpg *.jpeg *.bmp *.gif *.xpm *.pbm *.pgm *.ppm *.xbm) " ) ;
const char * AlbumCoverChoiceController : : kSaveImageFileFilter = QT_TR_NOOP ( " Images (*.png *.jpg *.jpeg *.bmp *.xpm *.pbm *.ppm *.xbm) " ) ;
const char * AlbumCoverChoiceController : : kAllFilesFilter = QT_TR_NOOP ( " All files (*) " ) ;
QSet < QString > * AlbumCoverChoiceController : : sImageExtensions = nullptr ;
2021-07-11 07:40:57 +02:00
AlbumCoverChoiceController : : AlbumCoverChoiceController ( QWidget * parent )
: QWidget ( parent ) ,
app_ ( nullptr ) ,
cover_searcher_ ( nullptr ) ,
cover_fetcher_ ( nullptr ) ,
save_file_dialog_ ( nullptr ) ,
cover_from_url_dialog_ ( nullptr ) ,
cover_from_file_ ( nullptr ) ,
cover_to_file_ ( nullptr ) ,
cover_from_url_ ( nullptr ) ,
search_for_cover_ ( nullptr ) ,
separator1_ ( nullptr ) ,
unset_cover_ ( nullptr ) ,
delete_cover_ ( nullptr ) ,
clear_cover_ ( nullptr ) ,
separator2_ ( nullptr ) ,
show_cover_ ( nullptr ) ,
search_cover_auto_ ( nullptr ) ,
save_cover_type_ ( CollectionSettingsPage : : SaveCoverType_Cache ) ,
save_cover_filename_ ( CollectionSettingsPage : : SaveCoverFilename_Pattern ) ,
cover_overwrite_ ( false ) ,
cover_lowercase_ ( true ) ,
cover_replace_spaces_ ( true ) ,
save_embedded_cover_override_ ( false ) {
2018-02-27 18:06:05 +01:00
cover_from_file_ = new QAction ( IconLoader : : Load ( " document-open " ) , tr ( " Load cover from disk... " ) , this ) ;
cover_to_file_ = new QAction ( IconLoader : : Load ( " document-save " ) , tr ( " Save cover to disk... " ) , this ) ;
cover_from_url_ = new QAction ( IconLoader : : Load ( " download " ) , tr ( " Load cover from URL... " ) , this ) ;
search_for_cover_ = new QAction ( IconLoader : : Load ( " search " ) , tr ( " Search for album covers... " ) , this ) ;
unset_cover_ = new QAction ( IconLoader : : Load ( " list-remove " ) , tr ( " Unset cover " ) , this ) ;
2021-02-26 21:03:51 +01:00
delete_cover_ = new QAction ( IconLoader : : Load ( " list-remove " ) , tr ( " Delete cover " ) , this ) ;
clear_cover_ = new QAction ( IconLoader : : Load ( " list-remove " ) , tr ( " Clear cover " ) , this ) ;
separator1_ = new QAction ( this ) ;
separator1_ - > setSeparator ( true ) ;
2018-02-27 18:06:05 +01:00
show_cover_ = new QAction ( IconLoader : : Load ( " zoom-in " ) , tr ( " Show fullsize... " ) , this ) ;
2018-08-29 21:42:24 +02:00
search_cover_auto_ = new QAction ( tr ( " Search automatically " ) , this ) ;
2018-02-27 18:06:05 +01:00
search_cover_auto_ - > setCheckable ( true ) ;
search_cover_auto_ - > setChecked ( false ) ;
2021-02-26 21:03:51 +01:00
separator2_ = new QAction ( this ) ;
separator2_ - > setSeparator ( true ) ;
2018-02-27 18:06:05 +01:00
2019-03-12 00:01:52 +01:00
ReloadSettings ( ) ;
2018-02-27 18:06:05 +01:00
}
2021-06-21 15:38:58 +02:00
AlbumCoverChoiceController : : ~ AlbumCoverChoiceController ( ) = default ;
2018-02-27 18:06:05 +01:00
2019-07-07 21:14:24 +02:00
void AlbumCoverChoiceController : : Init ( Application * app ) {
app_ = app ;
cover_fetcher_ = new AlbumCoverFetcher ( app_ - > cover_providers ( ) , this ) ;
cover_searcher_ = new AlbumCoverSearcher ( QIcon ( " :/pictures/cdcase.png " ) , app , this ) ;
cover_searcher_ - > Init ( cover_fetcher_ ) ;
2021-01-26 16:48:04 +01:00
QObject : : connect ( cover_fetcher_ , & AlbumCoverFetcher : : AlbumCoverFetched , this , & AlbumCoverChoiceController : : AlbumCoverFetched ) ;
2021-02-26 21:03:51 +01:00
QObject : : connect ( app_ - > album_cover_loader ( ) , & AlbumCoverLoader : : SaveEmbeddedCoverAsyncFinished , this , & AlbumCoverChoiceController : : SaveEmbeddedCoverAsyncFinished ) ;
2019-07-07 21:14:24 +02:00
}
2019-03-11 23:07:11 +01:00
void AlbumCoverChoiceController : : ReloadSettings ( ) {
QSettings s ;
s . beginGroup ( CollectionSettingsPage : : kSettingsGroup ) ;
2021-02-26 21:03:51 +01:00
save_cover_type_ = CollectionSettingsPage : : SaveCoverType ( s . value ( " save_cover_type " , CollectionSettingsPage : : SaveCoverType_Cache ) . toInt ( ) ) ;
2021-03-20 23:13:54 +01:00
save_cover_filename_ = CollectionSettingsPage : : SaveCoverFilename ( s . value ( " save_cover_filename " , CollectionSettingsPage : : SaveCoverFilename_Pattern ) . toInt ( ) ) ;
2019-03-11 23:07:11 +01:00
cover_pattern_ = s . value ( " cover_pattern " , " %albumartist-%album " ) . toString ( ) ;
cover_overwrite_ = s . value ( " cover_overwrite " , false ) . toBool ( ) ;
cover_lowercase_ = s . value ( " cover_lowercase " , false ) . toBool ( ) ;
cover_replace_spaces_ = s . value ( " cover_replace_spaces " , false ) . toBool ( ) ;
s . endGroup ( ) ;
}
2018-02-27 18:06:05 +01:00
QList < QAction * > AlbumCoverChoiceController : : GetAllActions ( ) {
2021-02-26 21:03:51 +01:00
return QList < QAction * > ( ) < < show_cover_
< < cover_to_file_
< < separator1_
< < cover_from_file_
< < cover_from_url_
< < search_for_cover_
< < separator2_
< < unset_cover_
< < clear_cover_
< < delete_cover_ ;
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult AlbumCoverChoiceController : : LoadImageFromFile ( Song * song ) {
2018-04-06 22:13:11 +02:00
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) ) return AlbumCoverImageResult ( ) ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
QString cover_file = QFileDialog : : getOpenFileName ( this , tr ( " Load cover from disk " ) , GetInitialPathForFileDialog ( * song , QString ( ) ) , tr ( kLoadImageFileFilter ) + " ;; " + tr ( kAllFilesFilter ) ) ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
if ( cover_file . isEmpty ( ) ) return AlbumCoverImageResult ( ) ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult result ;
QFile file ( cover_file ) ;
if ( file . open ( QIODevice : : ReadOnly ) ) {
result . image_data = file . readAll ( ) ;
file . close ( ) ;
2021-09-19 19:31:34 +02:00
if ( result . image_data . isEmpty ( ) ) {
qLog ( Error ) < < " Cover file " < < cover_file < < " is empty. " ;
emit Error ( tr ( " Cover file %1 is empty. " ) . arg ( cover_file ) ) ;
}
else {
2021-02-26 21:03:51 +01:00
result . mime_type = Utilities : : MimeTypeFromData ( result . image_data ) ;
result . image . loadFromData ( result . image_data ) ;
2021-03-07 02:36:50 +01:00
result . cover_url = QUrl : : fromLocalFile ( cover_file ) ;
2021-02-26 21:03:51 +01:00
}
2018-02-27 18:06:05 +01:00
}
2021-08-09 23:32:26 +02:00
else {
qLog ( Error ) < < " Failed to open cover file " < < cover_file < < " for reading: " < < file . errorString ( ) ;
2021-09-19 19:31:34 +02:00
emit Error ( tr ( " Failed to open cover file %1 for reading: %2 " ) . arg ( cover_file , file . errorString ( ) ) ) ;
2021-08-09 23:32:26 +02:00
}
2021-02-26 21:03:51 +01:00
return result ;
}
QUrl AlbumCoverChoiceController : : LoadCoverFromFile ( Song * song ) {
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return QUrl ( ) ;
QString cover_file = QFileDialog : : getOpenFileName ( this , tr ( " Load cover from disk " ) , GetInitialPathForFileDialog ( * song , QString ( ) ) , tr ( kLoadImageFileFilter ) + " ;; " + tr ( kAllFilesFilter ) ) ;
if ( cover_file . isEmpty ( ) ) return QUrl ( ) ;
if ( QImage ( cover_file ) . isNull ( ) ) return QUrl ( ) ;
2022-03-22 21:09:05 +01:00
switch ( get_save_album_cover_type ( ) ) {
2021-03-15 22:37:49 +01:00
case CollectionSettingsPage : : SaveCoverType_Embedded :
2021-02-26 21:03:51 +01:00
if ( song - > save_embedded_cover_supported ( ) ) {
SaveCoverEmbeddedAutomatic ( * song , cover_file ) ;
return QUrl : : fromLocalFile ( Song : : kEmbeddedCover ) ;
}
2022-07-26 20:37:06 +02:00
[[fallthrough]] ;
2021-02-26 21:03:51 +01:00
case CollectionSettingsPage : : SaveCoverType_Cache :
case CollectionSettingsPage : : SaveCoverType_Album : {
QUrl cover_url = QUrl : : fromLocalFile ( cover_file ) ;
SaveArtManualToSong ( song , cover_url ) ;
return cover_url ;
}
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
return QUrl ( ) ;
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
void AlbumCoverChoiceController : : SaveCoverToFileManual ( const Song & song , const AlbumCoverImageResult & result ) {
2018-02-27 18:06:05 +01:00
2019-03-11 23:07:11 +01:00
QString initial_file_name = " / " ;
if ( ! song . effective_albumartist ( ) . isEmpty ( ) ) {
initial_file_name = initial_file_name + song . effective_albumartist ( ) ;
}
initial_file_name = initial_file_name + " - " + ( song . effective_album ( ) . isEmpty ( ) ? tr ( " unknown " ) : song . effective_album ( ) ) + " .jpg " ;
initial_file_name = initial_file_name . toLower ( ) ;
2020-07-18 04:05:07 +02:00
initial_file_name . replace ( QRegularExpression ( " \\ s " ) , " - " ) ;
2020-08-04 21:18:14 +02:00
initial_file_name . remove ( OrganizeFormat : : kInvalidFatCharacters ) ;
2018-02-27 18:06:05 +01:00
QString save_filename = QFileDialog : : getSaveFileName ( this , tr ( " Save album cover " ) , GetInitialPathForFileDialog ( song , initial_file_name ) , tr ( kSaveImageFileFilter ) + " ;; " + tr ( kAllFilesFilter ) ) ;
2021-02-26 21:03:51 +01:00
if ( save_filename . isEmpty ( ) ) return ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
QFileInfo fileinfo ( save_filename ) ;
if ( fileinfo . suffix ( ) . isEmpty ( ) ) {
2018-02-27 18:06:05 +01:00
save_filename . append ( " .jpg " ) ;
2021-02-26 21:03:51 +01:00
fileinfo . setFile ( save_filename ) ;
2018-02-27 18:06:05 +01:00
}
2021-03-07 00:53:33 +01:00
if ( ! QImageWriter : : supportedImageFormats ( ) . contains ( fileinfo . completeSuffix ( ) . toUtf8 ( ) . toLower ( ) ) ) {
2021-02-26 21:03:51 +01:00
save_filename = Utilities : : PathWithoutFilenameExtension ( save_filename ) + " .jpg " ;
fileinfo . setFile ( save_filename ) ;
}
2021-07-13 23:25:36 +02:00
if ( result . is_jpeg ( ) & & fileinfo . completeSuffix ( ) . compare ( " jpg " , Qt : : CaseInsensitive ) = = 0 ) {
2021-02-26 21:03:51 +01:00
QFile file ( save_filename ) ;
if ( file . open ( QIODevice : : WriteOnly ) ) {
2021-08-09 23:32:26 +02:00
if ( file . write ( result . image_data ) < = 0 ) {
qLog ( Error ) < < " Failed writing cover to file " < < save_filename < < file . errorString ( ) ;
2021-09-19 19:31:34 +02:00
emit Error ( tr ( " Failed writing cover to file %1: %2 " ) . arg ( save_filename , file . errorString ( ) ) ) ;
2021-08-09 23:32:26 +02:00
}
2021-02-26 21:03:51 +01:00
file . close ( ) ;
}
2021-08-09 23:32:26 +02:00
else {
qLog ( Error ) < < " Failed to open cover file " < < save_filename < < " for writing: " < < file . errorString ( ) ;
2021-09-19 19:31:34 +02:00
emit Error ( tr ( " Failed to open cover file %1 for writing: %2 " ) . arg ( save_filename , file . errorString ( ) ) ) ;
2021-08-09 23:32:26 +02:00
}
2021-02-26 21:03:51 +01:00
}
else {
2021-09-19 19:31:34 +02:00
if ( ! result . image . save ( save_filename ) ) {
qLog ( Error ) < < " Failed writing cover to file " < < save_filename ;
emit Error ( tr ( " Failed writing cover to file %1. " ) . arg ( save_filename ) ) ;
}
2021-02-26 21:03:51 +01:00
}
2018-02-27 18:06:05 +01:00
}
QString AlbumCoverChoiceController : : GetInitialPathForFileDialog ( const Song & song , const QString & filename ) {
2018-10-02 00:38:52 +02:00
2018-05-01 00:41:33 +02:00
// Art automatic is first to show user which cover the album may be using now;
// The song is using it if there's no manual path but we cannot use manual path here because it can contain cached paths
2019-07-07 21:14:24 +02:00
if ( ! song . art_automatic ( ) . isEmpty ( ) & & ! song . art_automatic ( ) . path ( ) . isEmpty ( ) & & ! song . has_embedded_cover ( ) ) {
if ( song . art_automatic ( ) . scheme ( ) . isEmpty ( ) & & QFile : : exists ( QFileInfo ( song . art_automatic ( ) . path ( ) ) . path ( ) ) ) {
return song . art_automatic ( ) . path ( ) ;
}
2019-07-08 22:10:43 +02:00
else if ( song . art_automatic ( ) . isLocalFile ( ) & & QFile : : exists ( QFileInfo ( song . art_automatic ( ) . toLocalFile ( ) ) . path ( ) ) ) {
2019-07-07 21:14:24 +02:00
return song . art_automatic ( ) . toLocalFile ( ) ;
}
2018-05-01 00:41:33 +02:00
// If no automatic art, start in the song's folder
2018-02-27 18:06:05 +01:00
}
else if ( ! song . url ( ) . isEmpty ( ) & & song . url ( ) . toLocalFile ( ) . contains ( ' / ' ) ) {
return song . url ( ) . toLocalFile ( ) . section ( ' / ' , 0 , - 2 ) + filename ;
2018-05-01 00:41:33 +02:00
// Fallback - start in home
2018-02-27 18:06:05 +01:00
}
2019-07-07 21:14:24 +02:00
return QDir : : home ( ) . absolutePath ( ) + filename ;
2018-02-27 18:06:05 +01:00
}
2019-07-07 21:14:24 +02:00
QUrl AlbumCoverChoiceController : : LoadCoverFromURL ( Song * song ) {
2018-10-02 00:38:52 +02:00
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return QUrl ( ) ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult result = LoadImageFromURL ( ) ;
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
if ( result . image . isNull ( ) ) {
2019-07-07 21:14:24 +02:00
return QUrl ( ) ;
}
else {
2021-02-26 21:03:51 +01:00
return SaveCoverAutomatic ( song , result ) ;
2018-02-27 18:06:05 +01:00
}
2018-10-02 00:38:52 +02:00
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult AlbumCoverChoiceController : : LoadImageFromURL ( ) {
if ( ! cover_from_url_dialog_ ) { cover_from_url_dialog_ = new CoverFromURLDialog ( this ) ; }
return cover_from_url_dialog_ - > Exec ( ) ;
}
2019-07-07 21:14:24 +02:00
QUrl AlbumCoverChoiceController : : SearchForCover ( Song * song ) {
2018-03-04 14:10:50 +01:00
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return QUrl ( ) ;
2018-02-27 18:06:05 +01:00
// Get something sensible to stick in the search box
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult result = SearchForImage ( song ) ;
if ( result . is_valid ( ) ) {
return SaveCoverAutomatic ( song , result ) ;
2019-07-07 21:14:24 +02:00
}
else {
2021-02-26 21:03:51 +01:00
return QUrl ( ) ;
2018-02-27 18:06:05 +01:00
}
2018-10-02 00:38:52 +02:00
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
AlbumCoverImageResult AlbumCoverChoiceController : : SearchForImage ( Song * song ) {
if ( ! song - > url ( ) . isLocalFile ( ) ) return AlbumCoverImageResult ( ) ;
QString album = song - > effective_album ( ) ;
album = album . remove ( Song : : kAlbumRemoveDisc ) . remove ( Song : : kAlbumRemoveMisc ) ;
// Get something sensible to stick in the search box
return cover_searcher_ - > Exec ( song - > effective_albumartist ( ) , album ) ;
}
2021-03-07 05:43:56 +01:00
QUrl AlbumCoverChoiceController : : UnsetCover ( Song * song , const bool clear_art_automatic ) {
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return QUrl ( ) ;
QUrl cover_url = QUrl : : fromLocalFile ( Song : : kManuallyUnsetCover ) ;
2021-03-07 05:43:56 +01:00
SaveArtManualToSong ( song , cover_url , clear_art_automatic ) ;
2018-02-27 18:06:05 +01:00
2019-07-07 21:14:24 +02:00
return cover_url ;
2018-02-27 18:06:05 +01:00
}
2021-03-07 03:43:49 +01:00
void AlbumCoverChoiceController : : ClearCover ( Song * song , const bool clear_art_automatic ) {
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return ;
song - > clear_art_manual ( ) ;
2021-03-07 05:43:56 +01:00
if ( clear_art_automatic ) song - > clear_art_automatic ( ) ;
2021-03-07 03:43:49 +01:00
SaveArtManualToSong ( song , QUrl ( ) , clear_art_automatic ) ;
2021-02-26 21:03:51 +01:00
}
2021-03-07 03:43:49 +01:00
bool AlbumCoverChoiceController : : DeleteCover ( Song * song , const bool manually_unset ) {
2021-02-26 21:03:51 +01:00
if ( ! song - > url ( ) . isLocalFile ( ) | | song - > effective_albumartist ( ) . isEmpty ( ) | | song - > album ( ) . isEmpty ( ) ) return false ;
if ( song - > has_embedded_cover ( ) & & song - > save_embedded_cover_supported ( ) ) {
SaveCoverEmbeddedAutomatic ( * song , AlbumCoverImageResult ( ) ) ;
}
QString art_automatic ;
QString art_manual ;
if ( song - > art_automatic ( ) . isValid ( ) & & song - > art_automatic ( ) . isLocalFile ( ) ) {
art_automatic = song - > art_automatic ( ) . toLocalFile ( ) ;
}
if ( song - > art_manual ( ) . isValid ( ) & & song - > art_manual ( ) . isLocalFile ( ) ) {
art_manual = song - > art_manual ( ) . toLocalFile ( ) ;
}
bool success = true ;
if ( ! art_automatic . isEmpty ( ) ) {
2021-09-19 19:31:34 +02:00
QFile file ( art_automatic ) ;
if ( file . exists ( ) ) {
if ( file . remove ( ) ) {
2021-02-26 21:03:51 +01:00
song - > clear_art_automatic ( ) ;
if ( art_automatic = = art_manual ) song - > clear_art_manual ( ) ;
}
2021-09-19 19:31:34 +02:00
else {
success = false ;
qLog ( Error ) < < " Failed to delete cover file " < < art_automatic < < file . errorString ( ) ;
emit Error ( tr ( " Failed to delete cover file %1: %2 " ) . arg ( art_automatic , file . errorString ( ) ) ) ;
}
2021-02-26 21:03:51 +01:00
}
else song - > clear_art_automatic ( ) ;
}
else song - > clear_art_automatic ( ) ;
if ( ! art_manual . isEmpty ( ) ) {
2021-09-19 19:31:34 +02:00
QFile file ( art_manual ) ;
if ( file . exists ( ) ) {
if ( file . remove ( ) ) {
2021-02-26 21:03:51 +01:00
song - > clear_art_manual ( ) ;
if ( art_automatic = = art_manual ) song - > clear_art_automatic ( ) ;
}
2021-09-19 19:31:34 +02:00
else {
success = false ;
qLog ( Error ) < < " Failed to delete cover file " < < art_manual < < file . errorString ( ) ;
emit Error ( tr ( " Failed to delete cover file %1: %2 " ) . arg ( art_manual , file . errorString ( ) ) ) ;
}
2021-02-26 21:03:51 +01:00
}
else song - > clear_art_manual ( ) ;
}
else song - > clear_art_manual ( ) ;
2021-03-07 03:43:49 +01:00
if ( success ) {
2021-03-07 05:43:56 +01:00
if ( manually_unset ) UnsetCover ( song , true ) ;
2021-03-07 03:43:49 +01:00
else ClearCover ( song , true ) ;
}
2021-02-26 21:03:51 +01:00
return success ;
2018-09-10 21:58:57 +02:00
}
2019-07-09 01:05:42 +02:00
void AlbumCoverChoiceController : : ShowCover ( const Song & song , const QImage & image ) {
2018-09-10 21:58:57 +02:00
2021-02-26 21:03:51 +01:00
if ( image . isNull ( ) ) {
if ( ( song . art_manual ( ) . isValid ( ) & & song . art_manual ( ) . isLocalFile ( ) & & QFile : : exists ( song . art_manual ( ) . toLocalFile ( ) ) ) | |
( song . art_automatic ( ) . isValid ( ) & & song . art_automatic ( ) . isLocalFile ( ) & & QFile : : exists ( song . art_automatic ( ) . toLocalFile ( ) ) ) | |
song . has_embedded_cover ( )
) {
QPixmap pixmap = ImageUtils : : TryLoadPixmap ( song . art_automatic ( ) , song . art_manual ( ) , song . url ( ) ) ;
if ( ! pixmap . isNull ( ) ) ShowCover ( song , pixmap ) ;
}
}
else {
QPixmap pixmap = QPixmap : : fromImage ( image ) ;
2019-07-09 01:05:42 +02:00
if ( ! pixmap . isNull ( ) ) ShowCover ( song , pixmap ) ;
2018-09-10 21:58:57 +02:00
}
}
void AlbumCoverChoiceController : : ShowCover ( const Song & song , const QPixmap & pixmap ) {
2018-02-27 18:06:05 +01:00
QDialog * dialog = new QDialog ( this ) ;
dialog - > setAttribute ( Qt : : WA_DeleteOnClose , true ) ;
// Use Artist - Album as the window title
QString title_text ( song . effective_albumartist ( ) ) ;
if ( ! song . effective_album ( ) . isEmpty ( ) ) title_text + = " - " + song . effective_album ( ) ;
QLabel * label = new QLabel ( dialog ) ;
2018-09-10 21:58:57 +02:00
label - > setPixmap ( pixmap ) ;
2018-02-27 18:06:05 +01:00
2018-05-01 00:41:33 +02:00
// Add (WxHpx) to the title before possibly resizing
2020-05-29 17:45:00 +02:00
title_text + = " ( " + QString : : number ( pixmap . width ( ) ) + " x " + QString : : number ( pixmap . height ( ) ) + " px) " ;
2018-02-27 18:06:05 +01:00
2018-05-01 00:41:33 +02:00
// If the cover is larger than the screen, resize the window 85% seems to be enough to account for title bar and taskbar etc.
2020-01-05 19:14:25 +01:00
# if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))
QScreen * screen = QWidget : : screen ( ) ;
# else
QScreen * screen = ( window ( ) & & window ( ) - > windowHandle ( ) ? window ( ) - > windowHandle ( ) - > screen ( ) : QGuiApplication : : primaryScreen ( ) ) ;
# endif
QRect screenGeometry = screen - > availableGeometry ( ) ;
2019-07-08 22:10:43 +02:00
int desktop_height = screenGeometry . height ( ) ;
int desktop_width = screenGeometry . width ( ) ;
2018-02-27 18:06:05 +01:00
2018-05-01 00:41:33 +02:00
// Resize differently if monitor is in portrait mode
2018-02-27 18:06:05 +01:00
if ( desktop_width < desktop_height ) {
2021-03-21 18:53:02 +01:00
const int new_width = static_cast < int > ( static_cast < double > ( desktop_width ) * 0.95 ) ;
2020-05-29 17:45:00 +02:00
if ( new_width < pixmap . width ( ) ) {
label - > setPixmap ( pixmap . scaledToWidth ( new_width , Qt : : SmoothTransformation ) ) ;
2018-02-27 18:06:05 +01:00
}
}
else {
2021-03-21 18:53:02 +01:00
const int new_height = static_cast < int > ( static_cast < double > ( desktop_height ) * 0.85 ) ;
2020-05-29 17:45:00 +02:00
if ( new_height < pixmap . height ( ) ) {
label - > setPixmap ( pixmap . scaledToHeight ( new_height , Qt : : SmoothTransformation ) ) ;
2018-02-27 18:06:05 +01:00
}
}
dialog - > setWindowTitle ( title_text ) ;
2020-05-29 17:45:00 +02:00
# if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
dialog - > setFixedSize ( label - > pixmap ( Qt : : ReturnByValue ) . size ( ) ) ;
# else
2018-02-27 18:06:05 +01:00
dialog - > setFixedSize ( label - > pixmap ( ) - > size ( ) ) ;
2020-05-29 17:45:00 +02:00
# endif
2018-02-27 18:06:05 +01:00
dialog - > show ( ) ;
}
2021-09-12 21:24:22 +02:00
quint64 AlbumCoverChoiceController : : SearchCoverAutomatically ( const Song & song ) {
2018-02-27 18:06:05 +01:00
2021-09-12 21:24:22 +02:00
quint64 id = cover_fetcher_ - > FetchAlbumCover ( song . effective_albumartist ( ) , song . album ( ) , song . title ( ) , true ) ;
2018-02-27 18:06:05 +01:00
cover_fetching_tasks_ [ id ] = song ;
2020-04-20 18:03:18 +02:00
return id ;
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
void AlbumCoverChoiceController : : AlbumCoverFetched ( const quint64 id , const AlbumCoverImageResult & result , const CoverSearchStatistics & statistics ) {
2018-02-27 18:06:05 +01:00
2019-09-15 20:27:32 +02:00
Q_UNUSED ( statistics ) ;
2018-02-27 18:06:05 +01:00
Song song ;
if ( cover_fetching_tasks_ . contains ( id ) ) {
song = cover_fetching_tasks_ . take ( id ) ;
}
2021-02-26 21:03:51 +01:00
if ( result . is_valid ( ) ) {
SaveCoverAutomatic ( & song , result ) ;
2018-02-27 18:06:05 +01:00
}
emit AutomaticCoverSearchDone ( ) ;
}
2021-02-26 21:03:51 +01:00
void AlbumCoverChoiceController : : SaveArtAutomaticToSong ( Song * song , const QUrl & art_automatic ) {
2019-07-07 21:14:24 +02:00
if ( ! song - > is_valid ( ) ) return ;
2021-02-26 21:03:51 +01:00
song - > set_art_automatic ( art_automatic ) ;
2022-01-06 02:13:24 +01:00
if ( song - > has_embedded_cover ( ) ) {
song - > clear_art_manual ( ) ;
}
2019-07-07 21:14:24 +02:00
2021-02-26 21:03:51 +01:00
if ( song - > source ( ) = = Song : : Source_Collection ) {
2022-01-06 02:13:24 +01:00
app_ - > collection_backend ( ) - > UpdateAutomaticAlbumArtAsync ( song - > effective_albumartist ( ) , song - > album ( ) , art_automatic , song - > has_embedded_cover ( ) ) ;
2021-02-26 21:03:51 +01:00
}
if ( * song = = app_ - > current_albumcover_loader ( ) - > last_song ( ) ) {
app_ - > current_albumcover_loader ( ) - > LoadAlbumCover ( * song ) ;
}
}
void AlbumCoverChoiceController : : SaveArtManualToSong ( Song * song , const QUrl & art_manual , const bool clear_art_automatic ) {
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
if ( ! song - > is_valid ( ) ) return ;
song - > set_art_manual ( art_manual ) ;
if ( clear_art_automatic ) song - > clear_art_automatic ( ) ;
// Update the backends.
switch ( song - > source ( ) ) {
case Song : : Source_Collection :
app_ - > collection_backend ( ) - > UpdateManualAlbumArtAsync ( song - > effective_albumartist ( ) , song - > album ( ) , art_manual , clear_art_automatic ) ;
break ;
case Song : : Source_LocalFile :
case Song : : Source_CDDA :
case Song : : Source_Device :
case Song : : Source_Stream :
2021-07-11 01:02:53 +02:00
case Song : : Source_RadioParadise :
case Song : : Source_SomaFM :
2021-02-26 21:03:51 +01:00
case Song : : Source_Unknown :
break ;
case Song : : Source_Tidal :
case Song : : Source_Qobuz :
case Song : : Source_Subsonic :
InternetService * service = app_ - > internet_services ( ) - > ServiceBySource ( song - > source ( ) ) ;
if ( ! service ) break ;
if ( service - > artists_collection_backend ( ) ) {
service - > artists_collection_backend ( ) - > UpdateManualAlbumArtAsync ( song - > effective_albumartist ( ) , song - > album ( ) , art_manual , clear_art_automatic ) ;
}
if ( service - > albums_collection_backend ( ) ) {
service - > albums_collection_backend ( ) - > UpdateManualAlbumArtAsync ( song - > effective_albumartist ( ) , song - > album ( ) , art_manual , clear_art_automatic ) ;
}
if ( service - > songs_collection_backend ( ) ) {
service - > songs_collection_backend ( ) - > UpdateManualAlbumArtAsync ( song - > effective_albumartist ( ) , song - > album ( ) , art_manual , clear_art_automatic ) ;
}
break ;
2019-07-07 21:14:24 +02:00
}
2018-02-27 18:06:05 +01:00
2020-04-20 18:03:18 +02:00
if ( * song = = app_ - > current_albumcover_loader ( ) - > last_song ( ) ) {
2019-07-07 21:14:24 +02:00
app_ - > current_albumcover_loader ( ) - > LoadAlbumCover ( * song ) ;
2018-02-27 18:06:05 +01:00
}
}
2021-02-26 21:03:51 +01:00
QUrl AlbumCoverChoiceController : : SaveCoverToFileAutomatic ( const Song * song , const AlbumCoverImageResult & result , const bool force_overwrite ) {
2019-03-11 23:07:11 +01:00
2021-02-26 21:03:51 +01:00
return SaveCoverToFileAutomatic ( song - > source ( ) ,
song - > effective_albumartist ( ) ,
song - > effective_album ( ) ,
song - > album_id ( ) ,
song - > url ( ) . adjusted ( QUrl : : RemoveFilename ) . path ( ) ,
result ,
force_overwrite ) ;
2019-03-11 23:07:11 +01:00
}
2021-02-26 21:03:51 +01:00
QUrl AlbumCoverChoiceController : : SaveCoverToFileAutomatic ( const Song : : Source source ,
const QString & artist ,
const QString & album ,
const QString & album_id ,
const QString & album_dir ,
const AlbumCoverImageResult & result ,
const bool force_overwrite ) {
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
QString filepath = app_ - > album_cover_loader ( ) - > CoverFilePath ( source , artist , album , album_id , album_dir , result . cover_url , " jpg " ) ;
2019-07-07 21:14:24 +02:00
if ( filepath . isEmpty ( ) ) return QUrl ( ) ;
2018-05-01 00:41:33 +02:00
2021-02-26 21:03:51 +01:00
QFile file ( filepath ) ;
// Don't overwrite when saving in album dir if the filename is set to pattern unless "force_overwrite" is set.
if ( source = = Song : : Source_Collection & & ! cover_overwrite_ & & ! force_overwrite & & get_save_album_cover_type ( ) = = CollectionSettingsPage : : SaveCoverType_Album & & save_cover_filename_ = = CollectionSettingsPage : : SaveCoverFilename_Pattern & & file . exists ( ) ) {
while ( file . exists ( ) ) {
QFileInfo fileinfo ( file . fileName ( ) ) ;
file . setFileName ( fileinfo . path ( ) + " /0 " + fileinfo . fileName ( ) ) ;
}
filepath = file . fileName ( ) ;
}
QUrl cover_url ;
if ( result . is_jpeg ( ) ) {
if ( file . open ( QIODevice : : WriteOnly ) ) {
2021-08-09 23:32:26 +02:00
if ( file . write ( result . image_data ) > 0 ) {
cover_url = QUrl : : fromLocalFile ( filepath ) ;
}
else {
qLog ( Error ) < < " Failed to write cover to file " < < file . fileName ( ) < < file . errorString ( ) ;
2021-09-19 19:31:34 +02:00
emit Error ( tr ( " Failed to write cover to file %1: %2 " ) . arg ( file . fileName ( ) , file . errorString ( ) ) ) ;
2021-08-09 23:32:26 +02:00
}
2021-02-26 21:03:51 +01:00
file . close ( ) ;
}
2021-08-09 23:32:26 +02:00
else {
qLog ( Error ) < < " Failed to open cover file " < < file . fileName ( ) < < " for writing: " < < file . errorString ( ) ;
2021-09-19 19:31:34 +02:00
emit Error ( tr ( " Failed to open cover file %1 for writing: %2 " ) . arg ( file . fileName ( ) , file . errorString ( ) ) ) ;
2021-08-09 23:32:26 +02:00
}
2021-02-26 21:03:51 +01:00
}
else {
if ( result . image . save ( filepath , " JPG " ) ) cover_url = QUrl : : fromLocalFile ( filepath ) ;
}
return cover_url ;
}
void AlbumCoverChoiceController : : SaveCoverEmbeddedAutomatic ( const Song & song , const AlbumCoverImageResult & result ) {
if ( song . source ( ) = = Song : : Source_Collection ) {
# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QFuture < SongList > future = QtConcurrent : : run ( & CollectionBackend : : GetAlbumSongs , app_ - > collection_backend ( ) , song . effective_albumartist ( ) , song . effective_album ( ) , QueryOptions ( ) ) ;
# else
QFuture < SongList > future = QtConcurrent : : run ( app_ - > collection_backend ( ) , & CollectionBackend : : GetAlbumSongs , song . effective_albumartist ( ) , song . effective_album ( ) , QueryOptions ( ) ) ;
# endif
QFutureWatcher < SongList > * watcher = new QFutureWatcher < SongList > ( ) ;
2022-06-20 23:51:44 +02:00
QObject : : connect ( watcher , & QFutureWatcher < SongList > : : finished , this , [ this , watcher , song , result ] ( ) {
2021-02-26 21:03:51 +01:00
SongList songs = watcher - > result ( ) ;
watcher - > deleteLater ( ) ;
QList < QUrl > urls ;
2021-06-20 19:04:08 +02:00
urls . reserve ( songs . count ( ) ) ;
2021-02-26 21:03:51 +01:00
for ( const Song & s : songs ) urls < < s . url ( ) ;
if ( result . is_jpeg ( ) ) {
2021-09-12 21:24:22 +02:00
quint64 id = app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( urls , result . image_data ) ;
2021-02-26 21:03:51 +01:00
QMutexLocker l ( & mutex_cover_save_tasks_ ) ;
cover_save_tasks_ . insert ( id , song ) ;
}
else {
2021-09-12 21:24:22 +02:00
quint64 id = app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( urls , result . image ) ;
2021-02-26 21:03:51 +01:00
QMutexLocker l ( & mutex_cover_save_tasks_ ) ;
cover_save_tasks_ . insert ( id , song ) ;
}
} ) ;
2021-06-16 00:30:21 +02:00
watcher - > setFuture ( future ) ;
2021-02-26 21:03:51 +01:00
}
else {
if ( result . is_jpeg ( ) ) {
app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( song . url ( ) . toLocalFile ( ) , result . image_data ) ;
}
else {
app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( song . url ( ) . toLocalFile ( ) , result . image ) ;
}
}
}
void AlbumCoverChoiceController : : SaveCoverEmbeddedAutomatic ( const Song & song , const QUrl & cover_url ) {
SaveCoverEmbeddedAutomatic ( song , cover_url . toLocalFile ( ) ) ;
2019-03-11 23:07:11 +01:00
2021-02-26 21:03:51 +01:00
}
void AlbumCoverChoiceController : : SaveCoverEmbeddedAutomatic ( const Song & song , const QString & cover_filename ) {
if ( song . source ( ) = = Song : : Source_Collection ) {
# if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QFuture < SongList > future = QtConcurrent : : run ( & CollectionBackend : : GetAlbumSongs , app_ - > collection_backend ( ) , song . effective_albumartist ( ) , song . effective_album ( ) , QueryOptions ( ) ) ;
# else
2021-02-26 22:01:45 +01:00
QFuture < SongList > future = QtConcurrent : : run ( app_ - > collection_backend ( ) , & CollectionBackend : : GetAlbumSongs , song . effective_albumartist ( ) , song . effective_album ( ) , QueryOptions ( ) ) ;
2021-02-26 21:03:51 +01:00
# endif
QFutureWatcher < SongList > * watcher = new QFutureWatcher < SongList > ( ) ;
2022-06-20 23:51:44 +02:00
QObject : : connect ( watcher , & QFutureWatcher < SongList > : : finished , this , [ this , watcher , song , cover_filename ] ( ) {
2021-02-26 21:03:51 +01:00
SongList songs = watcher - > result ( ) ;
watcher - > deleteLater ( ) ;
QList < QUrl > urls ;
2021-06-20 19:04:08 +02:00
urls . reserve ( songs . count ( ) ) ;
2021-02-26 21:03:51 +01:00
for ( const Song & s : songs ) urls < < s . url ( ) ;
2021-09-12 21:24:22 +02:00
quint64 id = app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( urls , cover_filename ) ;
2021-02-26 21:03:51 +01:00
QMutexLocker l ( & mutex_cover_save_tasks_ ) ;
cover_save_tasks_ . insert ( id , song ) ;
} ) ;
2021-06-16 00:30:21 +02:00
watcher - > setFuture ( future ) ;
2021-02-26 21:03:51 +01:00
}
else {
app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( song . url ( ) . toLocalFile ( ) , cover_filename ) ;
2019-03-11 23:07:11 +01:00
}
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
}
2021-06-20 19:04:08 +02:00
void AlbumCoverChoiceController : : SaveCoverEmbeddedAutomatic ( const QList < QUrl > & urls , const QImage & image ) {
2018-02-27 18:06:05 +01:00
2021-02-26 21:03:51 +01:00
app_ - > album_cover_loader ( ) - > SaveEmbeddedCoverAsync ( urls , image ) ;
2018-02-27 18:06:05 +01:00
}
bool AlbumCoverChoiceController : : IsKnownImageExtension ( const QString & suffix ) {
if ( ! sImageExtensions ) {
sImageExtensions = new QSet < QString > ( ) ;
( * sImageExtensions ) < < " png " < < " jpg " < < " jpeg " < < " bmp " < < " gif " < < " xpm " < < " pbm " < < " pgm " < < " ppm " < < " xbm " ;
}
return sImageExtensions - > contains ( suffix ) ;
}
bool AlbumCoverChoiceController : : CanAcceptDrag ( const QDragEnterEvent * e ) {
for ( const QUrl & url : e - > mimeData ( ) - > urls ( ) ) {
const QString suffix = QFileInfo ( url . toLocalFile ( ) ) . suffix ( ) . toLower ( ) ;
if ( IsKnownImageExtension ( suffix ) ) return true ;
}
2019-04-08 18:46:11 +02:00
return e - > mimeData ( ) - > hasImage ( ) ;
2018-02-27 18:06:05 +01:00
}
2019-07-07 21:14:24 +02:00
QUrl AlbumCoverChoiceController : : SaveCover ( Song * song , const QDropEvent * e ) {
2018-02-27 18:06:05 +01:00
for ( const QUrl & url : e - > mimeData ( ) - > urls ( ) ) {
2018-09-10 21:58:57 +02:00
2018-02-27 18:06:05 +01:00
const QString filename = url . toLocalFile ( ) ;
const QString suffix = QFileInfo ( filename ) . suffix ( ) . toLower ( ) ;
if ( IsKnownImageExtension ( suffix ) ) {
2021-02-26 21:03:51 +01:00
if ( get_save_album_cover_type ( ) = = CollectionSettingsPage : : SaveCoverType_Embedded & & song - > save_embedded_cover_supported ( ) ) {
SaveCoverEmbeddedAutomatic ( * song , filename ) ;
return QUrl : : fromLocalFile ( Song : : kEmbeddedCover ) ;
}
else {
SaveArtManualToSong ( song , url ) ;
}
2019-07-07 21:14:24 +02:00
return url ;
2018-02-27 18:06:05 +01:00
}
}
if ( e - > mimeData ( ) - > hasImage ( ) ) {
QImage image = qvariant_cast < QImage > ( e - > mimeData ( ) - > imageData ( ) ) ;
if ( ! image . isNull ( ) ) {
2021-02-26 21:03:51 +01:00
return SaveCoverAutomatic ( song , AlbumCoverImageResult ( image ) ) ;
2018-02-27 18:06:05 +01:00
}
}
2019-07-07 21:14:24 +02:00
return QUrl ( ) ;
2018-02-27 18:06:05 +01:00
}
2021-02-26 21:03:51 +01:00
QUrl AlbumCoverChoiceController : : SaveCoverAutomatic ( Song * song , const AlbumCoverImageResult & result ) {
QUrl cover_url ;
switch ( get_save_album_cover_type ( ) ) {
case CollectionSettingsPage : : SaveCoverType_Embedded : {
if ( song - > save_embedded_cover_supported ( ) ) {
SaveCoverEmbeddedAutomatic ( * song , result ) ;
cover_url = QUrl : : fromLocalFile ( Song : : kEmbeddedCover ) ;
break ;
}
}
2022-07-26 20:37:06 +02:00
[[fallthrough]] ;
2021-02-26 21:03:51 +01:00
case CollectionSettingsPage : : SaveCoverType_Cache :
case CollectionSettingsPage : : SaveCoverType_Album : {
cover_url = SaveCoverToFileAutomatic ( song , result ) ;
if ( ! cover_url . isEmpty ( ) ) SaveArtManualToSong ( song , cover_url ) ;
break ;
}
}
return cover_url ;
}
2021-03-07 05:43:56 +01:00
void AlbumCoverChoiceController : : SaveEmbeddedCoverAsyncFinished ( quint64 id , const bool success , const bool cleared ) {
2021-02-26 21:03:51 +01:00
if ( ! cover_save_tasks_ . contains ( id ) ) return ;
Song song = cover_save_tasks_ . take ( id ) ;
2021-03-07 05:43:56 +01:00
if ( success ) {
if ( cleared ) SaveArtAutomaticToSong ( & song , QUrl ( ) ) ;
else SaveArtAutomaticToSong ( & song , QUrl : : fromLocalFile ( Song : : kEmbeddedCover ) ) ;
}
2021-02-26 21:03:51 +01:00
}