diff -Nru cantata-2.3.0/cantata_icon.qrc cantata-2.3.1/cantata_icon.qrc --- cantata-2.3.0/cantata_icon.qrc 1970-01-01 00:00:00.000000000 +0000 +++ cantata-2.3.1/cantata_icon.qrc 2018-05-22 08:54:17.000000000 +0000 @@ -0,0 +1,12 @@ + + +icons/cantata.svg +icons/cantata16.png +icons/cantata22.png +icons/cantata24.png +icons/cantata32.png +icons/cantata48.png +icons/cantata64.png +icons/cantata128.png + + diff -Nru cantata-2.3.0/cantata.qrc cantata-2.3.1/cantata.qrc --- cantata-2.3.0/cantata.qrc 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/cantata.qrc 2018-05-24 17:06:58.000000000 +0000 @@ -3,10 +3,6 @@ icons/stars.svg icons/consume.svg -icons/mpd.svg -icons/home.svg -icons/hdd.svg - icons/sidebar-library.svg icons/sidebar-devices.svg icons/sidebar-folders.svg @@ -16,28 +12,27 @@ icons/sidebar-playqueue.svg icons/sidebar-search.svg -online/icons/soundcloud.svg -online/icons/jamendo.svg -online/icons/magnatune.svg -online/icons/podcasts.svg -online/icons/itunes.svg -online/icons/gpodder.svg - -streams/icons/favourites.svg -streams/icons/icecast.svg -streams/icons/shoutcast.svg -streams/icons/tunein.svg -streams/icons/dirble.svg +online/icons/magnatune.svg +online/icons/bbc.svg +online/icons/cbc.svg + +streams/icons/shoutcast.svg +streams/icons/tunein.svg +streams/icons/station.svg icons/media-optical.svg icons/media-optical32.svg icons/view-media-album.svg icons/view-media-artist.svg icons/view-media-genre.svg -icons/dice.svg -icons/playlist.svg icons/radio.svg -icons/gradcap.svg + +online/podcast_directories.xml +context/lyrics_providers.xml +scrobbling/scrobblers.xml +context/weblinks.xml +tags/tag_fixes.xml +mpd-interface/mpd.conf.template diff -Nru cantata-2.3.0/ChangeLog cantata-2.3.1/ChangeLog --- cantata-2.3.0/ChangeLog 2018-04-24 21:49:10.000000000 +0000 +++ cantata-2.3.1/ChangeLog 2018-06-01 18:08:17.000000000 +0000 @@ -1,3 +1,68 @@ +2.3.1 +----- + 1. Update some translations. + 2. Set Smart rules 'files added in the last days' limit to 10*365 + 3. Only sort playlists in folders view, and place these after tracks. + 4. Reduce width of statusbar spacer. + 5. Move scrobling 'love' button into toolbar. Use unfilled heart before loved, + and filled when loved. + 6. Better control of playqueue status bar buttons when contracting/expanding. + 7. For windows, when adding local files (served via internal HTTP server) add + the real file path as a query item. + 8. Use smaller text for help text in Tweaks section of preferences dialog. + 9. Fix playback of local non-MPD files under Windows. +10. Stretching albums covers not working under Windows, so just remove option. +11. Don't enable AA_EnableHighDpiScaling for windows builds, seems to + interfere with fractional scaling. +12. When playing, only poll MPD every 5 seconds. +13. When updating play seekbar from MPDStatus, only upate if more than 1 + second from calculated position. +14. Slightly reduce height of toolbar. +15. Add a slight border to context view. +16. Update suru icon - was a little too small. +17. Don't attempt to align main menu for Windows < 10, as Qt seems to add some + menu animation that just looks weird when menu is moved. +18. When searching on 'any', do a second search on 'file' and combine results. + Looks as if MPD does not search filenames/paths when using 'any.' +19. Fix UTF8 file saving under Windows. +20. Fix preference dialog size under windows. +21. Fix enabling of add/replace play queue actions for Jamendo/Magnatune. +22. Use JSON to encode song details when adding online tracks. +23. Don't allow slashes, asterisks, or question marks in collection name. +24. Don't overwrite genre with file type for Jamendo. +25. Allow adding Jamendo/Magnatune tracks to stored playlists. +26. Add "--collection" commandline option to control the initial collection to + use. +27. Fix crash if try to expand dirble and --no-network passed to Cantata. +28. Modify name of supplied font-awesome font to Cantata-FontAwesome, so as to + avoid conflicts with any system installed font. +29. Remove custom icon theme, and just use FontAwesome. +30. Show technical info to the left of ratings. +31. Embed FontAwesome into Cantata. +32. Remove "New York Times" podcast directory - not available? +33. Fix loading of FLAC images with older TagLib. +34. Fix saving of 'Fadeout on stop' duration. +35. Fix covers settings from wizard not being saved. +36. Don't report errors when listing playlists, as MPD reports error if user + has disabled these. +37. Add genius.com to list of lyrics providers. +38. Cache lyrics using 'basic' artist name - e.g. X ft. Y => X +39. When looking for lyrics, remove "ft. X", "featuring X", etc, from song + title as well as artist. +40. Fix adding streams from provider dialog. +41. Reduce number of confirmation dialogs. +42. Remove group warning from initial wizard. +43. Fix saving stream settings. +44. Fix usage of podcast cover in title widget. +45. Fix playback of downloaded podcasts. +46. Simplify whitespace of podcast name and episode names. +47. Fix saving of podcast images to JPG. +48. Remove qt5ct work-around. +49. When saving podcasts, remove queries from filename. +50. Limit SoundCloud results to 200 matches. +51. Fix loading of MPD playlists the very first time Cantata is started. +52. Add file max-age to dynamic playlist rules. + 2.3.0 ----- 1. Only disable system tray support if org.kde.StatusNotifierWatcher is not diff -Nru cantata-2.3.0/CMakeLists.txt cantata-2.3.1/CMakeLists.txt --- cantata-2.3.0/CMakeLists.txt 2018-04-26 16:24:23.000000000 +0000 +++ cantata-2.3.1/CMakeLists.txt 2018-05-26 15:12:37.000000000 +0000 @@ -28,7 +28,7 @@ set(CPACK_SOURCE_GENERATOR "TBZ2") set(CPACK_PACKAGE_VERSION_MAJOR "2") set(CPACK_PACKAGE_VERSION_MINOR "3") -set(CPACK_PACKAGE_VERSION_PATCH "0") +set(CPACK_PACKAGE_VERSION_PATCH "1") set(CPACK_PACKAGE_VERSION_SPIN "") # Use ".$number" - e.g. ".1" set(CPACK_PACKAGE_CONTACT "Craig Drummond ") set(CANTATA_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}") @@ -63,6 +63,11 @@ option(ENABLE_MTP "Enable MTP library (required to support MTP devices)" ON) option(ENABLE_AVAHI "Enable automatic mpd server discovery" ${UNIX}) +# Build all apps into top-level folder, so that can run dev versions without install +if (NOT WIN32 AND NOT APPLE) + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) +endif() + if(ENABLE_AVAHI) find_package(Avahi) macro_log_feature(AVAHI_FOUND "Avahi Support" "Automatic MPD-Server Detection" "https://www.avahi.org/" FALSE "" "") @@ -312,7 +317,7 @@ widgets/actionlabel.cpp widgets/playqueueview.cpp widgets/groupedview.cpp widgets/actionitemdelegate.cpp widgets/textbrowser.cpp widgets/volumeslider.cpp widgets/menubutton.cpp widgets/icons.cpp widgets/toolbutton.cpp widgets/wizardpage.cpp widgets/searchwidget.cpp widgets/messageoverlay.cpp widgets/basicitemdelegate.cpp widgets/sizegrip.cpp - widgets/sizewidget.cpp widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp widgets/songdialog.cpp widgets/stretchheaderview.cpp + widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp widgets/songdialog.cpp widgets/stretchheaderview.cpp widgets/tableview.cpp widgets/thinsplitterhandle.cpp widgets/coverwidget.cpp widgets/ratingwidget.cpp widgets/notelabel.cpp widgets/selectorlabel.cpp widgets/titlewidget.cpp widgets/multipagewidget.cpp widgets/singlepagewidget.cpp widgets/stackedpagewidget.cpp widgets/mirrormenu.cpp widgets/genrecombo.cpp widgets/volumecontrol.cpp widgets/categorizedview.cpp @@ -338,8 +343,7 @@ online/onlinesearchwidget.cpp online/podcastservice.cpp online/rssparser.cpp online/opmlparser.cpp online/podcastsearchdialog.cpp online/podcastsettingsdialog.cpp online/podcastwidget.cpp online/onlinesearchservice.cpp db/onlinedb.cpp - scrobbling/scrobbler.cpp scrobbling/pausabletimer.cpp scrobbling/scrobblingsettings.cpp scrobbling/scrobblingstatus.cpp - scrobbling/scrobblinglove.cpp + scrobbling/scrobbler.cpp scrobbling/pausabletimer.cpp scrobbling/scrobblingsettings.cpp scrobbling/scrobblinglove.cpp http/httpserver.cpp) set(CANTATA_UIS ${CANTATA_UIS} gui/initialsettingswizard.ui gui/mainwindow.ui gui/interfacesettings.ui gui/playbacksettings.ui gui/serversettings.ui gui/coverdialog.ui @@ -453,7 +457,7 @@ devices/devicepropertiesdialog.cpp devices/encoders.cpp devices/freespaceinfo.cpp devices/transcodingjob.cpp devices/valueslider.cpp devices/syncdialog.cpp devices/synccollectionwidget.cpp - online/onlinedevice.cpp models/musiclibrarymodel.cpp) + models/musiclibrarymodel.cpp) set(CANTATA_UIS ${CANTATA_UIS} devices/actiondialog.ui devices/devicepropertieswidget.ui devices/synccollectionwidget.ui) @@ -511,6 +515,12 @@ set(CANTATA_SRCS ${CANTATA_SRCS} gui/shortcutssettingspage.cpp gui/mediakeys.cpp) +if (WIN32 OR APPLE) + set(CANTATA_RCS ${CANTATA_RCS} cantata_icon.qrc) +else() + add_subdirectory(icons) +endif() + QT5_ADD_RESOURCES(CANTATA_RC_SRCS ${CANTATA_RCS}) QT5_WRAP_UI(CANTATA_UI_HDRS ${CANTATA_UIS}) @@ -570,18 +580,8 @@ if (WIN32) target_link_libraries(cantata qxt) - install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml - DESTINATION ${CMAKE_INSTALL_PREFIX}/config/) -elseif (APPLE) - install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml - DESTINATION ${MACOSX_BUNDLE_RESOURCES}/config/) -else () - install(FILES tags/tag_fixes.xml context/lyrics_providers.xml context/weblinks.xml online/podcast_directories.xml scrobbling/scrobblers.xml - DESTINATION ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/config/) - install(FILES mpd-interface/mpd.conf.template DESTINATION ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/mpd) endif (WIN32) -add_subdirectory(icons) add_subdirectory(translations) add_subdirectory(support) add_subdirectory(3rdparty/qtiocompressor) diff -Nru cantata-2.3.0/config.h.cmake cantata-2.3.1/config.h.cmake --- cantata-2.3.0/config.h.cmake 2018-02-07 19:17:59.000000000 +0000 +++ cantata-2.3.1/config.h.cmake 2018-05-16 21:34:44.000000000 +0000 @@ -54,7 +54,6 @@ #define CANTATA_REV_URL "@PROJECT_REV_URL@" #define CANTATA_URL "@PROJECT_URL@" -#define CANTATA_SYS_CONFIG_DIR Utils::systemDir(QLatin1String("config")) #define CANTATA_SYS_ICONS_DIR Utils::systemDir(QLatin1String("icons")) #define CANTATA_SYS_MPD_DIR Utils::systemDir(QLatin1String("mpd")) #define CANTATA_SYS_TRANS_DIR Utils::systemDir(QLatin1String("translations")) diff -Nru cantata-2.3.0/context/albumview.cpp cantata-2.3.1/context/albumview.cpp --- cantata-2.3.0/context/albumview.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/context/albumview.cpp 2018-05-05 10:54:54.000000000 +0000 @@ -66,11 +66,15 @@ , detailsReceived(0) { engine=ContextEngine::create(this); - refreshAction = ActionCollection::get()->createAction("refreshalbum", tr("Refresh Album Information"), Icons::self()->refreshIcon); + #ifndef Q_OS_WIN + // Full width covers not working under windows. Issue #1252 fullWidthCoverAction = new Action(tr("Full Width Cover"), this); fullWidthCoverAction->setCheckable(true); - connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh())); connect(fullWidthCoverAction, SIGNAL(toggled(bool)), this, SLOT(setScaleImage(bool))); + fullWidthCoverAction->setChecked(Configuration(metaObject()->className()).get("fullWidthCover", false)); + #endif + refreshAction = ActionCollection::get()->createAction("refreshalbum", tr("Refresh Album Information"), Icons::self()->refreshIcon); + connect(refreshAction, SIGNAL(triggered()), this, SLOT(refresh())); connect(engine, SIGNAL(searchResult(QString,QString)), this, SLOT(searchResponse(QString,QString))); connect(Covers::self(), SIGNAL(cover(Song,QImage,QString)), SLOT(coverRetrieved(Song,QImage,QString))); connect(Covers::self(), SIGNAL(coverUpdated(Song,QImage,QString)), SLOT(coverUpdated(Song,QImage,QString))); @@ -87,12 +91,13 @@ connect(timer, SIGNAL(timeout()), this, SLOT(clearCache())); timer->start((int)((ArtistView::constCacheAge/2.0)*1000*24*60*60)); } - fullWidthCoverAction->setChecked(Configuration(metaObject()->className()).get("fullWidthCover", false)); } AlbumView::~AlbumView() { + #ifndef Q_OS_WIN Configuration(metaObject()->className()).set("fullWidthCover", fullWidthCoverAction->isChecked()); + #endif } void AlbumView::showContextMenu(const QPoint &pos) @@ -104,7 +109,9 @@ } else { menu->addAction(refreshAction); } + #ifndef Q_OS_WIN menu->addAction(fullWidthCoverAction); + #endif menu->exec(text->mapToGlobal(pos)); delete menu; } diff -Nru cantata-2.3.0/context/albumview.h cantata-2.3.1/context/albumview.h --- cantata-2.3.0/context/albumview.h 2018-02-14 17:39:41.000000000 +0000 +++ cantata-2.3.1/context/albumview.h 2018-04-30 21:23:02.000000000 +0000 @@ -70,7 +70,9 @@ private: QString currentArtist; Action *refreshAction; + #ifndef Q_OS_WIN Action *fullWidthCoverAction; + #endif ContextEngine *engine; int detailsReceived; QString pic; diff -Nru cantata-2.3.0/context/artistview.cpp cantata-2.3.1/context/artistview.cpp --- cantata-2.3.0/context/artistview.cpp 2018-03-14 19:01:02.000000000 +0000 +++ cantata-2.3.1/context/artistview.cpp 2018-05-16 21:34:22.000000000 +0000 @@ -287,6 +287,10 @@ QFile f(cacheFileName(reply->property(constNameKey).toString(), QString(), true, true)); if (f.open(QIODevice::WriteOnly|QIODevice::Text)) { QTextStream stream(&f); + #ifdef Q_OS_WIN + stream.setCodec("UTF-8"); + stream.setGenerateByteOrderMark(true); + #endif for (const QString &artist: artists) { stream << artist << endl; } @@ -320,7 +324,7 @@ } if (webLinks.isEmpty()) { - QFile file(CANTATA_SYS_CONFIG_DIR+"weblinks.xml"); + QFile file(":weblinks.xml"); if (file.open(QIODevice::ReadOnly)) { QXmlStreamReader reader(&file); while (!reader.atEnd()) { diff -Nru cantata-2.3.0/context/contextwidget.cpp cantata-2.3.1/context/contextwidget.cpp --- cantata-2.3.0/context/contextwidget.cpp 2018-03-25 10:37:14.000000000 +0000 +++ cantata-2.3.1/context/contextwidget.cpp 2018-05-01 21:26:45.000000000 +0000 @@ -517,6 +517,18 @@ if (darkBackground) { p.fillRect(r, palette().background().color()); + } else { + QColor col = palette().windowText().color(); + col.setAlphaF(0.15); + p.setPen(col); + p.drawLine(r.topLeft(), r.topRight()); + if (parentWidget() && parentWidget()->parentWidget() && 0==qstrcmp(parentWidget()->parentWidget()->metaObject()->className(), "QStackedWidget")) { + if (Qt::LeftToRight==layoutDirection()) { + p.drawLine(r.topLeft()+QPoint(0, 1), r.bottomLeft()); + } else { + p.drawLine(r.topRight()+QPoint(0, 1), r.bottomRight()); + } + } } if (backdropType) { if (!oldBackdrop.isNull()) { diff -Nru cantata-2.3.0/context/lyricsdialog.cpp cantata-2.3.1/context/lyricsdialog.cpp --- cantata-2.3.0/context/lyricsdialog.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/context/lyricsdialog.cpp 2018-05-24 18:01:51.000000000 +0000 @@ -23,6 +23,7 @@ #include #include +#include #include "support/icon.h" #include "lyricsdialog.h" @@ -46,7 +47,7 @@ icn->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); int iconSize=Icon::dlgIconSize(); icn->setFixedSize(iconSize, iconSize); - icn->setPixmap(Icon("dialog-information").pixmap(iconSize, iconSize)); + icn->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(iconSize, iconSize)); mainLayout->setMargin(0); layout->setMargin(0); mainLayout->addWidget(icn, 0, 0, 1, 1); diff -Nru cantata-2.3.0/context/lyrics_providers.xml cantata-2.3.1/context/lyrics_providers.xml --- cantata-2.3.0/context/lyrics_providers.xml 2018-02-15 18:10:11.000000000 +0000 +++ cantata-2.3.1/context/lyrics_providers.xml 2018-05-20 18:56:09.000000000 +0000 @@ -99,6 +99,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -Nru cantata-2.3.0/context/songview.cpp cantata-2.3.1/context/songview.cpp --- cantata-2.3.0/context/songview.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/context/songview.cpp 2018-05-20 12:34:54.000000000 +0000 @@ -62,26 +62,26 @@ static QString infoCacheFileName(const Song &song, const QString &lang, bool createDir) { - QString dir=Utils::cacheDir(SongView::constCacheDir+Covers::encodeName(song.artist)+Utils::constDirSep, createDir); + QString dir=Utils::cacheDir(SongView::constCacheDir+Covers::encodeName(song.basicArtist())+Utils::constDirSep, createDir); if (dir.isEmpty()) { return QString(); } - return dir+Covers::encodeName(song.title)+"."+lang+SongView::constInfoExt; + return dir+Covers::encodeName(song.basicTitle())+"."+lang+SongView::constInfoExt; } static QString lyricsCacheFileName(const Song &song, bool createDir=false) { - QString dir=Utils::cacheDir(SongView::constLyricsDir+Covers::encodeName(song.artist)+Utils::constDirSep, createDir); + QString dir=Utils::cacheDir(SongView::constLyricsDir+Covers::encodeName(song.basicArtist())+Utils::constDirSep, createDir); if (dir.isEmpty()) { return QString(); } - return dir+Covers::encodeName(song.title)+SongView::constExtension; + return dir+Covers::encodeName(song.basicTitle())+SongView::constExtension; } #if !defined Q_OS_WIN && !defined Q_OS_MAC static QString lyricsOtherFileName(const Song &song) { - return QDir::homePath()+"/.lyrics/"+Covers::encodeName(song.artist)+" - "+Covers::encodeName(song.title)+".txt"; + return QDir::homePath()+"/.lyrics/"+Covers::encodeName(song.basicArtist())+" - "+Covers::encodeName(song.basicTitle())+".txt"; } #endif @@ -361,30 +361,40 @@ job->setProperty("file", currentSong.file); connect(job, SIGNAL(finished()), this, SLOT(downloadFinished())); return; - } else { - #ifdef TAGLIB_FOUND - QString tagLyrics=Tags::readLyrics(songFile); + } + } - if (!tagLyrics.isEmpty()) { - text->setText(fixNewLines(tagLyrics)); - setMode(Mode_Display); -// controls->setVisible(false); - return; - } - #endif - // Stop here if we found lyrics in the cache dir. - if (setLyricsFromFile(mpdLyrics)) { - lyricsFile=mpdLyrics; - setMode(Mode_Display); - return; - } - // Try .txt extension - mpdLyrics=Utils::changeExtension(mpdLyrics, ".txt"); - if (setLyricsFromFile(mpdLyrics)) { - lyricsFile=mpdLyrics; - setMode(Mode_Display); - return; - } + loadLyricsFromFile(); +} + +void SongView::loadLyricsFromFile() +{ + if (currentSong.isCantataStream() || (!MPDConnection::self()->getDetails().dir.isEmpty() && !currentSong.file.isEmpty() && !currentSong.isNonMPD())) { + QString songFile=currentSong.filePath(MPDConnection::self()->getDetails().dir); + QString mpdLyrics=mpdLyricsFilePath(currentSong); + + #ifdef TAGLIB_FOUND + QString tagLyrics=Tags::readLyrics(songFile); + + if (!tagLyrics.isEmpty()) { + text->setText(fixNewLines(tagLyrics)); + setMode(Mode_Display); + // controls->setVisible(false); + return; + } + #endif + // Stop here if we found lyrics in the cache dir. + if (setLyricsFromFile(mpdLyrics)) { + lyricsFile=mpdLyrics; + setMode(Mode_Display); + return; + } + // Try .txt extension + mpdLyrics=Utils::changeExtension(mpdLyrics, ".txt"); + if (setLyricsFromFile(mpdLyrics)) { + lyricsFile=mpdLyrics; + setMode(Mode_Display); + return; } } @@ -646,7 +656,7 @@ void SongView::searchForInfo() { cancelInfoJobAction->setEnabled(true); - engine->search(QStringList() << currentSong.artist << currentSong.title, ContextEngine::Track); + engine->search(QStringList() << currentSong.basicArtist() << currentSong.basicTitle(), ContextEngine::Track); showSpinner(false); } @@ -780,7 +790,7 @@ } } } - getLyrics(); + loadLyricsFromFile(); } void SongView::lyricsReady(int id, QString lyrics) @@ -817,7 +827,12 @@ QFile f(fileName); if (f.open(QIODevice::WriteOnly)) { - QTextStream(&f) << text->toPlainText(); + QTextStream stream(&f); + #ifdef Q_OS_WIN + stream.setCodec("UTF-8"); + stream.setGenerateByteOrderMark(true); + #endif + stream << text->toPlainText(); f.close(); lyricsFile=fileName; return true; @@ -882,7 +897,6 @@ if (f.exists() && f.open(QIODevice::ReadOnly)) { // Read the file using a QTextStream so we get automatic UTF8 detection. QTextStream inputStream(&f); - text->setText(fixNewLines(inputStream.readAll())); cancelJobAction->setEnabled(false); hideSpinner(); diff -Nru cantata-2.3.0/context/songview.h cantata-2.3.1/context/songview.h --- cantata-2.3.0/context/songview.h 2018-02-14 22:24:06.000000000 +0000 +++ cantata-2.3.1/context/songview.h 2018-05-03 18:32:19.000000000 +0000 @@ -87,6 +87,7 @@ private: void loadLyrics(); + void loadLyricsFromFile(); void loadInfo(); void loadMetadata(); void searchForInfo(); diff -Nru cantata-2.3.0/context/ultimatelyrics.cpp cantata-2.3.1/context/ultimatelyrics.cpp --- cantata-2.3.0/context/ultimatelyrics.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/context/ultimatelyrics.cpp 2018-05-16 21:37:43.000000000 +0000 @@ -150,31 +150,36 @@ return; } - QStringList dirs=QStringList() << Utils::dataDir() << CANTATA_SYS_CONFIG_DIR; + QStringList files; + QString userDir=Utils::dataDir(); - QSet providerNames; - for (const QString &d: dirs) { - if (d.isEmpty()) { - continue; - } - QFileInfoList files=QDir(d).entryInfoList(QStringList() << QLatin1String("lyrics_*.xml"), QDir::NoDotAndDotDot|QDir::Files); + if (!userDir.isEmpty()) { + QFileInfoList files=QDir(userDir).entryInfoList(QStringList() << QLatin1String("lyrics_*.xml"), QDir::NoDotAndDotDot|QDir::Files); for (const QFileInfo &f: files) { - QFile file(f.absoluteFilePath()); - if (file.open(QIODevice::ReadOnly)) { - QXmlStreamReader reader(&file); - while (!reader.atEnd()) { - reader.readNext(); - - if (QLatin1String("provider")==reader.name()) { - QString name=reader.attributes().value("name").toString(); - - if (!providerNames.contains(name)) { - UltimateLyricsProvider *provider = parseProvider(&reader); - if (provider) { - providers << provider; - connect(provider, SIGNAL(lyricsReady(int,QString)), this, SIGNAL(lyricsReady(int,QString))); - providerNames.insert(name); - } + files.append(f.absoluteFilePath()); + } + } + + files.append(":lyrics_providers.xml"); + + QSet providerNames; + + for (const auto &f: files) { + QFile file(f); + if (file.open(QIODevice::ReadOnly)) { + QXmlStreamReader reader(&file); + while (!reader.atEnd()) { + reader.readNext(); + + if (QLatin1String("provider")==reader.name()) { + QString name=reader.attributes().value("name").toString(); + + if (!providerNames.contains(name)) { + UltimateLyricsProvider *provider = parseProvider(&reader); + if (provider) { + providers << provider; + connect(provider, SIGNAL(lyricsReady(int,QString)), this, SIGNAL(lyricsReady(int,QString))); + providerNames.insert(name); } } } diff -Nru cantata-2.3.0/context/ultimatelyricsprovider.cpp cantata-2.3.1/context/ultimatelyricsprovider.cpp --- cantata-2.3.0/context/ultimatelyricsprovider.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/context/ultimatelyricsprovider.cpp 2018-05-20 12:39:43.000000000 +0000 @@ -78,7 +78,7 @@ str.replace(constArtistArg, artistFixed); str.replace(constArtistFirstCharArg, firstChar(artistFixed)); str.replace(constAlbumArg, song.album); - str.replace(constTitleArg, song.title); + str.replace(constTitleArg, song.basicTitle()); str.replace(constYearArg, QString::number(song.year)); str.replace(constTrackNoArg, QString::number(song.track)); } @@ -216,6 +216,7 @@ } QString artistFixed=metadata.basicArtist(); + QString titleFixed=metadata.basicTitle(); QString urlText(url); if (QLatin1String("lyrics.wikia.com")==name) { @@ -223,7 +224,7 @@ QUrlQuery query; query.addQueryItem(QLatin1String("artist"), artistFixed); - query.addQueryItem(QLatin1String("song"), metadata.title); + query.addQueryItem(QLatin1String("song"), titleFixed); query.addQueryItem(QLatin1String("func"), QLatin1String("getSong")); query.addQueryItem(QLatin1String("fmt"), QLatin1String("xml")); url.setQuery(query); @@ -246,9 +247,9 @@ doUrlReplace(constAlbumArg, metadata.album, urlText); doUrlReplace(constAlbumLowerArg, metadata.album.toLower(), urlText); doUrlReplace(constAlbumLowerNoSpaceArg, noSpace(metadata.album.toLower()), urlText); - doUrlReplace(constTitleArg, metadata.title, urlText); - doUrlReplace(constTitleLowerArg, metadata.title.toLower(), urlText); - doUrlReplace(constTitleCaseArg, titleCase(metadata.title), urlText); + doUrlReplace(constTitleArg, titleFixed, urlText); + doUrlReplace(constTitleLowerArg, titleFixed.toLower(), urlText); + doUrlReplace(constTitleCaseArg, titleCase(titleFixed), urlText); doUrlReplace(constYearArg, QString::number(metadata.year), urlText); doUrlReplace(constTrackNoArg, QString::number(metadata.track), urlText); } diff -Nru cantata-2.3.0/debian/changelog cantata-2.3.1/debian/changelog --- cantata-2.3.0/debian/changelog 2018-04-27 14:22:20.000000000 +0000 +++ cantata-2.3.1/debian/changelog 2018-06-06 08:07:49.000000000 +0000 @@ -1,4 +1,4 @@ -cantata (2.3.0-0build1~ubuntu16.04) xenial; urgency=low +cantata (2.3.1-0build1~ubuntu16.04) xenial; urgency=low * New upstream release. * Use the packaged font-awesome rather than a local copy. diff -Nru cantata-2.3.0/debian/patches/series cantata-2.3.1/debian/patches/series --- cantata-2.3.0/debian/patches/series 2018-04-27 14:31:51.000000000 +0000 +++ cantata-2.3.1/debian/patches/series 2018-06-06 07:26:30.000000000 +0000 @@ -1,2 +1 @@ -font-awesome.patch ebur128-location.patch diff -Nru cantata-2.3.0/debian/rules cantata-2.3.1/debian/rules --- cantata-2.3.0/debian/rules 2017-09-30 06:05:39.000000000 +0000 +++ cantata-2.3.1/debian/rules 2018-06-06 07:56:20.000000000 +0000 @@ -16,7 +16,6 @@ override_dh_auto_install: dh_auto_install - rm $(CURDIR)/debian/cantata/usr/share/cantata/icons/cantata/LICENSE override_dh_installexamples: dh_installexamples diff -Nru cantata-2.3.0/devices/actiondialog.cpp cantata-2.3.1/devices/actiondialog.cpp --- cantata-2.3.0/devices/actiondialog.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/devices/actiondialog.cpp 2018-05-24 18:11:34.000000000 +0000 @@ -47,6 +47,7 @@ #endif #include #include +#include #ifdef QT_QTDBUS_FOUND #include #endif @@ -87,8 +88,8 @@ QWidget *mainWidet = new QWidget(this); setupUi(mainWidet); setMainWidget(mainWidet); - errorIcon->setPixmap(QIcon::fromTheme("dialog-error").pixmap(64, 64)); - skipIcon->setPixmap(QIcon::fromTheme("dialog-warning").pixmap(64, 64)); + errorIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(64, 64)); + skipIcon->setPixmap(style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(64, 64)); configureSourceButton->setIcon(Icons::self()->configureIcon); configureDestButton->setIcon(Icons::self()->configureIcon); connect(configureSourceButton, SIGNAL(clicked()), SLOT(configureSource())); diff -Nru cantata-2.3.0/devices/audiocddevice.cpp cantata-2.3.1/devices/audiocddevice.cpp --- cantata-2.3.0/devices/audiocddevice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/devices/audiocddevice.cpp 2018-05-23 18:55:59.000000000 +0000 @@ -36,6 +36,7 @@ #include "mpd-interface/mpdconnection.h" #include "gui/covers.h" #include "gui/settings.h" +#include "widgets/icons.h" #include #include #include @@ -88,7 +89,7 @@ , lookupInProcess(false) , autoPlay(false) { - icn=Icon("media-optical"); + icn=Icons::self()->albumMonoIcon; drive=dev.parent().as(); Solid::Block *block=dev.as(); if (block) { diff -Nru cantata-2.3.0/devices/device.cpp cantata-2.3.1/devices/device.cpp --- cantata-2.3.0/devices/device.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/devices/device.cpp 2018-05-24 18:05:14.000000000 +0000 @@ -47,6 +47,7 @@ #include "models/musiclibraryitemalbum.h" #include "models/musiclibraryitemsong.h" #include "models/musiclibrarymodel.h" +#include "widgets/icons.h" #include "solid-lite/portablemediaplayer.h" #include "solid-lite/storageaccess.h" #include "solid-lite/storagedrive.h" @@ -268,9 +269,9 @@ int index=song.file.lastIndexOf('.'); if (index>0) { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"+song.file.mid(index)); + temp=new QTemporaryFile("cantata_XXXXXX"+song.file.mid(index)); } else { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"); + temp=new QTemporaryFile("cantata_XXXXXX"); } temp->setAutoRemove(false); @@ -311,7 +312,7 @@ , transcoding(false) { m_model=m; - icn=Icon(solidDev.isValid() ? solidDev.icon() : QLatin1String("inode-directory")); + icn=Icons::self()->folderListIcon; m_itemData[0]=m_itemData[0].toUpper(); } @@ -325,7 +326,7 @@ , transcoding(false) { m_model=m; - icn=Icon(solidDev.isValid() ? solidDev.icon() : QLatin1String("inode-directory")); + icn=solidDev.isValid() ? Icon::get(solidDev.icon()) : Icons::self()->folderListIcon; } void Device::saveCache() diff -Nru cantata-2.3.0/devices/device.h cantata-2.3.1/devices/device.h --- cantata-2.3.0/devices/device.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/devices/device.h 2018-05-24 17:53:48.000000000 +0000 @@ -108,7 +108,7 @@ ~Device() override { } - Icon icon() const override { return icn; } + QIcon icon() const override { return icn; } Song fixPath(const Song &orig, bool fullPath) const override; virtual QString coverFile() const { return QString(); } virtual bool isConnected() const=0; @@ -186,7 +186,7 @@ bool needToFixVa; bool jobAbortRequested; bool transcoding; - Icon icn; + QIcon icn; }; #endif diff -Nru cantata-2.3.0/devices/mtpdevice.cpp cantata-2.3.1/devices/mtpdevice.cpp --- cantata-2.3.0/devices/mtpdevice.cpp 2018-04-02 10:18:48.000000000 +0000 +++ cantata-2.3.1/devices/mtpdevice.cpp 2018-05-24 17:03:17.000000000 +0000 @@ -40,6 +40,7 @@ #include "filejob.h" #include "support/configuration.h" #include "support/thread.h" +#include "support/monoicon.h" #include #include #include @@ -753,9 +754,9 @@ int index=name.lastIndexOf('.'); if (index>0) { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"+name.mid(index)); + temp=new QTemporaryFile("cantata_XXXXXX"+name.mid(index)); } else { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX"); + temp=new QTemporaryFile("cantata_XXXXXX"); } img.save(temp); temp->close(); @@ -1211,7 +1212,7 @@ DBUG << "setName" << opts.name; setData(opts.name); } - icn=Icon("multimedia-player"); + icn=MonoIcon::icon(FontAwesome::mobilephone, Utils::monoIconColor()); } MtpDevice::~MtpDevice() @@ -1338,7 +1339,7 @@ if (transcoding) { deleteTemp(); - tempFile=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+encoder.extension); + tempFile=new QTemporaryFile("cantata_XXXXXX."+encoder.extension); tempFile->setAutoRemove(false); if (!tempFile->open()) { diff -Nru cantata-2.3.0/devices/remotefsdevice.cpp cantata-2.3.1/devices/remotefsdevice.cpp --- cantata-2.3.0/devices/remotefsdevice.cpp 2018-04-02 14:33:00.000000000 +0000 +++ cantata-2.3.1/devices/remotefsdevice.cpp 2018-05-23 19:34:59.000000000 +0000 @@ -28,6 +28,7 @@ #include "actiondialog.h" #include "support/inputdialog.h" #include "support/utils.h" +#include "support/monoicon.h" #include "http/httpserver.h" #include "support/configuration.h" #include "mountpoints.h" @@ -215,11 +216,11 @@ // details.path=Utils::fixPath(details.path); load(); mount(); - icn=details.isLocalFile() - ? Icon("inode-directory") - : constSshfsProtocol==details.url.scheme() - ? Icon(QStringList() << "folder-network" << "utilities-terminal") - : Icon(QStringList() << "folder-samba" << "network-server"); + icn=MonoIcon::icon(details.isLocalFile() + ? FontAwesome::foldero + : constSshfsProtocol==details.url.scheme() + ? FontAwesome::linux_os + : FontAwesome::windows, Utils::monoIconColor()); } RemoteFsDevice::RemoteFsDevice(MusicLibraryModel *m, const Details &d) @@ -233,7 +234,11 @@ { // details.path=Utils::fixPath(details.path); setup(); - icn=Icon(details.isLocalFile() ? "inode-directory" : (constSshfsProtocol==details.url.scheme() ? "utilities-terminal" : "network-server")); + icn=MonoIcon::icon(details.isLocalFile() + ? FontAwesome::foldero + : constSshfsProtocol==details.url.scheme() + ? FontAwesome::linux_os + : FontAwesome::windows, Utils::monoIconColor()); } RemoteFsDevice::~RemoteFsDevice() { diff -Nru cantata-2.3.0/devices/synccollectionwidget.h cantata-2.3.1/devices/synccollectionwidget.h --- cantata-2.3.0/devices/synccollectionwidget.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/devices/synccollectionwidget.h 2018-05-24 18:04:59.000000000 +0000 @@ -32,7 +32,6 @@ class QTimer; class Action; -class Icon; class SyncCollectionWidget : public QWidget, Ui::SyncCollectionWidget { diff -Nru cantata-2.3.0/devices/umsdevice.cpp cantata-2.3.1/devices/umsdevice.cpp --- cantata-2.3.0/devices/umsdevice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/devices/umsdevice.cpp 2018-05-23 18:57:53.000000000 +0000 @@ -23,6 +23,7 @@ #include "umsdevice.h" #include "support/utils.h" +#include "support/monoicon.h" #include "devicepropertiesdialog.h" #include "devicepropertieswidget.h" #include "actiondialog.h" @@ -56,8 +57,7 @@ defaultName=data()+details; setData(defaultName); setup(); - icn=Icon(QStringList() << "drive-removable-media-usb-pendrive" << "drive-removable-media-usb" - << "multimedia-player"); + icn=MonoIcon::icon(FontAwesome::usb, Utils::monoIconColor()); } UmsDevice::~UmsDevice() diff -Nru cantata-2.3.0/gui/apikeys.cpp cantata-2.3.1/gui/apikeys.cpp --- cantata-2.3.0/gui/apikeys.cpp 2018-04-01 19:12:17.000000000 +0000 +++ cantata-2.3.1/gui/apikeys.cpp 2018-05-11 16:35:54.000000000 +0000 @@ -132,6 +132,7 @@ } return true; } + return false; } bool ApiKeys::isLimitReached(const QNetworkReply *job, Service srv) @@ -139,6 +140,9 @@ if (isLimitReached(srv)) { return true; } + if (!job) { + return false; + } bool reached = false; switch (srv) { diff -Nru cantata-2.3.0/gui/apikeyssettings.cpp cantata-2.3.1/gui/apikeyssettings.cpp --- cantata-2.3.0/gui/apikeyssettings.cpp 2018-03-17 11:40:31.000000000 +0000 +++ cantata-2.3.1/gui/apikeyssettings.cpp 2018-05-09 19:37:05.000000000 +0000 @@ -77,6 +77,9 @@ "with all Cantata users) has reached its monthly usage limit. To work-around this, you can register with a " "service yourself, and configure Cantata to use your personal API key. This key may be entered below. For any " "blank values below, Cantata will use its default key."), this); + QFont f(Utils::smallFont(label->font())); + f.setItalic(true); + label->setFont(f); label->setWordWrap(true); layout->addWidget(label); layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed)); diff -Nru cantata-2.3.0/gui/application.cpp cantata-2.3.1/gui/application.cpp --- cantata-2.3.0/gui/application.cpp 2018-01-01 10:09:03.000000000 +0000 +++ cantata-2.3.1/gui/application.cpp 2018-06-01 16:26:03.000000000 +0000 @@ -26,6 +26,8 @@ #include "settings.h" #include "support/proxystyle.h" #include "models/mpdlibrarymodel.h" +#include "models/playlistsmodel.h" +#include "models/streamsmodel.h" #include "support/utils.h" #include "mpd-interface/mpdstats.h" #include "mpd-interface/mpdstatus.h" @@ -33,9 +35,12 @@ #include "tags/taghelperiface.h" #include "scrobbling/scrobbler.h" #include "support/fancytabwidget.h" +#include "support/combobox.h" #include "widgets/itemview.h" #include "widgets/groupedview.h" #include "widgets/actionitemdelegate.h" +#include "widgets/toolbutton.h" +#include "widgets/sizegrip.h" #include "http/httpserver.h" #include "config.h" @@ -75,6 +80,8 @@ #endif Scrobbler::self(); MpdLibraryModel::self(); + PlaylistsModel::self(); + StreamsModel::self(); // Ensure this is started before any MPD connection HttpServer::self(); @@ -88,3 +95,37 @@ GroupedView::setup(); ActionItemDelegate::setup(); } + +void Application::fixSize(QWidget *widget) +{ + static int fixedHeight = -1; + if (-1 == fixedHeight) { + ComboBox c(widget); + ToolButton b(widget); + SizeGrip g(widget); + c.ensurePolished(); + b.ensurePolished(); + g.ensurePolished(); + fixedHeight=qMax(24, qMax(c.sizeHint().height(), qMax(b.sizeHint().height(), g.sizeHint().height()))); + if (fixedHeight%2) { + fixedHeight--; + } + } + + QToolButton *tb=qobject_cast(widget); + if (tb) { + tb->setFixedSize(fixedHeight, fixedHeight); + } else { + #ifdef Q_OS_MAC + // TODO: Why is this +(2*focus) required for macOS? If its not used, library page's statusbar is larger + // than the rest - due to genre combo? + widget->setFixedHeight(fixedHeight+(2*widget->style()->pixelMetric(QStyle::PM_FocusFrameHMargin))); + #else + if (0==qstrcmp("QWidget", widget->metaObject()->className())) { + widget->setFixedHeight(fixedHeight+Utils::scaleForDpi(4)); + } else { + widget->setFixedHeight(fixedHeight); + } + #endif + } +} diff -Nru cantata-2.3.0/gui/application_haiku.h cantata-2.3.1/gui/application_haiku.h --- cantata-2.3.0/gui/application_haiku.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/gui/application_haiku.h 2018-05-26 15:12:37.000000000 +0000 @@ -30,6 +30,7 @@ { public: static void init(); + static void fixSize(QWidget *widget); Application(int &argc, char **argv); virtual ~Application() { }; diff -Nru cantata-2.3.0/gui/application_mac.cpp cantata-2.3.1/gui/application_mac.cpp --- cantata-2.3.0/gui/application_mac.cpp 2018-01-01 10:09:03.000000000 +0000 +++ cantata-2.3.1/gui/application_mac.cpp 2018-05-14 16:24:12.000000000 +0000 @@ -25,21 +25,12 @@ #include "support/utils.h" #include "config.h" #include -#include #include Application::Application(int &argc, char **argv) : SingleApplication(argc, argv) { setAttribute(Qt::AA_DontShowIconsInMenus, true); - // Setup icon path... - QStringList paths=QIcon::themeSearchPaths(); - QString path=Utils::systemDir("icons"); - if (!paths.contains(path)) { - QIcon::setThemeSearchPaths(QStringList() << path << paths); - } - - QIcon::setThemeName(QLatin1String("cantata")); // Set DYLD_LIBRARY_PATH so that Qt finds our openSSL libs QDir dir(argv[0]); diff -Nru cantata-2.3.0/gui/application_mac.h cantata-2.3.1/gui/application_mac.h --- cantata-2.3.0/gui/application_mac.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/gui/application_mac.h 2018-05-26 15:12:37.000000000 +0000 @@ -30,6 +30,7 @@ { public: static void init(); + static void fixSize(QWidget *widget); Application(int &argc, char **argv); virtual ~Application() { }; }; diff -Nru cantata-2.3.0/gui/application_qt.cpp cantata-2.3.1/gui/application_qt.cpp --- cantata-2.3.0/gui/application_qt.cpp 2018-03-10 07:59:20.000000000 +0000 +++ cantata-2.3.1/gui/application_qt.cpp 2018-05-14 16:24:48.000000000 +0000 @@ -26,16 +26,6 @@ #include #include #include -#include - -static void setupIconTheme(Application *app) -{ - QIcon::setThemeSearchPaths(QStringList() << CANTATA_SYS_ICONS_DIR << QIcon::themeSearchPaths()); - QIcon::setThemeName(QLatin1String("cantata")); - if (Utils::KDE!=Utils::currentDe()) { - app->setAttribute(Qt::AA_DontShowIconsInMenus, true); - } -} Application::Application(int &argc, char **argv) : QApplication(argc, argv) @@ -48,7 +38,9 @@ bool Application::start() { if (QDBusConnection::sessionBus().registerService(CANTATA_REV_URL)) { - setupIconTheme(this); + if (Utils::KDE!=Utils::currentDe()) { + setAttribute(Qt::AA_DontShowIconsInMenus, true); + } return true; } loadFiles(); diff -Nru cantata-2.3.0/gui/application_qt.h cantata-2.3.1/gui/application_qt.h --- cantata-2.3.0/gui/application_qt.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/gui/application_qt.h 2018-05-26 15:12:37.000000000 +0000 @@ -29,6 +29,7 @@ { public: static void init(); + static void fixSize(QWidget *widget); Application(int &argc, char **argv); ~Application() override { } diff -Nru cantata-2.3.0/gui/application_win.cpp cantata-2.3.1/gui/application_win.cpp --- cantata-2.3.0/gui/application_win.cpp 2018-01-01 10:09:03.000000000 +0000 +++ cantata-2.3.1/gui/application_win.cpp 2018-05-14 16:24:53.000000000 +0000 @@ -23,14 +23,12 @@ #include "application_win.h" #include "config.h" -#include #include Application::Application(int &argc, char **argv) : SingleApplication(argc, argv) { installNativeEventFilter(this); - QIcon::setThemeName(QLatin1String("cantata")); setAttribute(Qt::AA_DontShowIconsInMenus, true); } diff -Nru cantata-2.3.0/gui/application_win.h cantata-2.3.1/gui/application_win.h --- cantata-2.3.0/gui/application_win.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/gui/application_win.h 2018-05-26 15:12:37.000000000 +0000 @@ -31,6 +31,7 @@ { public: static void init(); + static void fixSize(QWidget *widget); Application(int &argc, char **argv); virtual ~Application() { } bool nativeEventFilter(const QByteArray &, void *message, long *result); diff -Nru cantata-2.3.0/gui/cachesettings.cpp cantata-2.3.1/gui/cachesettings.cpp --- cantata-2.3.0/gui/cachesettings.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/cachesettings.cpp 2018-05-09 19:36:25.000000000 +0000 @@ -250,6 +250,9 @@ int col=0; QLabel *label=new QLabel(tr("Cantata caches various pieces of information (covers, lyrics, etc). Below is a summary of Cantata's " "current cache usage."), this); + QFont f(Utils::smallFont(label->font())); + f.setItalic(true); + label->setFont(f); label->setWordWrap(true); layout->addWidget(label, row++, col, 1, 2); layout->addItem(new QSpacerItem(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed), row++, 0); diff -Nru cantata-2.3.0/gui/coverdialog.cpp cantata-2.3.1/gui/coverdialog.cpp --- cantata-2.3.0/gui/coverdialog.cpp 2018-03-14 18:59:36.000000000 +0000 +++ cantata-2.3.1/gui/coverdialog.cpp 2018-05-24 17:55:11.000000000 +0000 @@ -546,7 +546,7 @@ QTemporaryFile *temp=nullptr; if (isLarge || (reply->property(constThumbProperty).toString()==reply->property(constLargeProperty).toString())) { - temp=new QTemporaryFile(QDir::tempPath()+"/cantata_XXXXXX."+(format ? QString(QLatin1String(format)).toLower() : "png")); + temp=new QTemporaryFile("cantata_XXXXXX."+(format ? QString(QLatin1String(format)).toLower() : "png")); if (temp->open()) { if (!format) { @@ -824,8 +824,8 @@ { if (!menu) { menu=new QMenu(list); - showAction=menu->addAction(Icon("zoom-original"), tr("Display")); - removeAction=menu->addAction(Icon("list-remove"), tr("Remove")); + showAction=menu->addAction(tr("Display")); + removeAction=menu->addAction(tr("Remove")); connect(showAction, SIGNAL(triggered()), SLOT(showImage())); connect(removeAction, SIGNAL(triggered()), SLOT(removeImages())); } diff -Nru cantata-2.3.0/gui/covers.cpp cantata-2.3.1/gui/covers.cpp --- cantata-2.3.0/gui/covers.cpp 2018-04-25 15:34:41.000000000 +0000 +++ cantata-2.3.1/gui/covers.cpp 2018-05-26 18:22:51.000000000 +0000 @@ -206,6 +206,17 @@ static Covers::Image serviceImage(const Song &s) { Covers::Image img; + + if (s.hasExtraField(Song::OnlineImageCacheName)) { + img.fileName=s.extraField(Song::OnlineImageCacheName); + if (!img.fileName.isEmpty()) { + img.img=loadImage(img.fileName); + if (!img.img.isNull()) { + DBUG_CLASS("Covers") << s.onlineService() << img.fileName; + return img; + } + } + } img.fileName=OnlineService::iconPath(s.onlineService()); if (!img.fileName.isEmpty()) { img.img=loadImage(img.fileName); @@ -408,15 +419,20 @@ static bool initialised=false; if (!initialised) { initialised=true; - QStringList dirs=QStringList() << Utils::dataDir() << CANTATA_SYS_CONFIG_DIR; - for (const QString &dir: dirs) { - if (dir.isEmpty()) { - continue; - } - QFile f(dir+QLatin1String("/tag_fixes.xml")); - if (f.open(QIODevice::ReadOnly)) { - QXmlStreamReader doc(&f); + QStringList files; + QString userDir=Utils::dataDir(); + + if (!userDir.isEmpty()) { + files.append(Utils::fixPath(userDir)+QLatin1String("tag_fixes.xml")); + } + + files.append(":tag_fixes.xml"); + + for (const auto &f: files) { + QFile file(f); + if (file.open(QIODevice::ReadOnly)) { + QXmlStreamReader doc(&file); while (!doc.atEnd()) { doc.readNext(); if (doc.isStartElement() && QLatin1String("artist")==doc.name()) { @@ -876,10 +892,16 @@ fileName=cacheName.isEmpty() ? Utils::cacheDir(id.toLower(), true)+Covers::encodeName(song.album.isEmpty() ? song.albumArtist() : (song.albumArtist()+" - "+song.album))+(png ? ".png" : ".jpg") : cacheName; - QFile f(fileName); - if (f.open(QIODevice::WriteOnly)) { + if (png && !cacheName.isEmpty()) { + QImage img=QImage::fromData(data, Covers::imageFormat(data)); + img.save(fileName, "JPG"); DBUG << "Saved image to" << fileName; - f.write(data); + } else { + QFile f(fileName); + if (f.open(QIODevice::WriteOnly)) { + DBUG << "Saved image to" << fileName; + f.write(data); + } } } emit cover(job.song, img, fileName); @@ -1229,7 +1251,7 @@ key+=QString::number(size); QPixmap *pix=cache.object(key); if (!pix) { - const Icon &icn=song.isArtistImageRequest() || song.isComposerImageRequest() + const QIcon &icn=song.isArtistImageRequest() || song.isComposerImageRequest() ? Icons::self()->artistIcon : podcast ? Icons::self()->podcastIcon diff -Nru cantata-2.3.0/gui/currentcover.cpp cantata-2.3.1/gui/currentcover.cpp --- cantata-2.3.0/gui/currentcover.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/currentcover.cpp 2018-05-24 17:55:11.000000000 +0000 @@ -65,7 +65,7 @@ void CurrentCover::initIconThemes() { if (iconThemes.isEmpty()) { - themes(Icon::currentTheme(), iconThemes); + themes(QIcon::themeName(), iconThemes); } } diff -Nru cantata-2.3.0/gui/customactionssettings.cpp cantata-2.3.1/gui/customactionssettings.cpp --- cantata-2.3.0/gui/customactionssettings.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/customactionssettings.cpp 2018-05-09 19:36:45.000000000 +0000 @@ -86,6 +86,9 @@ layout->setMargin(0); QLabel *label=new QLabel(tr("To have Cantata call external commands (e.g. to edit tags with another application), add an entry for the command below. When at least one command " "command is defined, a 'Custom Actions' entry will be added to the context menus in the Library, Folders, and Playlists views."), this); + QFont f(Utils::smallFont(label->font())); + f.setItalic(true); + label->setFont(f); label->setWordWrap(true); layout->addWidget(label, 0, 0, 1, 2); tree=new QTreeWidget(this); diff -Nru cantata-2.3.0/gui/initialsettingswizard.cpp cantata-2.3.1/gui/initialsettingswizard.cpp --- cantata-2.3.0/gui/initialsettingswizard.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/initialsettingswizard.cpp 2018-05-24 16:58:23.000000000 +0000 @@ -26,6 +26,7 @@ #include "settings.h" #include "support/utils.h" #include "support/icon.h" +#include "support/monoicon.h" #include "widgets/icons.h" #include "models/mpdlibrarymodel.h" #ifdef ENABLE_SIMPLE_MPD_SUPPORT @@ -64,19 +65,10 @@ port->setValue(det.port); password->setText(det.password); dir->setText(det.dir); - #if defined Q_OS_WIN || defined Q_OS_MAC - bool showGroupWarning=false; - #else - bool showGroupWarning=0==Utils::getGroupId(); - #endif - groupWarningLabel->setVisible(showGroupWarning); - groupWarningIcon->setVisible(showGroupWarning); - int iconSize=Icon::dlgIconSize(); - groupWarningIcon->setPixmap(Icon("dialog-warning").pixmap(iconSize, iconSize)); introPage->setBackground(Icons::self()->appIcon); - connectionPage->setBackground(Icons::self()->audioFileIcon); - coversPage->setBackground(Icons::self()->albumIconLarge); - finishedPage->setBackground(Icon("dialog-ok")); + connectionPage->setBackground(Icons::self()->audioListIcon); + coversPage->setBackground(Icons::self()->albumMonoIcon); + finishedPage->setBackground(MonoIcon::icon(FontAwesome::check, Utils::monoIconColor())); fetchCovers->setChecked(Settings::self()->fetchCovers()); storeCoversInMpdDir->setChecked(Settings::self()->storeCoversInMpdDir()); @@ -236,7 +228,8 @@ void InitialSettingsWizard::accept() { Settings::self()->saveConnectionDetails(getDetails()); - + Settings::self()->saveFetchCovers(fetchCovers->isChecked()); + Settings::self()->saveStoreCoversInMpdDir(storeCoversInMpdDir->isChecked()); #ifdef ENABLE_SIMPLE_MPD_SUPPORT if (basic->isChecked()) { Settings::self()->saveCurrentConnection(MPDUser::constName); diff -Nru cantata-2.3.0/gui/initialsettingswizard.ui cantata-2.3.1/gui/initialsettingswizard.ui --- cantata-2.3.0/gui/initialsettingswizard.ui 2018-02-15 20:29:36.000000000 +0000 +++ cantata-2.3.1/gui/initialsettingswizard.ui 2018-05-24 16:56:37.000000000 +0000 @@ -794,29 +794,7 @@ - - - - - - - - 0 - 0 - - - - <b>Warning:</b> You are not currently a member of the 'users' group. Cantata will function better (saving of album covers, lyrics, etc. with the correct permissions) if you (or your administrator) add yourself to this group. If you do add yourself you will need to logout and back in for this to take effect. - - - true - - - Qt::NoTextInteraction - - - - + Qt::Vertical diff -Nru cantata-2.3.0/gui/interfacesettings.cpp cantata-2.3.1/gui/interfacesettings.cpp --- cantata-2.3.0/gui/interfacesettings.cpp 2018-04-01 18:49:18.000000000 +0000 +++ cantata-2.3.1/gui/interfacesettings.cpp 2018-04-30 17:11:04.000000000 +0000 @@ -223,7 +223,13 @@ coverNameNoteLabel->setText(tr("If no setting is specified for 'Filename', then Cantata will use a default of " "cover. This filename is used when downloading covers.")); #endif - setMinimumSize(750, 650); + + QFont f = Utils::smallFont(ignorePrefixesLabel->font()); + f.setItalic(true); + ignorePrefixesLabel->setFont(f); + composerGenresLabel->setFont(f); + singleTracksFoldersLabel->setFont(f); + setMinimumSize(Utils::scaleForDpi(720), Utils::scaleForDpi(620)); } void InterfaceSettings::load() diff -Nru cantata-2.3.0/gui/interfacesettings.ui cantata-2.3.1/gui/interfacesettings.ui --- cantata-2.3.0/gui/interfacesettings.ui 2018-04-01 18:49:18.000000000 +0000 +++ cantata-2.3.1/gui/interfacesettings.ui 2018-05-05 16:15:42.000000000 +0000 @@ -6,8 +6,8 @@ 0 0 - 1719 - 435 + 600 + 500 @@ -506,7 +506,7 @@ - + Enter a (comma separated) list of prefixes to ignore when sorting artist and albums. e.g. if set to 'The' then 'The Beatles' would be sorted by 'Beatles' @@ -532,7 +532,7 @@ - + By default, Cantata uses the 'Album Artist' tag (or 'Artist' tag if a song has no 'Album Artist') to group songs and albums. For certain genres, e.g 'Classical', it may be preferable to use the 'Composer' tag (if set) to perform this grouping. Please enter a (comma separated) list of the genres with which you would like Cantata to use the 'Composer' tag. @@ -558,7 +558,7 @@ - + If you have a lot of artists in your collection that only contain a single track, then it can be cumbersome for each of these to have their own entry in the list of artists. As a work-around for this, if you place these tracks into a separate folder, and enter this folder name below, then Cantata will group these under an album named 'Single Tracks' with an album artist of 'Various Artists'. You may enter a comma separated list of folder names (without leading or trailing path separators) below. @@ -621,7 +621,7 @@ 16 - 264 + 16 diff -Nru cantata-2.3.0/gui/localfolderpage.cpp cantata-2.3.1/gui/localfolderpage.cpp --- cantata-2.3.0/gui/localfolderpage.cpp 2018-04-08 10:15:13.000000000 +0000 +++ cantata-2.3.1/gui/localfolderpage.cpp 2018-05-23 19:37:17.000000000 +0000 @@ -28,6 +28,7 @@ #include "widgets/menubutton.h" #include "support/monoicon.h" #include "support/configuration.h" +#include "support/utils.h" #ifdef TAGLIB_FOUND #include "tags/tags.h" #endif @@ -37,10 +38,11 @@ : SinglePageWidget(p) , isHomeFolder(isHome) { - model = isHome ? new LocalBrowseModel(QLatin1String("localbrowsehome"), tr("Home"), tr("Browse files in your home folder"), ":home.svg", this) - : new LocalBrowseModel(QLatin1String("localbrowseroot"), tr("Root"), tr("Browse files on your computer"), ":hdd.svg", this); + QColor col = Utils::monoIconColor(); + model = isHome ? new LocalBrowseModel(QLatin1String("localbrowsehome"), tr("Home"), tr("Browse files in your home folder"), MonoIcon::icon(FontAwesome::home, col), this) + : new LocalBrowseModel(QLatin1String("localbrowseroot"), tr("Root"), tr("Browse files on your computer"), MonoIcon::icon(FontAwesome::hddo, col), this); proxy = new FileSystemProxyModel(model); - browseAction = new Action(MonoIcon::icon(FontAwesome::folderopen, Utils::monoIconColor()), tr("Open In File Manager"), this); + browseAction = new Action(MonoIcon::icon(FontAwesome::folderopen, col), tr("Open In File Manager"), this); connect(view, SIGNAL(itemsSelected(bool)), this, SLOT(controlActions())); connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &))); connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int))); diff -Nru cantata-2.3.0/gui/localfolderpage.h cantata-2.3.1/gui/localfolderpage.h --- cantata-2.3.0/gui/localfolderpage.h 2018-02-08 16:48:09.000000000 +0000 +++ cantata-2.3.1/gui/localfolderpage.h 2018-05-24 17:50:59.000000000 +0000 @@ -39,7 +39,7 @@ QString name() const { return model->name(); } QString title() const { return model->title(); } QString descr() const { return model->descr(); } - const Icon & icon() const { return model->icon(); } + const QIcon & icon() const { return model->icon(); } QList selectedSongs(bool allowPlaylists=false) const override; private: diff -Nru cantata-2.3.0/gui/main.cpp cantata-2.3.1/gui/main.cpp --- cantata-2.3.0/gui/main.cpp 2018-04-24 21:42:30.000000000 +0000 +++ cantata-2.3.1/gui/main.cpp 2018-05-17 16:29:40.000000000 +0000 @@ -348,9 +348,10 @@ QCoreApplication::setOrganizationName(ORGANIZATION_NAME); QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); - #if QT_VERSION >= 0x050600 && defined Q_OS_WIN - QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - #endif + // Dont enable AA_EnableHighDpiScaling - messes up fractional scaling? Issue #1257 + //#if QT_VERSION >= 0x050600 && defined Q_OS_WIN + //QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + //#endif Application app(argc, argv); app.setApplicationVersion(PACKAGE_VERSION_STRING); @@ -362,9 +363,11 @@ QCommandLineOption debugOption(QStringList() << "d" << "debug", QObject::tr("Comma-separated list of debug areas - possible values:\n")+debugAreas(), "debug", ""); QCommandLineOption debugToFileOption(QStringList() << "f" << "debug-to-file", QObject::tr("Log debug messages to %1").arg(Utils::cacheDir(QString(), true)+"cantata.log"), "", "false"); QCommandLineOption noNetworkOption(QStringList() << "n" << "no-network", QObject::tr("Disable network access"), "", "false"); + QCommandLineOption collectionOption(QStringList() << "c" << "collection", "Collection name", "collection", ""); // TODO: 2.4 tr cmdLineParser.addOption(debugOption); cmdLineParser.addOption(debugToFileOption); cmdLineParser.addOption(noNetworkOption); + cmdLineParser.addOption(collectionOption); cmdLineParser.process(app); if (!app.start()) { @@ -404,7 +407,8 @@ #else loadTranslation("qt", QLibraryInfo::location(QLibraryInfo::TranslationsPath), lang); #endif - loadTranslation("cantata", CANTATA_SYS_TRANS_DIR, lang); + QString local = Utils::fixPath(QCoreApplication::applicationDirPath())+"translations"; + loadTranslation("cantata", QDir(local).exists() ? local : CANTATA_SYS_TRANS_DIR, lang); Application::init(); @@ -413,6 +417,17 @@ if (QDialog::Rejected==wz.exec()) { return 0; } + } else if (cmdLineParser.isSet(collectionOption)) { + QString col = cmdLineParser.value(collectionOption); + if (!col.isEmpty() && col!=Settings::self()->currentConnection()) { + auto collections = Settings::self()->allConnections(); + for (const auto &c: collections) { + if (c.name==col) { + Settings::self()->saveCurrentConnection(col); + break; + } + } + } } MainWindow mw; #if defined Q_OS_WIN || defined Q_OS_MAC diff -Nru cantata-2.3.0/gui/mainwindow.cpp cantata-2.3.1/gui/mainwindow.cpp --- cantata-2.3.0/gui/mainwindow.cpp 2018-04-26 16:22:47.000000000 +0000 +++ cantata-2.3.1/gui/mainwindow.cpp 2018-05-27 16:50:05.000000000 +0000 @@ -25,6 +25,7 @@ */ #include "mainwindow.h" +#include "application.h" #include "support/thread.h" #include "trayitem.h" #include "support/messagebox.h" @@ -140,6 +141,7 @@ , lastState(MPDState_Inactive) , lastSongId(-1) , autoScrollPlayQueue(true) + , singlePane(false) , currentPage(nullptr) #ifdef QT_QTDBUS_FOUND , mpris(nullptr) @@ -162,31 +164,9 @@ stopTrackButton=nullptr; coverWidget=nullptr; tabWidget=nullptr; - - #if defined Q_OS_MAC || defined Q_OS_WIN - init(); - #else - if ("qt5ct"==qgetenv("QT_QPA_PLATFORMTHEME")) { - // Work-aroud Qt5Ct colour scheme issues. Qt5Ct applies its palette after Cantata's main window - // is shown. Issue 944 - // TODO: The real fix would be for Cantata to properly repect colour scheme changes - show(); - resize(0, 0); - QTimer::singleShot(5, this, SLOT(init())); - } - else { - init(); - } - #endif -} - -void MainWindow::init() -{ - #if !defined Q_OS_MAC && !defined Q_OS_WIN - // Work-aroud Qt5Ct incorrectly setting icon theme - QIcon::setThemeSearchPaths(QStringList() << CANTATA_SYS_ICONS_DIR << QIcon::themeSearchPaths()); - QIcon::setThemeName(QLatin1String("cantata")); - #endif + savePlayQueueButton=nullptr; + centerPlayQueueButton=nullptr; + midSpacer=nullptr; QPoint p=pos(); ActionCollection::setMainWidget(this); @@ -207,7 +187,7 @@ Song::setUseOriginalYear(Settings::self()->useOriginalYear()); int hSpace=Utils::layoutSpacing(this); - int vSpace=fontMetrics().height()<14 ? hSpace/2 : 0; + int vSpace=Utils::scaleForDpi(2); toolbarLayout->setContentsMargins(hSpace, vSpace, hSpace, vSpace); toolbar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); setWindowTitle("Cantata"); @@ -222,6 +202,14 @@ topToolBar->addWidget(toolbar); topToolBar->setMovable(false); topToolBar->setContextMenuPolicy(Qt::PreventContextMenu); + + topToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + topToolBar->setContentsMargins(0, 0, 0, 0); + QLayout *l=topToolBar->layout(); + if (l) { + l->setMargin(0); + l->setSpacing(0); + } topToolBar->ensurePolished(); toolbar=topToolBar; #elif !defined Q_OS_WIN @@ -235,10 +223,15 @@ topToolBar->setContextMenuPolicy(Qt::PreventContextMenu); topToolBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); topToolBar->setContentsMargins(0, 0, 0, 0); + QLayout *l=topToolBar->layout(); + if (l) { + l->setMargin(0); + l->setSpacing(0); + } topToolBar->ensurePolished(); toolbar=topToolBar; } else { - toolbar->setFixedHeight(qMax(54, (int)(fontMetrics().height()*3.5)+(toolbarLayout->spacing()*3)+(vSpace*2))); + toolbar->setFixedHeight(qMax(54, (int)(fontMetrics().height()*3.25)+(toolbarLayout->spacing()*3)+(vSpace*2))); } #endif @@ -351,7 +344,7 @@ locateMenu->addAction(locateTrackAction); locateAction->setMenu(locateMenu); - playNextAction = ActionCollection::get()->createAction("playnext", tr("Play next")); + playNextAction = ActionCollection::get()->createAction("playnext", tr("Play Next")); #ifdef TAGLIB_FOUND editPlayQueueTagsAction = ActionCollection::get()->createAction("editpqtags", Utils::strippedText(StdActions::self()->editTagsAction->text()), StdActions::self()->editTagsAction->icon()); editPlayQueueTagsAction->setSettingsText(tr("Edit Track Information (Play Queue)")); @@ -525,6 +518,13 @@ playPauseTrackButton->setIconSize(QSize(playPauseIconSize, playPauseIconSize)); playPauseTrackButton->setFixedSize(QSize(playPauseIconSize+6, playPauseIconSize+6)); + QList pqWidgets = QList() << stopDynamicButton << dynamicLabel << playQueueStatsLabel << fullScreenLabel + << repeatButton << singleButton << randomButton << consumeButton << midSpacer + << centerPlayQueueButton << savePlayQueueButton << clearPlayQueueButton << sizeGrip; + for (const auto &item: pqWidgets) { + Application::fixSize(item); + } + if (fullScreenAction->isEnabled()) { fullScreenAction->setChecked(Settings::self()->showFullScreen()); } @@ -584,7 +584,7 @@ #ifdef Q_OS_MAC bool showMenubar = true; #else - bool showMenubar = Utils::Gnome!=Utils::currentDe() && Utils::Ubuntu_Gnome!=Utils::currentDe(); + bool showMenubar = Utils::Gnome!=Utils::currentDe(); #endif if (showMenubar) { #ifdef Q_OS_MAC @@ -912,12 +912,12 @@ updateActionToolTips(); CustomActions::self()->setMainWindow(this); - if (Utils::Gnome!=Utils::currentDe() && Settings::self()->startHidden()) { + if (Utils::useSystemTray() && Settings::self()->startHidden()) { hide(); } else { show(); } - controlPlayQueueButtons(); + QTimer::singleShot(0, this, SLOT(controlPlayQueueButtons())); } MainWindow::~MainWindow() @@ -958,7 +958,7 @@ StreamsModel::self()->save(); nowPlaying->saveConfig(); Settings::self()->saveForceSingleClick(TreeView::getForceSingleClick()); - if (Utils::Gnome!=Utils::currentDe()) { + if (Utils::useSystemTray()) { Settings::StartupState startupState=Settings::self()->startupState(); Settings::self()->saveStartHidden(trayItem->isActive() && Settings::self()->minimiseOnClose() && ((isHidden() && Settings::SS_ShowMainWindow!=startupState) || (Settings::SS_HideMainWindow==startupState))); @@ -1098,15 +1098,16 @@ } } -#if defined Q_OS_WIN void MainWindow::showEvent(QShowEvent *event) { + #if defined Q_OS_WIN if (!thumbnailTooolbar) { thumbnailTooolbar=new ThumbnailToolBar(this); } + #endif QMainWindow::showEvent(event); + controlView(); } -#endif void MainWindow::closeEvent(QCloseEvent *event) { @@ -1376,11 +1377,11 @@ if (!switchedOn.isEmpty() && switchedOff.isEmpty()) { QStringList names=switchedOn.toList(); qSort(names); - trayItem->showMessage(tr("Outputs"), tr("Enabled: %1").arg(names.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage()); + trayItem->showMessage(tr("Outputs"), tr("Enabled: %1").arg(names.join(QLatin1String(", ")))); } else if (!switchedOff.isEmpty() && switchedOn.isEmpty()) { QStringList names=switchedOff.toList(); qSort(names); - trayItem->showMessage(tr("Outputs"), tr("Disabled: %1").arg(names.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage()); + trayItem->showMessage(tr("Outputs"), tr("Disabled: %1").arg(names.join(QLatin1String(", ")))); } else if (!switchedOn.isEmpty() && !switchedOff.isEmpty()) { QStringList on=switchedOn.toList(); qSort(on); @@ -1388,7 +1389,7 @@ qSort(off); trayItem->showMessage(tr("Outputs"), tr("Enabled: %1").arg(on.join(QLatin1String(", ")))+QLatin1Char('\n')+ - tr("Disabled: %1").arg(off.join(QLatin1String(", "))), Icons::self()->speakerIcon.pixmap(64, 64).toImage()); + tr("Disabled: %1").arg(off.join(QLatin1String(", ")))); } } setProperty(constMpdEnabledOuptuts, QStringList() << enabledMpd.toList()); @@ -2619,11 +2620,11 @@ void MainWindow::controlView(bool forceUpdate) { if (!stopTrackButton || !coverWidget || !tabWidget) { + controlPlayQueueButtons(); return; } static int lastWidth=-1; - static bool collapsed=false; if (forceUpdate || -1==lastWidth || qAbs(lastWidth-width())>20) { bool stopEnabled = stopTrackButton->property(constUserSettingProp).toBool(); @@ -2649,18 +2650,17 @@ if (responsiveSidebar || forceUpdate) { if (!responsiveSidebar || width()>Utils::scaleForDpi(450)) { - if (forceUpdate || collapsed) { + if (forceUpdate || singlePane) { int index=tabWidget->currentIndex(); if (forceUpdate || tabWidget->style()!=tabWidgetStyle) { tabWidget->setStyle(tabWidgetStyle); } tabWidget->setHiddenPages(tabWidgetPages); tabWidget->setCurrentIndex(index); - controlPlayQueueButtons(); } - collapsed=false; + singlePane=false; } else if (responsiveSidebar) { - if (forceUpdate || !collapsed) { + if (forceUpdate || !singlePane) { int index=tabWidget->currentIndex(); int smallStyle=FancyTabWidget::Small|FancyTabWidget::Top|FancyTabWidget::IconOnly; if (forceUpdate || tabWidget->style()!=smallStyle) { @@ -2681,20 +2681,23 @@ } tabWidget->setCurrentIndex(index); - controlPlayQueueButtons(); } - collapsed=true; + singlePane=true; } } } + controlPlayQueueButtons(); } void MainWindow::controlPlayQueueButtons() { - savePlayQueueButton->setVisible(playQueueWidget->width()>Utils::scaleForDpi(410)); - centerPlayQueueButton->setVisible(playQueueWidget->width()>(Utils::scaleForDpi(410)+centerPlayQueueButton->width())); - leftSpacer->setVisible(centerPlayQueueButton->isVisible() && (loveTrack->isVisible() || scrobblingStatus->isVisible())); - midSpacer->setVisible(centerPlayQueueButton->isVisible()); + if (!savePlayQueueButton || !centerPlayQueueButton || !midSpacer) { + return; + } + + savePlayQueueButton->setVisible(singlePane || playQueueWidget->width()>Utils::scaleForDpi(320)); + centerPlayQueueButton->setVisible(singlePane || playQueueWidget->width()>(Utils::scaleForDpi(320)+centerPlayQueueButton->width())); + midSpacer->setVisible(singlePane || centerPlayQueueButton->isVisible()); } void MainWindow::expandOrCollapse(bool saveCurrentSize) diff -Nru cantata-2.3.0/gui/mainwindow.h cantata-2.3.1/gui/mainwindow.h --- cantata-2.3.0/gui/mainwindow.h 2018-03-24 15:36:24.000000000 +0000 +++ cantata-2.3.1/gui/mainwindow.h 2018-05-27 16:50:15.000000000 +0000 @@ -116,9 +116,7 @@ protected: void keyPressEvent(QKeyEvent *event) override; - #if defined Q_OS_WIN - void showEvent(QShowEvent *event); - #endif + void showEvent(QShowEvent *event) override; void closeEvent(QCloseEvent *event) override; void resizeEvent(QResizeEvent *event) override; @@ -267,7 +265,6 @@ private Q_SLOTS: void controlPlayQueueButtons(); - void init(); void toggleContext(); void initMpris(); void toggleMenubar(); @@ -278,6 +275,7 @@ qint32 lastSongId; PlayQueueProxyModel playQueueProxyModel; bool autoScrollPlayQueue; + bool singlePane; Action *prefAction; Action *refreshDbAction; Action *doDbRefreshAction; diff -Nru cantata-2.3.0/gui/mainwindow.ui cantata-2.3.1/gui/mainwindow.ui --- cantata-2.3.0/gui/mainwindow.ui 2018-03-23 19:49:52.000000000 +0000 +++ cantata-2.3.1/gui/mainwindow.ui 2018-05-26 15:12:37.000000000 +0000 @@ -159,7 +159,7 @@ - + 1 @@ -206,15 +206,6 @@ - - - - - - - - - true @@ -261,9 +252,6 @@ - - - @@ -336,11 +324,6 @@
widgets/spacerwidget.h
- SizeWidget - QWidget -
widgets/sizewidget.h
-
- SizeGrip QWidget
widgets/sizegrip.h
@@ -356,16 +339,6 @@
widgets/volumecontrol.h
- ScrobblingStatus - QToolButton -
scrobbling/scrobblingstatus.h
-
- - ScrobblingLove - QToolButton -
scrobbling/scrobblinglove.h
-
- UrlLabel QLabel
support/urllabel.h
diff -Nru cantata-2.3.0/gui/mpdbrowsepage.h cantata-2.3.1/gui/mpdbrowsepage.h --- cantata-2.3.0/gui/mpdbrowsepage.h 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/gui/mpdbrowsepage.h 2018-05-24 17:50:58.000000000 +0000 @@ -43,7 +43,7 @@ QString name() const { return model.name(); } QString title() const { return model.title(); } QString descr() const { return model.descr(); } - const Icon & icon() const { return model.icon(); } + const QIcon & icon() const { return model.icon(); } QStringList selectedFiles(bool allowPlaylists=false) const override; QList selectedSongs(bool allowPlaylists=false) const override; #ifdef ENABLE_DEVICES_SUPPORT diff -Nru cantata-2.3.0/gui/playbacksettings.cpp cantata-2.3.1/gui/playbacksettings.cpp --- cantata-2.3.0/gui/playbacksettings.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/playbacksettings.cpp 2018-05-19 07:20:31.000000000 +0000 @@ -90,6 +90,7 @@ void PlaybackSettings::save() { Settings::self()->saveStopOnExit(stopOnExit->isChecked()); + Settings::self()->saveStopFadeDuration(stopFadeDuration->value()); #if (defined Q_OS_LINUX && defined QT_QTDBUS_FOUND) || (defined Q_OS_MAC && defined IOKIT_FOUND) Settings::self()->saveInhibitSuspend(inhibitSuspend->isChecked()); #endif @@ -160,7 +161,7 @@ crossfadingLabel->setEnabled(c); replayGainLabel->setEnabled(rgSupported); replayGain->setEnabled(rgSupported); - messageIcon->setPixmap(Icon(c ? "dialog-information" : "dialog-warning").pixmap(messageIcon->minimumSize())); + messageIcon->setPixmap(style()->standardIcon(c ? QStyle::SP_MessageBoxInformation : QStyle::SP_MessageBoxWarning).pixmap(messageIcon->minimumSize())); if (c) { messageLabel->setText(tr("Connected to %1
The entries below apply to the currently connected MPD collection.
") .arg(MPDConnection::self()->getDetails().description())); diff -Nru cantata-2.3.0/gui/preferencesdialog.cpp cantata-2.3.1/gui/preferencesdialog.cpp --- cantata-2.3.0/gui/preferencesdialog.cpp 2018-03-14 17:33:10.000000000 +0000 +++ cantata-2.3.1/gui/preferencesdialog.cpp 2018-05-16 05:14:53.000000000 +0000 @@ -41,6 +41,7 @@ #include "shortcutssettingspage.h" #include "scrobbling/scrobblingsettings.h" #include "apikeyssettings.h" +#include "support/monoicon.h" #include #include @@ -65,34 +66,32 @@ apiKeys = new ApiKeysSettings(this); server->load(); playback->load(); - //cover->load(); interface->load(); context->load(); scrobbling->load(); custom->load(); - addPage(QLatin1String("collection"), server, tr("Collection"), Icon("audio-x-generic"), tr("Collection Settings")); - addPage(QLatin1String("playback"), playback, tr("Playback"), Icons::self()->speakerIcon, tr("Playback Settings")); - //addPage(QLatin1String("cover"), files, tr("Covers"), Icons::self()->filesIcon, tr("Album Cover Settings")); - addPage(QLatin1String("interface"), interface, tr("Interface"), Icon("preferences-other"), tr("Interface Settings")); - addPage(QLatin1String("info"), context, tr("Info"), Icons::self()->contextIcon, tr("Info View Settings")); - addPage(QLatin1String("scrobbling"), scrobbling, tr("Scrobbling"), Icons::self()->lastFmIcon, tr("Scrobbling Settings")); + QColor iconColor = Utils::clampColor(palette().text().color()); + addPage(QLatin1String("collection"), server, tr("Collection"), MonoIcon::icon(FontAwesome::music, iconColor), tr("Collection Settings")); + addPage(QLatin1String("playback"), playback, tr("Playback"), MonoIcon::icon(FontAwesome::volumeup, iconColor), tr("Playback Settings")); + addPage(QLatin1String("interface"), interface, tr("Interface"), MonoIcon::icon(FontAwesome::sliders, iconColor), tr("Interface Settings")); + addPage(QLatin1String("info"), context, tr("Info"), MonoIcon::icon(FontAwesome::infocircle, iconColor), tr("Info View Settings")); + addPage(QLatin1String("scrobbling"), scrobbling, tr("Scrobbling"), MonoIcon::icon(FontAwesome::lastfm, iconColor), tr("Scrobbling Settings")); #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND audiocd = new AudioCdSettings(0); audiocd->load(); - addPage(QLatin1String("cd"), audiocd, tr("Audio CD"), Icons::self()->albumIcon(32), tr("Audio CD Settings")); + addPage(QLatin1String("cd"), audiocd, tr("Audio CD"), Icons::self()->albumMonoIcon, tr("Audio CD Settings")); #endif #ifdef ENABLE_PROXY_CONFIG proxy = new ProxySettings(0); proxy->load(); - addPage(QLatin1String("proxy"), proxy, tr("Proxy"), Icon("preferences-system-network"), tr("Proxy Settings")); + addPage(QLatin1String("proxy"), proxy, tr("Proxy"), MonoIcon::icon(FontAwesome::globe, iconColor), tr("Proxy Settings")); #endif shortcuts = new ShortcutsSettingsPage(nullptr); - addPage(QLatin1String("shortcuts"), shortcuts, tr("Shortcuts"), Icon(QStringList() << "preferences-desktop-keyboard" << "keyboard"), - tr("Keyboard Shortcut Settings")); + addPage(QLatin1String("shortcuts"), shortcuts, tr("Shortcuts"), MonoIcon::icon(FontAwesome::keyboardo, iconColor), tr("Keyboard Shortcut Settings")); shortcuts->load(); - addPage(QLatin1String("cache"), cache, tr("Cache"), Icon(QStringList() << "folder-temp" << "folder"), tr("Cached Items")); - addPage(QLatin1String("custom"), custom, tr("Custom Actions"), Icon(QStringList() << "fork" << "gtk-execute"), tr("Custom Actions")); - addPage(QLatin1String("apikeys"), apiKeys, tr("Service Keys"), Icon("key"), tr("Service API Keys")); + addPage(QLatin1String("cache"), cache, tr("Cache"), MonoIcon::icon(FontAwesome::foldero, iconColor), tr("Cached Items")); + addPage(QLatin1String("custom"), custom, tr("Custom Actions"), MonoIcon::icon(FontAwesome::rocket, iconColor), tr("Custom Actions")); + addPage(QLatin1String("apikeys"), apiKeys, tr("Service Keys"), MonoIcon::icon(FontAwesome::key, iconColor), tr("Service API Keys")); #ifdef Q_OS_MAC setCaption(tr("Cantata Preferences")); setMinimumWidth(800); diff -Nru cantata-2.3.0/gui/serversettings.cpp cantata-2.3.1/gui/serversettings.cpp --- cantata-2.3.0/gui/serversettings.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/gui/serversettings.cpp 2018-05-30 21:04:41.000000000 +0000 @@ -46,9 +46,6 @@ w->deleteLater(); \ w=0; - - -#ifdef ENABLE_SIMPLE_MPD_SUPPORT class CollectionNameValidator : public QValidator { public: @@ -57,10 +54,17 @@ State validate(QString &input, int &) const override { - return input.startsWith(MPDUser::constName) ? Invalid : Acceptable; + #ifdef ENABLE_SIMPLE_MPD_SUPPORT + if (input.startsWith(MPDUser::constName)) { + return Invalid; + } + #endif + if (-1!=input.indexOf("/") || -1!=input.indexOf("\\") || -1!=input.indexOf("*") || -1!=input.indexOf("?")) { + return Invalid; + } + return Acceptable; } }; -#endif ServerSettings::ServerSettings(QWidget *p) : QWidget(p) @@ -94,9 +98,7 @@ hostLabel->setText(tr("Host:")); #endif - #ifdef ENABLE_SIMPLE_MPD_SUPPORT name->setValidator(new CollectionNameValidator(this)); - #endif #ifndef ENABLE_HTTP_STREAM_PLAYBACK REMOVE(streamUrlLabel) REMOVE(streamUrl) @@ -281,8 +283,7 @@ details.port=6600; details.hostname=QLatin1String("localhost"); details.dir=QLatin1String("/var/lib/mpd/music/"); - // disable local streaming by default - details.allowLocalStreaming=false; + details.allowLocalStreaming=true; details.autoUpdate=false; combo->addItem(details.name); #ifdef ENABLE_SIMPLE_MPD_SUPPORT @@ -421,9 +422,9 @@ details.streamUrl=streamUrl->text().trimmed(); #endif #ifdef ENABLE_HTTP_SERVER - details.allowLocalStreaming=allowLocalStreaming->checkState() == Qt::Checked; + details.allowLocalStreaming=allowLocalStreaming->isChecked(); #endif - details.autoUpdate=autoUpdate->checkState() == Qt::Checked; + details.autoUpdate=autoUpdate->isChecked(); } #ifdef ENABLE_SIMPLE_MPD_SUPPORT else { diff -Nru cantata-2.3.0/gui/trayitem.cpp cantata-2.3.1/gui/trayitem.cpp --- cantata-2.3.0/gui/trayitem.cpp 2018-04-07 14:21:44.000000000 +0000 +++ cantata-2.3.1/gui/trayitem.cpp 2018-05-23 18:23:28.000000000 +0000 @@ -162,8 +162,10 @@ trayItemMenu->addSeparator(); trayItemMenu->addAction(copyAction(mw->quitAction)); trayItem->setContextMenu(trayItemMenu); - QIcon icon=QIcon::fromTheme(QIcon::hasThemeIcon("cantata-panel") ? "cantata-panel" : "cantata"); - #if !defined Q_OS_MAC && !defined Q_OS_WIN + #if defined Q_OS_MAC || defined Q_OS_WIN + QIcon icon=QIcon::fromTheme("cantata"); + #else + QIcon icon=QIcon::fromTheme(Utils::Gnome==Utils::currentDe() ? "cantata-symbolic" : "cantata"); // Bug: 660 If installed to non-standard folder, QIcon::fromTheme does not seem to find icon. Therefore // add icon files here... if (icon.isNull()) { diff -Nru cantata-2.3.0/gui/trayitem.h cantata-2.3.1/gui/trayitem.h --- cantata-2.3.0/gui/trayitem.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/gui/trayitem.h 2018-05-14 16:36:05.000000000 +0000 @@ -45,7 +45,7 @@ TrayItem(MainWindow *p); ~TrayItem() override { } - void showMessage(const QString &title, const QString &text, const QImage &img); + void showMessage(const QString &title, const QString &text, const QImage &img=QImage()); void setup(); #ifdef Q_OS_MAC bool isActive() const { return false; } diff -Nru cantata-2.3.0/http/httpserver.cpp cantata-2.3.1/http/httpserver.cpp --- cantata-2.3.0/http/httpserver.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/http/httpserver.cpp 2018-05-28 21:00:45.000000000 +0000 @@ -74,7 +74,7 @@ bool HttpServer::isAlive() const { // started on demand, but only start if allowed - return Settings::self()->connectionDetails().allowLocalStreaming; + return MPDConnection::self()->getDetails().allowLocalStreaming; } bool HttpServer::start() @@ -169,7 +169,13 @@ url.setScheme("http"); url.setHost(currentIfaceIp); url.setPort(socket->serverPort()); + #ifdef Q_OS_WIN + // Use a query item, as s.file might have a driver specifier + query.addQueryItem("file", s.file); + url.setPath("/"+Utils::getFile(s.file)); + #else url.setPath(s.file); + #endif if (!s.album.isEmpty()) { query.addQueryItem("album", s.album); } @@ -285,11 +291,12 @@ if (q.hasQueryItem("onlineservice")) { s.setIsFromOnlineService(q.queryItemValue("onlineservice")); } - s.file=url.path(); - s.type=Song::CantataStream; #ifdef Q_OS_WIN - s.file=fixWindowsPath(s.file); + s.file=fixWindowsPath(q.queryItemValue("file")); + #else + s.file=url.path(); #endif + s.type=Song::CantataStream; #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND if (s.file.startsWith(Song::constCddaProtocol)) { s.type=Song::Cdda; diff -Nru cantata-2.3.0/icons/CMakeLists.txt cantata-2.3.1/icons/CMakeLists.txt --- cantata-2.3.0/icons/CMakeLists.txt 2018-04-10 17:41:46.000000000 +0000 +++ cantata-2.3.1/icons/CMakeLists.txt 2018-05-22 08:46:05.000000000 +0000 @@ -1,62 +1,39 @@ -if (NOT HAIKU) - if (NOT WIN32 AND NOT APPLE) - macro (update_iconcache ICON_THEME) - # Update mtime of hicolor icon theme dir. - # We don't always have touch command (e.g. on Windows), so instead create - # and delete a temporary file in the theme dir. - install(CODE " - set(DESTDIR_VALUE \"\$ENV{DESTDIR}\") - if (NOT DESTDIR_VALUE) - file(WRITE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\" \"update\") - file(REMOVE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\") - endif (NOT DESTDIR_VALUE) - ") - endmacro (update_iconcache) - endif (NOT WIN32 AND NOT APPLE) - - if (WIN32 OR APPLE) - install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/svg) - foreach (SIZE 16 22 32 48 64 128 256 512) - install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE} RENAME cantata.png) - endforeach() - else (WIN32 OR APPLE) - install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps) - install(FILES cantata-symbolic.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps) - foreach (SIZE 16 22 24 32 48 64 128 256 512) - install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}/apps RENAME cantata.png) - endforeach() - endif (WIN32 OR APPLE) - - if (NOT WIN32 AND NOT APPLE) - update_iconcache(hicolor) - - if (EXISTS /etc/lsb-release) - file(READ "/etc/lsb-release" LSB_RELEASE_CONTENTS) - string(REGEX MATCH "DISTRIB_ID=Ubuntu" IS_UBUNTU ${LSB_RELEASE_CONTENTS}) - if (IS_UBUNTU) - set(INSTALL_UBUNTU_ICONS_DEFAULT ON) - else(IS_UBUNTU) - set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) - endif(IS_UBUNTU) - else(EXISTS /etc/lsb-release) - set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) - endif(EXISTS /etc/lsb-release) - option(INSTALL_UBUNTU_ICONS "Install the Ubuntu themed monochrome panel icons" ${INSTALL_UBUNTU_ICONS_DEFAULT}) - - if (INSTALL_UBUNTU_ICONS) - install(FILES trayicon-mono-dark.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-light/apps/22 RENAME cantata-panel.svg) - install(FILES trayicon-mono-light.svg DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/ubuntu-mono-dark/apps/22 RENAME cantata-panel.svg) - update_iconcache(ubuntu-mono-light) - update_iconcache(ubuntu-mono-dark) - add_subdirectory(suru) - update_iconcache(Suru) - endif (INSTALL_UBUNTU_ICONS) - - endif (NOT WIN32 AND NOT APPLE) - - add_subdirectory(theme) +if (NOT HAIKU AND NOT WIN32 AND NOT APPLE) + macro (update_iconcache ICON_THEME) + # Update mtime of hicolor icon theme dir. + # We don't always have touch command (e.g. on Windows), so instead create + # and delete a temporary file in the theme dir. + install(CODE " + set(DESTDIR_VALUE \"\$ENV{DESTDIR}\") + if (NOT DESTDIR_VALUE) + file(WRITE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\" \"update\") + file(REMOVE \"${CMAKE_INSTALL_PREFIX}/share/icons/${ICON_THEME}/temp.txt\") + endif (NOT DESTDIR_VALUE) + ") + endmacro (update_iconcache) - #if (APPLE) - # install(FILES trayicon-mono-dark.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps RENAME cantata-panel.svg) - #endif (APPLE) -endif (NOT HAIKU) + install(FILES cantata.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/scalable/apps) + install(FILES cantata-symbolic.svg DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/symbolic/apps) + foreach (SIZE 16 22 24 32 48 64 128 256 512) + install(FILES cantata${SIZE}.png DESTINATION ${CANTATA_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}/apps RENAME cantata.png) + endforeach() + update_iconcache(hicolor) + + if (EXISTS /etc/lsb-release) + file(READ "/etc/lsb-release" LSB_RELEASE_CONTENTS) + string(REGEX MATCH "DISTRIB_ID=Ubuntu" IS_UBUNTU ${LSB_RELEASE_CONTENTS}) + if (IS_UBUNTU) + set(INSTALL_UBUNTU_ICONS_DEFAULT ON) + else(IS_UBUNTU) + set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) + endif(IS_UBUNTU) + else(EXISTS /etc/lsb-release) + set(INSTALL_UBUNTU_ICONS_DEFAULT OFF) + endif(EXISTS /etc/lsb-release) + option(INSTALL_UBUNTU_ICONS "Install the Ubuntu Suru icons" ${INSTALL_UBUNTU_ICONS_DEFAULT}) + + if (INSTALL_UBUNTU_ICONS) + add_subdirectory(suru) + update_iconcache(Suru) + endif () +endif () diff -Nru cantata-2.3.0/icons/dice.svg cantata-2.3.1/icons/dice.svg --- cantata-2.3.0/icons/dice.svg 2017-07-03 19:12:24.000000000 +0000 +++ cantata-2.3.1/icons/dice.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ - - diff -Nru cantata-2.3.0/icons/gradcap.svg cantata-2.3.1/icons/gradcap.svg --- cantata-2.3.0/icons/gradcap.svg 2017-08-18 17:54:50.000000000 +0000 +++ cantata-2.3.1/icons/gradcap.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/hdd.svg cantata-2.3.1/icons/hdd.svg --- cantata-2.3.0/icons/hdd.svg 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/icons/hdd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/home.svg cantata-2.3.1/icons/home.svg --- cantata-2.3.0/icons/home.svg 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/icons/home.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/mpd.svg cantata-2.3.1/icons/mpd.svg --- cantata-2.3.0/icons/mpd.svg 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/icons/mpd.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/playlist.svg cantata-2.3.1/icons/playlist.svg --- cantata-2.3.0/icons/playlist.svg 2017-07-03 21:40:35.000000000 +0000 +++ cantata-2.3.1/icons/playlist.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,2 +0,0 @@ - - diff -Nru cantata-2.3.0/icons/radio.svg cantata-2.3.1/icons/radio.svg --- cantata-2.3.0/icons/radio.svg 2017-07-03 21:50:35.000000000 +0000 +++ cantata-2.3.1/icons/radio.svg 2018-05-23 18:52:06.000000000 +0000 @@ -1,5 +1,5 @@ - - + + Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-16x16@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-16x16@2x.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-16x16.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-16x16.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-24x24@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-24x24@2x.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-24x24.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-24x24.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-256x256@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-256x256@2x.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-256x256.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-256x256.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-32x32@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-32x32@2x.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-32x32.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-32x32.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-48x48@2x.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-48x48@2x.png differ Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/icons/suru/cantata-48x48.png and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/icons/suru/cantata-48x48.png differ diff -Nru cantata-2.3.0/icons/suru/cantata.svg cantata-2.3.1/icons/suru/cantata.svg --- cantata-2.3.0/icons/suru/cantata.svg 2018-04-10 17:31:08.000000000 +0000 +++ cantata-2.3.1/icons/suru/cantata.svg 2018-05-03 16:01:25.000000000 +0000 @@ -16,7 +16,7 @@ height="300" id="svg11300" sodipodi:version="0.32" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" + inkscape:version="0.92.3 (2405546, 2018-03-11)" sodipodi:docname="cantata.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0" @@ -33,21 +33,21 @@ borderopacity="0.25490196" inkscape:pageopacity="0" inkscape:pageshadow="2" - inkscape:zoom="1.69" - inkscape:cx="326.30783" - inkscape:cy="69.493302" - inkscape:current-layer="layer2" + inkscape:zoom="4.64" + inkscape:cx="303.34484" + inkscape:cy="139.38382" + inkscape:current-layer="layer6" showgrid="false" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:showpageshadow="false" - inkscape:window-width="1853" - inkscape:window-height="1015" - inkscape:window-x="67" + inkscape:window-width="1850" + inkscape:window-height="1053" + inkscape:window-x="70" inkscape:window-y="27" width="400px" height="300px" - inkscape:snap-nodes="false" + inkscape:snap-nodes="true" inkscape:snap-bbox="true" gridtolerance="10000" inkscape:object-nodes="true" @@ -55,15 +55,14 @@ showguides="true" inkscape:guide-bbox="true" inkscape:window-maximized="1" - inkscape:bbox-paths="false" - inkscape:snap-bbox-midpoints="false" + inkscape:bbox-paths="true" + inkscape:snap-bbox-midpoints="true" inkscape:snap-global="true" inkscape:object-paths="true" inkscape:snap-intersection-paths="true" inkscape:snap-smooth-nodes="true" inkscape:pagecheckerboard="false" - showborder="false" - inkscape:bbox-nodes="true"> + showborder="false"> + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + id="feGaussianBlur955" /> apps cantata + x="146.48828" + y="-8.2548828" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:18px;line-height:1.25;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans Bold'">cantata - + style="display:inline"> + + + style="opacity:1;fill:url(#linearGradient975);fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + style="opacity:1;fill:#d3d3d3;fill-opacity:1;stroke:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> + + + + + + transform="matrix(1.6795267,0,0,1.6795267,-216.66948,-49.22028)"> + transform="matrix(0.31019247,0,0,0.31019247,219.92569,52.357051)"> + transform="matrix(0.19999191,0,0,0.19999191,255.35237,125.75238)"> + transform="matrix(0.48357041,0,0,0.46726211,180.20486,92.128333)"> - - diff -Nru cantata-2.3.0/icons/suru/CMakeLists.txt cantata-2.3.1/icons/suru/CMakeLists.txt --- cantata-2.3.0/icons/suru/CMakeLists.txt 2018-04-10 17:46:21.000000000 +0000 +++ cantata-2.3.1/icons/suru/CMakeLists.txt 2018-05-23 21:57:58.000000000 +0000 @@ -1,6 +1,6 @@ set(CANTATA_SURU_ICON_INSTALL_PREFIX ${SHARE_INSTALL_PREFIX}/icons/Suru) - install(FILES ../cantata-symbolic.svg DESTINATION ${CANTATA_SURU_ICON_INSTALL_PREFIX}/scalable/apps) + foreach (SIZE 16 24 32 48 256) foreach (DPI "" @2x) install(FILES cantata-${SIZE}x${SIZE}${DPI}.png DESTINATION ${CANTATA_SURU_ICON_INSTALL_PREFIX}/${SIZE}x${SIZE}${DPI}/apps RENAME cantata.png) diff -Nru cantata-2.3.0/icons/theme/AUTHORS cantata-2.3.1/icons/theme/AUTHORS --- cantata-2.3.0/icons/theme/AUTHORS 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/AUTHORS 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -svg64/dialog-*.svg are from breeze - --------------------------------------------------------------------- - -playlist.svg and dynamic-playlist.svg are created using papirus -mimetype background - ------------------------- ICON THEME PAPIRUS ------------------------ -SOURCES: -Sam Hewitt - author icon theme Paper (https://github.com/snwh/paper-icon-theme) - -CUSTOMIZER: -Alexey Varfolomeev - Papirus Pack KDE (https://github.com/varlesh/papirus-pack-kde) diff -Nru cantata-2.3.0/icons/theme/CMakeLists.txt cantata-2.3.1/icons/theme/CMakeLists.txt --- cantata-2.3.0/icons/theme/CMakeLists.txt 2018-03-13 19:52:17.000000000 +0000 +++ cantata-2.3.1/icons/theme/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -set(ICON_FILES -svg/audio-x-generic.svg -svg/information.svg -svg/folder-temp.svg -svg/fork.svg -svg/inode-directory.svg -svg/network-server-database.svg -svg/preferences-desktop-keyboard.svg -svg/preferences-other.svg -svg/speaker.svg -svg/key.svg -svg64/dialog-error.svg -svg64/dialog-information.svg -svg64/dialog-question.svg -svg64/dialog-warning.svg -) - -if (ENABLE_PROXY_CONFIG) - set(ICON_FILES svg/preferences-system-network.svg ${ICON_FILES}) -endif (ENABLE_PROXY_CONFIG) - -if (ENABLE_DEVICES_SUPPORT) - set(ICON_FILES svg/drive-removable-media-usb-pendrive.svg svg/multimedia-player.svg ${ICON_FILES}) - if (ENABLE_REMOTE_DEVICES) - set(ICON_FILES svg/folder-network.svg svg/folder-samba.svg ${ICON_FILES}) - endif (ENABLE_REMOTE_DEVICES) -endif (ENABLE_DEVICES_SUPPORT) - -if (WIN32 OR APPLE) - set(CANTATA_ICON_THEME_PATH ${CANTATA_ICON_INSTALL_PREFIX}) -else (WIN32 OR APPLE) - set(CANTATA_ICON_THEME_PATH ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/icons/cantata) -endif (WIN32 OR APPLE) - -foreach(ICON ${ICON_FILES}) - get_filename_component(ICON_PATH ${ICON} PATH) - install(FILES ${ICON} DESTINATION ${CANTATA_ICON_THEME_PATH}/${ICON_PATH}) -endforeach(ICON ${ICON_FILES}) -install(FILES AUTHORS index.theme LICENSE DESTINATION ${CANTATA_ICON_THEME_PATH}) - -install(FILES ../cantata128.png DESTINATION ${CANTATA_ICON_THEME_PATH}/128 RENAME cantata.png) -if (NOT WIN32 AND NOT APPLE) - install(FILES ../cantata.svg DESTINATION ${CANTATA_ICON_THEME_PATH}/svg) -endif (NOT WIN32 AND NOT APPLE) - diff -Nru cantata-2.3.0/icons/theme/index.theme cantata-2.3.1/icons/theme/index.theme --- cantata-2.3.0/icons/theme/index.theme 2018-02-13 22:10:53.000000000 +0000 +++ cantata-2.3.1/icons/theme/index.theme 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -[Icon Theme] -Name=Cantata -Comment=Icons taken from Papirus theme. -Inherits=breeze,oxygen,hicolor -Directories=svg,svg64,128 - -[128] -Context=Applications -Size=128 -Type=Fixed - -[svg] -Size=48 -MinSize=8 -MaxSize=512 -Type=Scalable - -[svg64] -Size=64 -MinSize=8 -MaxSize=512 -Type=Scalable - diff -Nru cantata-2.3.0/icons/theme/LICENSE cantata-2.3.1/icons/theme/LICENSE --- cantata-2.3.0/icons/theme/LICENSE 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/LICENSE 1970-01-01 00:00:00.000000000 +0000 @@ -1,425 +0,0 @@ -Creative Commons Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Paper available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Paper means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Paper - and in which the Licensed Paper is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Paper is a musical work, performance, or sound recording, - Adapted Paper is always produced where the Licensed Paper is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Paper in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Paper. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Paper means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Paper and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Paper to: - - a. reproduce and Share the Licensed Paper, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Paper. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Paper. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Paper. Every - recipient of the Licensed Paper automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Paper. - Every recipient of Adapted Paper from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Paper - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Paper if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Paper. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Paper is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Paper (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Paper: - - i. identification of the creator(s) of the Licensed - Paper and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Paper to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Paper and - retain an indication of any previous modifications; and - - c. indicate the Licensed Paper is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Paper. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Paper You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Paper. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Paper that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Paper: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Paper, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Paper has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Paper under separate terms or conditions or stop - distributing the Licensed Paper at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Paper not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Paper that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org. \ No newline at end of file diff -Nru cantata-2.3.0/icons/theme/svg/audio-x-generic.svg cantata-2.3.1/icons/theme/svg/audio-x-generic.svg --- cantata-2.3.0/icons/theme/svg/audio-x-generic.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/audio-x-generic.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,9 +0,0 @@ - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/drive-removable-media-usb-pendrive.svg cantata-2.3.1/icons/theme/svg/drive-removable-media-usb-pendrive.svg --- cantata-2.3.0/icons/theme/svg/drive-removable-media-usb-pendrive.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/drive-removable-media-usb-pendrive.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/folder-network.svg cantata-2.3.1/icons/theme/svg/folder-network.svg --- cantata-2.3.0/icons/theme/svg/folder-network.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/folder-network.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/folder-samba.svg cantata-2.3.1/icons/theme/svg/folder-samba.svg --- cantata-2.3.0/icons/theme/svg/folder-samba.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/folder-samba.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/folder-temp.svg cantata-2.3.1/icons/theme/svg/folder-temp.svg --- cantata-2.3.0/icons/theme/svg/folder-temp.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/folder-temp.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/fork.svg cantata-2.3.1/icons/theme/svg/fork.svg --- cantata-2.3.0/icons/theme/svg/fork.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/fork.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/information.svg cantata-2.3.1/icons/theme/svg/information.svg --- cantata-2.3.0/icons/theme/svg/information.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/information.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/inode-directory.svg cantata-2.3.1/icons/theme/svg/inode-directory.svg --- cantata-2.3.0/icons/theme/svg/inode-directory.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/inode-directory.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/key.svg cantata-2.3.1/icons/theme/svg/key.svg --- cantata-2.3.0/icons/theme/svg/key.svg 2018-03-13 19:51:19.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/key.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/multimedia-player.svg cantata-2.3.1/icons/theme/svg/multimedia-player.svg --- cantata-2.3.0/icons/theme/svg/multimedia-player.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/multimedia-player.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/network-server-database.svg cantata-2.3.1/icons/theme/svg/network-server-database.svg --- cantata-2.3.0/icons/theme/svg/network-server-database.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/network-server-database.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/preferences-desktop-keyboard.svg cantata-2.3.1/icons/theme/svg/preferences-desktop-keyboard.svg --- cantata-2.3.0/icons/theme/svg/preferences-desktop-keyboard.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/preferences-desktop-keyboard.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/preferences-other.svg cantata-2.3.1/icons/theme/svg/preferences-other.svg --- cantata-2.3.0/icons/theme/svg/preferences-other.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/preferences-other.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/preferences-system-network.svg cantata-2.3.1/icons/theme/svg/preferences-system-network.svg --- cantata-2.3.0/icons/theme/svg/preferences-system-network.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/preferences-system-network.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg/speaker.svg cantata-2.3.1/icons/theme/svg/speaker.svg --- cantata-2.3.0/icons/theme/svg/speaker.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg/speaker.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-error.svg cantata-2.3.1/icons/theme/svg64/dialog-error.svg --- cantata-2.3.0/icons/theme/svg64/dialog-error.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg64/dialog-error.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-information.svg cantata-2.3.1/icons/theme/svg64/dialog-information.svg --- cantata-2.3.0/icons/theme/svg64/dialog-information.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg64/dialog-information.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-question.svg cantata-2.3.1/icons/theme/svg64/dialog-question.svg --- cantata-2.3.0/icons/theme/svg64/dialog-question.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg64/dialog-question.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/theme/svg64/dialog-warning.svg cantata-2.3.1/icons/theme/svg64/dialog-warning.svg --- cantata-2.3.0/icons/theme/svg64/dialog-warning.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/theme/svg64/dialog-warning.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/icons/trayicon-mono-dark.svg cantata-2.3.1/icons/trayicon-mono-dark.svg --- cantata-2.3.0/icons/trayicon-mono-dark.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/icons/trayicon-mono-dark.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru cantata-2.3.0/icons/trayicon-mono-light.svg cantata-2.3.1/icons/trayicon-mono-light.svg --- cantata-2.3.0/icons/trayicon-mono-light.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/icons/trayicon-mono-light.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ - - - - - - diff -Nru cantata-2.3.0/icons/view-media-artist.svg cantata-2.3.1/icons/view-media-artist.svg --- cantata-2.3.0/icons/view-media-artist.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/view-media-artist.svg 2018-05-16 05:15:50.000000000 +0000 @@ -1,18 +1,3 @@ - - - - - - - - - - - - - - - - + diff -Nru cantata-2.3.0/icons/view-media-genre.svg cantata-2.3.1/icons/view-media-genre.svg --- cantata-2.3.0/icons/view-media-genre.svg 2016-10-16 13:47:02.000000000 +0000 +++ cantata-2.3.1/icons/view-media-genre.svg 2018-05-11 16:34:28.000000000 +0000 @@ -1,6 +1,2 @@ - + + diff -Nru cantata-2.3.0/INSTALL cantata-2.3.1/INSTALL --- cantata-2.3.0/INSTALL 2017-12-28 11:25:09.000000000 +0000 +++ cantata-2.3.1/INSTALL 2018-05-21 16:19:31.000000000 +0000 @@ -62,7 +62,7 @@ Default: ON -DINSTALL_UBUNTU_ICONS= - Install monochrome system tray icons for Ubuntu. + Install Suru icons for Ubuntu. -DCANTATA_HELPERS_LIB_DIR= For 64 bit builds, this may be used to control the lib sub-dir diff -Nru cantata-2.3.0/models/browsemodel.cpp cantata-2.3.1/models/browsemodel.cpp --- cantata-2.3.0/models/browsemodel.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/models/browsemodel.cpp 2018-05-23 19:39:27.000000000 +0000 @@ -28,6 +28,8 @@ #include "gui/settings.h" #include "mpd-interface/mpdconnection.h" #include "mpd-interface/mpdstats.h" +#include "support/monoicon.h" +#include "support/utils.h" #include void BrowseModel::FolderItem::add(Item *i) @@ -59,7 +61,7 @@ , enabled(false) , dbVersion(0) { - icn.addFile(":mpd.svg"); + icn=MonoIcon::icon(FontAwesome::server, Utils::monoIconColor()); connect(this, SIGNAL(listFolder(QString)), MPDConnection::self(), SLOT(listFolder(QString))); folderIndex.insert(root->getPath(), root); } diff -Nru cantata-2.3.0/models/browsemodel.h cantata-2.3.1/models/browsemodel.h --- cantata-2.3.0/models/browsemodel.h 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/models/browsemodel.h 2018-05-24 17:49:38.000000000 +0000 @@ -113,7 +113,7 @@ QString name() const; QString title() const; QString descr() const; - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } void clear(); void load(); bool isEnabled() const { return enabled; } @@ -142,7 +142,7 @@ Item * toItem(const QModelIndex &index) const { return index.isValid() ? static_cast(index.internalPointer()) : root; } private: - Icon icn; + QIcon icn; FolderItem *root; QMap folderIndex; bool enabled; diff -Nru cantata-2.3.0/models/localbrowsemodel.cpp cantata-2.3.1/models/localbrowsemodel.cpp --- cantata-2.3.0/models/localbrowsemodel.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/models/localbrowsemodel.cpp 2018-05-23 19:40:01.000000000 +0000 @@ -63,13 +63,13 @@ return l.fileName().toLower().localeAwareCompare(r.fileName().toLower())<0; } -LocalBrowseModel::LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QString &icon, QObject *p) +LocalBrowseModel::LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QIcon &icon, QObject *p) : QFileSystemModel(p) , pathName(name) , pathTitle(title) , pathDescr(descr) + , icn(icon) { - icn.addFile(icon); setFilter(QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot|QDir::Drives); } diff -Nru cantata-2.3.0/models/localbrowsemodel.h cantata-2.3.1/models/localbrowsemodel.h --- cantata-2.3.0/models/localbrowsemodel.h 2018-02-07 21:59:25.000000000 +0000 +++ cantata-2.3.1/models/localbrowsemodel.h 2018-05-24 17:50:59.000000000 +0000 @@ -33,20 +33,20 @@ Q_OBJECT public: - LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QString &icon, QObject *p); + LocalBrowseModel(const QString &name, const QString &title, const QString &descr, const QIcon &icon, QObject *p); QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QString name() const { return pathName; } QString title() const { return pathTitle; } QString descr() const { return pathDescr; } - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } private: QString pathName; QString pathTitle; QString pathDescr; - Icon icn; + QIcon icn; }; class FileSystemProxyModel : public QSortFilterProxyModel diff -Nru cantata-2.3.0/models/musiclibraryitemroot.h cantata-2.3.1/models/musiclibraryitemroot.h --- cantata-2.3.0/models/musiclibraryitemroot.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/models/musiclibraryitemroot.h 2018-05-24 17:55:11.000000000 +0000 @@ -69,7 +69,7 @@ } ~MusicLibraryItemRoot() override { } - virtual Icon icon() const { return Icon(); } + virtual QIcon icon() const { return QIcon(); } virtual QImage image() const { return QImage(); } virtual Song fixPath(const Song &orig, bool) const { return orig; } virtual const QString & id() const { return m_itemData; } diff -Nru cantata-2.3.0/models/playlistsmodel.cpp cantata-2.3.1/models/playlistsmodel.cpp --- cantata-2.3.0/models/playlistsmodel.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/models/playlistsmodel.cpp 2018-05-23 19:48:17.000000000 +0000 @@ -74,7 +74,7 @@ , itemMenu(nullptr) , dropAdjust(0) { - icn.addFile(":playlist.svg"); + icn=Icons::self()->playlistListIcon; connect(MPDConnection::self(), SIGNAL(stateChanged(bool)), SLOT(mpdConnectionStateChanged(bool))); connect(MPDConnection::self(), SIGNAL(playlistsRetrieved(const QList &)), this, SLOT(setPlaylists(const QList &))); connect(MPDConnection::self(), SIGNAL(playlistInfoRetrieved(const QString &, const QList &)), this, SLOT(playlistInfoRetrieved(const QString &, const QList &))); @@ -345,7 +345,7 @@ ? pl->visibleName() : pl->visibleName()+"\n"+tr("%n Tracks (%1)", "", pl->songs.count()).arg(Utils::formatTime(pl->totalTime())); case Qt::DecorationRole: - return multiCol ? QVariant() : (pl->isSmartPlaylist ? Icons::self()->dynamicListIcon : Icons::self()->playlistListIcon); + return multiCol ? QVariant() : (pl->isSmartPlaylist ? Icons::self()->smartPlaylistIcon : Icons::self()->playlistListIcon); case Cantata::Role_SubText: if (!pl->loaded) { pl->loaded=true; diff -Nru cantata-2.3.0/models/playlistsmodel.h cantata-2.3.1/models/playlistsmodel.h --- cantata-2.3.0/models/playlistsmodel.h 2018-02-01 19:06:17.000000000 +0000 +++ cantata-2.3.1/models/playlistsmodel.h 2018-05-24 17:53:49.000000000 +0000 @@ -104,7 +104,7 @@ QString name() const; QString title() const; QString descr() const; - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return COL_COUNT; } bool canFetchMore(const QModelIndex &index) const override; @@ -163,7 +163,7 @@ quint32 allocateKey(); private: - Icon icn; + QIcon icn; bool multiCol; QList items; QSet usedKeys; diff -Nru cantata-2.3.0/models/streamsearchmodel.cpp cantata-2.3.1/models/streamsearchmodel.cpp --- cantata-2.3.0/models/streamsearchmodel.cpp 2018-03-14 22:01:34.000000000 +0000 +++ cantata-2.3.1/models/streamsearchmodel.cpp 2018-06-01 16:30:16.000000000 +0000 @@ -28,6 +28,8 @@ #include "network/networkaccessmanager.h" #include "gui/stdactions.h" #include "gui/settings.h" +#include "support/monoicon.h" +#include "support/utils.h" #include #include #include @@ -36,21 +38,15 @@ #include #include -static QIcon getIcon(const QString &name) -{ - QIcon icon; - icon.addFile(":"+name); - return icon.isNull() ? Icons::self()->streamCategoryIcon : icon; -} - StreamSearchModel::StreamSearchModel(QObject *parent) : ActionModel(parent) , root(new StreamsModel::CategoryItem(QString(), "root")) { // ORDER *MUST* MATCH Category ENUM!!!!! - root->children.append(new StreamsModel::CategoryItem("http://opml.radiotime.com/Search.ashx", tr("TuneIn"), root, getIcon("tunein"))); - root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constShoutCastHost+QLatin1String("/legacy/genrelist"), tr("ShoutCast"), root, getIcon("shoutcast"))); - root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constDirbleHost+QLatin1String("/v2/search/"), tr("Dirble"), root, getIcon("dirble"))); + root->children.append(new StreamsModel::CategoryItem("http://opml.radiotime.com/Search.ashx", tr("TuneIn"), root, MonoIcon::icon(":tunein.svg", Utils::monoIconColor()))); + root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constShoutCastHost+QLatin1String("/legacy/genrelist"), tr("ShoutCast"), root, MonoIcon::icon(":shoutcast.svg", Utils::monoIconColor()))); + root->children.append(new StreamsModel::CategoryItem(QLatin1String("http://")+StreamsModel::constDirbleHost+QLatin1String("/v2/search/"), tr("Dirble"), root, MonoIcon::icon(":station.svg", Utils::monoIconColor()))); + icon = MonoIcon::icon(FontAwesome::search, Utils::monoIconColor()); } StreamSearchModel::~StreamSearchModel() @@ -112,7 +108,7 @@ case Cantata::Role_SubText: return tr("Search for radio streams"); case Qt::DecorationRole: - return Icon("edit-find"); + return icon; } return QVariant(); } @@ -257,28 +253,6 @@ currentSearch=QString(); } -static int getParam(const QString &key, QString &query) -{ - int index=query.indexOf(" "+key+"="); - int val=0; - if (-1!=index) { - int endPos=query.indexOf(" ", index+3); - int end=endPos; - if (-1==end) { - end=query.length()-1; - } - int start=index+key.length()+2; - val=query.mid(start, (end+1)-start).toInt(); - if (endPos>start) { - query=query.left(index)+query.mid(endPos); - query=query.trimmed(); - } else { - query=query.left(index); - } - } - return val; -} - void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly) { if (searchTerm==currentSearch) { @@ -305,18 +279,9 @@ } case ShoutCast: { searchUrl=QUrl(item->url); - QString search=searchTerm; - int limit=getParam("limit", search); - int bitrate=getParam("br", search); - if (0==bitrate) { - bitrate=getParam("bitrate", search); - } ApiKeys::self()->addKey(query, ApiKeys::ShoutCast); - query.addQueryItem("search", search); - query.addQueryItem("limit", QString::number(limit<1 ? 100 : limit)); - if (bitrate>=32 && bitrate<=512) { - query.addQueryItem("br", QString::number(bitrate)); - } + query.addQueryItem("search", searchTerm); + query.addQueryItem("limit", QString::number(200)); break; } case Dirble: diff -Nru cantata-2.3.0/models/streamsearchmodel.h cantata-2.3.1/models/streamsearchmodel.h --- cantata-2.3.0/models/streamsearchmodel.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/models/streamsearchmodel.h 2018-05-23 19:55:48.000000000 +0000 @@ -87,6 +87,7 @@ QMap jobs; StreamsModel::CategoryItem *root; QString currentSearch; + QIcon icon; }; #endif diff -Nru cantata-2.3.0/models/streamsmodel.cpp cantata-2.3.1/models/streamsmodel.cpp --- cantata-2.3.0/models/streamsmodel.cpp 2018-03-14 22:03:56.000000000 +0000 +++ cantata-2.3.1/models/streamsmodel.cpp 2018-05-24 18:03:36.000000000 +0000 @@ -27,6 +27,7 @@ #include "widgets/icons.h" #include "network/networkaccessmanager.h" #include "support/utils.h" +#include "support/monoicon.h" #include "gui/settings.h" #include "playqueuemodel.h" #include "roles.h" @@ -35,7 +36,6 @@ #include "support/actioncollection.h" #include "digitallyimported.h" #include "qtiocompressor/qtiocompressor.h" -#include "support/utils.h" #include "config.h" #include "support/globalstatic.h" #include @@ -88,25 +88,18 @@ static const QLatin1String constBookmarksDir=QLatin1String("bookmarks"); -static QIcon getIcon(const QString &name) -{ - QIcon icon; - icon.addFile(":"+name); - return icon.isNull() ? Icons::self()->streamCategoryIcon : icon; -} - -static Icon getExternalIcon(const QString &path, QStringList files=QStringList() << StreamsModel::constSvgIcon << StreamsModel::constPngIcon) +static QIcon getExternalIcon(const QString &path, QStringList files=QStringList() << StreamsModel::constSvgIcon << StreamsModel::constPngIcon) { for (const QString &file: files) { QString iconFile=path+Utils::constDirSep+file; if (QFile::exists(iconFile)) { - Icon icon; + QIcon icon; icon.addFile(iconFile); return icon; } } - return Icon(); + return QIcon(); } static QString categoryCacheName(const QString &name, bool createDir=false) @@ -231,11 +224,7 @@ StreamsModel::CategoryItem * StreamsModel::CategoryItem::createBookmarksCategory() { - Icon icon=Icon("bookmarks"); - if (icon.isNull()) { - icon=Icon("user-bookmarks"); - } - CategoryItem *bookmarkCat = new CategoryItem(QString(), tr("Bookmarks"), this, icon); + CategoryItem *bookmarkCat = new CategoryItem(QString(), tr("Bookmarks"), this, MonoIcon::icon(FontAwesome::bookmark, Utils::monoIconColor())); bookmarkCat->state=CategoryItem::Fetched; bookmarkCat->isBookmarks=true; return bookmarkCat; @@ -498,18 +487,19 @@ : ActionModel(parent) , root(new CategoryItem(QString(), "root")) { - icn.addFile(":radio.svg"); - tuneIn=new CategoryItem(constRadioTimeUrl+QLatin1String("?locale=")+QLocale::system().name(), tr("TuneIn"), root, getIcon("tunein"), QString(), "tunein"); + QColor col = Utils::monoIconColor(); + icn=MonoIcon::icon(":radio.svg", col); + tuneIn=new CategoryItem(constRadioTimeUrl+QLatin1String("?locale=")+QLocale::system().name(), tr("TuneIn"), root, MonoIcon::icon(":tunein.svg", col), QString(), "tunein"); tuneIn->supportsBookmarks=true; root->children.append(tuneIn); - root->children.append(new IceCastCategoryItem(constIceCastUrl, tr("IceCast"), root, getIcon("icecast"), "icecast")); - shoutCast=new ShoutCastCategoryItem(constShoutCastUrl, tr("ShoutCast"), root, getIcon("shoutcast")); + root->children.append(new IceCastCategoryItem(constIceCastUrl, tr("IceCast"), root, MonoIcon::icon(FontAwesome::cube, col), "icecast")); + shoutCast=new ShoutCastCategoryItem(constShoutCastUrl, tr("ShoutCast"), root, MonoIcon::icon(":shoutcast.svg", col)); shoutCast->configName="shoutcast"; root->children.append(shoutCast); - dirble=new DirbleCategoryItem(constDirbleUrl, tr("Dirble"), root, getIcon("dirble")); + dirble=new DirbleCategoryItem(constDirbleUrl, tr("Dirble"), root, MonoIcon::icon(":station.svg", col)); dirble->configName="dirble"; root->children.append(dirble); - favourites=new FavouritesCategoryItem(constFavouritesUrl, tr("Favorites"), root, getIcon("favourites")); + favourites=new FavouritesCategoryItem(constFavouritesUrl, tr("Favorites"), root, MonoIcon::icon(FontAwesome::heart, MonoIcon::constRed)); root->children.append(favourites); loadInstalledProviders(); addBookmarkAction = new Action(Icons::self()->addBookmarkIcon, tr("Bookmark Category"), this); @@ -1753,7 +1743,7 @@ } } -StreamsModel::CategoryItem * StreamsModel::addInstalledProvider(const QString &name, const Icon &icon, const QString &streamsFileName, bool replace) +StreamsModel::CategoryItem * StreamsModel::addInstalledProvider(const QString &name, const QIcon &icon, const QString &streamsFileName, bool replace) { CategoryItem *cat=nullptr; if (streamsFileName.endsWith(constSettingsFile)) { diff -Nru cantata-2.3.0/models/streamsmodel.h cantata-2.3.1/models/streamsmodel.h --- cantata-2.3.0/models/streamsmodel.h 2018-03-14 22:00:51.000000000 +0000 +++ cantata-2.3.1/models/streamsmodel.h 2018-05-24 17:55:11.000000000 +0000 @@ -218,7 +218,7 @@ QString name() const; QString title() const; QString descr() const; - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } QModelIndex index(int, int, const QModelIndex & = QModelIndex()) const override; QModelIndex parent(const QModelIndex &) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; @@ -263,7 +263,7 @@ void save(); QList getCategories() const; void setHiddenCategories(const QSet &cats); - CategoryItem * addInstalledProvider(const QString &name, const Icon &icon, const QString &streamsFileName, bool replace); + CategoryItem * addInstalledProvider(const QString &name, const QIcon &icon, const QString &streamsFileName, bool replace); void removeInstalledProvider(const QString &key); QModelIndex categoryIndex(const CategoryItem *cat) const; @@ -324,7 +324,7 @@ Action *configureDiAction; Action *reloadAction; QList hiddenCategories; - Icon icn; + QIcon icn; }; #endif diff -Nru cantata-2.3.0/mpd-interface/mpdconnection.cpp cantata-2.3.1/mpd-interface/mpdconnection.cpp --- cantata-2.3.0/mpd-interface/mpdconnection.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/mpd-interface/mpdconnection.cpp 2018-05-29 06:17:56.000000000 +0000 @@ -195,7 +195,7 @@ MPDConnectionDetails::MPDConnectionDetails() : port(6600) , dirReadable(false) - , allowLocalStreaming(false) + , allowLocalStreaming(true) , autoUpdate(false) { } @@ -220,6 +220,23 @@ } } +MPDConnectionDetails & MPDConnectionDetails::operator=(const MPDConnectionDetails &o) +{ + name=o.name; + hostname=o.hostname; + port=o.port; + password=o.password; + dir=o.dir; + dirReadable=o.dirReadable; + #ifdef ENABLE_HTTP_STREAM_PLAYBACK + streamUrl=o.streamUrl; + #endif + replayGain=o.replayGain; + allowLocalStreaming=o.allowLocalStreaming; + autoUpdate=o.autoUpdate; + return *this; +} + void MPDConnectionDetails::setDirReadable() { dirReadable=Utils::isDirReadable(dir); @@ -1656,7 +1673,9 @@ void MPDConnection::listPlaylists() { - Response response=sendCommand("listplaylists"); + // Don't report errors here. If user has disabled playlists, then MPD will report an error + // Issues #1090 #1284 + Response response=sendCommand("listplaylists", false); if (response.ok) { QList playlists=MPDParseUtils::parsePlaylists(response.data); playlists.removeAll((Playlist(constStreamsPlayListName))); @@ -1838,6 +1857,26 @@ Response response=sendCommand(cmd); if (response.ok) { songs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_Search); + + if (QLatin1String("any")==field) { + // When searching on 'any' MPD ignores filename/paths! So, do another + // search on these, and combine results. + response=sendCommand("search file "+encodeName(value)); + if (response.ok) { + QList otherSongs=MPDParseUtils::parseSongs(response.data, MPDParseUtils::Loc_Search); + if (!otherSongs.isEmpty()) { + QSet fileNames; + for (const auto &s: songs) { + fileNames.insert(s.file); + } + for (const auto &s: otherSongs) { + if (!fileNames.contains(s.file)) { + songs.append(s); + } + } + } + } + } qSort(songs); } } diff -Nru cantata-2.3.0/mpd-interface/mpdconnection.h cantata-2.3.1/mpd-interface/mpdconnection.h --- cantata-2.3.0/mpd-interface/mpdconnection.h 2018-02-15 19:29:59.000000000 +0000 +++ cantata-2.3.1/mpd-interface/mpdconnection.h 2018-05-29 06:18:05.000000000 +0000 @@ -141,10 +141,12 @@ struct MPDConnectionDetails { MPDConnectionDetails(); + MPDConnectionDetails(const MPDConnectionDetails &o) { *this=o; } QString getName() const; QString description() const; bool isLocal() const { return hostname.startsWith('/'); } bool isEmpty() const { return hostname.isEmpty() || (!isLocal() && 0==port); } + MPDConnectionDetails & operator=(const MPDConnectionDetails &o); bool operator==(const MPDConnectionDetails &o) const { return hostname==o.hostname && isLocal()==o.isLocal() && (isLocal() || port==o.port) && password==o.password; } bool operator!=(const MPDConnectionDetails &o) const { return !(*this==o); } bool operator<(const MPDConnectionDetails &o) const { return name.localeAwareCompare(o.name)<0; } diff -Nru cantata-2.3.0/mpd-interface/mpdparseutils.cpp cantata-2.3.1/mpd-interface/mpdparseutils.cpp --- cantata-2.3.0/mpd-interface/mpdparseutils.cpp 2018-04-25 21:04:06.000000000 +0000 +++ cantata-2.3.1/mpd-interface/mpdparseutils.cpp 2018-05-16 22:05:20.000000000 +0000 @@ -743,7 +743,18 @@ } } if (Loc_Browse==loc) { - qSort(songs); + QList sngs; + QList playlists; + for (const auto &s: songs) { + if (Song::Playlist==s.type) { + playlists.append(s); + } else { + sngs.append(s); + } + } + qSort(playlists); + songs=sngs; + songs+=playlists; } songList+=songs; } diff -Nru cantata-2.3.0/mpd-interface/mpduser.cpp cantata-2.3.1/mpd-interface/mpduser.cpp --- cantata-2.3.0/mpd-interface/mpduser.cpp 2018-02-15 19:42:19.000000000 +0000 +++ cantata-2.3.1/mpd-interface/mpduser.cpp 2018-05-28 21:03:07.000000000 +0000 @@ -79,6 +79,7 @@ mpdExe=Utils::findExe("mpd"); #endif det.name=constName; + det.allowLocalStreaming=true; } bool MPDUser::isSupported() @@ -254,7 +255,7 @@ QString playlists; if (create && !QFile::exists(cfgName)) { // Conf file does not exist, so we need to create one... - QFile cfgTemplate(CANTATA_SYS_MPD_DIR+constConfigFile+".template"); + QFile cfgTemplate(":"+constConfigFile+".template"); if (cfgTemplate.open(QIODevice::ReadOnly|QIODevice::Text)) { QFile cfgFile(cfgName); diff -Nru cantata-2.3.0/mpd-interface/song.cpp cantata-2.3.1/mpd-interface/song.cpp --- cantata-2.3.0/mpd-interface/song.cpp 2018-02-25 21:52:52.000000000 +0000 +++ cantata-2.3.1/mpd-interface/song.cpp 2018-05-20 12:37:51.000000000 +0000 @@ -36,6 +36,8 @@ #include #include #include +#include +#include //static const quint8 constOnlineDiscId=0xEE; @@ -384,9 +386,11 @@ }; static QHash storeMap; +static QMutex storeMapMutex; void Song::clearKeyStore(int location) { + QMutexLocker locker(&storeMapMutex); storeMap.remove(location); } @@ -449,9 +453,11 @@ return 0; } - KeyStore &store=storeMap[location]; QString songKey(albumKey()); + QMutexLocker locker(&storeMapMutex); + KeyStore &store=storeMap[location]; QHash::ConstIterator it=store.keys.find(songKey); + if (it!=store.keys.end()) { key=it.value(); } else { @@ -747,24 +753,34 @@ return albumArtist()+QLatin1Char(':')+albumId()+QLatin1Char(':')+QString::number(disc); } -QString Song::basicArtist() const +static QString basic(const QString &str) { - if (!albumartist.isEmpty() && (artist.isEmpty() || albumartist==artist || (albumartist.length() - + - + - + diff -Nru cantata-2.3.0/online/icons/cbc.svg cantata-2.3.1/online/icons/cbc.svg --- cantata-2.3.0/online/icons/cbc.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/online/icons/cbc.svg 2018-05-23 18:37:42.000000000 +0000 @@ -1 +1 @@ - + diff -Nru cantata-2.3.0/online/icons/CMakeLists.txt cantata-2.3.1/online/icons/CMakeLists.txt --- cantata-2.3.0/online/icons/CMakeLists.txt 2017-04-09 16:23:42.000000000 +0000 +++ cantata-2.3.1/online/icons/CMakeLists.txt 2018-05-17 16:28:05.000000000 +0000 @@ -1,4 +1,4 @@ -set(CANTATA_INSTALL_ONLINE_ICONS bbc.svg cbc.svg npr.svg podcasts.png soundcloud.png) +set(CANTATA_INSTALL_ONLINE_ICONS podcasts.png soundcloud.png) if (WIN32) install(FILES ${CANTATA_INSTALL_ONLINE_ICONS} DESTINATION ${CMAKE_INSTALL_PREFIX}/icons/) diff -Nru cantata-2.3.0/online/icons/gpodder.svg cantata-2.3.1/online/icons/gpodder.svg --- cantata-2.3.0/online/icons/gpodder.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/online/icons/gpodder.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/online/icons/itunes.svg cantata-2.3.1/online/icons/itunes.svg --- cantata-2.3.0/online/icons/itunes.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/online/icons/itunes.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -itunes - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/online/icons/jamendo.svg cantata-2.3.1/online/icons/jamendo.svg --- cantata-2.3.0/online/icons/jamendo.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/online/icons/jamendo.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/online/icons/magnatune.svg cantata-2.3.1/online/icons/magnatune.svg --- cantata-2.3.0/online/icons/magnatune.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/online/icons/magnatune.svg 2018-05-23 18:52:13.000000000 +0000 @@ -1,5 +1,5 @@ - + diff -Nru cantata-2.3.0/online/icons/npr.svg cantata-2.3.1/online/icons/npr.svg --- cantata-2.3.0/online/icons/npr.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/online/icons/npr.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/online/icons/podcasts.svg cantata-2.3.1/online/icons/podcasts.svg --- cantata-2.3.0/online/icons/podcasts.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/online/icons/podcasts.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/online/icons/soundcloud.svg cantata-2.3.1/online/icons/soundcloud.svg --- cantata-2.3.0/online/icons/soundcloud.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/online/icons/soundcloud.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -image/svg+xml diff -Nru cantata-2.3.0/online/jamendoservice.cpp cantata-2.3.1/online/jamendoservice.cpp --- cantata-2.3.0/online/jamendoservice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/jamendoservice.cpp 2018-05-23 18:49:07.000000000 +0000 @@ -27,6 +27,8 @@ #include "models/roles.h" #include "support/icon.h" #include "support/configuration.h" +#include "support/utils.h" +#include "support/monoicon.h" #include #include @@ -319,7 +321,7 @@ JamendoService::JamendoService(QObject *p) : OnlineDbService(new OnlineDb(constName, p), p) { - icn.addFile(":"+constName); + icn=MonoIcon::icon(FontAwesome::playcircleo, Utils::monoIconColor()); useCovers(name()); Configuration cfg(constName); format=toFormat(cfg.get("format", formatStr(FMT_MP3))); @@ -387,7 +389,6 @@ { s.file=QString(constStreamUrl).replace("id=%1", "id="+s.file); s.file+=FMT_MP3==format ? QLatin1String("mp31") : QLatin1String("ogg2"); - s.genres[0]=FMT_MP3==format ? QLatin1String("mp3") : QLatin1String("ogg"); s.type=Song::OnlineSvrTrack; s.setIsFromOnlineService(name()); return encode(s); diff -Nru cantata-2.3.0/online/magnatuneservice.cpp cantata-2.3.1/online/magnatuneservice.cpp --- cantata-2.3.0/online/magnatuneservice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/magnatuneservice.cpp 2018-05-23 18:54:08.000000000 +0000 @@ -27,6 +27,7 @@ #include "models/roles.h" #include "support/icon.h" #include "support/configuration.h" +#include "support/monoicon.h" #include #include @@ -157,7 +158,7 @@ MagnatuneService::MagnatuneService(QObject *p) : OnlineDbService(new OnlineDb(constName, p), p) { - icn.addFile(":"+constName); + icn=MonoIcon::icon(":magnatune.svg", Utils::monoIconColor()); useCovers(name()); Configuration cfg(constName); membership=toMembership(cfg.get("membership", membershipStr(MB_None))); @@ -241,7 +242,7 @@ s.file=url.toString(); // TODO: Magnatune downloads! // if (MB_Download==membership) { - // s.genre=downloadTypeStr(download); + // ??? // } } s.setIsFromOnlineService(name()); diff -Nru cantata-2.3.0/online/onlinedbwidget.cpp cantata-2.3.1/online/onlinedbwidget.cpp --- cantata-2.3.0/online/onlinedbwidget.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/onlinedbwidget.cpp 2018-05-08 21:45:16.000000000 +0000 @@ -56,6 +56,7 @@ connect(view, SIGNAL(headerClicked(int)), SLOT(headerClicked(int))); connect(view, SIGNAL(updateToPlayQueue(QModelIndex,bool)), this, SLOT(updateToPlayQueue(QModelIndex,bool))); view->setOpenAfterSearch(SqlLibraryModel::T_Album!=srv->topLevel()); + view->addAction(StdActions::self()->addToStoredPlaylistAction); connect(StdActions::self()->addRandomAlbumToPlayQueueAction, SIGNAL(triggered()), SLOT(addRandomAlbum())); connect(srv, SIGNAL(modelReset()), this, SLOT(modelReset())); } @@ -193,6 +194,11 @@ void OnlineDbWidget::controlActions() { QModelIndexList selected=view->selectedIndexes(false); // Dont need sorted selection here... + bool enable=selected.count()>0; + + StdActions::self()->enableAddToPlayQueue(enable); + StdActions::self()->addToStoredPlaylistAction->setEnabled(enable); + bool allowRandomAlbum=isVisible() && !selected.isEmpty(); if (allowRandomAlbum) { for (const QModelIndex &idx: selected) { diff -Nru cantata-2.3.0/online/onlinedevice.cpp cantata-2.3.1/online/onlinedevice.cpp --- cantata-2.3.0/online/onlinedevice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/onlinedevice.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "onlinedevice.h" -#include "support/utils.h" -#include "network/networkaccessmanager.h" -#include "mpd-interface/mpdconnection.h" -#include "models/mpdlibrarymodel.h" -#include - -void OnlineDevice::copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover) -{ - Q_UNUSED(copyCover) - - jobAbortRequested=false; - QString baseDir=MPDConnection::self()->getDetails().dir; - QString dest(baseDir+musicPath); - if (!overwrite && (QFile::exists(dest) || MpdLibraryModel::self()->songExists(s))) { - emit actionStatus(SongExists); - return; - } - - overWrite=overwrite; - lastProg=-1; - currentDestFile=baseDir+musicPath; - currentSong=s; - - QDir dir(Utils::getDir(dest)); - if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) { - emit actionStatus(DirCreationFaild); - return; - } - - job=NetworkAccessManager::self()->get(QUrl(s.file)); - connect(job, SIGNAL(finished()), SLOT(downloadFinished())); - connect(job, SIGNAL(downloadProgress(qint64,qint64)), SLOT(downloadProgress(qint64,qint64))); -} - -void OnlineDevice::downloadFinished() -{ - NetworkJob *reply=qobject_cast(sender()); - if (!reply) { - return; - } - - reply->deleteLater(); - - if (reply!=job) { - return; - } - - if (reply->ok()) { - if (overWrite && QFile::exists(currentDestFile)) { - QFile::remove(currentDestFile); - } - - QFile f(currentDestFile); - if (f.open(QIODevice::WriteOnly)) { - f.write(reply->readAll()); - - currentSong.file=currentDestFile.mid(MPDConnection::self()->getDetails().dir.length()); - QString origPath; - if (MPDConnection::self()->isMopidy()) { - origPath=currentSong.file; - currentSong.file=Song::encodePath(currentSong.file); - } - Utils::setFilePerms(currentDestFile); -// MusicLibraryModel::self()->addSongToList(currentSong); -// DirViewModel::self()->addFileToList(origPath.isEmpty() ? currentSong.file : origPath, -// origPath.isEmpty() ? QString() : currentSong.file); - emit actionStatus(Ok); - } else { - emit actionStatus(WriteFailed); - } - } else { - emit actionStatus(DownloadFailed); - } -} - -void OnlineDevice::downloadProgress(qint64 bytesReceived, qint64 bytesTotal) -{ - if (jobAbortRequested || bytesTotal<=1) { - return; - } - int prog=(bytesReceived*100)/bytesTotal; - if (prog!=lastProg) { - lastProg=prog; - emit progress(prog); - } -} - -#include "moc_onlinedevice.cpp" diff -Nru cantata-2.3.0/online/onlinedevice.h cantata-2.3.1/online/onlinedevice.h --- cantata-2.3.0/online/onlinedevice.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/online/onlinedevice.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,64 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef ONLINE_DEVICE_H -#define ONLINE_DEVICE_H - -#include "devices/device.h" -#include "mpd-interface/song.h" - -class NetworkJob; -class OnlineDevice : public Device -{ - Q_OBJECT - -public: - OnlineDevice() : Device(nullptr, QString(), QString()), lastProg(-1), overWrite(false), job(nullptr) { } - ~OnlineDevice() override { } - - bool isConnected() const override { return true; } - void rescan(bool) override { } - bool isRefreshing() const override { return false; } - void stop() override { } - QString path() const override { return QString(); } - void addSong(const Song&, bool, bool) override { } - void copySongTo(const Song &s, const QString &musicPath, bool overwrite, bool copyCover) override; - void removeSong(const Song&) override { } - void cleanDirs(const QSet&) override { } - double usedCapacity() override { return 0.0; } - QString capacityString() override { return QString(); } - qint64 freeSpace() override { return 0; } - DevType devType() const override { return RemoteFs; } - void saveOptions() override { } - -private Q_SLOTS: - void downloadFinished(); - void downloadProgress(qint64 bytesReceived, qint64 bytesTotal); - -private: - int lastProg; - bool overWrite; - NetworkJob *job; -}; - -#endif diff -Nru cantata-2.3.0/online/onlineservice.cpp cantata-2.3.1/online/onlineservice.cpp --- cantata-2.3.0/online/onlineservice.cpp 2018-01-01 10:09:03.000000000 +0000 +++ cantata-2.3.1/online/onlineservice.cpp 2018-05-08 21:36:34.000000000 +0000 @@ -24,6 +24,8 @@ #include "onlineservice.h" #include "mpd-interface/song.h" #include +#include +#include static const QString constUrlGuard=QLatin1String("#{SONG_DETAILS}"); static const QString constDeliminator=QLatin1String("<@>"); @@ -33,19 +35,34 @@ return str.replace(constDeliminator, " ").replace("\n", ""); } +static inline void add(QJsonObject &json, const QString &key, const QString &val) +{ + if (!val.isEmpty()) { + json.insert(key, val); + } +} + +static inline void add(QJsonObject &json, const QString &key, int val) +{ + if (0!=val) { + json.insert(key, val); + } +} + Song & OnlineService::encode(Song &song) { - song.file=QUrl(song.file).toEncoded()+constUrlGuard+ - fixString(song.artist)+constDeliminator+ - fixString(song.albumartist)+constDeliminator+ - fixString(song.album)+constDeliminator+ - fixString(song.title)+constDeliminator+ - fixString(song.genres[0])+constDeliminator+ - QString::number(song.time)+constDeliminator+ - QString::number(song.year)+constDeliminator+ - QString::number(song.track)+constDeliminator+ - QString::number(song.disc)+constDeliminator+ - song.onlineService(); + QJsonObject json; + add(json, "artist", song.artist); + add(json, "albumartist", song.albumartist); + add(json, "album", song.album); + add(json, "title", song.title); + add(json, "genre", song.genres[0]); + add(json, "time", song.time); + add(json, "year", song.year); + add(json, "track", song.track); + add(json, "disc", song.disc); + add(json, "service", song.onlineService()); + song.file=QUrl(song.file).toEncoded()+"#"+QJsonDocument(json).toJson(QJsonDocument::Compact); return song; } @@ -57,7 +74,7 @@ int pos=song.file.indexOf(constUrlGuard); - if (pos>0) { + if (pos>0) { // Old (pre 2.3.1) style QStringList parts=song.file.mid(pos+constUrlGuard.length()).split(constDeliminator); if (parts.length()>=10) { song.artist=parts.at(0); @@ -74,6 +91,27 @@ song.file=song.file.left(pos); return true; } + } else { + pos = song.file.indexOf("#{"); + if (pos>0) { + QJsonDocument doc = QJsonDocument::fromJson(song.file.mid(pos+1).toUtf8()); + if (!doc.isNull()) { + QJsonObject obj = doc.object(); + song.artist=obj["artist"].toString(); + song.albumartist=obj["albumartist"].toString(); + song.album=obj["album"].toString(); + song.title=obj["title"].toString(); + song.genres[0]=obj["genre"].toString(); + if (obj.contains("time")) song.track=obj["time"].toInt(); + if (obj.contains("year")) song.track=obj["year"].toInt(); + if (obj.contains("track")) song.track=obj["track"].toInt(); + if (obj.contains("disc")) song.track=obj["disc"].toInt(); + song.setIsFromOnlineService(obj["service"].toString()); + song.type=Song::OnlineSvrTrack; + song.file=song.file.left(pos); + return true; + } + } } return false; } diff -Nru cantata-2.3.0/online/onlineservice.h cantata-2.3.1/online/onlineservice.h --- cantata-2.3.0/online/onlineservice.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/online/onlineservice.h 2018-05-24 17:53:49.000000000 +0000 @@ -43,13 +43,13 @@ virtual QString name() const =0; virtual QString title() const =0; virtual QString descr() const =0; - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } protected: static void useCovers(const QString &name, bool onlyIfCache=false); protected: - Icon icn; + QIcon icn; }; #endif diff -Nru cantata-2.3.0/online/podcast_directories.xml cantata-2.3.1/online/podcast_directories.xml --- cantata-2.3.0/online/podcast_directories.xml 2016-10-16 13:47:03.000000000 +0000 +++ cantata-2.3.1/online/podcast_directories.xml 2018-05-16 18:11:31.000000000 +0000 @@ -1,9 +1,9 @@ - - - - + + + + diff -Nru cantata-2.3.0/online/podcastsearchdialog.cpp cantata-2.3.1/online/podcastsearchdialog.cpp --- cantata-2.3.0/online/podcastsearchdialog.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/podcastsearchdialog.cpp 2018-05-23 18:50:20.000000000 +0000 @@ -32,6 +32,7 @@ #include "podcastservice.h" #include "support/utils.h" #include "support/action.h" +#include "support/monoicon.h" #include "widgets/textbrowser.h" #include "support/messagewidget.h" #include "gui/covers.h" @@ -87,7 +88,7 @@ ITunesSearchPage(QWidget *p) : PodcastSearchPage(p, QLatin1String("iTunes"), - QLatin1String("itunes"), + FontAwesome::apple, QUrl(QLatin1String("http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStoreServices.woa/wa/wsSearch")), QLatin1String("term"), QStringList() << QLatin1String("country") << QLatin1String("US") << QLatin1String("media") << QLatin1String("podcast")) @@ -118,7 +119,7 @@ GPodderSearchPage(QWidget *p) : PodcastSearchPage(p, QLatin1String("GPodder"), - QLatin1String("gpodder"), + FontAwesome::podcast, QUrl(QLatin1String("http://gpodder.net/search.json")), QLatin1String("q")) { @@ -216,7 +217,7 @@ podItem->setData(0, ImageUrlRole, image); podItem->setData(0, DescriptionRole, description); podItem->setData(0, WebPageUrlRole, webPage); - podItem->setIcon(0, Icons::self()->audioFileIcon); + podItem->setIcon(0, Icons::self()->audioListIcon); } static QString encode(const QImage &img) @@ -317,7 +318,7 @@ QDesktopServices::openUrl(url); } -PodcastSearchPage::PodcastSearchPage(QWidget *p, const QString &n, const QString &i, const QUrl &qu, const QString &qk, const QStringList &other) +PodcastSearchPage::PodcastSearchPage(QWidget *p, const QString &n, int i, const QUrl &qu, const QString &qk, const QStringList &other) : PodcastPage(p, n) , queryUrl(qu) , queryKey(qk) @@ -342,7 +343,7 @@ mainLayout->addLayout(viewLayout); connect(search, SIGNAL(returnPressed()), SLOT(doSearch())); connect(searchButton, SIGNAL(clicked()), SLOT(doSearch())); - icn.addFile(":"+i); + icn=MonoIcon::icon((FontAwesome::icon)i, Utils::monoIconColor()); } void PodcastSearchPage::showEvent(QShowEvent *e) @@ -385,7 +386,7 @@ parse(data); } -OpmlBrowsePage::OpmlBrowsePage(QWidget *p, const QString &n, const QString &i, const QUrl &u) +OpmlBrowsePage::OpmlBrowsePage(QWidget *p, const QString &n, const QIcon &i, const QUrl &u) : PodcastPage(p, n) , loaded(false) , url(u) @@ -398,7 +399,7 @@ tree->addAction(act); connect(act, SIGNAL(triggered()), this, SLOT(reload())); tree->setContextMenuPolicy(Qt::ActionsContextMenu); - icn.addFile(i.isEmpty() || !QFile::exists(i) ? ":podcasts" : i); + icn=i; } void OpmlBrowsePage::showEvent(QShowEvent *e) @@ -480,7 +481,7 @@ : new QTreeWidgetItem(tree, QStringList() << cat.name); catItem->setData(0, IsPodcastRole, false); - catItem->setIcon(0, Icons::self()->folderIcon); + catItem->setIcon(0, Icons::self()->folderListIcon); for (const OpmlParser::Podcast &pod: cat.podcasts) { addPodcast(pod, catItem); } @@ -517,7 +518,7 @@ mainLayout->addLayout(viewLayout); connect(urlEntry, SIGNAL(returnPressed()), SLOT(loadUrl())); connect(loadButton, SIGNAL(clicked()), SLOT(loadUrl())); - icn.addFile(":podcasts"); + icn=Icons::self()->rssListIcon; } void PodcastUrlPage::showEvent(QShowEvent *e) @@ -608,7 +609,7 @@ QSet loaded; pages << loadDirectories(Utils::dataDir(), false, loaded); - pages << loadDirectories(CANTATA_SYS_CONFIG_DIR, true, loaded); + pages << loadDirectories(QString(), true, loaded); for (PodcastPage *p: pages) { connect(p, SIGNAL(rssSelected(QUrl)), SLOT(rssSelected(QUrl))); @@ -668,11 +669,11 @@ { QList pages; - if (dir.isEmpty()) { + if (dir.isEmpty() && !isSystem) { return pages; } - QFile file(dir+QLatin1String("/podcast_directories.xml")); + QFile file(isSystem ? QLatin1String(":podcast_directories.xml") : (dir+QLatin1String("/podcast_directories.xml"))); if (file.open(QIODevice::ReadOnly)) { QXmlStreamReader reader(&file); @@ -681,10 +682,21 @@ if (reader.isStartElement() && QLatin1String("directory")==reader.name()) { QString url=reader.attributes().value(QLatin1String("url")).toString(); if (!loaded.contains(url)) { - QString icon=reader.attributes().value(QLatin1String("icon")).toString(); - if (!icon.isEmpty()) { - icon=dir+(isSystem ? "../icons/" : "")+icon; + QString iconName=reader.attributes().value(QLatin1String("icon")).toString(); + QIcon icon; + + if (iconName.isEmpty()) { + icon=MonoIcon::icon(FontAwesome::rsssquare, Utils::monoIconColor()); + } else if (iconName.startsWith(":")) { + icon= MonoIcon::icon(iconName, Utils::monoIconColor()); + } else { + icon.addFile(iconName); + } + + if (icon.isNull()) { + icon=MonoIcon::icon(FontAwesome::rsssquare, Utils::monoIconColor()); } + OpmlBrowsePage *page=new OpmlBrowsePage(pageWidget, reader.attributes().value(QLatin1String("name")).toString(), icon, diff -Nru cantata-2.3.0/online/podcastsearchdialog.h cantata-2.3.1/online/podcastsearchdialog.h --- cantata-2.3.0/online/podcastsearchdialog.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/online/podcastsearchdialog.h 2018-05-24 17:55:11.000000000 +0000 @@ -54,7 +54,7 @@ PodcastPage(QWidget *p, const QString &n); ~PodcastPage() override { cancel(); cancelImage(); } - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } const QString & name() const { return pageName; } QUrl currentRss() const; @@ -87,14 +87,14 @@ TextBrowser *text; NetworkJob *job; NetworkJob *imageJob; - Icon icn; + QIcon icn; }; class PodcastSearchPage : public PodcastPage { Q_OBJECT public: - PodcastSearchPage(QWidget *p, const QString &n, const QString &i, const QUrl &qu, const QString &qk, const QStringList &other=QStringList()); + PodcastSearchPage(QWidget *p, const QString &n, int i, const QUrl &qu, const QString &qk, const QStringList &other=QStringList()); ~PodcastSearchPage() override { } void showEvent(QShowEvent *e) override; @@ -119,7 +119,7 @@ { Q_OBJECT public: - OpmlBrowsePage(QWidget *p, const QString &n, const QString &i, const QUrl &u); + OpmlBrowsePage(QWidget *p, const QString &n, const QIcon &i, const QUrl &u); ~OpmlBrowsePage() override { } void showEvent(QShowEvent *e) override; diff -Nru cantata-2.3.0/online/podcastservice.cpp cantata-2.3.1/online/podcastservice.cpp --- cantata-2.3.0/online/podcastservice.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/podcastservice.cpp 2018-05-28 16:15:41.000000000 +0000 @@ -25,6 +25,7 @@ #include "podcastsettingsdialog.h" #include "rssparser.h" #include "support/utils.h" +#include "support/monoicon.h" #include "gui/settings.h" #include "widgets/icons.h" #include "mpd-interface/mpdconnection.h" @@ -390,7 +391,7 @@ , rssUpdateTimer(nullptr) { QMetaObject::invokeMethod(this, "loadAll", Qt::QueuedConnection); - icn.addFile(":"+constName); + icn=MonoIcon::icon(FontAwesome::rsssquare, Utils::monoIconColor()); useCovers(name(), true); clearPartialDownloads(); connect(MPDConnection::self(), SIGNAL(currentSongUpdated(const Song &)), this, SLOT(currentMpdSong(const Song &))); @@ -648,15 +649,14 @@ Song & PodcastService::fixPath(Song &song) const { - song.setPodcastLocalPath(QString()); song.setIsFromOnlineService(constName); song.artist=title(); if (!song.podcastLocalPath().isEmpty() && QFile::exists(song.podcastLocalPath())) { - if (MPDConnection::self()->localFilePlaybackSupported()) { - song.file=QLatin1String("file://")+song.podcastLocalPath(); - } else if (HttpServer::self()->isAlive()) { + if (HttpServer::self()->isAlive()) { song.file=song.podcastLocalPath(); song.file=HttpServer::self()->encodeUrl(song); + } else if (MPDConnection::self()->localFilePlaybackSupported()) { + song.file=QLatin1String("file://")+song.podcastLocalPath(); } return song; } @@ -1024,7 +1024,7 @@ if (downloadingEpisode(episode)) { return; } - dest=Utils::fixPath(dest)+Utils::fixPath(encodeName(podcast->name))+Utils::getFile(episode.toString()); + dest=Utils::fixPath(dest)+Utils::fixPath(encodeName(podcast->name))+Utils::getFile(episode.path()); toDownload.append(DownloadEntry(episode, podcast->url, dest)); updateEpisode(podcast->url, episode, Episode::QueuedForDownload); doNextDownload(); diff -Nru cantata-2.3.0/online/podcastwidget.cpp cantata-2.3.1/online/podcastwidget.cpp --- cantata-2.3.0/online/podcastwidget.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/online/podcastwidget.cpp 2018-05-25 17:19:06.000000000 +0000 @@ -40,14 +40,15 @@ , srv(s) , proxy(this) { + QIcon newIcon = MonoIcon::icon(FontAwesome::asterisk, Utils::monoIconColor()); subscribeAction = new Action(Icons::self()->addNewItemIcon, tr("Add Subscription"), this); unSubscribeAction = new Action(Icons::self()->removeIcon, tr("Remove Subscription"), this); downloadAction = new Action(Icons::self()->downloadIcon, tr("Download Episodes"), this); deleteAction = new Action(MonoIcon::icon(FontAwesome::trash, MonoIcon::constRed, MonoIcon::constRed), tr("Delete Downloaded Episodes"), this); cancelDownloadAction = new Action(Icons::self()->cancelIcon, tr("Cancel Download"), this); - markAsNewAction = new Action(MonoIcon::icon(FontAwesome::asterisk, Utils::monoIconColor()), tr("Mark Episodes As New"), this); + markAsNewAction = new Action(newIcon, tr("Mark Episodes As New"), this); markAsListenedAction = new Action(tr("Mark Episodes As Listened"), this); - unplayedOnlyAction = new Action(Icons::self()->rssListIcon, tr("Show Unplayed Only"), this); + unplayedOnlyAction = new Action(newIcon, tr("Show Unplayed Only"), this); unplayedOnlyAction->setCheckable(true); proxy.setSourceModel(srv); @@ -190,9 +191,6 @@ QMap > urls=getEpisodes(proxy, view->selectedIndexes(true), GetEp_NotDownloaded); if (!urls.isEmpty()) { - if (MessageBox::No==MessageBox::questionYesNo(this, tr("Do you wish to download the selected podcast episodes?"))) { - return; - } QMap >::ConstIterator it(urls.constBegin()); QMap >::ConstIterator end(urls.constEnd()); for (; it!=end; ++it) { @@ -203,8 +201,7 @@ void PodcastWidget::cancelDownload() { - if (srv->isDownloading() && - MessageBox::Yes==MessageBox::questionYesNo(this, tr("Cancel podcast episode downloads (both current and any that are queued)?"))) { + if (srv->isDownloading()) { srv->cancelAll(); } } @@ -230,9 +227,6 @@ QMap > urls=getEpisodes(proxy, view->selectedIndexes(false), GetEp_Listened); if (!urls.isEmpty()) { - if (MessageBox::No==MessageBox::questionYesNo(this, tr("Do you wish to mark the selected podcast episodes as new?"))) { - return; - } QMap >::ConstIterator it(urls.constBegin()); QMap >::ConstIterator end(urls.constEnd()); for (; it!=end; ++it) { @@ -246,9 +240,6 @@ QMap > urls=getEpisodes(proxy, view->selectedIndexes(false), GetEp_NotListened); if (!urls.isEmpty()) { - if (MessageBox::No==MessageBox::questionYesNo(this, tr("Do you wish to mark the selected podcast episodes as listened?"))) { - return; - } QMap >::ConstIterator it(urls.constBegin()); QMap >::ConstIterator end(urls.constEnd()); for (; it!=end; ++it) { @@ -259,6 +250,7 @@ void PodcastWidget::showUnplayedOnly(bool on) { + view->goToTop(); proxy.showUnplayedOnly(on); } @@ -282,9 +274,7 @@ } if (selected.isEmpty() || selected.count()==srv->podcastCount()) { - if (MessageBox::Yes==MessageBox::questionYesNo(this, tr("Refresh all subscriptions?"), tr("Refresh"), GuiItem(tr("Refresh All")), StdGuiItem::cancel())) { - srv->refreshAll(); - } + srv->refreshAll(); return; } switch (MessageBox::questionYesNoCancel(this, tr("Refresh all subscriptions, or only those selected?"), tr("Refresh"), GuiItem(tr("Refresh All")), GuiItem(tr("Refresh Selected")))) { diff -Nru cantata-2.3.0/online/rssparser.cpp cantata-2.3.1/online/rssparser.cpp --- cantata-2.3.0/online/rssparser.cpp 2018-01-01 10:09:03.000000000 +0000 +++ cantata-2.3.1/online/rssparser.cpp 2018-05-26 18:02:46.000000000 +0000 @@ -113,7 +113,7 @@ const QStringRef name = reader.name(); if (reader.isStartElement()) { if (QLatin1String("title")==name) { - ep.name=reader.readElementText(); + ep.name=reader.readElementText().simplified(); } else if (QLatin1String("duration")==name && constITunesNameSpace==reader.namespaceUri()) { QStringList parts = reader.readElementText().split(':'); if (2==parts.count()) { @@ -182,7 +182,7 @@ if (reader.isStartElement()) { const QStringRef name = reader.name(); if (ch.name.isEmpty() && QLatin1String("title")==name) { - ch.name=reader.readElementText(); + ch.name=reader.readElementText().simplified(); } else if (QLatin1String("image")==name && ch.image.isEmpty()) { if (constITunesNameSpace==reader.namespaceUri()) { ch.image=reader.attributes().value(QLatin1String("href")).toString(); diff -Nru cantata-2.3.0/online/soundcloudservice.cpp cantata-2.3.1/online/soundcloudservice.cpp --- cantata-2.3.0/online/soundcloudservice.cpp 2018-03-14 21:58:58.000000000 +0000 +++ cantata-2.3.1/online/soundcloudservice.cpp 2018-06-01 16:31:32.000000000 +0000 @@ -25,6 +25,8 @@ #include "gui/apikeys.h" #include "network/networkaccessmanager.h" #include "mpd-interface/mpdconnection.h" +#include "support/utils.h" +#include "support/monoicon.h" #include #include #include @@ -35,7 +37,7 @@ SoundCloudService::SoundCloudService(QObject *p) : OnlineSearchService(p) { - icn.addFile(":"+constName); + icn=MonoIcon::icon(FontAwesome::soundcloud, Utils::monoIconColor()); } QString SoundCloudService::name() const @@ -74,6 +76,7 @@ QUrlQuery query; ApiKeys::self()->addKey(query, ApiKeys::SoundCloud); query.addQueryItem("q", currentValue); + query.addQueryItem("limit", QString::number(200)); searchUrl.setQuery(query); QNetworkRequest req(searchUrl); diff -Nru cantata-2.3.0/playlists/cantata-dynamic cantata-2.3.1/playlists/cantata-dynamic --- cantata-2.3.0/playlists/cantata-dynamic 2017-12-23 17:04:50.000000000 +0000 +++ cantata-2.3.1/playlists/cantata-dynamic 2018-06-01 18:15:17.000000000 +0000 @@ -254,10 +254,6 @@ $ratingFrom=0; $ratingTo=0; -# If we have no include rules, then song list is taken from tracks with ratings -# Therefore, there is no need to subsequently filter - and ratingFilter would be -# set to 0 -$ratingFilter=1; $lastRatingFrom=0; $lastRatingTo=0; @@ -303,6 +299,7 @@ my @genreList=@{ $_[3] }; my $ruleMatch=$_[4]; my $isInclude=$_[5]; + my $maxAge=$_[6]; my @type=(); if ($isInclude == 1) { @@ -333,9 +330,12 @@ if ($genre ne "") { $type[$ruleNum]=$type[$ruleNum]." Genre \"${genre}\""; } + if ($isInclude && $maxAge>0) { + $type[$ruleNum]=$type[$ruleNum]." modified-since ${maxAge}"; + } $ruleNum++; } - } elsif ($artist ne "" || $genre ne "" || $rule ne "") { + } elsif ($artist ne "" || $genre ne "" || $rule ne "" || ($isInclude && $maxAge>0)) { $type[$ruleNum]="${ruleMatch} $rule"; if ($artist ne "") { $type[$ruleNum]=$type[$ruleNum]." Artist \"${artist}\""; @@ -343,6 +343,9 @@ if ($genre ne "") { $type[$ruleNum]=$type[$ruleNum]." Genre \"${genre}\""; } + if ($maxAge>0) { + $type[$ruleNum]=$type[$ruleNum]." modified-since ${maxAge}"; + } $ruleNum++; } } @@ -412,6 +415,7 @@ my @similarArtists=(); my $isInclude=1; my $currentRule=""; + my $maxAge=0; @includeRules=(); @excludeRules=(); $ratingFrom=0; @@ -434,7 +438,7 @@ } if ($key=~ m/^(Rule)/) { # New rule... if (length($currentRule)>1 || scalar(@similarArtists)>0 || scalar(@dates)>0 || scalar(@genres)>0) { - &saveRule($currentRule, \@dates, \@similarArtists, \@genres, $ruleMatch, $isInclude); + &saveRule($currentRule, \@dates, \@similarArtists, \@genres, $ruleMatch, $isInclude, $maxAge); } $currentRule=""; @dates=(); @@ -471,6 +475,10 @@ $playQueueDesiredLength += 1; } } + } elsif ($key=~ m/^(MaxAge)/) { + if ($val > 0) { + $maxAge = time() - ($val * 24 * 60 * 60); + } } else { if ($key eq "Date") { my @dateVals = split("-", $val); @@ -542,7 +550,9 @@ } if (length($currentRule)>1 || scalar(@similarArtists)>0 || scalar(@dates)>0 || scalar(@genres)>0) { - &saveRule($currentRule, \@dates, \@similarArtists, \@genres, $ruleMatch, $isInclude); + &saveRule($currentRule, \@dates, \@similarArtists, \@genres, $ruleMatch, $isInclude, $maxAge); + } elsif ($maxAge>0 && 0 == scalar(@includeRules)) { + &saveRule("", "", "", "", "find", 1, $maxAge); # No include rules but have max-age, so create a rule } if (1==$testMode) { @@ -643,17 +653,17 @@ # Is a file with rating from .. rating to? sub checkSongRatingInRange() { - if ($ratingFilter = 0) { - # Rating filter disabled - i,e. had no include rule, so song list is - # taken from those with a rating... - return 1; - } if ($ratingFrom<=0 && $ratingTo<=0) { # No filter, so must be in range! return 1; } if ($numMpdSongs<1) { # No songs! return 0; } + if (0 == scalar(@includeRules)) { + # There were no include rules, so all files matching rating range were chose. + # Therefore, no need to check ratings now. + return 1; + } my $file=shift; my @entries = &getEntries("sticker get song \"${file}\" rating", 'sticker'); foreach my $entry (@entries) { diff -Nru cantata-2.3.0/playlists/dynamicplaylists.cpp cantata-2.3.1/playlists/dynamicplaylists.cpp --- cantata-2.3.0/playlists/dynamicplaylists.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/playlists/dynamicplaylists.cpp 2018-05-23 20:10:14.000000000 +0000 @@ -31,6 +31,7 @@ #include "gui/settings.h" #include "support/actioncollection.h" #include "support/globalstatic.h" +#include "support/monoicon.h" #include #include #include @@ -125,7 +126,7 @@ const QString constFilename=QLatin1String("FILENAME:"); DynamicPlaylists::DynamicPlaylists() - : RulesPlaylists("dice", "dynamic") + : RulesPlaylists(FontAwesome::random, "dynamic") , localTimer(nullptr) , usingRemote(false) , remoteTimer(nullptr) @@ -172,7 +173,7 @@ switch (role) { case Qt::DecorationRole: - return IS_ACTIVE(entryList.at(index.row()).name) ? Icons::self()->replacePlayQueueIcon : Icons::self()->dynamicListIcon; + return IS_ACTIVE(entryList.at(index.row()).name) ? Icons::self()->replacePlayQueueIcon : icn; case Cantata::Role_Actions: { QVariant v; v.setValue >(QList() << (IS_ACTIVE(entryList.at(index.row()).name) ? stopAction : startAction)); diff -Nru cantata-2.3.0/playlists/dynamicplaylists.h cantata-2.3.1/playlists/dynamicplaylists.h --- cantata-2.3.0/playlists/dynamicplaylists.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/playlists/dynamicplaylists.h 2018-05-23 19:50:06.000000000 +0000 @@ -66,7 +66,6 @@ QString descr() const override; bool isDynamic() const override { return true; } QVariant data(const QModelIndex &index, int role) const override; - const Icon & icon() const { return icn; } bool isRemote() const override { return usingRemote; } bool saveRemote(const QString &string, const Entry &e) override; void del(const QString &name) override; diff -Nru cantata-2.3.0/playlists/dynamicplaylistspage.cpp cantata-2.3.1/playlists/dynamicplaylistspage.cpp --- cantata-2.3.0/playlists/dynamicplaylistspage.cpp 2018-03-09 17:38:09.000000000 +0000 +++ cantata-2.3.1/playlists/dynamicplaylistspage.cpp 2018-05-24 17:57:52.000000000 +0000 @@ -27,6 +27,7 @@ #include "widgets/icons.h" #include "support/action.h" #include "support/configuration.h" +#include "support/monoicon.h" #include "mpd-interface/mpdconnection.h" #include "support/messagebox.h" #include "gui/stdactions.h" @@ -127,7 +128,10 @@ } enableWidgets(s); #endif - view->setBackgroundImage(s ? Icon(QStringList() << "network-server-database.svg" << "applications-internet") : Icon()); + if (s && server.isNull()) { + server = MonoIcon::icon(FontAwesome::server, Utils::monoIconColor()); + } + view->setBackgroundImage(s ? server : QIcon()); } void DynamicPlaylistsPage::add() diff -Nru cantata-2.3.0/playlists/dynamicplaylistspage.h cantata-2.3.1/playlists/dynamicplaylistspage.h --- cantata-2.3.0/playlists/dynamicplaylistspage.h 2018-03-09 17:34:28.000000000 +0000 +++ cantata-2.3.1/playlists/dynamicplaylistspage.h 2018-05-24 17:56:41.000000000 +0000 @@ -68,6 +68,7 @@ QString infoStr; QLabel *remoteRunningLabel; #endif + QIcon server; }; #endif diff -Nru cantata-2.3.0/playlists/playlistrulesdialog.cpp cantata-2.3.1/playlists/playlistrulesdialog.cpp --- cantata-2.3.0/playlists/playlistrulesdialog.cpp 2018-03-20 17:18:29.000000000 +0000 +++ cantata-2.3.1/playlists/playlistrulesdialog.cpp 2018-06-01 18:07:47.000000000 +0000 @@ -25,11 +25,13 @@ #include "playlistruledialog.h" #include "support/messagebox.h" #include "widgets/basicitemdelegate.h" +#include "widgets/icons.h" #include #include #include #include #include +#include #define REMOVE(w) \ w->setVisible(false); \ @@ -156,6 +158,11 @@ connect(rules, SIGNAL(saved(bool)), SLOT(saved(bool))); } + if (style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons)) { + addBtn->setIcon(Icons::self()->addIcon); + editBtn->setIcon(Icons::self()->editIcon); + removeBtn->setIcon(Icons::self()->removeIcon); + } rulesList->setInfoText(tr("Each playlist requires a unique name, enter that above.\n\n" "Use the 'Add' button to add a 'rule' to control which artists, genres, etc you want included in the playlist. " "Any rules added will be listed here. " @@ -174,12 +181,12 @@ maxDuration->setSpecialValueText(tr("No Limit")); numTracks->setRange(rules->minTracks(), rules->maxTracks()); + maxAge->setRange(0, 10*365); if (rules->isDynamic()) { REMOVE(orderLabel) REMOVE(order) REMOVE(orderAscending) - REMOVE(maxAge) orderLayout->deleteLater(); numTracks->setValue(qMax(qMin(10, rules->maxTracks()), rules->minTracks())); } else { @@ -237,9 +244,7 @@ setOrder(); orderAscending->setCurrentIndex(e.orderAscending ? 0 : 1); } - if (maxAge) { - maxAge->setValue(e.maxAge); - } + maxAge->setValue(e.maxAge); show(); } @@ -423,9 +428,7 @@ entry.order=(RulesPlaylists::Order)order->currentData().toInt(); entry.orderAscending=0==orderAscending->currentIndex(); } - if (maxAge) { - entry.maxAge=maxAge->value(); - } + entry.maxAge=maxAge->value(); from=minDuration->value(); to=maxDuration->value(); if (to>0) { diff -Nru cantata-2.3.0/playlists/rulesplaylists.cpp cantata-2.3.1/playlists/rulesplaylists.cpp --- cantata-2.3.0/playlists/rulesplaylists.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/playlists/rulesplaylists.cpp 2018-06-01 18:19:40.000000000 +0000 @@ -24,6 +24,7 @@ #include "dynamicplaylists.h" #include "config.h" #include "support/utils.h" +#include "support/monoicon.h" #include "widgets/icons.h" #include "models/roles.h" #include "gui/settings.h" @@ -103,10 +104,10 @@ } } -RulesPlaylists::RulesPlaylists(const QString &iconFile, const QString &dir) +RulesPlaylists::RulesPlaylists(int icon, const QString &dir) : rulesDir(dir) { - icn.addFile(":"+iconFile+".svg"); + icn=MonoIcon::icon((FontAwesome::icon)icon, Utils::monoIconColor()); loadLocal(); } @@ -216,7 +217,7 @@ str << constDurationKey << constKeyValSep << e.minDuration << constRangeSep << e.maxDuration << '\n'; } if (0!=e.maxAge) { - str << constMaxAgeKey << constKeyValSep << e.maxAge; + str << constMaxAgeKey << constKeyValSep << e.maxAge << '\n'; } if (Order_Random!=e.order) { str << constOrderKey << constKeyValSep << orderStr(e.order) << '\n'; diff -Nru cantata-2.3.0/playlists/rulesplaylists.h cantata-2.3.1/playlists/rulesplaylists.h --- cantata-2.3.0/playlists/rulesplaylists.h 2018-02-18 19:16:50.000000000 +0000 +++ cantata-2.3.1/playlists/rulesplaylists.h 2018-05-23 19:49:35.000000000 +0000 @@ -30,7 +30,6 @@ #include #include #include "models/actionmodel.h" -#include "support/icon.h" class RulesPlaylists : public ActionModel { @@ -95,14 +94,14 @@ static const QChar constRangeSep; static const QChar constKeyValSep; - RulesPlaylists(const QString &iconFile, const QString &dir); + RulesPlaylists(int icon, const QString &dir); ~RulesPlaylists() override { } virtual QString name() const =0; virtual QString title() const =0; virtual QString descr() const =0; virtual bool isDynamic() const { return false; } - const Icon & icon() const { return icn; } + const QIcon & icon() const { return icn; } virtual bool isRemote() const { return false; } virtual int minTracks() const { return 10; } virtual int maxTracks() const { return 500; } @@ -131,7 +130,7 @@ void updateEntry(const Entry &e); protected: - Icon icn; + QIcon icn; QString rulesDir; QList entryList; QString currentEntry; diff -Nru cantata-2.3.0/playlists/smartplaylists.cpp cantata-2.3.1/playlists/smartplaylists.cpp --- cantata-2.3.0/playlists/smartplaylists.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/playlists/smartplaylists.cpp 2018-05-23 19:50:26.000000000 +0000 @@ -29,9 +29,8 @@ GLOBAL_STATIC(SmartPlaylists, instance) SmartPlaylists::SmartPlaylists() - : RulesPlaylists("gradcap", "smart") + : RulesPlaylists(FontAwesome::graduationcap, "smart") { - playlistIcon=MonoIcon::icon(FontAwesome::graduationcap, Utils::monoIconColor()); } QString SmartPlaylists::name() const @@ -61,7 +60,7 @@ switch (role) { case Qt::DecorationRole: - return playlistIcon; + return icn; case Cantata::Role_Actions: return ActionModel::data(index, role); default: diff -Nru cantata-2.3.0/playlists/smartplaylists.h cantata-2.3.1/playlists/smartplaylists.h --- cantata-2.3.0/playlists/smartplaylists.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/playlists/smartplaylists.h 2018-05-23 19:45:59.000000000 +0000 @@ -24,7 +24,6 @@ #ifndef SMART_PLAYLISTS_H #define SMART_PLAYLISTS_H -#include #include "rulesplaylists.h" class SmartPlaylists : public RulesPlaylists @@ -43,9 +42,6 @@ QVariant data(const QModelIndex &index, int role) const override; int maxTracks() const override { return 10000; } int defaultNumTracks() const override { return 100; } - -private: - QIcon playlistIcon; }; #endif diff -Nru cantata-2.3.0/README cantata-2.3.1/README --- cantata-2.3.0/README 2018-03-19 19:35:37.000000000 +0000 +++ cantata-2.3.1/README 2018-06-05 18:04:37.000000000 +0000 @@ -803,6 +803,16 @@ 6. Build 'install' project via QtCreator +If Qt Creator is not installed, or calling CMake from the commandline, you may +need to set CMAKE_PREFIX_PATH e.g. + + export CMAKE_PREFIX_PATH=/usr/local/Cellar/qt/5.9.1/lib/cmake/:${CMAKE_PREFIX_PATH} + +Ensure 'lrelease' (required to build Cantata translations) is in PATH, e.g. + + export PATH=/usr/local/Cellar/qt/5.9.1/bin/:${PATH} + + Create Installer ---------------- diff -Nru cantata-2.3.0/scrobbling/scrobbler.cpp cantata-2.3.1/scrobbling/scrobbler.cpp --- cantata-2.3.0/scrobbling/scrobbler.cpp 2018-03-14 19:03:37.000000000 +0000 +++ cantata-2.3.1/scrobbling/scrobbler.cpp 2018-05-16 21:42:29.000000000 +0000 @@ -305,6 +305,10 @@ void Scrobbler::love() { + if (lovedTrack()) { + return; + } + lovePending=false; if (!loveIsEnabled) { return; @@ -863,15 +867,19 @@ void Scrobbler::loadScrobblers() { if (scrobblers.isEmpty()) { - QStringList dirs=QStringList() << Utils::dataDir() << CANTATA_SYS_CONFIG_DIR; - for (const QString &dir: dirs) { - if (dir.isEmpty()) { - continue; - } + QStringList files; + QString userDir=Utils::dataDir(); + + if (!userDir.isEmpty()) { + files.append(Utils::fixPath(userDir)+QLatin1String("scrobblers.xml")); + } + + files.append(":scrobblers.xml"); - QFile f(dir+"scrobblers.xml"); - if (f.open(QIODevice::ReadOnly)) { - QXmlStreamReader doc(&f); + for (const auto &f: files) { + QFile file(f); + if (file.open(QIODevice::ReadOnly)) { + QXmlStreamReader doc(&file); while (!doc.atEnd()) { doc.readNext(); if (doc.isStartElement() && QLatin1String("scrobbler")==doc.name()) { diff -Nru cantata-2.3.0/scrobbling/scrobblinglove.cpp cantata-2.3.1/scrobbling/scrobblinglove.cpp --- cantata-2.3.0/scrobbling/scrobblinglove.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/scrobbling/scrobblinglove.cpp 2018-05-09 21:27:15.000000000 +0000 @@ -23,12 +23,15 @@ #include "scrobblinglove.h" #include "scrobbler.h" -#include "widgets/icons.h" +#include "support/monoicon.h" +#include "support/utils.h" ScrobblingLove::ScrobblingLove(QWidget *p) : ToolButton(p) { - setIcon(Icons::self()->addToFavouritesIcon); + love = MonoIcon::icon(FontAwesome::hearto, Utils::monoIconColor()); + loved = MonoIcon::icon(FontAwesome::heart, Utils::monoIconColor()); + setIcon(love); connect(Scrobbler::self(), SIGNAL(loveEnabled(bool)), SLOT(setVisible(bool))); connect(Scrobbler::self(), SIGNAL(songChanged(bool)), SLOT(songChanged(bool))); connect(Scrobbler::self(), SIGNAL(scrobblerChanged()), SLOT(scrobblerChanged())); @@ -39,7 +42,6 @@ void ScrobblingLove::sendLove() { - setEnabled(false); Scrobbler::self()->love(); scrobblerChanged(); } @@ -52,7 +54,8 @@ void ScrobblingLove::scrobblerChanged() { - setToolTip(Scrobbler::self()->lovedTrack() + setIcon(isEnabled() && Scrobbler::self()->lovedTrack() ? loved : love); + setToolTip(isEnabled() && Scrobbler::self()->lovedTrack() ? tr("%1: Loved Current Track").arg(Scrobbler::self()->activeScrobbler()) : tr("%1: Love Current Track").arg(Scrobbler::self()->activeScrobbler())); } diff -Nru cantata-2.3.0/scrobbling/scrobblinglove.h cantata-2.3.1/scrobbling/scrobblinglove.h --- cantata-2.3.0/scrobbling/scrobblinglove.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/scrobbling/scrobblinglove.h 2018-04-30 16:44:48.000000000 +0000 @@ -25,6 +25,7 @@ #define SCROBBLING_LOVE_H #include "widgets/toolbutton.h" +#include class ScrobblingLove : public ToolButton { @@ -37,6 +38,10 @@ void sendLove(); void songChanged(bool valid); void scrobblerChanged(); + +private: + QIcon love; + QIcon loved; }; #endif diff -Nru cantata-2.3.0/scrobbling/scrobblingstatus.cpp cantata-2.3.1/scrobbling/scrobblingstatus.cpp --- cantata-2.3.0/scrobbling/scrobblingstatus.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/scrobbling/scrobblingstatus.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "scrobblingstatus.h" -#include "scrobbler.h" -#include "widgets/icons.h" -#include "widgets/spacerwidget.h" -#include - -ScrobblingStatus::ScrobblingStatus(QWidget *p) - : QWidget(p) -{ - btn = new ToolButton(this); - btn->setCheckable(true); - btn->setIcon(Icons::self()->lastFmIcon); - connect(Scrobbler::self(), SIGNAL(authenticated(bool)), SLOT(setVisible(bool))); - connect(Scrobbler::self(), SIGNAL(enabled(bool)), btn, SLOT(setChecked(bool))); - connect(btn, SIGNAL(toggled(bool)), Scrobbler::self(), SLOT(setEnabled(bool))); - setVisible(Scrobbler::self()->isAuthenticated()); - btn->setChecked(Scrobbler::self()->isEnabled()); - scrobblerChanged(); - - QHBoxLayout *l=new QHBoxLayout(this); - l->setMargin(0); - l->setSpacing(0); - l->addWidget(btn); - l->addWidget(new SpacerWidget(this)); -} - -void ScrobblingStatus::scrobblerChanged() -{ - btn->setToolTip(tr("%1: Scrobble Tracks").arg(Scrobbler::self()->activeScrobbler())); -} - -#include "moc_scrobblingstatus.cpp" diff -Nru cantata-2.3.0/scrobbling/scrobblingstatus.h cantata-2.3.1/scrobbling/scrobblingstatus.h --- cantata-2.3.0/scrobbling/scrobblingstatus.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/scrobbling/scrobblingstatus.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef SCROBBLING_STATUS_H -#define SCROBBLING_STATUS_H - -#include "widgets/toolbutton.h" - -class ScrobblingStatus : public QWidget -{ - Q_OBJECT -public: - ScrobblingStatus(QWidget *p); - ~ScrobblingStatus() override { } - - bool isChecked() const { return btn->isChecked(); } -public Q_SLOTS: - void setChecked(bool c) { btn->setChecked(c); } -private Q_SLOTS: - void scrobblerChanged(); -private: - ToolButton *btn; -}; - -#endif diff -Nru cantata-2.3.0/streams/icons/dirble.svg cantata-2.3.1/streams/icons/dirble.svg --- cantata-2.3.0/streams/icons/dirble.svg 2015-04-25 14:47:56.000000000 +0000 +++ cantata-2.3.1/streams/icons/dirble.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -Nru cantata-2.3.0/streams/icons/favourites.svg cantata-2.3.1/streams/icons/favourites.svg --- cantata-2.3.0/streams/icons/favourites.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/streams/icons/favourites.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff -Nru cantata-2.3.0/streams/icons/icecast.svg cantata-2.3.1/streams/icons/icecast.svg --- cantata-2.3.0/streams/icons/icecast.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/streams/icons/icecast.svg 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - -Nuvola apps package - - - - - - diff -Nru cantata-2.3.0/streams/icons/shoutcast.svg cantata-2.3.1/streams/icons/shoutcast.svg --- cantata-2.3.0/streams/icons/shoutcast.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/streams/icons/shoutcast.svg 2018-05-23 19:59:08.000000000 +0000 @@ -1,35 +1,35 @@ - + - + - + - + - + - + - + - + - + - + - + diff -Nru cantata-2.3.0/streams/icons/station.svg cantata-2.3.1/streams/icons/station.svg --- cantata-2.3.0/streams/icons/station.svg 1970-01-01 00:00:00.000000000 +0000 +++ cantata-2.3.1/streams/icons/station.svg 2018-05-24 17:06:01.000000000 +0000 @@ -0,0 +1,3 @@ + + + diff -Nru cantata-2.3.0/streams/icons/tunein.svg cantata-2.3.1/streams/icons/tunein.svg --- cantata-2.3.0/streams/icons/tunein.svg 2015-04-25 14:47:55.000000000 +0000 +++ cantata-2.3.1/streams/icons/tunein.svg 2018-05-23 19:58:30.000000000 +0000 @@ -1 +1 @@ - + diff -Nru cantata-2.3.0/streams/streamproviderlistdialog.cpp cantata-2.3.1/streams/streamproviderlistdialog.cpp --- cantata-2.3.0/streams/streamproviderlistdialog.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/streams/streamproviderlistdialog.cpp 2018-05-24 17:02:06.000000000 +0000 @@ -234,8 +234,8 @@ if (j->ok()) { readProviders(j->actualJob()); } else { - MessageBox::error(this, tr("Failed to download list of stream providers!")); slotButtonClicked(Close); + MessageBox::error(parentWidget(), tr("Failed to download list of stream providers!")); } if (spinner) { spinner->stop(); @@ -247,7 +247,7 @@ QTreeWidgetItem *item=*(processItems.begin()); if (j->ok()) { statusText->setText(tr("Installing/updating %1").arg(item->text(0))); - QTemporaryFile temp(QDir::tempPath()+"/cantata_XXXXXX.streams"); + QTemporaryFile temp("cantata_XXXXXX.streams"); temp.setAutoRemove(true); temp.open(); temp.write(j->readAll()); @@ -353,16 +353,8 @@ processItems.append(i); } } - QString message; - if (install && update) { - message=tr("Install/update the selected stream providers?"); - } else if (install) { - message=tr("Install the selected stream providers?"); - } else if (update) { - message=tr("Update the selected stream providers?"); - } - if (!message.isEmpty() && MessageBox::Yes==MessageBox::questionYesNo(this, message, tr("Install/Update"))) { + if (install || update) { setState(true); doNext(); } diff -Nru cantata-2.3.0/streams/streamssettings.cpp cantata-2.3.1/streams/streamssettings.cpp --- cantata-2.3.0/streams/streamssettings.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/streams/streamssettings.cpp 2018-05-24 18:02:03.000000000 +0000 @@ -222,7 +222,7 @@ streamsFile.write(streamFile); streamsFile.close(); - Icon icn; + QIcon icn; if (!icon.isEmpty()) { QFile iconFile(dir+Utils::constDirSep+iconName); if (iconFile.open(QIODevice::WriteOnly)) { @@ -314,6 +314,7 @@ remove(); break; case Close: + save(); reject(); // Need to call this - if not, when dialog is closed by window X control, it is not deleted!!!! Dialog::slotButtonClicked(button); diff -Nru cantata-2.3.0/support/actioncollection.cpp cantata-2.3.1/support/actioncollection.cpp --- cantata-2.3.0/support/actioncollection.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/support/actioncollection.cpp 2018-05-24 17:26:01.000000000 +0000 @@ -52,11 +52,7 @@ Action *act = static_cast(addAction(name)); act->setText(text); if (nullptr!=icon) { - if ('m'==icon[0] && 'e'==icon[1] && 'd'==icon[2] && 'i'==icon[3] && 'a'==icon[4] && '-'==icon[5]) { - act->setIcon(Icon::getMediaIcon(icon)); - } else { - act->setIcon(Icon(icon)); - } + act->setIcon(Icon::get(icon)); } if (!whatsThis.isEmpty()) { act->setWhatsThis(whatsThis); Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/support/Cantata-FontAwesome.ttf and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/support/Cantata-FontAwesome.ttf differ diff -Nru cantata-2.3.0/support/CMakeLists.txt cantata-2.3.1/support/CMakeLists.txt --- cantata-2.3.0/support/CMakeLists.txt 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/support/CMakeLists.txt 2018-05-16 16:15:21.000000000 +0000 @@ -9,24 +9,14 @@ pagewidget.cpp combobox.cpp configdialog.cpp monoicon.cpp) if (APPLE) - install(FILES fontawesome-webfont.ttf DESTINATION ${MACOSX_BUNDLE_RESOURCES}/fonts) -elseif (WIN32) - install(FILES fontawesome-webfont.ttf DESTINATION ${CMAKE_INSTALL_PREFIX}/fonts) -else () - install(FILES fontawesome-webfont.ttf DESTINATION ${SHARE_INSTALL_PREFIX}/${CMAKE_PROJECT_NAME}/fonts) -endif () - -if (APPLE) set(SUPPORT_SRCS ${SUPPORT_SRCS} osxstyle.cpp flattoolbutton.cpp windowmanager.cpp) endif () set(SUPPORT_SRCS ${SUPPORT_SRCS} pathrequester.cpp kmessagewidget.cpp dialog.cpp shortcutsmodel.cpp shortcutssettingswidget.cpp keysequencewidget.cpp acceleratormanager.cpp urllabel.cpp) set(SUPPORT_UIS shortcutssettingswidget.ui) - if (Qt5Gui_VERSION_MAJOR LESS 5 OR Qt5Gui_VERSION_MINOR LESS 2) - endif () qt5_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS}) -qt5_add_resources(SUPPORT_RC_SRCS ${SUPPORT_RCS}) +qt5_add_resources(SUPPORT_RC_SRCS support.qrc) add_library(support STATIC ${SUPPORT_SRCS} ${SUPPORT_UI_HDRS} ${SUPPORT_RC_SRCS}) diff -Nru cantata-2.3.0/support/dialog.cpp cantata-2.3.1/support/dialog.cpp --- cantata-2.3.0/support/dialog.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/support/dialog.cpp 2018-05-25 16:24:35.000000000 +0000 @@ -117,10 +117,10 @@ namespace StdGuiItem { GuiItem ok() { return GuiItem(QObject::tr("&OK"), FontAwesome::check); } -GuiItem cancel() { return GuiItem(QObject::tr("&Cancel"), FontAwesome::ban, true); } +GuiItem cancel() { return GuiItem(QObject::tr("&Cancel"), FontAwesome::ban); } GuiItem yes() { return GuiItem(QObject::tr("&Yes"), FontAwesome::check); } GuiItem no() { return GuiItem(QObject::tr("&No"), FontAwesome::times, true); } -GuiItem discard() { return GuiItem(QObject::tr("&Discard"), FontAwesome::eraser, true); } +GuiItem discard() { return GuiItem(QObject::tr("&Discard"), FontAwesome::trash, true); } GuiItem save() { return GuiItem(QObject::tr("&Save"), FontAwesome::save); } GuiItem apply() { return GuiItem(QObject::tr("&Apply"), FontAwesome::check); } GuiItem close() { return GuiItem(QObject::tr("&Close"), FontAwesome::close, true); } @@ -281,7 +281,7 @@ b->setText(item.text); if (style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons)) { if (!item.icon.isEmpty()) { - b->setIcon(Icon(item.icon)); + b->setIcon(Icon::get(item.icon)); } else if (item.monoIcon>0) { b->setIcon(monoIcon(item)); } else { @@ -298,7 +298,7 @@ b->setText(item.text); if (style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons)) { if (!item.icon.isEmpty()) { - b->setIcon(Icon(item.icon)); + b->setIcon(Icon::get(item.icon)); } else if (item.monoIcon>0) { b->setIcon(monoIcon(item)); } else { diff -Nru cantata-2.3.0/support/fancytabwidget.cpp cantata-2.3.1/support/fancytabwidget.cpp --- cantata-2.3.0/support/fancytabwidget.cpp 2018-03-25 15:09:17.000000000 +0000 +++ cantata-2.3.1/support/fancytabwidget.cpp 2018-06-05 17:39:58.000000000 +0000 @@ -139,7 +139,7 @@ #ifdef Q_OS_MAC QColor col = OSXStyle::self()->viewPalette().highlight().color(); #elif defined Q_OS_WIN - QColor col = option->palette.highlight().color(); + QColor col = active ? option->palette.highlight().color() : QColor(96, 96, 96); col.setAlphaF(0.25); #else QColor col = option->palette.highlight().color(); @@ -429,7 +429,7 @@ #ifdef Q_OS_MAC QColor col = OSXStyle::self()->viewPalette().highlight().color(); #elif defined Q_OS_WIN - QColor col = palette().highlight().color(); + QColor col = palette().currentColorGroup()==QPalette::Active ? palette().highlight().color() : QColor(96, 96, 96); col.setAlphaF(0.25); #else QColor col = palette().highlight().color(); Binary files /tmp/tmp985K5I/iXXExtESWn/cantata-2.3.0/support/fontawesome-webfont.ttf and /tmp/tmp985K5I/ZFaEIRp865/cantata-2.3.1/support/fontawesome-webfont.ttf differ diff -Nru cantata-2.3.0/support/icon.cpp cantata-2.3.1/support/icon.cpp --- cantata-2.3.0/support/icon.cpp 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/support/icon.cpp 2018-05-24 17:23:42.000000000 +0000 @@ -89,48 +89,6 @@ } } -Icon Icon::getMediaIcon(const QString &name) -{ - static QList modes=QList() << QIcon::Normal << QIcon::Disabled << QIcon::Active << QIcon::Selected; - Icon icn; - Icon icon(name); - - for (QIcon::Mode mode: modes) { - icn.addPixmap(icon.pixmap(QSize(64, 64), mode).scaled(QSize(28, 28), Qt::KeepAspectRatio, Qt::SmoothTransformation), mode); - icn.addPixmap(icon.pixmap(QSize(48, 48), mode), mode); - icn.addPixmap(icon.pixmap(QSize(32, 32), mode), mode); - icn.addPixmap(icon.pixmap(QSize(24, 24), mode), mode); - icn.addPixmap(icon.pixmap(QSize(22, 22), mode), mode); - icn.addPixmap(icon.pixmap(QSize(16, 16), mode), mode); - } - - return icn; -} - -Icon Icon::create(const QString &name, const QList &sizes, bool andSvg) -{ - Icon icon; - for (int s: sizes) { - icon.addFile(QLatin1Char(':')+name+QString::number(s), QSize(s, s)); - } - if (andSvg) { - icon.addFile(QLatin1Char(':')+name+QLatin1String(".svg")); - } - return icon; -} - -Icon::Icon(const QStringList &names) -{ - for (const QString &name: names) { - Icon icn(name); - if (!icn.isNull()) { - *this=icn; - return; - } - } - *this=Icon("unknown"); -} - QPixmap Icon::getScaledPixmap(const QIcon &icon, int w, int h, int base) { QList sizes=icon.availableSizes(); diff -Nru cantata-2.3.0/support/icon.h cantata-2.3.1/support/icon.h --- cantata-2.3.0/support/icon.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/support/icon.h 2018-05-24 17:26:20.000000000 +0000 @@ -28,27 +28,18 @@ class QToolButton; -class Icon : public QIcon +namespace Icon { -public: - explicit Icon(const QString &icon) : QIcon(QIcon::fromTheme(icon)) { } - Icon(const QIcon &i) : QIcon(i) { } - Icon(const QStringList &names); - Icon() { } - - static int stdSize(int s); - static int dlgIconSize(); - static void init(QToolButton *btn, bool setFlat=true); - static Icon getMediaIcon(const QString &name); - static QString currentTheme() { return QIcon::themeName(); } - static Icon create(const QString &name, const QList &sizes, bool andSvg=false); + extern int stdSize(int s); + extern int dlgIconSize(); + extern void init(QToolButton *btn, bool setFlat=true); + inline QIcon get(const QString &name) { return name.startsWith(":") || name.startsWith("/") ? QIcon(name) : QIcon::fromTheme(name); } enum Std { Close, Clear }; - static QPixmap getScaledPixmap(const QIcon &icon, int w, int h, int base); - QPixmap getScaledPixmap(int w, int h, int base) const { return getScaledPixmap(*this, w, h, base); } -}; + extern QPixmap getScaledPixmap(const QIcon &icon, int w, int h, int base); +} #endif diff -Nru cantata-2.3.0/support/keysequencewidget.cpp cantata-2.3.1/support/keysequencewidget.cpp --- cantata-2.3.0/support/keysequencewidget.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/support/keysequencewidget.cpp 2018-05-24 18:10:25.000000000 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include // This defines the unicode symbols for special keys (kCommandUnicode and friends) #ifdef Q_OS_MAC @@ -172,17 +173,13 @@ _keyButton = new KeySequenceButton(this, this); _keyButton->setFocusPolicy(Qt::StrongFocus); - _keyButton->setIcon(QIcon::fromTheme("configure")); _keyButton->setToolTip(tr("Click on the button, then enter the shortcut like you would in the program.\nExample for Ctrl+a: hold the Ctrl key and press a.")); layout->addWidget(_keyButton); _clearButton = new QToolButton(this); layout->addWidget(_clearButton); - if (qApp->isLeftToRight()) - _clearButton->setIcon(QIcon::fromTheme("edit-clear-locationbar-rtl", QIcon::fromTheme("edit-clear"))); - else - _clearButton->setIcon(QIcon::fromTheme("edit-clear-locationbar-ltr", QIcon::fromTheme("edit-clear"))); + _clearButton->setIcon(style()->standardIcon(QStyle::SP_LineEditClearButton)); setLayout(layout); diff -Nru cantata-2.3.0/support/messagebox.cpp cantata-2.3.1/support/messagebox.cpp --- cantata-2.3.0/support/messagebox.cpp 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/support/messagebox.cpp 2018-05-24 17:26:44.000000000 +0000 @@ -102,12 +102,12 @@ if (!yesText.text.isEmpty()) { QAbstractButton *btn=box.button(QMessageBox::Yes); btn->setText(yesText.text); - btn->setIcon(!yesText.icon.isEmpty() && btnIcons ? Icon(yesText.icon) : Icon()); + btn->setIcon(!yesText.icon.isEmpty() && btnIcons ? Icon::get(yesText.icon) : QIcon()); } if (!noText.text.isEmpty()) { QAbstractButton *btn=box.button(QMessageBox::No); btn->setText(noText.text); - btn->setIcon(!noText.icon.isEmpty() && btnIcons ? Icon(noText.icon) : Icon()); + btn->setIcon(!noText.icon.isEmpty() && btnIcons ? Icon::get(noText.icon) : QIcon()); } AcceleratorManager::manage(&box); return -1==box.exec() ? Cancel : map(box.standardButton(box.clickedButton())); @@ -146,22 +146,22 @@ case Error: dlg->setCaption(title.isEmpty() ? QObject::tr("Error") : title); dlg->setButtons(Dialog::Ok); - iconLabel->setPixmap(Icon("dialog-error").pixmap(iconSize, iconSize)); + iconLabel->setPixmap(qApp->style()->standardIcon(QStyle::SP_MessageBoxCritical).pixmap(iconSize, iconSize)); break; case Question: dlg->setCaption(title.isEmpty() ? QObject::tr("Question") : title); dlg->setButtons(Dialog::Yes|Dialog::No); - iconLabel->setPixmap(Icon("dialog-question").pixmap(iconSize, iconSize)); + iconLabel->setPixmap(qApp->style()->standardIcon(QStyle::SP_MessageBoxQuestion).pixmap(iconSize, iconSize)); break; case Warning: dlg->setCaption(title.isEmpty() ? QObject::tr("Warning") : title); dlg->setButtons(Dialog::Yes|Dialog::No); - iconLabel->setPixmap(Icon("dialog-warning").pixmap(iconSize, iconSize)); + iconLabel->setPixmap(qApp->style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(iconSize, iconSize)); break; case Information: dlg->setCaption(title.isEmpty() ? QObject::tr("Information") : title); dlg->setButtons(Dialog::Ok); - iconLabel->setPixmap(Icon("dialog-information").pixmap(iconSize, iconSize)); + iconLabel->setPixmap(qApp->style()->standardIcon(QStyle::SP_MessageBoxInformation).pixmap(iconSize, iconSize)); break; } lay->addWidget(iconLabel, 0, 0, 1, 1); diff -Nru cantata-2.3.0/support/monoicon.cpp cantata-2.3.1/support/monoicon.cpp --- cantata-2.3.0/support/monoicon.cpp 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/support/monoicon.cpp 2018-06-01 18:03:40.000000000 +0000 @@ -82,9 +82,11 @@ } else { // Load fontawesome, if it is not already loaded if (fontAwesomeFontName.isEmpty()) { - QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(QFontDatabase::addApplicationFont(Utils::systemDir(QLatin1String("fonts"))+QLatin1String("fontawesome-webfont.ttf"))); + Q_INIT_RESOURCE(support); + + QStringList loadedFontFamilies = QFontDatabase::applicationFontFamilies(QFontDatabase::addApplicationFont(":/font.ttf")); if (!loadedFontFamilies.empty()) { - fontAwesomeFontName= loadedFontFamilies.at(0); + fontAwesomeFontName = loadedFontFamilies.at(0); } } fontName=fontAwesomeFontName; @@ -96,15 +98,18 @@ font.setBold(true); } else if (pixelSize>10) { static const int constScale=14; - static const int constHalfScale=constScale/2; - pixelSize=((pixelSize/constScale)*constScale)+((pixelSize%constScale)>=constHalfScale ? constScale : 0); - pixelSize=qMin(pixelSize, rect.height()); - if (FontAwesome::bars==fontAwesomeIcon && pixelSize%constHalfScale) { - pixelSize-=1; - } else if (FontAwesome::list==fontAwesomeIcon && pixelSize%constHalfScale) { - pixelSize+=1; - } + if (pixelSize>=(constScale*2)) { + pixelSize=((pixelSize/constScale)*constScale); + } else { + static const int constHalfScale=constScale/2; + pixelSize=((pixelSize/constScale)*constScale)+((pixelSize%constScale)>=constHalfScale ? constHalfScale : 0); + if (pixelSize%constScale) { + if (FontAwesome::list==fontAwesomeIcon) { + pixelSize-=2; + } + } + } } font.setPixelSize(pixelSize); diff -Nru cantata-2.3.0/support/monoicon.h cantata-2.3.1/support/monoicon.h --- cantata-2.3.0/support/monoicon.h 2018-01-01 10:09:04.000000000 +0000 +++ cantata-2.3.1/support/monoicon.h 2018-05-14 21:20:32.000000000 +0000 @@ -594,6 +594,7 @@ unlockalt = 0xf13e, unsorted = 0xf0dc, upload = 0xf093, + usb = 0xf287, usd = 0xf155, user = 0xf007, usermd = 0xf0f0, diff -Nru cantata-2.3.0/support/pagewidget.cpp cantata-2.3.1/support/pagewidget.cpp --- cantata-2.3.0/support/pagewidget.cpp 2018-03-14 17:27:56.000000000 +0000 +++ cantata-2.3.1/support/pagewidget.cpp 2018-06-05 17:40:02.000000000 +0000 @@ -77,6 +77,7 @@ } bool mouseOver=option.state&QStyle::State_MouseOver; bool selected=option.state&QStyle::State_Selected; + bool active=option.state&QStyle::State_Active; if (standard) { if (GtkStyle::isActive()) { @@ -118,10 +119,19 @@ const QString text = index.model()->data(index, Qt::DisplayRole).toString(); const QIcon icon = index.model()->data(index, Qt::DecorationRole).value(); - const QPixmap pixmap = icon.pixmap(iconSize, iconSize); + const QPixmap pixmap = icon.pixmap(iconSize, iconSize, + #ifdef Q_OS_WIN + QIcon::Normal + #else + selected && + ( active || + option.palette.brush(QPalette::Inactive, QPalette::HighlightedText).color()== + option.palette.brush(QPalette::Active, QPalette::HighlightedText).color()) ? QIcon::Selected : QIcon::Normal + #endif + ); QFontMetrics fm = painter->fontMetrics(); - QSize layoutSize = pixmap.size() / pixmap.DEVICE_PIXEL_RATIO(); + QSize layoutSize = pixmap.isNull() ? QSize(iconSize, iconSize) : (pixmap.size() / pixmap.DEVICE_PIXEL_RATIO()); QTextLayout iconTextLayout(text, option.font); QTextOption textOption(Qt::AlignHCenter); @@ -132,7 +142,7 @@ QPen pen = painter->pen(); QPalette::ColorGroup cg = option.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { + if (cg == QPalette::Normal && !active) { cg = QPalette::Inactive; } @@ -157,7 +167,9 @@ painter->setPen(option.palette.color(cg, QPalette::Text)); } - painter->drawPixmap(option.rect.x() + (option.rect.width()/2)-(layoutSize.width()/2), option.rect.y() + 5, pixmap); + if (!pixmap.isNull()) { + painter->drawPixmap(option.rect.x() + (option.rect.width()/2)-(layoutSize.width()/2), option.rect.y() + 5, pixmap); + } if (!text.isEmpty()) { iconTextLayout.draw(painter, QPoint(option.rect.x() + (option.rect.width()/2)-(maxWidth/2), option.rect.y() + layoutSize.height()+7)); } @@ -180,7 +192,7 @@ QFontMetrics fm = option.fontMetrics; int gap = fm.height(); - QSize layoutSize = pixmap.size() / pixmap.DEVICE_PIXEL_RATIO(); + QSize layoutSize = pixmap.isNull() ? QSize(iconSize, iconSize) : (pixmap.size() / pixmap.DEVICE_PIXEL_RATIO()); if (layoutSize.height() == 0) { /** diff -Nru cantata-2.3.0/support/pathrequester.cpp cantata-2.3.1/support/pathrequester.cpp --- cantata-2.3.0/support/pathrequester.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/support/pathrequester.cpp 2018-05-24 18:08:29.000000000 +0000 @@ -44,7 +44,7 @@ layout->addWidget(edit); layout->addWidget(btn); btn->setAutoRaise(true); - btn->setIcon(icon.isNull() ? Icon("document-open") : icon); + btn->setIcon(icon); connect(btn, SIGNAL(clicked(bool)), SLOT(choose())); connect(edit, SIGNAL(textChanged(const QString &)), SIGNAL(textChanged(const QString &))); } diff -Nru cantata-2.3.0/support/proxystyle.cpp cantata-2.3.1/support/proxystyle.cpp --- cantata-2.3.0/support/proxystyle.cpp 2018-04-01 09:44:20.000000000 +0000 +++ cantata-2.3.1/support/proxystyle.cpp 2018-05-26 11:26:06.000000000 +0000 @@ -39,9 +39,23 @@ ProxyStyle::ProxyStyle(int modView) : modViewFrame(modView) { - #if !defined Q_OS_WIN && !defined Q_OS_MAC - editClearIcon=MonoIcon::icon(FontAwesome::timescircle, QColor(128, 128, 128), QColor(128, 128, 128)); - #endif + icons.insert(SP_LineEditClearButton, MonoIcon::icon(FontAwesome::timescircle, QColor(128, 128, 128), QColor(128, 128, 128))); + icons.insert(SP_MessageBoxCritical, MonoIcon::icon(FontAwesome::timescircleo, MonoIcon::constRed, MonoIcon::constRed)); + icons.insert(SP_MessageBoxWarning, MonoIcon::icon(FontAwesome::exclamationtriangle, QColor(0xff, 0x99, 0x00), QColor(0xff, 0x99, 0x00))); + icons.insert(SP_MessageBoxQuestion, MonoIcon::icon(FontAwesome::questioncircle, QColor(0x1a, 0x8c, 0xff), QColor(0x1a, 0x8c, 0xff))); + icons.insert(SP_MessageBoxInformation, MonoIcon::icon(FontAwesome::infocircle, QColor(0x1a, 0x8c, 0xff), QColor(0x1a, 0x8c, 0xff))); + + QColor monoCol = Utils::monoIconColor(); + icons.insert(SP_DialogCancelButton, MonoIcon::icon(FontAwesome::ban, monoCol, monoCol)); + icons.insert(SP_DialogHelpButton, MonoIcon::icon(FontAwesome::lifering, monoCol, monoCol)); + icons.insert(SP_DialogOpenButton, MonoIcon::icon(FontAwesome::foldero, monoCol, monoCol)); + icons.insert(SP_DialogSaveButton, MonoIcon::icon(FontAwesome::save, monoCol, monoCol)); + icons.insert(SP_DialogCloseButton, MonoIcon::icon(FontAwesome::close, MonoIcon::constRed, MonoIcon::constRed)); + icons.insert(SP_DialogApplyButton, MonoIcon::icon(FontAwesome::check, monoCol, monoCol)); + icons.insert(SP_DialogResetButton, MonoIcon::icon(FontAwesome::undo, monoCol, monoCol)); + icons.insert(SP_DialogDiscardButton, MonoIcon::icon(FontAwesome::trash, MonoIcon::constRed, MonoIcon::constRed)); + icons.insert(SP_DialogYesButton, MonoIcon::icon(FontAwesome::check, monoCol, monoCol)); + icons.insert(SP_DialogNoButton, MonoIcon::icon(FontAwesome::times, MonoIcon::constRed, MonoIcon::constRed)); } void ProxyStyle::polish(QWidget *widget) @@ -57,7 +71,7 @@ int ProxyStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const { - return SH_DialogButtonBox_ButtonsHaveIcons == hint ? false : baseStyle()->styleHint(hint, option, widget, returnData); + return SH_DialogButtonBox_ButtonsHaveIcons == hint && Utils::KDE!=Utils::currentDe() ? false : baseStyle()->styleHint(hint, option, widget, returnData); } int ProxyStyle::pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const @@ -92,21 +106,15 @@ } } -#if !defined Q_OS_WIN && !defined Q_OS_MAC QPixmap ProxyStyle::standardPixmap(StandardPixmap sp, const QStyleOption *opt, const QWidget *widget) const { QPixmap pixmap=baseStyle()->standardPixmap(sp, opt, widget); - if (SP_LineEditClearButton==sp) { - return editClearIcon.pixmap(pixmap.size()); - } - return pixmap; + const auto icon = icons.find(sp); + return icon==icons.constEnd() ? pixmap : icon.value().pixmap(pixmap.size()); } QIcon ProxyStyle::standardIcon(StandardPixmap sp, const QStyleOption *opt, const QWidget *widget) const { - if (SP_LineEditClearButton==sp) { - return editClearIcon; - } - return baseStyle()->standardIcon(sp, opt, widget); + const auto icon = icons.find(sp); + return icon==icons.constEnd() ? baseStyle()->standardIcon(sp, opt, widget) : icon.value(); } -#endif diff -Nru cantata-2.3.0/support/proxystyle.h cantata-2.3.1/support/proxystyle.h --- cantata-2.3.0/support/proxystyle.h 2018-03-13 19:29:21.000000000 +0000 +++ cantata-2.3.1/support/proxystyle.h 2018-05-25 16:31:26.000000000 +0000 @@ -26,6 +26,7 @@ #include #include +#include class ProxyStyle : public QProxyStyle { @@ -48,16 +49,12 @@ int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const override; int pixelMetric(PixelMetric metric, const QStyleOption *option, const QWidget *widget) const override; void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const override; - #if !defined Q_OS_WIN && !defined Q_OS_MAC QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *opt, const QWidget *widget) const override; QIcon standardIcon(StandardPixmap sp, const QStyleOption *opt, const QWidget *widget) const override; - #endif private: int modViewFrame; - #if !defined Q_OS_WIN && !defined Q_OS_MAC - QIcon editClearIcon; - #endif + QMap icons; }; #endif diff -Nru cantata-2.3.0/support/support.qrc cantata-2.3.1/support/support.qrc --- cantata-2.3.0/support/support.qrc 1970-01-01 00:00:00.000000000 +0000 +++ cantata-2.3.1/support/support.qrc 2018-05-16 16:07:02.000000000 +0000 @@ -0,0 +1,5 @@ + + +Cantata-FontAwesome.ttf + + diff -Nru cantata-2.3.0/support/utils.cpp cantata-2.3.1/support/utils.cpp --- cantata-2.3.0/support/utils.cpp 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/support/utils.cpp 2018-05-21 16:24:47.000000000 +0000 @@ -58,7 +58,7 @@ const QLatin1String Utils::constDirSepStr("/"); const char * Utils::constDirSepCharStr="/"; -static const QLatin1String constHttp("http://"); +static const QLatin1String constHttp("http:"); QString Utils::fixPath(const QString &dir, bool ensureEndsInSlash) { @@ -742,6 +742,11 @@ #elif defined Q_OS_MAC return fixPath(QCoreApplication::applicationDirPath())+app; #else + // Check for helpers in same folder as main exe, so that can test dev versions without install. + QString local = fixPath(QCoreApplication::applicationDirPath())+app; + if (QFile::exists(local)) { + return local; + } return QString(INSTALL_PREFIX "/" LINUX_LIB_DIR "/")+QCoreApplication::applicationName()+constDirSep+app; #endif } @@ -902,7 +907,7 @@ } else if (desktop.contains("kde")) { de=KDE; } else if (desktop.contains("gnome") || desktop.contains("pantheon")) { - de=desktop.contains("ubuntu") ? Ubuntu_Gnome : Gnome; + de=Gnome; } else { QByteArray kde=qgetenv("KDE_FULL_SESSION"); if ("true"==kde) { @@ -922,9 +927,9 @@ #elif defined Q_OS_WIN return true; #elif QT_QTDBUS_FOUND - return Ubuntu_Gnome==currentDe() || Gnome==currentDe() ? QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher") : true; + return Gnome==currentDe() ? QDBusConnection::sessionBus().interface()->isServiceRegistered("org.kde.StatusNotifierWatcher") : true; #else - return Ubuntu_Gnome!=currentDe() && Gnome!=currentDe(); + return Gnome!=currentDe(); #endif } diff -Nru cantata-2.3.0/support/utils.h cantata-2.3.1/support/utils.h --- cantata-2.3.0/support/utils.h 2018-01-27 10:02:54.000000000 +0000 +++ cantata-2.3.1/support/utils.h 2018-05-21 16:24:30.000000000 +0000 @@ -114,7 +114,6 @@ enum Desktop { KDE, Gnome, - Ubuntu_Gnome, Unity, Other }; diff -Nru cantata-2.3.0/tags/tags.cpp cantata-2.3.1/tags/tags.cpp --- cantata-2.3.0/tags/tags.cpp 2018-04-08 10:19:44.000000000 +0000 +++ cantata-2.3.1/tags/tags.cpp 2018-05-17 16:25:37.000000000 +0000 @@ -1157,6 +1157,11 @@ // } else if (file->ID3v1Tag()) { // readID3v1Tags(fileref, song, rg); } + #if TAGLIB_VERSION >= CANTATA_MAKE_VERSION(1,7,0) + if (img && img->isNull()) { + readFlacPicture(file->pictureList(), img); + } + #endif #ifdef TAGLIB_MP4_FOUND } else if (TagLib::MP4::File *file = dynamic_cast< TagLib::MP4::File * >(fileref.file())) { TagLib::MP4::Tag *tag = dynamic_cast< TagLib::MP4::Tag * >(file->tag()); diff -Nru cantata-2.3.0/translations/blank.ts cantata-2.3.1/translations/blank.ts --- cantata-2.3.0/translations/blank.ts 2018-04-01 18:51:45.000000000 +0000 +++ cantata-2.3.1/translations/blank.ts 2018-05-26 17:50:51.000000000 +0000 @@ -3295,7 +3295,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_cs.ts cantata-2.3.1/translations/cantata_cs.ts --- cantata-2.3.0/translations/cantata_cs.ts 2018-04-09 19:09:05.000000000 +0000 +++ cantata-2.3.1/translations/cantata_cs.ts 2018-05-26 17:53:00.000000000 +0000 @@ -9769,7 +9769,7 @@ - Play next + Play Next Přehrát další diff -Nru cantata-2.3.0/translations/cantata_da.ts cantata-2.3.1/translations/cantata_da.ts --- cantata-2.3.0/translations/cantata_da.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_da.ts 2018-05-26 17:53:09.000000000 +0000 @@ -3325,7 +3325,7 @@ - Play next + Play Next Afspil næste diff -Nru cantata-2.3.0/translations/cantata_de.ts cantata-2.3.1/translations/cantata_de.ts --- cantata-2.3.0/translations/cantata_de.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_de.ts 2018-05-26 17:53:19.000000000 +0000 @@ -7614,7 +7614,7 @@ - Play next + Play Next Als nächstes abspielen diff -Nru cantata-2.3.0/translations/cantata_en_GB.ts cantata-2.3.1/translations/cantata_en_GB.ts --- cantata-2.3.0/translations/cantata_en_GB.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_en_GB.ts 2018-05-26 17:51:26.000000000 +0000 @@ -3389,7 +3389,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_es.ts cantata-2.3.1/translations/cantata_es.ts --- cantata-2.3.0/translations/cantata_es.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_es.ts 2018-05-26 17:51:32.000000000 +0000 @@ -8241,7 +8241,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_fr.ts cantata-2.3.1/translations/cantata_fr.ts --- cantata-2.3.0/translations/cantata_fr.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_fr.ts 2018-05-30 17:59:13.000000000 +0000 @@ -1,83 +1,83 @@ - + Refresh Album Information - Rafraîchir les informations de l'album + Rafraîchir les informations de l'album Album - Album + Album Tracks i18n: file: devices/albumdetails.ui:136 i18n: ectx: property (title), widget (QGroupBox, groupBox_2) - Pistes + Pistes Refresh Artist Information - Rafraîchir les informations de l'artiste + Rafraîchir les informations de l'artiste Artist i18n: file: devices/albumdetails.ui:163 i18n: ectx: property (text), widget (QTreeWidget, tracks) - Artiste + Artiste Albums - Albums + Albums Web Links - Liens Web + Liens Web Similar Artists - Artistes similaires + Artistes similaires Lyrics Providers - Fournisseur de paroles + Fournisseur de paroles Wikipedia Languages - Langues Wikipédia + Langues Wikipédia Other - Autre + Autre Reset Spacing - Réinitialiser l'espacement + Réinitialiser l'espacement &Artist - &Artiste + &Artiste Al&bum - Al&bum + Al&bum &Track - &Piste + &Piste Read more on last.fm - Continuer la lecture sur last.fm + Continuer la lecture sur last.fm If Cantata has failed to find lyrics, or has found the wrong ones, use this dialog to enter new search details. For example, the current song may actually be a cover-version - if so, then searching for lyrics by the original artist might help. If this search does find new lyrics, these will still be associated with the original song title and artist as displayed in Cantata. - Si Cantata n'a pas trouvé de paroles, ou n'a pas trouvé les bonnes, utilisez cette fenêtre pour entrer de nouveaux paramètres de recherche. Par exemple, la chanson dont vous cherchez les paroles est peut-être une reprise - dans ce cas, chercher les paroles de la version originale peut donner de meilleurs résultats. + Si Cantata n'a pas trouvé de paroles, ou n'a pas trouvé les bonnes, utilisez cette fenêtre pour entrer de nouveaux paramètres de recherche. Par exemple, la chanson dont vous cherchez les paroles est peut-être une reprise - dans ce cas, chercher les paroles de la version originale peut donner de meilleurs résultats. Si cette recherche donne de nouveaux résultats, ils seront toujours associés avec le titre et l'artiste de la version originale dans l'affichage de Cantata. @@ -96,7 +96,7 @@ i18n: file: tags/tageditor.ui:54 i18n: ectx: property (text), widget (StateLabel, titleLabel) - Titre: + Titre: Artist: @@ -113,152 +113,152 @@ i18n: file: tags/tageditor.ui:67 i18n: ectx: property (text), widget (StateLabel, artistLabel) - Artiste: + Artiste: Search For Lyrics - Rechercher des paroles + Rechercher des paroles Choose the websites you want to use when searching for lyrics. - Choisissez les sites sources pour la recherche de paroles. + Choisissez les sites sources pour la recherche de paroles. Song Information - Informations sur la piste + Informations sur la piste Images (*.png *.jpg) - Images (*.png *.jpg) + Images (*.png *.jpg) 10px pixels - 10px + 10px %1% value% - %1% + %1% %1 px pixels - %1 px + %1 px Lyrics - Paroles + Paroles Information - Informations + Informations Metadata - Métadonnées + Métadonnées Refresh Lyrics - Rafraîchir les paroles + Rafraîchir les paroles Edit Lyrics - Éditer les paroles + Éditer les paroles Delete Lyrics File - Supprimer le fichier contenant les paroles + Supprimer le fichier contenant les paroles Refresh Track Information - Rafraîchir les informations sur la piste + Rafraîchir les informations sur la piste Cancel - Annuler + Annuler Track i18n: file: devices/albumdetails.ui:158 i18n: ectx: property (text), widget (QTreeWidget, tracks) - Piste + Piste Reload lyrics? Reload from disk, or delete disk copy and download? - Recharger les paroles ? + Recharger les paroles ? Recharger depuis le disque, ou effacer la copie disque et télécharger ? Reload - Rafraîchir + Rafraîchir Reload From Disk - Rafraîchir à partir du disque + Rafraîchir à partir du disque Download - Télécharger + Télécharger Current playing song has changed, still perform search? - La piste courante a changé, continuer la recherche ? + La piste courante a changé, continuer la recherche ? Song Changed - Piste modifiée + Piste modifiée Perform Search - Effectuer la recherche + Effectuer la recherche Delete lyrics file? - Supprimer les paroles ? + Supprimer les paroles ? Delete File - Supprimer le fichier + Supprimer le fichier Album artist - Artiste de l'album + Artiste de l'album Composer i18n: file: devices/filenameschemedialog.ui:102 i18n: ectx: property (text), widget (QPushButton, composer) - Compositeur + Compositeur Lyricist - Parolier + Parolier Conductor - Chef d'orchestre + Chef d'orchestre Remixer - Remixeur + Remixeur Subtitle - Sous-titre + Sous-titre Track number - Piste numéro + Piste numéro Disc number - Disque numéro + Disque numéro Genre @@ -271,183 +271,183 @@ i18n: file: dynamic/dynamicrule.ui:128 i18n: ectx: property (text), widget (BuddyLabel, label_5) - Genre + Genre Date - Date + Date Original date - Date originale + Date originale Comment - Commentaire + Commentaire Copyright - Copyright + Copyright Label - Label + Label Catalogue number - Numéro du catalogue + Numéro du catalogue Title sort - Trier par titre + Trier par titre Artist sort - Trier par artiste + Trier par artiste Album artist sort - Trier par artiste de l'album + Trier par artiste de l'album Album sort - Trier par album + Trier par album Encoded by - Encodé par + Encodé par Encoder - Encodeur + Encodeur Mood - Humeur + Humeur Media - Média + Média Bitrate - Débit binaire + Débit binaire Sample rate - Échantillonnage + Échantillonnage Channels - Canaux + Canaux Tagging time - Date de l’étiquetage + Date de l’étiquetage Performer (%1) - Interprète (%1) + Interprète (%1) %1 kb/s - %1 kb/s + %1 kb/s %1 Hz - %1 Hz + %1 Hz Bits - Bits + Bits Performer - Interprète + Interprète Year i18n: file: devices/filenameschemedialog.ui:174 i18n: ectx: property (text), widget (QPushButton, year) - Année + Année Filename - Nom du fichier + Nom du fichier Fetching lyrics via %1 - Recherche des paroles via %1 + Recherche des paroles via %1 (Polish Translations) - (Traduction polonaise) + (Traduction polonaise) (Portuguese Translations) - (Traduction portugaise) + (Traduction portugaise) Track listing - Liste des pistes + Liste des pistes Read more on wikipedia - Lire plus sur Wikipédia + Lire plus sur Wikipédia Open in browser - Ouvrir dans le navigateur + Ouvrir dans le navigateur artist|band|singer|vocalist|musician Search pattern for an artist or band, separated by | - artiste|groupe|chanteur|vocaliste|musicien + artiste|groupe|chanteur|vocaliste|musicien album|score|soundtrack Search pattern for an album, separated by | - album|partition|bande + album|partition|bande Choose the wikipedia languages you want to use when searching for artist and album information. - Choisissez les langues Wikipédia à utiliser lors de la recherche d'informations sur les artistes et albums. + Choisissez les langues Wikipédia à utiliser lors de la recherche d'informations sur les artistes et albums. Cantata is playing a track - Cantata est en train de lire une piste + Cantata est en train de lire une piste <b>INVALID</b> - <b>INVALIDE</b> + <b>INVALIDE</b> <i>(When different)</i> - <i>(Si différent)</i> + <i>(Si différent)</i> Artists:%1, Albums:%2, Songs:%3 - Artistes:%1, Albums:%2, Pistes:%3 + Artistes:%1, Albums:%2, Pistes:%3 %1 free - %1 libre + %1 libre Local Music Library - Bibliothèque musicale locale + Bibliothèque musicale locale Audio CD - CD Audio + CD Audio There is insufficient space left on the destination device. The selected songs consume %1, but there is only %2 left. The songs will need to be transcoded to a smaller filesize in order to be successfully copied. - Il n'y a pas assez d'espace libre sur le périphérique. + Il n'y a pas assez d'espace libre sur le périphérique. Les pistes sélectionnées occupent %1, mais il ne reste que %2 de libre. Les pistes doivent être converties vers un format plus léger afin d'être copiées sur le périphérique. @@ -456,173 +456,173 @@ There is insufficient space left on the destination. The selected songs consume %1, but there is only %2 left. - Il n'y a pas assez d'espace libre sur le périphérique. + Il n'y a pas assez d'espace libre sur le périphérique. Les pistes sélectionnées occupent %1, mais il ne reste que %2 de libre. Copy Songs To Device - Copier les pistes sur le périphérique + Copier les pistes sur le périphérique Copy Songs - Copier les pistes + Copier les pistes Delete Songs - Supprimer les pistes + Supprimer les pistes You have not configured the destination device. Continue with the default settings? - Vous n'avez pas configuré le périphérique de destination. + Vous n'avez pas configuré le périphérique de destination. Continuer avec la configuration par défaut ? Not Configured - Non configuré + Non configuré Use Defaults - Utiliser la configuration par défaut + Utiliser la configuration par défaut You have not configured the source device. Continue with the default settings? - Vous n'avez pas configuré le périphérique source. + Vous n'avez pas configuré le périphérique source. Continuer avec les paramètres par défaut ? Are you sure you wish to stop? - Êtes vous sûr de vouloir arrêter ? + Êtes vous sûr de vouloir arrêter ? Stop - Arrêter + Arrêter Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! Device is not connected! - Le périphérique n'est pas connecté ! + Le périphérique n'est pas connecté ! Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? Device has been changed? - Le périphérique a été changé ? + Le périphérique a été changé ? Clearing unused folders - Nettoyage des dossiers non utilisés + Nettoyage des dossiers non utilisés Calculate ReplayGain for ripped tracks? - Calculer le ReplayGain des pistes extraites ? + Calculer le ReplayGain des pistes extraites ? ReplayGain - ReplayGain + ReplayGain Calculate - Calculer + Calculer The destination filename already exists! - Le fichier de destination existe déjà ! + Le fichier de destination existe déjà ! Song already exists! - La piste existe déjà ! + La piste existe déjà ! Song does not exist! - La piste n'existe pas ! + La piste n'existe pas ! Failed to create destination folder!<br/>Please check you have sufficient permissions. - La création du dossier de destination a échoué !<br/>Veuillez vérifier que vous avez les permissions requises. + La création du dossier de destination a échoué !<br/>Veuillez vérifier que vous avez les permissions requises. Source file no longer exists? - Le fichier source ne semble plus exister ? + Le fichier source ne semble plus exister ? Failed to copy. - Copie échouée. + Copie échouée. Failed to delete. - Suppression impossible. + Suppression impossible. Not connected to device. - Non connecté au périphérique. + Non connecté au périphérique. Selected codec is not available. - Le codec sélectionné n'est pas disponible. + Le codec sélectionné n'est pas disponible. Transcoding failed. - Le transcodage a échoué. + Le transcodage a échoué. Failed to create temporary file.<br/>(Required for transcoding to MTP devices.) - La création du fichier temporaire a échoué.<br/>(Requis pour transcoder vers les périphériques MTP.) + La création du fichier temporaire a échoué.<br/>(Requis pour transcoder vers les périphériques MTP.) Failed to read source file. - La création du fichier source a échoué. + La création du fichier source a échoué. Failed to write to destination file. - L'écriture du fichier cible a échoué. + L'écriture du fichier cible a échoué. No space left on device. - Plus d'espace restant sur le périphérique. + Plus d'espace restant sur le périphérique. Failed to update metadata. - La mise à jour des métadonnées a échoué + La mise à jour des métadonnées a échoué Failed to download track. - Le téléchargement de la piste a échoué. + Le téléchargement de la piste a échoué. Failed to lock device. - Le verrouillage du périphérique a échoué. + Le verrouillage du périphérique a échoué. Local Music Library Properties - Propriétés de la Bibliothèque Musicale Locale + Propriétés de la Bibliothèque Musicale Locale Error - Erreur + Erreur Skip - Passer + Passer Auto Skip - Saut automatique + Saut automatique Retry - Réessayer + Réessayer Album: @@ -635,703 +635,703 @@ i18n: file: tags/tageditor.ui:106 i18n: ectx: property (text), widget (StateLabel, albumLabel) - Album: + Album: Track: i18n: file: tags/tageditor.ui:34 i18n: ectx: property (text), widget (StateLabel, trackNameLabel) - Piste: + Piste: Source file: - Fichier source: + Fichier source: Destination file: - Fichier de destination: + Fichier de destination: File: - Fichier: + Fichier: Calculating... - Calcul en cours… + Calcul en cours… %1 (Estimated) time (Estimated) - %1 (Estimé) + %1 (Estimé) Time remaining: - Temps restant: + Temps restant: Saving cache - Sauvegarde du cache + Sauvegarde du cache Apply "Various Artists" Workaround - Appliquer l'alternative "Artistes divers" + Appliquer l'alternative "Artistes divers" Revert "Various Artists" Workaround - Révoquer l'alternative "Artistes divers" + Révoquer l'alternative "Artistes divers" Capitalize - Mettre une majuscule + Mettre une majuscule Adjust Track Numbers - Ajuster les numéros des pistes + Ajuster les numéros des pistes Tools - Outils + Outils Apply "Various Artists" workaround? - Appliquer l'alternative "Artistes divers" ? + Appliquer l'alternative "Artistes divers" ? This will set 'Album artist' and 'Artist' to "Various Artists", and set 'Title' to "TrackArtist - TrackTitle" - Cela remplacera 'Artiste album' et 'Artiste' par "Artistes divers", et 'Titre' par "Artiste piste - Titre de la piste" + Cela remplacera 'Artiste album' et 'Artiste' par "Artistes divers", et 'Titre' par "Artiste piste - Titre de la piste" Revert "Various Artists" workaround? - Révoquer l'alternative "Artistes divers" ? + Révoquer l'alternative "Artistes divers" ? Where the 'Album artist' is the same as 'Artist' and the 'Title' is of the format "TrackArtist - TrackTitle", 'Artist' will be taken from 'Title' and 'Title' itself will be set to just the title. e.g. If 'Title' is "Wibble - Wobble", then 'Artist' will be set to "Wibble" and 'Title' will be set to "Wobble" - Lorsque la valeur de 'Artiste album' est la même que 'Artiste' et que celle de 'Titre' est au format "Artiste piste - Titre de la piste", 'Artiste' sera défini à partir de 'Titre' et 'Titre' sera réduit à la seule valeur du titre. e.g. + Lorsque la valeur de 'Artiste album' est la même que 'Artiste' et que celle de 'Titre' est au format "Artiste piste - Titre de la piste", 'Artiste' sera défini à partir de 'Titre' et 'Titre' sera réduit à la seule valeur du titre. e.g. Si 'Titre' est "Toto - Tata", alors 'Artiste' deviendra "Toto" et 'Titre' sera "Tata" Revert - Réinitialiser + Réinitialiser Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'? - Mettre une majuscule à 'Titre', 'Artiste', 'Artiste de l'album' et à 'Album' ? + Mettre une majuscule à 'Titre', 'Artiste', 'Artiste de l'album' et à 'Album' ? Adjust track number by: - Ajuster les numéros des pistes par: + Ajuster les numéros des pistes par: Reading disc - Lecture du disque + Lecture du disque CDDB - CDDB + CDDB MusicBrainz - MusicBrainz + MusicBrainz Data Track - Données de la piste + Données de la piste Failed to open CD device - L'ouverture du CD a échoué + L'ouverture du CD a échoué Track %1 - Piste %1 + Piste %1 Failed to create CDDB connection - La connexion à CDDB a échoué + La connexion à CDDB a échoué No matches found in CDDB - Recherche CDDB infructueuse + Recherche CDDB infructueuse CDDB error: %1 - Erreur CDDB: %1 + Erreur CDDB: %1 Multiple matches were found. Please choose the relevant one from below: - Plusieurs résultats ont été trouvés. Veuillez sélectionner le résultat le plus pertinent dans la liste ci-dessous: + Plusieurs résultats ont été trouvés. Veuillez sélectionner le résultat le plus pertinent dans la liste ci-dessous: Title i18n: file: devices/albumdetails.ui:168 i18n: ectx: property (text), widget (QTreeWidget, tracks) - Titre + Titre Disc Selection - Sélection du disque + Sélection du disque %1 - %2 Disc %3 (%4) artist - album Disc disc (year) - %1 - %2 Disque %3 (%4) + %1 - %2 Disque %3 (%4) %1 - %2 (%3) artist - album (year) - %1 - %2 (%3) + %1 - %2 (%3) Updating (%1)... - Mise à jour (%1)… + Mise à jour (%1)… Updating (%1%)... - Mise à jour (%1%)… + Mise à jour (%1%)… Device Properties - Propriétés du périphérique + Propriétés du périphérique Don't copy covers - Ne pas copier les pochettes + Ne pas copier les pochettes Embed cover within each file - Ajouter la pochette à chaque fichier + Ajouter la pochette à chaque fichier No maximum size - Pas de taille maximum + Pas de taille maximum 400 pixels - 400 pixels + 400 pixels 300 pixels - 300 pixels + 300 pixels 200 pixels - 200 pixels + 200 pixels 100 pixels - 100 pixels + 100 pixels <p>When copying tracks to a device, and the 'Album Artist' is set to 'Various Artists', then Cantata will set the 'Artist' tag of all tracks to 'Various Artists' and the track 'Title' tag to 'TrackArtist - TrackTitle'.<hr/> When copying from a device, Cantata will check if 'Album Artist' and 'Artist' are both set to 'Various Artists'. If so, it will attempt to extract the real artist from the 'Title' tag, and remove the artist name from the 'Title' tag.</p> - <p>Lors de la copie de pistes vers un périphérique, au cours de laquelle la valeur de 'Artiste album' est remplacée par 'Artistes divers', Cantata remplacera l'étiquette 'Artiste' de toutes les pistes par 'Artistes divers' et l'étiquette 'Titre' de la piste par 'Artiste piste - Titre de la piste'.<hr/> Lors de la copie depuis un périphérique, Cantata vérifiera si les valeurs de 'Artiste album' et 'Artiste' sont bien 'Artistes divers'. Auquel cas, il essaiera d'extraire le véritable artiste de l'étiquette 'Titre', puis de supprimer le nom de l'artiste de l'étiquette 'Titre'.</p> + <p>Lors de la copie de pistes vers un périphérique, au cours de laquelle la valeur de 'Artiste album' est remplacée par 'Artistes divers', Cantata remplacera l'étiquette 'Artiste' de toutes les pistes par 'Artistes divers' et l'étiquette 'Titre' de la piste par 'Artiste piste - Titre de la piste'.<hr/> Lors de la copie depuis un périphérique, Cantata vérifiera si les valeurs de 'Artiste album' et 'Artiste' sont bien 'Artistes divers'. Auquel cas, il essaiera d'extraire le véritable artiste de l'étiquette 'Titre', puis de supprimer le nom de l'artiste de l'étiquette 'Titre'.</p> <p>If you enable this, then Cantata will create a cache of the device's music library. This will help to speed up subsequent library scans (as the cache file will be used instead of having to read the tags of each file.)<hr/><b>NOTE:</b> If you use another application to update the device's library, then this cache will become out-of-date. To rectify this, simply click on the 'refresh' icon in the device list. This will cause the cache file to be removed, and the contents of the device re-scanned.</p> - <p>Si vous activez cette option, Cantata créera un cache de la librairie musicale du périphérique. Cela permettra d'accélérer les analyses de la librairie (puisque le cache évitera la lecture des étiquettes de chaque fichier de la librairie.)<hr/><b>NOTE:</b> Si vous utilisez une autre application pour mettre à jour la librairie du périphérique, ce cache deviendra obsolète. Pour remédier à cela, cliquez simplement sur l'icône 'rafraîchir' dans la liste des périphériques. Cela supprimera le fichier de cache et provoquera une nouvelle analyse du contenu du périphérique.</p> + <p>Si vous activez cette option, Cantata créera un cache de la librairie musicale du périphérique. Cela permettra d'accélérer les analyses de la librairie (puisque le cache évitera la lecture des étiquettes de chaque fichier de la librairie.)<hr/><b>NOTE:</b> Si vous utilisez une autre application pour mettre à jour la librairie du périphérique, ce cache deviendra obsolète. Pour remédier à cela, cliquez simplement sur l'icône 'rafraîchir' dans la liste des périphériques. Cela supprimera le fichier de cache et provoquera une nouvelle analyse du contenu du périphérique.</p> Do not transcode - Ne pas convertir + Ne pas convertir Transcode to %1 - Convertir vers %1 + Convertir vers %1 %1 (%2 free) name (size free) - %1 (%2 libre) + %1 (%2 libre) Copy To Library - Copier vers la Librairie + Copier vers la Librairie Forget Device - Oublier le périphérique + Oublier le périphérique Add Device - Ajouter le périphérique + Ajouter le périphérique Lookup album and track details? - Voir les informations détaillées de l'album et des pistes ? + Voir les informations détaillées de l'album et des pistes ? Refresh - Rafraîchir + Rafraîchir Via CDDB - Via CDDB + Via CDDB Via MusicBrainz - Via MusicBrainz + Via MusicBrainz Which type of refresh do you wish to perform? - Quel type de rafraîchissement souhaitez-vous effectuer ? + Quel type de rafraîchissement souhaitez-vous effectuer ? Partial - Only new songs are scanned (quick) - Partiel - Seules les nouvelles pistes sont analysées (rapide) + Partiel - Seules les nouvelles pistes sont analysées (rapide) Full - All songs are rescanned (slow) - Complet - Toutes les pistes sont analysées (lent) + Complet - Toutes les pistes sont analysées (lent) Partial - Partiel + Partiel Full - Complet + Complet Are you sure you wish to delete the selected songs? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? + Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? Cette action est définitive. Are you sure you wish to forget '%1'? - Êtes-vous sûr de vouloir oublier '%1' ? + Êtes-vous sûr de vouloir oublier '%1' ? Are you sure you wish to eject Audio CD '%1 - %2'? - Êtes-vous sûr de vouloir éjecter le CD Audio '%1 - %2' ? + Êtes-vous sûr de vouloir éjecter le CD Audio '%1 - %2' ? Eject - Éjecter + Éjecter Are you sure you wish to disconnect '%1'? - Êtes-vous sûr de vouloir déconnecter '%1' ? + Êtes-vous sûr de vouloir déconnecter '%1' ? Disconnect - Déconnecter + Déconnecter Please close other dialogs first. - Veuillez fermer au préalable les autres boites de dialogue. + Veuillez fermer au préalable les autres boites de dialogue. <a href=http://en.wikipedia.org/wiki/Advanced_Audio_Coding>Advanced Audio Coding</a> (AAC) is a patented lossy codec for digital audio.<br>AAC generally achieves better sound quality than MP3 at similar bit rates. It is a reasonable choice for the iPod and some other portable music players. Feel free to redirect the english Wikipedia link to a local version, if it exists. - <a href="http://fr.wikipedia.org/wiki/Advanced_Audio_Coding">Advanced Audio Coding</a> (AAC, « Encodage Audio Avancé » en français) est un algorithme de compression audio avec perte de données ayant pour but d’offrir un meilleur ratio Qualité/débit binaire que le format plus ancien MPEG-1/2 Audio Layer 3 (plus connu sous le nom de MP3). Pour cette raison, il a été choisi par différentes firmes comme Apple ou RealNetworks. + <a href="http://fr.wikipedia.org/wiki/Advanced_Audio_Coding">Advanced Audio Coding</a> (AAC, « Encodage Audio Avancé » en français) est un algorithme de compression audio avec perte de données ayant pour but d’offrir un meilleur ratio Qualité/débit binaire que le format plus ancien MPEG-1/2 Audio Layer 3 (plus connu sous le nom de MP3). Pour cette raison, il a été choisi par différentes firmes comme Apple ou RealNetworks. Expected average bitrate for variable bitrate encoding - Taux de compression moyen estimé pour un encodage à taux variable + Taux de compression moyen estimé pour un encodage à taux variable Smaller file - Fichier plus petit + Fichier plus petit Better sound quality - Meilleure qualité audio. + Meilleure qualité audio. Ogg Vorbis - Ogg Vorbis + Ogg Vorbis Quality rating - Niveau de qualité + Niveau de qualité Opus - Opus + Opus Apple Lossless - Apple Lossless + Apple Lossless FLAC - FLAC + FLAC Compression level - Niveau de compression + Niveau de compression Faster compression - Compression rapide + Compression rapide Windows Media Audio - Windows Media Audio + Windows Media Audio Filename Scheme - Schéma de nommage + Schéma de nommage Various Artists Example album artist - Artistes Divers + Artistes Divers Wibble Example artist - Wibble + Wibble Vivaldi Example composer - Vivaldi + Vivaldi Now 5001 Example album - Now 5001 + Now 5001 Wobble Example song name - Wobble + Wobble Dance Example genre - Dance + Dance The following variables will be replaced with their corresponding meaning for each track name. - Les variables suivantes vont êtes remplacées par leurs valeurs respectives pour chaque nom de piste. + Les variables suivantes vont êtes remplacées par leurs valeurs respectives pour chaque nom de piste. <tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</em></th></tr> - <tr><th><em>Variable</em></th><th><em>Bouton</em></th><th><em>Description</em></th></tr> + <tr><th><em>Variable</em></th><th><em>Bouton</em></th><th><em>Description</em></th></tr> Updating... - Mise à jour… + Mise à jour… Reading cache - Lecture du cache + Lecture du cache %1 %2% Message percent - %1 %2% + %1 %2% Connecting to device... - Connexion au périphérique + Connexion au périphérique No devices found - Pas de périphérique trouvé + Pas de périphérique trouvé Connected to device - Connecté au périphérique + Connecté au périphérique Disconnected from device - Déconnecté du périphérique + Déconnecté du périphérique Updating folders... - Mise à jour des dossiers… + Mise à jour des dossiers… Updating files... - Mise à jour des fichiers… + Mise à jour des fichiers… Updating tracks... - Mise à jour des pistes… + Mise à jour des pistes… Not Connected - Non connecté + Non connecté %1 (Disc %2) - %1 (Disque %2) + %1 (Disque %2) No matches found in MusicBrainz - Aucun résultat trouvé dans MusicBrainz + Aucun résultat trouvé dans MusicBrainz Connection - Connexion + Connexion Music Library - Bibliothèque musicale + Bibliothèque musicale A remote device named '%1' already exists! Please choose a different name. - Un périphérique distant possède déjà le même nom '%1' + Un périphérique distant possède déjà le même nom '%1' Veuillez choisir un nom différent. Samba Share - Partage Samba + Partage Samba Samba Share (Auto-discover host and port) - Partage Samba (découverte automatique de l'hôte et du port) + Partage Samba (découverte automatique de l'hôte et du port) Secure Shell (sshfs) - Secure Shell (sshfs) + Secure Shell (sshfs) Locally Mounted Folder - Dossiers montés localement + Dossiers montés localement Available - Disponible + Disponible Not Available - Non disponible + Non disponible Failed to resolve connection details for %1 - La récupération des détails de connexion pour %1 a échoué + La récupération des détails de connexion pour %1 a échoué Connecting... - Connection… + Connection… Password prompting does not work when cantata is started from the commandline. - La boite de dialogue pour le mot de passe n'est pas disponible quand Cantata est démarré depuis une console. + La boite de dialogue pour le mot de passe n'est pas disponible quand Cantata est démarré depuis une console. No suitable ssh-askpass application installed! This is required for entering passwords. - Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. + Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. Mount point ("%1") is not empty! - Le point de montage ("%1") nest pas vide ! + Le point de montage ("%1") nest pas vide ! "sshfs" is not installed! - "sshfs" n'est pas installé ! + "sshfs" n'est pas installé ! Disconnecting... - Déconnexion… + Déconnexion… "fusermount" is not installed! - "fusermount" n'est pas installé ! + "fusermount" n'est pas installé ! Failed to connect to "%1" - La connexion à "%1" a échoué + La connexion à "%1" a échoué Failed to disconnect from "%1" - La déconnexion à "%1" a échoué + La déconnexion à "%1" a échoué Capacity Unknown - Capacité inconnue + Capacité inconnue Search i18n: file: gui/coverdialog.ui:23 i18n: ectx: property (text), widget (QPushButton, search) - Recherche + Recherche Check Items - Cocher les items + Cocher les items Uncheck Items - Décocher les items + Décocher les items Synchronize - Synchroniser + Synchroniser Device and library are in sync. - Le périphérique et la bibliothèque sont synchronisés. + Le périphérique et la bibliothèque sont synchronisés. Not Scanned - Non analysé + Non analysé (recommended) - (recommandé) + (recommandé) Empty filename. - Nom de fichier vide + Nom de fichier vide Invalid filename. (%1) - Nom de fichier invalide. (%1) + Nom de fichier invalide. (%1) Failed to save %1. - La sauvegarde de %1 a échoué. + La sauvegarde de %1 a échoué. Failed to delete rules file. (%1) - La suppression des droits sur le fichier a échoué. (%1) + La suppression des droits sur le fichier a échoué. (%1) Invalid command. (%1) - Commande invalide. (%1) + Commande invalide. (%1) Could not remove active rules link. - La suppression des règles actives ne peut être effectuée. + La suppression des règles actives ne peut être effectuée. Rules file, %1, does not exist. - Le fichier de droits, %1, n'existe pas. + Le fichier de droits, %1, n'existe pas. Incorrect arguments supplied. - L'argument renseigné est incorrect. + L'argument renseigné est incorrect. Unknown method called. - La méthode appelée est inconnue. + La méthode appelée est inconnue. Unknown error - Erreur inconnue + Erreur inconnue Start Dynamic Playlist - Lancer la liste dynamique + Lancer la liste dynamique Stop Dynamic Mode - Arrêter la liste dynamique + Arrêter la liste dynamique Dynamic Playlists - Listes de lecture dynamiques + Listes de lecture dynamiques - Rating: %1..%2 - - Note: %1..%2 + - Note: %1..%2 You need to install "perl" on your system in order for Cantata's dynamic mode to function. - Vous devez installer "perl" sur votre système pour activer le mode dynamique de Cantata. + Vous devez installer "perl" sur votre système pour activer le mode dynamique de Cantata. Failed to locate rules file - %1 - La localisation du fichier contenant les règles a échoué - %1 + La localisation du fichier contenant les règles a échoué - %1 Saving rule - Sauvegarde des règles + Sauvegarde des règles Deleting rule - Suppression des règles + Suppression des règles Awaiting response for previous command. (%1) - En attente de la réponse pour la commande précédente. (%1) + En attente de la réponse pour la commande précédente. (%1) Failed to save %1. (%2) - La sauvegarde de %1 a échoué. (%2) + La sauvegarde de %1 a échoué. (%2) Add i18n: file: dynamic/dynamicrules.ui:71 i18n: ectx: property (text), widget (QPushButton, addBtn) - Ajouter + Ajouter Edit i18n: file: dynamic/dynamicrules.ui:78 i18n: ectx: property (text), widget (QPushButton, editBtn) - Éditer + Éditer Remove i18n: file: dynamic/dynamicrules.ui:85 i18n: ectx: property (text), widget (QPushButton, removeBtn) - Supprimer + Supprimer Are you sure you wish to remove the selected rules? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? + Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? Cette action est définitive. Remove Dynamic Rules - Supprimer les règles dynamiques + Supprimer les règles dynamiques Dynamic Rule - Règle dynamique + Règle dynamique <i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i> - <i><b>ERROR</b>: L'année du début doit être inférieure à l'année de fin</i> + <i><b>ERROR</b>: L'année du début doit être inférieure à l'année de fin</i> <i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)</i> - <i><b>ERROR:</b> La fourchette de dates est trop large (limite de %1 au maximum)</i> + <i><b>ERROR:</b> La fourchette de dates est trop large (limite de %1 au maximum)</i> SimilarArtists - Artistes similaires + Artistes similaires AlbumArtist - Artiste de l'album + Artiste de l'album Include - Inclure + Inclure Exclude - Exclure + Exclure (Exact) - (Exacte) + (Exacte) Dynamic Rules - Règles dynamiques + Règles dynamiques None @@ -1356,110 +1356,110 @@ i18n: file: support/shortcutssettingswidget.ui:78 i18n: ectx: property (text), widget (QLabel, defaultShortcut) - Vide + Vide About dynamic rules - À propos des règles dynamiques + À propos des règles dynamiques Failed to save %1 - La sauvegarde de %1 a échoué + La sauvegarde de %1 a échoué A set of rules named '%1' already exists! Overwrite? - Un ensemble de règles nommé '%1' existe déjà ! + Un ensemble de règles nommé '%1' existe déjà ! Remplacer ? Overwrite Rules - Remplacer les règles + Remplacer les règles Saving %1 - Sauvegarde de %1 + Sauvegarde de %1 Deleting... - Suppression… + Suppression… Name - Nom + Nom Item Count - Nombre d'éléments + Nombre d'éléments Space Used - Espace occupé + Espace occupé Total space used: %1 - Espace occupé total: %1 + Espace occupé total: %1 Covers - Pochettes + Pochettes Scaled Covers - Pochettes redimensionnées + Pochettes redimensionnées Backdrops - Toile de fond + Toile de fond Artist Information - Informations sur l'artiste + Informations sur l'artiste Album Information - Informations sur l'album + Informations sur l'album Track Information - Informations sur la piste + Informations sur la piste Stream Listings - Liste de flux + Liste de flux Podcast Directories - Répertoires des podcasts + Répertoires des podcasts Scrobble Tracks - Scrobbler les pistes + Scrobbler les pistes Delete All - Tout supprimer + Tout supprimer Delete all '%1' items? - Supprimer les '%1' éléments ? + Supprimer les '%1' éléments ? Delete Cache Items - Supprimer tous les éléments en cache + Supprimer tous les éléments en cache Delete items from all selected categories? - Supprimer les éléments des catégories sélectionnées ? + Supprimer les éléments des catégories sélectionnées ? %1 %2 x %3 (%4) name width x height (file size) - %1 + %1 %2 x %3 (%4) @@ -1467,80 +1467,80 @@ %2 x %3 name width x height - %1 + %1 %2 x %3 Current Cover - Pochette courante + Pochette courante CoverArt Archive - Archive de CoverArt + Archive de CoverArt Image - Image + Image Downloading... - Téléchargement… + Téléchargement… Image (%1 x %2 %3%) Image (width x height zoom%) - Image (%1 x %2 %3%) + Image (%1 x %2 %3%) An image already exists for this artist, and the file is not writeable. - Une image existe déjà pour cet artiste et ne peut être remplacée. + Une image existe déjà pour cet artiste et ne peut être remplacée. A cover already exists for this album, and the file is not writeable. - Une pochette existe déjà pour cet album et ne peut être remplacée. + Une pochette existe déjà pour cet album et ne peut être remplacée. '%1' Artist Image - '%1' Image de l'artiste + '%1' Image de l'artiste '%1 - %2' Album Cover 'Artist - Album' Album Cover - '%1 - %2' Pochette d'album + '%1 - %2' Pochette d'album Failed to set cover! Could not download to temporary file! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! La pochette n'a pas pu être téléchargée vers les fichiers temporaires ! Failed to download image! - Le téléchargement de l'image a échoué ! + Le téléchargement de l'image a échoué ! Load Local Cover - Chargement d'une pochette locale + Chargement d'une pochette locale File is already in list! - Le fichier est déjà dans la liste ! + Le fichier est déjà dans la liste ! Failed to read image! - La lecture de l'image a échoué ! + La lecture de l'image a échoué ! Display - Afficher + Afficher Failed to set cover! Could not make copy! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! La copie ne peut être créée ! @@ -1548,7 +1548,7 @@ Failed to set cover! Could not backup original! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! Le fichier original ne peut être sauvegardé ! @@ -1556,13 +1556,13 @@ Failed to set cover! Could not copy file to '%1'! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! Le fichier ne peut être copié vers '%1' ! Searching... - Recherche en cours… + Recherche en cours… Name: @@ -1579,456 +1579,456 @@ i18n: file: gui/serversettings.ui:63 i18n: ectx: property (text), widget (QLabel, label_2) - Nom: + Nom: Open In File Manager - Ouvrir dans l'explorateur de fichiers + Ouvrir dans l'explorateur de fichiers Connection Established - Connexion établie + Connexion établie Connection Failed - La connexion a échoué + La connexion a échoué Grouped Albums - Albums groupés + Albums groupés Table - Tableau + Tableau Play Queue i18n: file: gui/interfacesettings.ui:128 i18n: ectx: attribute (title), widget (QWidget, tab_5) - Liste de lecture courante + Liste de lecture courante Folders - Dossiers + Dossiers Playlists - Listes de lecture + Listes de lecture Devices - UMS, MTP (e.g. Android), and AudioCDs - Périphériques - UMS, MTP (ex: Android) et CD audio + Périphériques - UMS, MTP (ex: Android) et CD audio Search (via MPD) - Rechercher (via MPD) + Rechercher (via MPD) Info - Current song information (artist, album, and lyrics) - Info - Informations de la piste courante (artiste, album et paroles) + Info - Informations de la piste courante (artiste, album et paroles) Large - Grand + Grand Small - Petit + Petit Tab-bar - Barre d'onglets + Barre d'onglets Left - Gauche + Gauche Right - Droite + Droite Top - Haut + Haut Bottom - Bas + Bas Notifications - Notifications + Notifications System default - Valeurs par défaut + Valeurs par défaut Album, Artist, Year - Album, Artiste, Année + Album, Artiste, Année Album, Year, Artist - Album, Année, Artiste + Album, Année, Artiste Artist, Album, Year - Artiste, Album, Année + Artiste, Album, Année Artist, Year, Album - Artiste, Année, Album + Artiste, Année, Album Year, Album, Artist - Année, Album, Artiste + Année, Album, Artiste Year, Artist, Album - Année, Artiste, Album + Année, Artiste, Album Configure Cantata... - Configurer Cantata… + Configurer Cantata… Preferences... - Préférences... + Préférences... Quit - Quitter + Quitter About Cantata... Qt-only - À propos de Cantata… + À propos de Cantata… Show Window - Afficher la fenêtre + Afficher la fenêtre Server information... - Informations sur le serveur… + Informations sur le serveur… Refresh Database - Rafraîchir la base de données + Rafraîchir la base de données Connect i18n: file: gui/initialsettingswizard.ui:472 i18n: ectx: property (text), widget (QPushButton, connectButton) - Connecter + Connecter Collection - Collection + Collection Outputs - Sorties + Sorties Stop After Track - Arrêter après la piste + Arrêter après la piste Add To Stored Playlist - Ajouter à la liste sauvegardée + Ajouter à la liste sauvegardée Add Stream URL - Ajouter l'URL de flux + Ajouter l'URL de flux Clear - Nettoyer + Nettoyer Center On Current Track - Centrer sur la piste courante + Centrer sur la piste courante Expanded Interface - Interface étendue + Interface étendue Show Current Song Information - Afficher les informations de la piste courante + Afficher les informations de la piste courante Full Screen - Plein écran + Plein écran Random - Aléatoire + Aléatoire Repeat - Répéter + Répéter Single - Single + Single When 'Single' is activated, playback is stopped after current song, or song is repeated if 'Repeat' is enabled. - Quand le mode 'Single' est activé, la lecture est stoppée après la piste courante ou la piste est répétée si le mode 'Répéter' est activé. + Quand le mode 'Single' est activé, la lecture est stoppée après la piste courante ou la piste est répétée si le mode 'Répéter' est activé. Consume - Consommer + Consommer When consume is activated, a song is removed from the play queue after it has been played. - Quand le mode 'Consommer' est activé, la piste courante est retirée de la liste de lecture après sa lecture. + Quand le mode 'Consommer' est activé, la piste courante est retirée de la liste de lecture après sa lecture. Find in Play Queue - Trouver dans la liste de lecture + Trouver dans la liste de lecture Play Stream - Lire le flux + Lire le flux Locate In Library - Trouver dans la bibliothèque + Trouver dans la bibliothèque Expand All - Tout étendre + Tout étendre Collapse All - Tout replier + Tout replier Devices - Périphériques + Périphériques Info - Infos + Infos Show Menubar - Afficher la barre de menu + Afficher la barre de menu &Music - &Musique + &Musique &Edit - &Éditer + &Éditer &View - &Voir + &Voir &Queue - &File + &File &Settings - &Paramètres + &Paramètres &Help - &Aide + &Aide Set Rating - Donner une note + Donner une note No Rating - Pas de note + Pas de note Failed to locate any songs matching the dynamic playlist rules. - Aucune piste respectant les choix définis pour la liste de lecture dynamique n'a été trouvée. + Aucune piste respectant les choix définis pour la liste de lecture dynamique n'a été trouvée. Connecting to %1 - Connecté à %1 + Connecté à %1 Refresh MPD Database? - Rafraîchir la base de données MPD ? + Rafraîchir la base de données MPD ? About Cantata Qt-only - À propos de Cantata + À propos de Cantata Context view backdrops courtesy of <a href="http://www.fanart.tv">FanArt.tv</a> Qt-only - Les images de fond sont issues de <a href="http://www.fanart.tv">FanArt.tv</a> + Les images de fond sont issues de <a href="http://www.fanart.tv">FanArt.tv</a> Context view metadata courtesy of <a href="http://www.wikipedia.org">Wikipedia</a> and <a href="http://www.last.fm">Last.fm</a> Qt-only - Les informations de lecture sont issues de <a href="http://www.wikipedia.org">Wikipedia</a> et <a href="http://www.last.fm">Last.fm</a> + Les informations de lecture sont issues de <a href="http://www.wikipedia.org">Wikipedia</a> et <a href="http://www.last.fm">Last.fm</a> Please consider uploading your own music fan-art to <a href="http://www.fanart.tv">FanArt.tv</a> - N'hésitez pas à envoyer vos propres images fan-art sur <a href="http://www.fanart.tv">FanArt.tv</a> + N'hésitez pas à envoyer vos propres images fan-art sur <a href="http://www.fanart.tv">FanArt.tv</a> A Podcast is currently being downloaded Quitting now will abort the download. - Un podcast est actuellement en téléchargement + Un podcast est actuellement en téléchargement Le téléchargement sera abandonné si vous quittez maintenant. Abort download and quit - Abandonner et quitter + Abandonner et quitter Enabled: %1 - Activé: %1 + Activé: %1 Disabled: %1 - Désactivé: %1 + Désactivé: %1 Server Information - Informations du serveur + Informations du serveur <tr><td colspan="2"><b>Server</b></td></tr><tr><td align="right">Protocol:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Uptime:&nbsp;</td><td>%4</td></tr><tr><td align="right">Playing:&nbsp;</td><td>%5</td></tr><tr><td align="right">Handlers:&nbsp;</td><td>%6</td></tr><tr><td align="right">Tags:&nbsp;</td><td>%7</td></tr> - <tr><td colspan="2"><b>Serveur</b></td></tr><tr><td align="right">Protocole:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Durée de fonctionnement:&nbsp;</td><td>%4</td></tr><tr><td align="right">Temps de lecture:&nbsp;</td><td>%5</td></tr><tr><td align="right">Formats:&nbsp;</td><td>%6</td></tr><tr><td align="right">Étiquettes:&nbsp;</td><td>%7</td></tr> + <tr><td colspan="2"><b>Serveur</b></td></tr><tr><td align="right">Protocole:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Durée de fonctionnement:&nbsp;</td><td>%4</td></tr><tr><td align="right">Temps de lecture:&nbsp;</td><td>%5</td></tr><tr><td align="right">Formats:&nbsp;</td><td>%6</td></tr><tr><td align="right">Étiquettes:&nbsp;</td><td>%7</td></tr> <tr><td colspan="2"><b>Database</b></td></tr><tr><td align="right">Artists:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Songs:&nbsp;</td><td>%3</td></tr><tr><td align="right">Duration:&nbsp;</td><td>%4</td></tr><tr><td align="right">Updated:&nbsp;</td><td>%5</td></tr> - <tr><td colspan="2"><b>Base de données</b></td></tr><tr><td align="right">Artistes:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Pistes:&nbsp;</td><td>%3</td></tr><tr><td align="right">Durée totale:&nbsp;</td><td>%4</td></tr><tr><td align="right">Mise à jour:&nbsp;</td><td>%5</td></tr> + <tr><td colspan="2"><b>Base de données</b></td></tr><tr><td align="right">Artistes:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Pistes:&nbsp;</td><td>%3</td></tr><tr><td align="right">Durée totale:&nbsp;</td><td>%4</td></tr><tr><td align="right">Mise à jour:&nbsp;</td><td>%5</td></tr> Cantata (%1) - Cantata (%1) + Cantata (%1) MPD reported the following error: %1 - MPD a retourné l'erreur suivante: %1 + MPD a retourné l'erreur suivante: %1 Cantata - Cantata + Cantata Playback stopped - La lecture a été interrompue + La lecture a été interrompue Remove all songs from play queue? - Supprimer toutes les pistes de la liste de lecture ? + Supprimer toutes les pistes de la liste de lecture ? Priority - Priorité + Priorité Enter priority (0..255): - Saisir une priorité (0…255): + Saisir une priorité (0…255): Playlist Name - Nom de la liste de lecture + Nom de la liste de lecture Enter a name for the playlist: - Entrez un nom pour la liste de lecture: + Entrez un nom pour la liste de lecture: '%1' is used to store favorite streams, please choose another name. - Le nom '%1' est déjà utilisé pour enregistrer vos flux favoris, veuillez choisir un autre nom. + Le nom '%1' est déjà utilisé pour enregistrer vos flux favoris, veuillez choisir un autre nom. A playlist named '%1' already exists! Add to that playlist? - La liste de lecture '%1' existe déjà ! + La liste de lecture '%1' existe déjà ! Ajouter à cette liste de lecture ? Existing Playlist - Liste de lecture existante + Liste de lecture existante Auto - Automatique + Automatique <i>Connected to %1<br/>The entries below apply to the currently connected MPD collection.</i> - <i>Connecté à %1<br/>Les éléments ci-dessous sont liés à la collection MPD courante.</i> + <i>Connecté à %1<br/>Les éléments ci-dessous sont liés à la collection MPD courante.</i> <i>Not Connected!<br/>The entries below cannot be modified, as Cantata is not connected to MPD.</i> i18n: file: gui/playbacksettings.ui:94 i18n: ectx: property (text), widget (QLabel, messageLabel) - <i>Non connecté !<br/>Les entrées ci-dessous ne peuvent être modifiées car Cantata n'est pas connecté à MPD.</i> + <i>Non connecté !<br/>Les entrées ci-dessous ne peuvent être modifiées car Cantata n'est pas connecté à MPD.</i> Rename - Renommer + Renommer Remove Duplicates - Supprimer les doublons + Supprimer les doublons Are you sure you wish to remove the selected playlists? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les listes de lecture sélectionnées ? + Êtes-vous sûr de vouloir supprimer les listes de lecture sélectionnées ? Ce choix est définitif. Remove Playlists - Supprimer les listes de lecture + Supprimer les listes de lecture A playlist named '%1' already exists! Overwrite? - Une liste nommée '%1' existe déjà ! + Une liste nommée '%1' existe déjà ! Remplacer ? Overwrite Playlist - Remplacer la liste de lecture + Remplacer la liste de lecture Rename Playlist - Renommer la liste de lecture + Renommer la liste de lecture Enter new name for playlist: - Entrez un nouveau nom pour la liste de lecture: + Entrez un nouveau nom pour la liste de lecture: Cannot add songs from '%1' to '%2' - Les pistes de '%1' à '%2' ne peuvent être ajoutées + Les pistes de '%1' à '%2' ne peuvent être ajoutées 1 Track - + 1 Piste %1 Pistes @@ -2036,7 +2036,7 @@ 1 Track (%2) - + 1 Piste (%2) %1 Pistes (%2) @@ -2044,7 +2044,7 @@ 1 Album - + 1 Album %1 Albums @@ -2052,7 +2052,7 @@ 1 Artist - + 1 Artiste %1 Artistes @@ -2060,7 +2060,7 @@ 1 Stream - + 1 Flux %1 Flux @@ -2068,7 +2068,7 @@ 1 Entry - + %1 Entrée %1 Entrées @@ -2076,7 +2076,7 @@ 1 Rule - + %1 Règle %1 Règles @@ -2084,7 +2084,7 @@ 1 Podcast - + 1 Podcast %1 Podcasts @@ -2092,7 +2092,7 @@ 1 Episode - + 1 Épisode %1 Épisodes @@ -2100,7 +2100,7 @@ 1 Update available - + 1 Mise à jour disponible %1 Mises à jour disponibles @@ -2108,69 +2108,69 @@ Collection Settings - Paramètres de la collection + Paramètres de la collection Playback i18n: file: gui/playbacksettings.ui:29 i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox) - Lecture + Lecture Playback Settings - Paramètres de lecture + Paramètres de lecture Interface - Interface + Interface Interface Settings - Paramètres de l'interface + Paramètres de l'interface Scrobbling - Scrobblage + Scrobblage Scrobbling Settings - Paramètres de scrobblage + Paramètres de scrobblage Audio CD Settings - Paramètres des CD Audio + Paramètres des CD Audio Proxy - Proxy + Proxy Proxy Settings Qt-only - Paramètres du proxy + Paramètres du proxy Shortcuts Qt-only - Raccourcis + Raccourcis Keyboard Shortcut Settings Qt-only - Raccourcis clavier + Raccourcis clavier Cache - Cache + Cache Cached Items - Éléments dans le cache + Éléments dans le cache Cantata Preferences - Préférences de Cantata + Préférences de Cantata Configure @@ -2187,7 +2187,7 @@ i18n: file: gui/coverdialog.ui:37 i18n: ectx: property (toolTip), widget (MenuButton, configureButton) - Configurer + Configurer Composer: @@ -2204,11 +2204,11 @@ i18n: file: tags/tageditor.ui:93 i18n: ectx: property (text), widget (StateLabel, composerLabel) - Compositeur: + Compositeur: Performer: - Interprète: + Interprète: Genre: @@ -2221,7 +2221,7 @@ i18n: file: tags/tageditor.ui:145 i18n: ectx: property (text), widget (StateLabel, genreLabel) - Genre: + Genre: Comment: @@ -2234,23 +2234,23 @@ i18n: file: tags/tageditor.ui:195 i18n: ectx: property (text), widget (StateLabel, commentLabel) - Commentaire: + Commentaire: Date: - Date: + Date: Modified: - Modifié: + Modifié: Any: - Tous: + Tous: No tracks found. - Pas de pistes trouvées: + Pas de pistes trouvées: Host: @@ -2275,429 +2275,429 @@ i18n: file: network/proxysettings.ui:63 i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel) - Hôte: + Hôte: Which type of collection do you wish to connect to? - À quel type de collection souhaitez-vous vous connecter ? + À quel type de collection souhaitez-vous vous connecter ? <i><b>NOTE:</b> %1</i> - <i><b>NOTE:</b> %1</i> + <i><b>NOTE:</b> %1</i> Add Collection - Ajouter une Collection + Ajouter une Collection Standard - Standard + Standard Basic - Basique + Basique Delete '%1'? - Supprimer '%1' ? + Supprimer '%1' ? Delete - Supprimer + Supprimer New Collection %1 - Nouvelle collection %1 + Nouvelle collection %1 Default - Par défaut + Par défaut Previous Track - Piste précédente + Piste précédente Next Track - Piste suivante + Piste suivante Play/Pause - Lecture/Pause + Lecture/Pause Stop After Current Track - Arrêter après cette piste + Arrêter après cette piste Increase Volume - Augmenter le volume + Augmenter le volume Decrease Volume - Baisser le volume + Baisser le volume Save As - Enregistrer en tant que + Enregistrer en tant que Add With Priority - Ajouter en priorité + Ajouter en priorité Set Priority - Définir la priorité + Définir la priorité Highest Priority (255) - Priorité la plus forte (255) + Priorité la plus forte (255) High Priority (200) - Priorité forte (200) + Priorité forte (200) Medium Priority (125) - Priorité moyenne (125) + Priorité moyenne (125) Low Priority (50) - Priorité faible (50) + Priorité faible (50) Default Priority (0) - Priorité par défaut (0) + Priorité par défaut (0) Custom Priority... - Priorité personnalisée… + Priorité personnalisée… Add To Playlist - Ajouter à la liste de lecture + Ajouter à la liste de lecture Organize Files - Organiser les fichiers + Organiser les fichiers Edit Track Information - Éditer les informations de la piste + Éditer les informations de la piste Set Image - Appliquer l'image + Appliquer l'image Find - Rechercher + Rechercher Add To Play Queue - Ajouter à la liste courante + Ajouter à la liste courante Now playing - En lecture + En lecture Play - Lecture + Lecture Pause - Pause + Pause Cue Sheet - Liste Cue + Liste Cue Playlist - Liste de lecture + Liste de lecture Configure Device - Configurer le périphérique + Configurer le périphérique Refresh Device - Rafraîchir le périphérique + Rafraîchir le périphérique Connect Device - Connecter le périphérique + Connecter le périphérique Disconnect Device - Déconnecter le périphérique + Déconnecter le périphérique Edit CD Details - Éditer les propriétés du CD + Éditer les propriétés du CD No Devices Attached - Pas de périphérique connecté + Pas de périphérique connecté Not logged in - Non connecté + Non connecté Logged in - Connecté + Connecté No subscriptions - Pas de souscriptions + Pas de souscriptions You do not have an active subscription - Vous n'avez aucune souscription active + Vous n'avez aucune souscription active Logged in (expiry:%1) - Connecté (expiration:%1) + Connecté (expiration:%1) Session expired - Session expirée + Session expirée %1 by %2 Album by Artist - %1 par %2 + %1 par %2 New Playlist... - Nouvelle liste de lecture… + Nouvelle liste de lecture… Smart Playlist - Liste de lecture intelligente + Liste de lecture intelligente Length - Durée + Durée Disc - Disque + Disque Rating - Note + Note Undo - Annuler + Annuler Redo - Refaire + Refaire Shuffle - Mélanger + Mélanger Sort By - Trier par + Trier par Album Artist i18n: file: devices/filenameschemedialog.ui:82 i18n: ectx: property (text), widget (QPushButton, albumArtist) - Artiste Album + Artiste Album Track Title i18n: file: devices/filenameschemedialog.ui:122 i18n: ectx: property (text), widget (QPushButton, trackTitle) - Titre de la piste + Titre de la piste TuneIn - TuneIn + TuneIn ShoutCast - ShoutCast + ShoutCast Dirble - Dirble + Dirble Not Loaded - Non chargé + Non chargé Loading... - Chargement… + Chargement… Bookmarks - Favoris + Favoris IceCast - IceCast + IceCast Favorites - Favoris + Favoris Bookmark Category - Catégorie des favoris + Catégorie des favoris Add Stream To Favorites - Ajouter le flux aux favoris + Ajouter le flux aux favoris Streams - Flux + Flux Unknown - Inconnu + Inconnu "%1" name (host) - "%1" + "%1" "%1" (%2:%3) name (host:port) - "%1" (%2:%3) + "%1" (%2:%3) Connection to %1 failed - La connexion à %1 a échoué + La connexion à %1 a échoué Connection to %1 failed - please check your proxy settings - La connexion à %1 a échoué - Veuillez vérifier votre configuration proxy + La connexion à %1 a échoué - Veuillez vérifier votre configuration proxy Connection to %1 failed - incorrect password - La connexion à %1 a échoué - mot de passe incorrect + La connexion à %1 a échoué - mot de passe incorrect Failed to send command to %1 - not connected - L'envoie de la commande à %1 a échoué - non connecté + L'envoie de la commande à %1 a échoué - non connecté Failed to load. Please check user "mpd" has read permission. - Le chargement a échoué. Veuillez vérifier si "mpd" a les permissions de lecture. + Le chargement a échoué. Veuillez vérifier si "mpd" a les permissions de lecture. Failed to load. MPD can only play local files if connected via a local socket. - Le chargement a échoué. MPD peut lire les pistes locales uniquement s'il est connecté à un socket local. + Le chargement a échoué. MPD peut lire les pistes locales uniquement s'il est connecté à un socket local. Failed to send command. Disconnected from %1 - L'envoie de la commande a échoué. Déconnecté de %1 + L'envoie de la commande a échoué. Déconnecté de %1 Failed to rename <b>%1</b> to <b>%2</b> - Le renommage de <b>%1</b> à <b>%2</b> a échoué + Le renommage de <b>%1</b> à <b>%2</b> a échoué Failed to save <b>%1</b> - La sauvegarde de <b>%1</b> a échoué + La sauvegarde de <b>%1</b> a échoué You cannot add parts of a cue sheet to a playlist! - Vous ne pouvez pas ajouter des parties d'un fichier Cue à une liste de lecture ! + Vous ne pouvez pas ajouter des parties d'un fichier Cue à une liste de lecture ! You cannot add a playlist to another playlist! - Il est impossible d'ajouter une liste de lecture dans une autre ! + Il est impossible d'ajouter une liste de lecture dans une autre ! Failed to send '%1' to %2. Please check %2 is registered with MPD. - L'envoie de '%1' à %2 a échoué. Veuillez vérifier si %2 est présent dans MPD. + L'envoie de '%1' à %2 a échoué. Veuillez vérifier si %2 est présent dans MPD. Single Tracks i18n: file: gui/interfacesettings.ui:540 i18n: ectx: property (title), widget (QGroupBox, groupBox_3) - Piste unique + Piste unique Personal - Personnel + Personnel Various Artists - Artistes divers + Artistes divers <b>%1</b> on <b>%2</b> Song on Album - <b>%1</b> sur <b>%2</b> + <b>%1</b> sur <b>%2</b> <b>%1</b> by <b>%2</b> on <b>%3</b> Song by Artist on Album - <b>%1</b> par <b>%2</b> sur <b>%3</b> + <b>%1</b> par <b>%2</b> sur <b>%3</b> No proxy - Pas de proxy + Pas de proxy Use the system proxy settings - Utiliser les paramètres proxy du système + Utiliser les paramètres proxy du système Manual proxy configuration - Configuration manuelle du proxy + Configuration manuelle du proxy Jamendo Settings - Paramètres Jamendo + Paramètres Jamendo MP3 - MP3 + MP3 Ogg - Ogg + Ogg Streaming format: - Format du flux: + Format du flux: Streaming - Flux continu + Flux continu MP3 128k - MP3 128K + MP3 128K MP3 VBR - MP3 VBR + MP3 VBR WAV - WAV + WAV Magnatune Settings - Paramètres Magnatune + Paramètres Magnatune Username: @@ -2714,7 +2714,7 @@ i18n: file: streams/digitallyimportedsettings.ui:51 i18n: ectx: property (text), widget (BuddyLabel, label_2) - Identifiant: + Identifiant: Password: @@ -2747,228 +2747,228 @@ i18n: file: streams/digitallyimportedsettings.ui:64 i18n: ectx: property (text), widget (BuddyLabel, label_3) - Mot de passe: + Mot de passe: Membership: - Adhésion: + Adhésion: Downloads: - Téléchargements: + Téléchargements: Failed to parse - L'analyse a échoué + L'analyse a échoué Failed to download - Le téléchargement a échoué + Le téléchargement a échoué RSS: - RSS: + RSS: Website: - Site web: + Site web: Podcast details - Détails du podcast + Détails du podcast Select a podcast to display its details - Choisissez un podcast pour afficher ses informations complémentaires + Choisissez un podcast pour afficher ses informations complémentaires Enter search term... - Entrez les termes de la recherche… + Entrez les termes de la recherche… Failed to fetch podcasts from %1 - La récupération des podcasts depuis %1 a échoué + La récupération des podcasts depuis %1 a échoué Failed to download directory listing - La récupération de la liste des dossiers a échoué + La récupération de la liste des dossiers a échoué Failed to parse directory listing - L'analyse de la liste des dossiers a échoué + L'analyse de la liste des dossiers a échoué URL - URL + URL Enter podcast URL... - Entrer l'URL du podcast + Entrer l'URL du podcast Load - Charger + Charger Enter podcast URL below, and press 'Load' - Veuillez entrer l'URL du podcast ci-dessous, et cliquez sur 'Charger' + Veuillez entrer l'URL du podcast ci-dessous, et cliquez sur 'Charger' Invalid URL! - URL Invalide ! + URL Invalide ! Subscribe - Souscrire + Souscrire Enter URL - Entrer l'URL + Entrer l'URL Search %1 - Rechercher %1 + Rechercher %1 Search for podcasts on %1 - Recherche de podcasts sur %1 + Recherche de podcasts sur %1 Add Podcast Subscription - Ajouter la souscription au podcast + Ajouter la souscription au podcast Browse %1 - Parcourir %1 + Parcourir %1 Browse %1 podcasts - Parcourir les podcasts de %1 + Parcourir les podcasts de %1 You are already subscribed to this podcast! - Vous êtes désormais enregistré sur ce podcast! + Vous êtes désormais enregistré sur ce podcast! Subscription added - Souscription ajoutée + Souscription ajoutée %1 (%2) podcast name (num unplayed episodes) - %1 (%2) + %1 (%2) (Downloading: %1%) - (Téléchargement: %1%) + (Téléchargement: %1%) Failed to parse %1 - L'analyse de %1 a échoué + L'analyse de %1 a échoué Failed to download %1 - Le téléchargement de %1 a échoué + Le téléchargement de %1 a échoué Check for new episodes: - Vérifier l'existence de nouveaux épisodes: + Vérifier l'existence de nouveaux épisodes: Download episodes to: - Télécharger les épisodes vers: + Télécharger les épisodes vers: Download automatically: - Télécharger automatiquement: + Télécharger automatiquement: Podcast Settings - Paramètres des podcasts: + Paramètres des podcasts: Manually - Manuellement + Manuellement Every 15 minutes - Toutes les 15 minutes + Toutes les 15 minutes Every 30 minutes - Toutes les 30 minutes + Toutes les 30 minutes Every hour - Toutes heures + Toutes heures Every 2 hours - Toutes les 2 heures + Toutes les 2 heures Every 6 hours - Toutes les 6 heures + Toutes les 6 heures Every 12 hours - Toutes les 12 heures + Toutes les 12 heures Every day - Chaque jour + Chaque jour Every week - Chaque semaine + Chaque semaine Don't automatically download episodes - Ne pas télécharger automatiquement les épisodes + Ne pas télécharger automatiquement les épisodes Latest episode - Dernier épisode + Dernier épisode Latest %1 episodes - %1 derniers épisodes + %1 derniers épisodes All episodes - Tous les épisodes + Tous les épisodes Add Subscription - Ajouter une souscription + Ajouter une souscription Remove Subscription - Supprimer la souscription + Supprimer la souscription Unsubscribe from '%1'? - Se désabonner de '%1' ? + Se désabonner de '%1' ? Do you wish to download the selected podcast episodes? - Souhaitez-vous télécharger les épisodes podcast sélectionnés ? + Souhaitez-vous télécharger les épisodes podcast sélectionnés ? Cancel podcast episode downloads (both current and any that are queued)? - Annuler le téléchargement des épisodes (y compris ceux en téléchargement et en attente) ? + Annuler le téléchargement des épisodes (y compris ceux en téléchargement et en attente) ? Do you wish to the delete downloaded files of the selected podcast episodes? - Souhaitez vous supprimer les fichiers téléchargés des podcasts sélectionnés ? + Souhaitez vous supprimer les fichiers téléchargés des podcasts sélectionnés ? Do you wish to mark the selected podcast episodes as new? - Souhaitez vous définir les podcasts sélectionnés comme nouveaux ? + Souhaitez vous définir les podcasts sélectionnés comme nouveaux ? Do you wish to mark the selected podcast episodes as listened? - Souhaitez vous définir les podcasts sélectionnés comme écoutés ? + Souhaitez vous définir les podcasts sélectionnés comme écoutés ? Background Image @@ -2981,14 +2981,14 @@ i18n: file: gui/interfacesettings.ui:207 i18n: ectx: property (title), widget (QGroupBox, groupBox) - Image de fond + Image de fond Artist image i18n: file: context/othersettings.ui:39 i18n: ectx: property (text), widget (QRadioButton, contextBackdrop_artist) - Image de l'artiste + Image de l'artiste Custom image: @@ -3001,7 +3001,7 @@ i18n: file: gui/interfacesettings.ui:227 i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_custom) - Image personnalisée + Image personnalisée Blur: @@ -3014,7 +3014,7 @@ i18n: file: gui/interfacesettings.ui:247 i18n: ectx: property (text), widget (QLabel, label_4b) - Flou: + Flou: 10px @@ -3027,7 +3027,7 @@ i18n: file: gui/interfacesettings.ui:293 i18n: ectx: property (text), widget (QLabel, playQueueBackgroundBlurLabel) - 10px + 10px Opacity: @@ -3040,7 +3040,7 @@ i18n: file: gui/interfacesettings.ui:305 i18n: ectx: property (text), widget (QLabel, label_4) - Opacité: + Opacité: 40% @@ -3053,7 +3053,7 @@ i18n: file: gui/interfacesettings.ui:351 i18n: ectx: property (text), widget (QLabel, playQueueBackgroundOpacityLabel) - 40% + 40% no-c-format @@ -3061,7 +3061,7 @@ i18n: file: context/othersettings.ui:177 i18n: ectx: property (specialValueText), widget (QSpinBox, contextSwitchTime) - Désactiver le changement automatique + Désactiver le changement automatique ms @@ -3074,49 +3074,49 @@ i18n: file: gui/playbacksettings.ui:51 i18n: ectx: property (suffix), widget (QSpinBox, stopFadeDuration) - ms + ms Dark background i18n: file: context/othersettings.ui:193 i18n: ectx: property (text), widget (QCheckBox, contextDarkBackground) - Fond sombre + Fond sombre Always collapse into a single pane i18n: file: context/othersettings.ui:203 i18n: ectx: property (text), widget (QCheckBox, contextAlwaysCollapsed) - Toujours regrouper en un seul panneau + Toujours regrouper en un seul panneau Only show basic wikipedia text i18n: file: context/othersettings.ui:213 i18n: ectx: property (text), widget (QCheckBox, wikipediaIntroOnly) - N'afficher que le texte Wikipédia de base + N'afficher que le texte Wikipédia de base Available: i18n: file: context/togglelist.ui:17 i18n: ectx: property (text), widget (QLabel, label_2) - Disponible: + Disponible: Selected: i18n: file: context/togglelist.ui:24 i18n: ectx: property (text), widget (QLabel, label_3) - Sélectionner le fichier: + Sélectionner le fichier: Copy songs from: i18n: file: devices/actiondialog.ui:180 i18n: ectx: property (text), widget (QLabel, label) - Copier les pistes depuis: + Copier les pistes depuis: (Needs configuring) @@ -3129,42 +3129,42 @@ i18n: file: devices/actiondialog.ui:264 i18n: ectx: property (text), widget (QLabel, configureDestLabel) - (Configuration nécessaire) + (Configuration nécessaire) Copy songs to: i18n: file: devices/actiondialog.ui:233 i18n: ectx: property (text), widget (QLabel, label_3) - Copier les pistes vers: + Copier les pistes vers: Destination format: i18n: file: devices/actiondialog.ui:296 i18n: ectx: property (text), widget (QLabel, codecLabel) - Fichier de destination: + Fichier de destination: Overwrite songs i18n: file: devices/actiondialog.ui:310 i18n: ectx: property (text), widget (QCheckBox, overwrite) - Remplacer les chansons + Remplacer les chansons To copy: i18n: file: devices/actiondialog.ui:317 i18n: ectx: property (text), widget (QLabel, songCountLabel) - À copier: + À copier: Album Details i18n: file: devices/albumdetails.ui:26 i18n: ectx: property (title), widget (QGroupBox, groupBox) - Détails de l'album + Détails de l'album Year: @@ -3177,77 +3177,77 @@ i18n: file: tags/tageditor.ui:158 i18n: ectx: property (text), widget (StateLabel, yearLabel) - Année: + Année: Disc: i18n: file: devices/albumdetails.ui:102 i18n: ectx: property (text), widget (BuddyLabel, label_6) - Disque: + Disque: Single artist i18n: file: devices/albumdetails.ui:115 i18n: ectx: property (text), widget (QCheckBox, singleArtist) - Piste unique: + Piste unique: Album and Track Information Retrieval i18n: file: devices/audiocdsettings.ui:29 i18n: ectx: property (title), widget (QGroupBox, groupBox) - Récupérer les informations de l'album et des pistes + Récupérer les informations de l'album et des pistes Initially look up via: i18n: file: devices/audiocdsettings.ui:38 i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel) - Vérifier initialement via: + Vérifier initialement via: CDDB Host: i18n: file: devices/audiocdsettings.ui:51 i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel) - Hôte CDDB: + Hôte CDDB: CDDB Port: i18n: file: devices/audiocdsettings.ui:64 i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel) - Port CDDB: + Port CDDB: Lookup information as soon as CD is inserted i18n: file: devices/audiocdsettings.ui:84 i18n: ectx: property (text), widget (QCheckBox, cdAuto) - Récupérer les informations dès l’insertion d'un CD + Récupérer les informations dès l’insertion d'un CD Audio Extraction i18n: file: devices/audiocdsettings.ui:94 i18n: ectx: property (title), widget (QGroupBox, groupBox_2) - Extraction audio + Extraction audio Never skip on read error i18n: file: devices/audiocdsettings.ui:107 i18n: ectx: property (text), widget (QCheckBox, paranoiaNeverSkip) - Ne jamais sauter les erreurs de lecture + Ne jamais sauter les erreurs de lecture These settings are only valid, and editable, when the device is connected. i18n: file: devices/devicepropertieswidget.ui:20 i18n: ectx: property (text), widget (PlainNoteLabel, remoteDeviceNote) - Ces paramètres ne sont valables et éditables que quand le périphérique est connecté. + Ces paramètres ne sont valables et éditables que quand le périphérique est connecté. Music folder: @@ -3272,49 +3272,49 @@ i18n: file: gui/serversettings.ui:230 i18n: ectx: property (text), widget (BuddyLabel, dirLabel_2) - Dossier musical: + Dossier musical: Copy album covers as: i18n: file: devices/devicepropertieswidget.ui:58 i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel) - Copier la pochette en tant que: + Copier la pochette en tant que: Maximum cover size: i18n: file: devices/devicepropertieswidget.ui:75 i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel) - Taille maximum des pochettes: + Taille maximum des pochettes: Default volume: i18n: file: devices/devicepropertieswidget.ui:95 i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel) - Volume par défaut + Volume par défaut 'Various Artists' workaround i18n: file: devices/devicepropertieswidget.ui:102 i18n: ectx: property (text), widget (QCheckBox, fixVariousArtists) - Solution de contournement pour 'Artistes divers' + Solution de contournement pour 'Artistes divers' Automatically scan music when attached i18n: file: devices/devicepropertieswidget.ui:109 i18n: ectx: property (text), widget (QCheckBox, autoScan) - Analyser automatiquement les pistes + Analyser automatiquement les pistes Use cache i18n: file: devices/devicepropertieswidget.ui:116 i18n: ectx: property (text), widget (QCheckBox, useCache) - Utiliser le cache + Utiliser le cache Filenames @@ -3327,7 +3327,7 @@ i18n: file: tags/trackorganiser.ui:25 i18n: ectx: property (title), widget (QGroupBox, optionsBox) - Nom des fichiers + Nom des fichiers Filename scheme: @@ -3340,7 +3340,7 @@ i18n: file: tags/trackorganiser.ui:61 i18n: ectx: property (text), widget (BuddyLabel, label_6) - Schéma de nommage: + Schéma de nommage: Use only ASCII characters @@ -3353,7 +3353,7 @@ i18n: file: tags/trackorganiser.ui:78 i18n: ectx: property (text), widget (QCheckBox, asciiOnly) - Utiliser seulement des caractères ASCII + Utiliser seulement des caractères ASCII Replace spaces with underscores @@ -3366,7 +3366,7 @@ i18n: file: tags/trackorganiser.ui:85 i18n: ectx: property (text), widget (QCheckBox, replaceSpaces) - Remplacer les espaces avec des tirets-bas + Remplacer les espaces avec des tirets-bas Append 'The' to artist names @@ -3379,140 +3379,140 @@ i18n: file: tags/trackorganiser.ui:92 i18n: ectx: property (text), widget (QCheckBox, ignoreThe) - Ajouter 'The' aux nom des artistes + Ajouter 'The' aux nom des artistes Transcoding i18n: file: devices/devicepropertieswidget.ui:205 i18n: ectx: property (title), widget (QGroupBox, transcoderFrame) - Transcodage + Transcodage Only transcode if source file is of a different format i18n: file: devices/devicepropertieswidget.ui:214 i18n: ectx: property (text), widget (QCheckBox, transcoderWhenDifferent) - Convertir seulement si le fichier source est dans un format différent + Convertir seulement si le fichier source est dans un format différent Example: i18n: file: devices/filenameschemedialog.ui:38 i18n: ectx: property (text), widget (QLabel, label_album_example) - Exemple: + Exemple: About filename schemes i18n: file: devices/filenameschemedialog.ui:67 i18n: ectx: property (text), widget (UrlLabel, help) - À propos du schéma de nommage + À propos du schéma de nommage The artist of the album. For most albums, this will be the same as the <i>Track Artist.</i> For compilations, this will often be <i>Various Artists.</i> i18n: file: devices/filenameschemedialog.ui:79 i18n: ectx: property (toolTip), widget (QPushButton, albumArtist) - L'artiste de l'album. Pour la plupart des albums, il aura la même valeur que <i>l'artiste des pistes</i>. Pour les compilations, il sera souvent défini comme <i>Artistes Divers</i>. + L'artiste de l'album. Pour la plupart des albums, il aura la même valeur que <i>l'artiste des pistes</i>. Pour les compilations, il sera souvent défini comme <i>Artistes Divers</i>. The name of the album. i18n: file: devices/filenameschemedialog.ui:89 i18n: ectx: property (toolTip), widget (QPushButton, albumTitle) - Le nom de l'album. + Le nom de l'album. Album Title i18n: file: devices/filenameschemedialog.ui:92 i18n: ectx: property (text), widget (QPushButton, albumTitle) - Titre de l'album + Titre de l'album The composer. i18n: file: devices/filenameschemedialog.ui:99 i18n: ectx: property (toolTip), widget (QPushButton, composer) - Le compositeur + Le compositeur The artist of each track. i18n: file: devices/filenameschemedialog.ui:109 i18n: ectx: property (toolTip), widget (QPushButton, trackArtist) - L'artiste de chaque piste. + L'artiste de chaque piste. Track Artist i18n: file: devices/filenameschemedialog.ui:112 i18n: ectx: property (text), widget (QPushButton, trackArtist) - Artiste de la piste + Artiste de la piste The track title (without <i>Track Artist</i>). i18n: file: devices/filenameschemedialog.ui:119 i18n: ectx: property (toolTip), widget (QPushButton, trackTitle) - Le titre de la piste (sans <i>l'artiste de la piste</i>). + Le titre de la piste (sans <i>l'artiste de la piste</i>). The track title (with <i>Track Artist</i>, if different to <i>Album Artist</i>). i18n: file: devices/filenameschemedialog.ui:141 i18n: ectx: property (toolTip), widget (QPushButton, trackArtistAndTitle) - Le titre de la piste (avec <i>l'artiste de la piste</i> s'il est différent de <i>l'artiste de l'album</i>). + Le titre de la piste (avec <i>l'artiste de la piste</i> s'il est différent de <i>l'artiste de l'album</i>). Track Title (+Artist) i18n: file: devices/filenameschemedialog.ui:144 i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle) - Titre de la piste (+Artiste) + Titre de la piste (+Artiste) The track number. i18n: file: devices/filenameschemedialog.ui:151 i18n: ectx: property (toolTip), widget (QPushButton, trackNo) - Piste numéro + Piste numéro Track # i18n: file: devices/filenameschemedialog.ui:154 i18n: ectx: property (text), widget (QPushButton, trackNo) - Piste # + Piste # CD # i18n: file: devices/filenameschemedialog.ui:164 i18n: ectx: property (text), widget (QPushButton, cdNo) - CD # + CD # The year of the album's release. i18n: file: devices/filenameschemedialog.ui:171 i18n: ectx: property (toolTip), widget (QPushButton, year) - Année de sortie de l'album. + Année de sortie de l'album. The genre of the album. i18n: file: devices/filenameschemedialog.ui:181 i18n: ectx: property (toolTip), widget (QPushButton, genre) - Genre de l'album. + Genre de l'album. These settings are only editable when the device is not connected. i18n: file: devices/remotedevicepropertieswidget.ui:17 i18n: ectx: property (text), widget (PlainNoteLabel, connectionNote) - Ces paramètres ne sont modifiables que lorsque le périphérique est déconnecté. + Ces paramètres ne sont modifiables que lorsque le périphérique est déconnecté. Type: @@ -3529,7 +3529,7 @@ i18n: file: network/proxysettings.ui:39 i18n: ectx: property (text), widget (BuddyLabel, proxyTypeLabel) - Type: + Type: Options @@ -3542,7 +3542,7 @@ i18n: file: gui/interfacesettings.ui:71 i18n: ectx: property (title), widget (QGroupBox, optionsGroup) - Options + Options Port: @@ -3559,7 +3559,7 @@ i18n: file: network/proxysettings.ui:76 i18n: ectx: property (text), widget (BuddyLabel, proxyPortLabel) - Port: + Port: User: @@ -3576,7 +3576,7 @@ i18n: file: devices/remotedevicepropertieswidget.ui:319 i18n: ectx: property (text), widget (BuddyLabel, userLabel) - Identifiant: + Identifiant: Domain: @@ -3589,7 +3589,7 @@ i18n: file: devices/remotedevicepropertieswidget.ui:212 i18n: ectx: property (text), widget (BuddyLabel, label_2x) - Domaine: + Domaine: Share: @@ -3602,7 +3602,7 @@ i18n: file: devices/remotedevicepropertieswidget.ui:242 i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2) - Partager: + Partager: If you enter a password here, it will be stored <b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the password before accessing the share, set the password to '-' @@ -3615,14 +3615,14 @@ i18n: file: devices/remotedevicepropertieswidget.ui:257 i18n: ectx: property (text), widget (PlainNoteLabel, label_4x) - Si un mot de passe est saisi ici, il sera stocké <b>en clair</b> dans le fichier de configuration de Cantata. Si vous souhaitez re-saisir votre mot de passe à chaque fois, entrez '-'. + Si un mot de passe est saisi ici, il sera stocké <b>en clair</b> dans le fichier de configuration de Cantata. Si vous souhaitez re-saisir votre mot de passe à chaque fois, entrez '-'. Service name: i18n: file: devices/remotedevicepropertieswidget.ui:186 i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x) - Nom du service: + Nom du service: Folder: @@ -3635,28 +3635,28 @@ i18n: file: devices/remotedevicepropertieswidget.ui:390 i18n: ectx: property (text), widget (BuddyLabel, label) - Dossier: + Dossier: Extra Options: i18n: file: devices/remotedevicepropertieswidget.ui:345 i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel) - Paramètres supplémentaires: + Paramètres supplémentaires: Due to the way sshfs works, a suitable ssh-askpass application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter the password. i18n: file: devices/remotedevicepropertieswidget.ui:360 i18n: ectx: property (text), widget (PlainNoteLabel, label_5) - Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. + Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. Name of Dynamic Rules i18n: file: dynamic/dynamicrules.ui:39 i18n: ectx: property (placeholderText), widget (LineEdit, nameText) - Nom des règles dynamiques + Nom des règles dynamiques - @@ -3669,49 +3669,49 @@ i18n: file: dynamic/dynamicrules.ui:166 i18n: ectx: property (text), widget (QLabel, rangeLabel2) - et + et About Rules i18n: file: dynamic/dynamicrules.ui:209 i18n: ectx: property (text), widget (UrlLabel, aboutLabel) - À propos des règles dynamiques + À propos des règles dynamiques Include songs that match the following: i18n: file: dynamic/dynamicrule.ui:37 i18n: ectx: property (text), item, widget (QComboBox, typeCombo) - Inclure les pistes qui correspondent à: + Inclure les pistes qui correspondent à: Exclude songs that match the following: i18n: file: dynamic/dynamicrule.ui:42 i18n: ectx: property (text), item, widget (QComboBox, typeCombo) - Exclure les pistes qui correspondent à: + Exclure les pistes qui correspondent à: Artists similar to: i18n: file: dynamic/dynamicrule.ui:63 i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label) - Artistes similaires à: + Artistes similaires à: Album Artist: i18n: file: dynamic/dynamicrule.ui:76 i18n: ectx: property (text), widget (BuddyLabel, label_2) - Artiste Album: + Artiste Album: From Year: i18n: file: dynamic/dynamicrule.ui:141 i18n: ectx: property (text), widget (BuddyLabel, label_6) - De l'année: + De l'année: Any @@ -3724,35 +3724,35 @@ i18n: file: dynamic/dynamicrule.ui:180 i18n: ectx: property (specialValueText), widget (QSpinBox, dateToSpin) - Tous + Tous To Year: i18n: file: dynamic/dynamicrule.ui:164 i18n: ectx: property (text), widget (BuddyLabel, label_6x) - À l'année: + À l'année: Exact match i18n: file: dynamic/dynamicrule.ui:213 i18n: ectx: property (text), widget (QCheckBox, exactCheck) - Correspondance exacte + Correspondance exacte Only enter values for the tags you wish to be search on. i18n: file: dynamic/dynamicrule.ui:241 i18n: ectx: property (text), widget (NoteLabel, label_7) - Veuillez ne saisir de valeurs que pour les étiquettes que vous souhaitez utiliser dans la recherche. + Veuillez ne saisir de valeurs que pour les étiquettes que vous souhaitez utiliser dans la recherche. Add a local file i18n: file: gui/coverdialog.ui:30 i18n: ectx: property (toolTip), widget (FlatToolButton, addFileButton) - Ajouter un fichier local + Ajouter un fichier local Save downloaded lyrics in music folder @@ -3765,7 +3765,7 @@ i18n: file: gui/initialsettingswizard.ui:682 i18n: ectx: property (text), widget (QCheckBox, storeLyricsInMpdDir) - Enregistrer les paroles téléchargées dans le dossier musical + Enregistrer les paroles téléchargées dans le dossier musical Save downloaded backdrops in music folder @@ -3778,91 +3778,91 @@ i18n: file: gui/initialsettingswizard.ui:689 i18n: ectx: property (text), widget (QCheckBox, storeBackdropsInMpdDir) - Enregistrer les images de fond dans le dossier musical + Enregistrer les images de fond dans le dossier musical Cantata First Run i18n: file: gui/initialsettingswizard.ui:14 i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard) - Premier lancement de Cantanta + Premier lancement de Cantanta Welcome to Cantata i18n: file: gui/initialsettingswizard.ui:46 i18n: ectx: property (text), widget (QLabel, label) - Bienvenue sur Cantata + Bienvenue sur Cantata <html><head/><body><p>Welcome to Cantata</p></body></html> i18n: file: gui/initialsettingswizard.ui:108 i18n: ectx: property (text), widget (QLabel, label_7) - <html><head/><body><p>Bienvenue sur Cantata</p></body></html> + <html><head/><body><p>Bienvenue sur Cantata</p></body></html> Standard multi-user/server setup i18n: file: gui/initialsettingswizard.ui:159 i18n: ectx: property (text), widget (QRadioButton, advanced) - Profil multi-utilisateurs/serveurs standard. + Profil multi-utilisateurs/serveurs standard. Basic single user setup i18n: file: gui/initialsettingswizard.ui:204 i18n: ectx: property (text), widget (QRadioButton, basic) - Profil standard pour un simple utilisateur + Profil standard pour un simple utilisateur Connection details i18n: file: gui/initialsettingswizard.ui:321 i18n: ectx: property (text), widget (QLabel, label_3) - Détails de connexion + Détails de connexion Music folder i18n: file: gui/initialsettingswizard.ui:511 i18n: ectx: property (text), widget (QLabel, label_13) - Dossier musical + Dossier musical Please choose the folder containing your music collection. i18n: file: gui/initialsettingswizard.ui:534 i18n: ectx: property (text), widget (QLabel, label_12) - Veuillez spécifier le dossier contenant votre collection musicale. + Veuillez spécifier le dossier contenant votre collection musicale. <p>Cantata will download missing covers, and lyrics, from the internet.</p><p>For each of these, please confirm whether you wish Cantata to store the relevant files within the music folder, or within your personal cache/config folders.</p> i18n: file: gui/initialsettingswizard.ui:643 i18n: ectx: property (text), widget (QLabel, label_5f) - <p>Cantata va télécharger les pochettes et paroles manquantes depuis Internet.</p><p>Pour chacune d'entre elles veuillez confirmer si vous souhaitez que Cantata les enregistre dans le dossier musique ou dans votre dossier de cache/de configuration.</p> + <p>Cantata va télécharger les pochettes et paroles manquantes depuis Internet.</p><p>Pour chacune d'entre elles veuillez confirmer si vous souhaitez que Cantata les enregistre dans le dossier musique ou dans votre dossier de cache/de configuration.</p> Finished! i18n: file: gui/initialsettingswizard.ui:740 i18n: ectx: property (text), widget (QLabel, label_6) - Terminé ! + Terminé ! Sidebar i18n: file: gui/interfacesettings.ui:36 i18n: ectx: attribute (title), widget (QWidget, sidebarTab) - Barre latérale + Barre latérale Views i18n: file: gui/interfacesettings.ui:42 i18n: ectx: property (title), widget (QGroupBox, viewsGroup) - Vues + Vues Style: @@ -3875,231 +3875,231 @@ i18n: file: gui/interfacesettings.ui:137 i18n: ectx: property (text), widget (BuddyLabel, playQueueViewLabel) - Style: + Style: Position: i18n: file: gui/interfacesettings.ui:95 i18n: ectx: property (text), widget (BuddyLabel, sbPositionLabel) - Position: + Position: Only show icons, no text i18n: file: gui/interfacesettings.ui:108 i18n: ectx: property (text), widget (QCheckBox, sbIconsOnly) - N'afficher que les icônes, sans le texte + N'afficher que les icônes, sans le texte Auto-hide i18n: file: gui/interfacesettings.ui:115 i18n: ectx: property (text), widget (QCheckBox, sbAutoHide) - Cacher automatiquement + Cacher automatiquement Initially collapse albums i18n: file: gui/interfacesettings.ui:150 i18n: ectx: property (text), widget (QCheckBox, playQueueStartClosed) - Regrouper les albums initialement + Regrouper les albums initialement Scroll to current track i18n: file: gui/interfacesettings.ui:164 i18n: ectx: property (text), widget (QCheckBox, playQueueScroll) - Défiler jusqu'à la piste courante + Défiler jusqu'à la piste courante Current album cover i18n: file: gui/interfacesettings.ui:220 i18n: ectx: property (text), widget (QRadioButton, playQueueBackground_cover) - Pochette courante + Pochette courante Toolbar i18n: file: gui/interfacesettings.ui:367 i18n: ectx: attribute (title), widget (QWidget, toolbarTab) - Outils + Outils Show stop button i18n: file: gui/interfacesettings.ui:376 i18n: ectx: property (text), widget (QCheckBox, showStopButton) - Afficher le bouton stop + Afficher le bouton stop Show cover of current track i18n: file: gui/interfacesettings.ui:383 i18n: ectx: property (text), widget (QCheckBox, showCoverWidget) - Afficher la pochette de la piste courante + Afficher la pochette de la piste courante Show track rating i18n: file: gui/interfacesettings.ui:390 i18n: ectx: property (text), widget (QCheckBox, showRatingWidget) - Afficher la note de la piste + Afficher la note de la piste External i18n: file: gui/interfacesettings.ui:398 i18n: ectx: attribute (title), widget (QWidget, tab_7) - Externe + Externe Show popup messages when changing tracks i18n: file: gui/interfacesettings.ui:411 i18n: ectx: property (text), widget (QCheckBox, systemTrayPopup) - Afficher une notification lors du changement de piste + Afficher une notification lors du changement de piste Show icon in notification area i18n: file: gui/interfacesettings.ui:421 i18n: ectx: property (text), widget (QCheckBox, systemTrayCheckBox) - Afficher un icône dans la zone de notifications + Afficher un icône dans la zone de notifications Minimize to notification area when closed i18n: file: gui/interfacesettings.ui:431 i18n: ectx: property (text), widget (QCheckBox, minimiseOnClose) - Minimiser dans la zone de notification si la fenêtre est fermée + Minimiser dans la zone de notification si la fenêtre est fermée On Start-up i18n: file: gui/interfacesettings.ui:438 i18n: ectx: property (title), widget (QGroupBox, startupState) - Au lancement + Au lancement Show main window i18n: file: gui/interfacesettings.ui:444 i18n: ectx: property (text), widget (QRadioButton, startupStateShow) - Afficher la fenêtre + Afficher la fenêtre Hide main window i18n: file: gui/interfacesettings.ui:451 i18n: ectx: property (text), widget (QRadioButton, startupStateHide) - Cacher la fenêtre principale + Cacher la fenêtre principale Restore previous state i18n: file: gui/interfacesettings.ui:458 i18n: ectx: property (text), widget (QRadioButton, startupStateRestore) - Récupérer l'état précédent + Récupérer l'état précédent General i18n: file: gui/interfacesettings.ui:609 i18n: ectx: attribute (title), widget (QWidget, tab_4) - Général + Général Fetch missing covers from Last.fm i18n: file: gui/interfacesettings.ui:620 i18n: ectx: property (text), widget (QCheckBox, fetchCovers) - Récupérer les pochettes manquantes sur Last.fm + Récupérer les pochettes manquantes sur Last.fm Make interface more touch friendly i18n: file: gui/interfacesettings.ui:645 i18n: ectx: property (text), widget (QCheckBox, touchFriendly) - Adapter l'interface aux appareils tactiles + Adapter l'interface aux appareils tactiles Show song information tooltips i18n: file: gui/interfacesettings.ui:652 i18n: ectx: property (text), widget (QCheckBox, infoTooltips) - Informations sur la piste + Informations sur la piste Support retina displays i18n: file: gui/interfacesettings.ui:659 i18n: ectx: property (text), widget (QCheckBox, retinaSupport) - Support des écrans haute résolution + Support des écrans haute résolution Language: i18n: file: gui/interfacesettings.ui:666 i18n: ectx: property (text), widget (BuddyLabel, langLabel) - Langue : + Langue : Changing the 'touch friendly' setting will require a re-start of Cantata. i18n: file: gui/interfacesettings.ui:695 i18n: ectx: property (text), widget (NoteLabel, touchFriendlyNoteLabel) - L'activation de l'interface pour les appareils tactiles requiert un redémarrage de Cantata. + L'activation de l'interface pour les appareils tactiles requiert un redémarrage de Cantata. [Dynamic] i18n: file: gui/mainwindow.ui:181 i18n: ectx: property (text), widget (QLabel, dynamicLabel) - [Dynamique] + [Dynamique] Exit Full Screen i18n: file: gui/mainwindow.ui:204 i18n: ectx: property (text), widget (UrlLabel, fullScreenLabel) - Sortir du mode plein écran + Sortir du mode plein écran Stop playback on exit i18n: file: gui/playbacksettings.ui:58 i18n: ectx: property (text), widget (QCheckBox, stopOnExit) - Arrêter la lecture à la fermeture + Arrêter la lecture à la fermeture Output i18n: file: gui/playbacksettings.ui:88 i18n: ectx: property (title), widget (QGroupBox, outputBox) - Sortie + Sortie About replay gain i18n: file: gui/playbacksettings.ui:178 i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain) - À propos du ReplayGain + À propos du ReplayGain Use the checkboxes below to control the active outputs. i18n: file: gui/playbacksettings.ui:187 i18n: ectx: property (text), widget (QLabel, outputsViewLabel) - Utilisez les cases ci-dessous pour contrôler les sorties actives. + Utilisez les cases ci-dessous pour contrôler les sorties actives. Collection: i18n: file: gui/serversettings.ui:35 i18n: ectx: property (text), widget (QLabel, label) - Collection: + Collection: Cover filename: @@ -4112,56 +4112,56 @@ i18n: file: gui/serversettings.ui:243 i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel) - Nom des pochettes: + Nom des pochettes: HTTP stream URL: i18n: file: gui/serversettings.ui:156 i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel) - URL du flux HTTP: + URL du flux HTTP: Mode: i18n: file: network/proxysettings.ui:26 i18n: ectx: property (text), widget (BuddyLabel, modeLabel) - Mode: + Mode: HTTP Proxy i18n: file: network/proxysettings.ui:50 i18n: ectx: property (text), item, widget (QComboBox, proxyType) - Proxy HTTP: + Proxy HTTP: SOCKS Proxy i18n: file: network/proxysettings.ui:55 i18n: ectx: property (text), item, widget (QComboBox, proxyType) - Proxy SOCKS: + Proxy SOCKS: Use the checkboxes below to configure the list of active services. i18n: file: online/onlinesettings.ui:12 i18n: ectx: property (text), widget (QLabel, label) - Utilisez les cases ci-dessous pour configurer la liste des services actifs. + Utilisez les cases ci-dessous pour configurer la liste des services actifs. Configure Service i18n: file: online/onlinesettings.ui:47 i18n: ectx: property (text), widget (QPushButton, configureButton) - Configurer le service + Configurer le service Scrobble using: i18n: file: scrobbling/scrobblingsettings.ui:32 i18n: ectx: property (text), widget (BuddyLabel, scrobblerLabel) - Scrobbler avec: + Scrobbler avec: Status: @@ -4174,7 +4174,7 @@ i18n: file: streams/digitallyimportedsettings.ui:94 i18n: ectx: property (text), widget (BuddyLabel, label_5) - Status: + Status: Login @@ -4187,864 +4187,864 @@ i18n: file: streams/digitallyimportedsettings.ui:120 i18n: ectx: property (text), widget (QPushButton, loginButton) - Authentification + Authentification Scrobble tracks i18n: file: scrobbling/scrobblingsettings.ui:131 i18n: ectx: property (text), widget (QCheckBox, enableScrobbling) - Scrobbler les pistes: + Scrobbler les pistes: Show 'Love' button i18n: file: scrobbling/scrobblingsettings.ui:138 i18n: ectx: property (text), widget (QCheckBox, showLove) - Afficher le bouton 'Aimer' + Afficher le bouton 'Aimer' Premium Account i18n: file: streams/digitallyimportedsettings.ui:42 i18n: ectx: property (title), widget (QGroupBox, groupBox) - Compte Premium + Compte Premium Stream type: i18n: file: streams/digitallyimportedsettings.ui:81 i18n: ectx: property (text), widget (BuddyLabel, label_4) - Type de flux: + Type de flux: Session expiry: i18n: file: streams/digitallyimportedsettings.ui:127 i18n: ectx: property (text), widget (QLabel, expiryLabel) - Session expirée: + Session expirée: Search: i18n: file: support/shortcutssettingswidget.ui:22 i18n: ectx: property (text), widget (BuddyLabel, label_2) - Recherche: + Recherche: Shortcut for Selected Action i18n: file: support/shortcutssettingswidget.ui:65 i18n: ectx: property (title), widget (QGroupBox, actionBox) - Raccourcis pour l'action choisie + Raccourcis pour l'action choisie Default: i18n: file: support/shortcutssettingswidget.ui:71 i18n: ectx: property (text), widget (QRadioButton, useDefault) - Par défaut: + Par défaut: Custom: i18n: file: support/shortcutssettingswidget.ui:85 i18n: ectx: property (text), widget (QRadioButton, useCustom) - Personnalisé: + Personnalisé: Album artist: i18n: file: tags/tageditor.ui:80 i18n: ectx: property (text), widget (StateLabel, albumArtistLabel) - Artiste de l'album: + Artiste de l'album: Track number: i18n: file: tags/tageditor.ui:119 i18n: ectx: property (text), widget (StateLabel, trackLabel) - Piste numéro: + Piste numéro: Disc number: i18n: file: tags/tageditor.ui:132 i18n: ectx: property (text), widget (StateLabel, discLabel) - Disque numéro: + Disque numéro: Rating: i18n: file: tags/tageditor.ui:171 i18n: ectx: property (text), widget (StateLabel, ratingLabel) - Note: + Note: <i>(Various)</i> i18n: file: tags/tageditor.ui:186 i18n: ectx: property (text), widget (QLabel, ratingVarious) - <i>Divers</i> + <i>Divers</i> Original Name i18n: file: tags/trackorganiser.ui:115 i18n: ectx: property (text), widget (QTreeWidget, files) - Nom original + Nom original New Name i18n: file: tags/trackorganiser.ui:120 i18n: ectx: property (text), widget (QTreeWidget, files) - Nouveau nom + Nouveau nom Ratings will be lost if a file is renamed. i18n: file: tags/trackorganiser.ui:130 i18n: ectx: property (text), widget (UrlNoteLabel, ratingsNote) - Les notes seront perdues si les fichiers sont renommés. + Les notes seront perdues si les fichiers sont renommés. Your names NAME OF TRANSLATORS - Jaussoin Timothée + Jaussoin Timothée Your emails EMAIL OF TRANSLATORS - edhelas@movim.eu + edhelas@movim.eu Show All Tracks - Afficher toutes les pistes + Afficher toutes les pistes Show Untagged Tracks - Afficher les pistes non renseignées + Afficher les pistes non renseignées Remove From List - Supprimer de la liste + Supprimer de la liste Album Gain - Gain de l'album + Gain de l'album Track Gain - Gain de la piste + Gain de la piste Album Peak - Pic de l'album + Pic de l'album Track Peak - Pic de la piste + Pic de la piste Scan - Analyser + Analyser Update ReplayGain tags in tracks? - Mettre à jour les étiquettes ReplayGain dans les pistes ? + Mettre à jour les étiquettes ReplayGain dans les pistes ? Update Tags - Mettre à jour les étiquettes + Mettre à jour les étiquettes Abort scanning of tracks? - Arrêter l'analyse des pistes ? + Arrêter l'analyse des pistes ? Abort - Annuler + Annuler Abort reading of existing tags? - Annuler la lecture des étiquettes existantes ? + Annuler la lecture des étiquettes existantes ? Scan <b>all</b> tracks?<br/><br/><i>All tracks have existing ReplayGain tags.</i> - Analyser <b>toutes</b> les pistes ?<br/><br/><i>Toutes les pistes ont déjà une étiquette ReplayGain.</i> + Analyser <b>toutes</b> les pistes ?<br/><br/><i>Toutes les pistes ont déjà une étiquette ReplayGain.</i> Untagged Tracks - Pistes non étiquetées + Pistes non étiquetées All Tracks - Toutes les pistes + Toutes les pistes Scanning tracks... - Analyse des pistes… + Analyse des pistes… Reading existing tags... - Lecture des étiquettes existantes… + Lecture des étiquettes existantes… %1 (Corrupt tags?) filename (Corrupt tags?) - %1 (Étiquettes corrompues ?) + %1 (Étiquettes corrompues ?) Failed to update the tags of the following tracks: - La mise à jour des étiquettes des pistes suivantes a échoué: + La mise à jour des étiquettes des pistes suivantes a échoué: Device is not connected. - Le périphérique n'est pas connecté. + Le périphérique n'est pas connecté. %1 dB - %1 dB + %1 dB Failed - Échoué + Échoué Original: %1 dB - Originale: %1 dB + Originale: %1 dB Original: %1 - Original: %1 + Original: %1 Remove the selected tracks from the list? - Supprimer la piste sélectionnée de la liste ? + Supprimer la piste sélectionnée de la liste ? Remove Tracks - Supprimer les pistes + Supprimer les pistes Invalid service - Service incorrect + Service incorrect Invalid method - Méthode incorrecte + Méthode incorrecte Authentication failed - L'authentification a échouée + L'authentification a échouée Invalid format - Format incorrect + Format incorrect Invalid parameters - Paramètres incorrects + Paramètres incorrects Invalid resource specified - La ressource spécifiée est incorrecte + La ressource spécifiée est incorrecte Operation failed - L'opération a échoué + L'opération a échoué Invalid session key - La clef de session est incorrecte + La clef de session est incorrecte Invalid API key - La clef de l'API est incorrecte + La clef de l'API est incorrecte Service offline - Services hors ligne + Services hors ligne Last.fm is currently busy, please try again in a few minutes - Last.fm est actuellement indisponible, veuillez réessayer dans quelques minutes + Last.fm est actuellement indisponible, veuillez réessayer dans quelques minutes %1 error: %2 - %1 erreur: %2 + %1 erreur: %2 %1: Loved Current Track - %1: Piste courante aimée + %1: Piste courante aimée %1: Love Current Track - %1: Aimer la piste courante + %1: Aimer la piste courante %1 (via MPD) scrobbler name (via MPD) - %1 (via MPD) + %1 (via MPD) Authenticating... - Authentification… + Authentification… Authenticated - Authentifié… + Authentifié… Not Authenticated - Non authentifié + Non authentifié %1: Scrobble Tracks - %1: Scrobbler les pistes + %1: Scrobbler les pistes MP3 256k - MP3 256k + MP3 256k AAC 64k - AAC 64k + AAC 64k AAC 128k - AAC 128k + AAC 128k Logout - Déconnexion + Déconnexion URL: - URL: + URL: Add Stream - Ajouter un flux + Ajouter un flux Edit Stream - Éditer le flux + Éditer le flux Installed - Installé + Installé Update available - Mise à jour disponible + Mise à jour disponible Check the providers you wish to install/update. - Veuillez vérifier les fournisseurs que vous souhaitez installer/mettre à jour. + Veuillez vérifier les fournisseurs que vous souhaitez installer/mettre à jour. Install/Update Stream Providers - Installer/Mettre à jour les fournisseurs de flux + Installer/Mettre à jour les fournisseurs de flux Downloading list... - Téléchargement de la liste… + Téléchargement de la liste… Failed to download list of stream providers! - La téléchargement de la liste des fournisseurs de flux a échoué. + La téléchargement de la liste des fournisseurs de flux a échoué. Installing/updating %1 - Installation/Mise à jour de %1 + Installation/Mise à jour de %1 Failed to install '%1' - L'installation de '%1' a échoué + L'installation de '%1' a échoué Failed to download '%1' - Le téléchargement de '%1' a échoué + Le téléchargement de '%1' a échoué Install/update the selected stream providers? - Installer/Mettre à jour les fournisseurs de flux sélectionnés ? + Installer/Mettre à jour les fournisseurs de flux sélectionnés ? Install the selected stream providers? - Installer les fournisseurs de flux sélectionnés ? + Installer les fournisseurs de flux sélectionnés ? Update the selected stream providers? - Mettre à jour le fournisseur de flux sélectionné ? + Mettre à jour le fournisseur de flux sélectionné ? Install/Update - Installation/Mise à jour + Installation/Mise à jour Abort installation/update? - Abandonner l'installation/la mise à jour ? + Abandonner l'installation/la mise à jour ? Downloading %1 - Téléchargement de %1 + Téléchargement de %1 Update all updateable providers - Mettre à jour tous les fournisseurs disponibles + Mettre à jour tous les fournisseurs disponibles Import Streams Into Favorites - Importer les flux dans les favoris + Importer les flux dans les favoris Export Favorite Streams - Exporter les flux favoris + Exporter les flux favoris Add New Stream To Favorites - Ajouter un nouveau flux aux favoris + Ajouter un nouveau flux aux favoris Import Streams - Importer les flux + Importer les flux XML Streams (*.xml *.xml.gz *.cantata) - Flux XML (*.xml *.xml.gz *.cantata) + Flux XML (*.xml *.xml.gz *.cantata) Export Streams - Exporter les flux + Exporter les flux XML Streams (*.xml.gz) - Flux XML (*.xml.gz) + Flux XML (*.xml.gz) Failed to create '%1'! - La création de '%1' a échoué ! + La création de '%1' a échoué ! Stream '%1' already exists! - Le flux '%1' existe déjà ! + Le flux '%1' existe déjà ! A stream named '%1' already exists! - Il existe déjà un flux nommé '%1' ! + Il existe déjà un flux nommé '%1' ! Bookmark added - Marque-page ajouté + Marque-page ajouté Already bookmarked - Déjà dans les marque-pages + Déjà dans les marque-pages Already in favorites - Déjà dans les favoris. + Déjà dans les favoris. Reload '%1' streams? - Rafraîchir le flux '%1' ? + Rafraîchir le flux '%1' ? Are you sure you wish to remove bookmark to '%1'? - Êtes-vous sûr de vouloir supprimer '%1' des marque-pages ? + Êtes-vous sûr de vouloir supprimer '%1' des marque-pages ? Are you sure you wish to remove all '%1' bookmarks? - Êtes-vous sûr de vouloir supprimer tous les marque-pages '%1' ? + Êtes-vous sûr de vouloir supprimer tous les marque-pages '%1' ? Are you sure you wish to remove the %1 selected streams? - Êtes-vous sûr de vouloir supprimer les %1 flux sélectionnés ? + Êtes-vous sûr de vouloir supprimer les %1 flux sélectionnés ? Are you sure you wish to remove '%1'? - Êtes-vous sûr de supprimer '%1' ? + Êtes-vous sûr de supprimer '%1' ? Added '%1'' to favorites - Ajout de '%1' aux favoris + Ajout de '%1' aux favoris Configure Streams - Configurer le flux + Configurer le flux From File... - Depuis le fichier… + Depuis le fichier… Download... - Télécharger… + Télécharger… Configure Provider - Configurer le service: + Configurer le service: Install - Installer + Installer Install Streams - Installer des flux + Installer des flux Cantata Streams (*.streams) - Flux Cantata (*.streams) + Flux Cantata (*.streams) A category named '%1' already exists! Overwrite? - Une catégorie nommée '%1' est déjà présente ! + Une catégorie nommée '%1' est déjà présente ! Remplacer ? Failed top open package file. - L'ouverture de l'archive a échoué. + L'ouverture de l'archive a échoué. Invalid file format! - Type de fichier non pris en charge ! + Type de fichier non pris en charge ! Failed to create stream category folder! - La création du dossier de catégorie du flux a échoué ! + La création du dossier de catégorie du flux a échoué ! Failed to save stream list! - L'enregistrement de la liste des flux a échoué. + L'enregistrement de la liste des flux a échoué. Failed to remove streams folder! - La suppression du dossier de flux a échoué ! + La suppression du dossier de flux a échoué ! &OK - &OK + &OK &Cancel - &Annuler + &Annuler &Yes - &Oui + &Oui &No - &Non + &Non &Discard - &Annuler + &Annuler &Save - &Sauvegarder + &Sauvegarder &Apply - &Appliquer + &Appliquer &Close - &Fermer + &Fermer &Overwrite - &Réécrire + &Réécrire &Reset - &Réinitialiser + &Réinitialiser &Continue - &Continuer + &Continuer &Delete - &Effacer + &Effacer &Stop - &Arrêter + &Arrêter &Remove - &Supprimer + &Supprimer &Previous - &Précédent + &Précédent &Next - &Suivant + &Suivant Configure... - Configurer… + Configurer… Password - Mot de passe + Mot de passe Please enter password: - Veuillez saisir le mot de passe à nouveau: + Veuillez saisir le mot de passe à nouveau: Close - Fermer + Fermer Warning - Attention + Attention Question - Question + Question &Window - &Fenêtre + &Fenêtre Minimize - Minimiser + Minimiser Zoom - Zoomer + Zoomer Select Folder - Sélectionner le dossier + Sélectionner le dossier Select File - Sélectionner le fichier + Sélectionner le fichier %1 B - %1 B + %1 B %1 kB - %1 kB + %1 kB %1 MB - %1 MB + %1 MB %1 GB - %1 GB + %1 GB %1 KiB - %1 Ko + %1 Ko %1 MiB - %1 Mo + %1 Mo %1 GiB - %1 Go + %1 Go Tags - Étiquettes + Étiquettes Set 'Album Artist' from 'Artist' - Récupérer la valeur de 'Artiste de l'album' depuis 'Artiste' + Récupérer la valeur de 'Artiste de l'album' depuis 'Artiste' Read Ratings from File - Lire la note à partir du fichier + Lire la note à partir du fichier Write Ratings to File - Écrire les notes sur les fichiers + Écrire les notes sur les fichiers All tracks - Toutes les pistes + Toutes les pistes Read rating from music file? - Lire la note de la piste ? + Lire la note de la piste ? Ratings - Notes + Notes Read Ratings - Lire les notes + Lire les notes Read Rating - Lire la note + Lire la note Read, and updated, ratings from the following tracks: - Lire + Lire Write ratings for all tracks to the music files? - Enregistrer les notes dans l'ensemble des pistes ? + Enregistrer les notes dans l'ensemble des pistes ? Write rating to music file? - Écrire la note dans le fichier musical ? + Écrire la note dans le fichier musical ? Write Ratings - Écrire les notes + Écrire les notes Write Rating - Écrire la note + Écrire la note Failed to write ratings of the following tracks: - L'écriture des notes sur les fichiers suivants a échoué: + L'écriture des notes sur les fichiers suivants a échoué: Failed to write rating to music file! - L'écriture de la note sur la piste a échoué ! + L'écriture de la note sur la piste a échoué ! All tracks [modified] - Toutes les pistes [modifier] + Toutes les pistes [modifier] %1 [modified] - %1 [modifier] + %1 [modifier] Would you also like to rename your song files, so as to match your tags? - Souhaitez vous renommer vos fichiers musicaux afin de les faire correspondre avec leurs étiquettes ? + Souhaitez vous renommer vos fichiers musicaux afin de les faire correspondre avec leurs étiquettes ? Rename Files - Renommer les fichiers + Renommer les fichiers Abort renaming of files? - Abandonner le renommage des fichiers ? + Abandonner le renommage des fichiers ? Source file does not exist! - Le fichier source n'existe pas ! + Le fichier source n'existe pas ! Destination file already exists! - Le fichier de destination existe déjà ! + Le fichier de destination existe déjà ! Failed to create destination folder! - La création du dossier cible a échoué ! + La création du dossier cible a échoué ! Failed to rename '%1' to '%2' - Le renommage de '%1' à '%2' a échoué + Le renommage de '%1' à '%2' a échoué Song ratings are not stored in the song files, but within MPD's 'sticker' database. If you rename a file (or the folder it is within), then the rating associated with the song will be lost. - Les notes des chansons ne sont pas enregistrées dans leur fichier audio mais dans la base de données d'étiquettes de MPD. + Les notes des chansons ne sont pas enregistrées dans leur fichier audio mais dans la base de données d'étiquettes de MPD. Si vous renommez un fichier (ou le dossier le contenant) la note associée à la piste sera perdue. <tr><td align="right"><b>Composer:</b></td><td>%1</td></tr> - <tr><td align="right"><b>Compositeur:</b></td><td>%1</td></tr> + <tr><td align="right"><b>Compositeur:</b></td><td>%1</td></tr> <tr><td align="right"><b>Performer:</b></td><td>%1</td></tr> - <tr><td align="right"><b>Interprète:</b></td><td>%1</td></tr> + <tr><td align="right"><b>Interprète:</b></td><td>%1</td></tr> <tr><td align="right"><b>Artist:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Year:</b></td><td>%3</td></tr> - <tr><td align="right"><b>Artiste:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Année:</b></td><td>%3</td></tr> + <tr><td align="right"><b>Artiste:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Année:</b></td><td>%3</td></tr> Filter On Genre - Filtrer sur le genre + Filtrer sur le genre All Genres - Tous les genres + Tous les genres Go Back - Retour + Retour Menu - Menu + Menu (Stream) - (Flux) + (Flux) Search... - Rechercher… + Rechercher… Close Search Bar - Fermer la barre de recherche + Fermer la barre de recherche Logged into %1 - Connecté sur %1 + Connecté sur %1 <b>NOT</b> logged into %1 - <b>NON</b> connecté sur %1 + <b>NON</b> connecté sur %1 Basic Tree (No Icons) - Arbre basique (sans icônes) + Arbre basique (sans icônes) Simple Tree - Arbre simple + Arbre simple Detailed Tree - Arbre détaillé + Arbre détaillé List - Liste + Liste Grid - Grille + Grille Cannot access song files! Please check Cantata's "Music folder" setting, and MPD's "music_directory" setting. - Cantata ne peut accéder aux musiques ! + Cantata ne peut accéder aux musiques ! Veuillez vérifier le paramètre "Dossier musical" ainsi que la valeur du paramètre "music_directory" dans la configuration de MPD. @@ -5052,480 +5052,490 @@ Cannot access song files! Please check that the device is still attached. - Cantata ne peut accéder aux musiques ! + Cantata ne peut accéder aux musiques ! Veuillez vérifier si le périphérique est toujours attaché. Stretch Columns To Fit Window - Adapter les colonnes à la fenêtre + Adapter les colonnes à la fenêtre (Various) - (Divers) + (Divers) Mute - Muet + Muet Unmute - Rétablir le son + Rétablir le son Volume %1% (Muted) - Volume %1% (Silencieux) + Volume %1% (Silencieux) Volume %1% - Volume %1% + Volume %1% 1 Track Singular - 1 piste + 1 piste %1 Tracks Plural (N!=1) - %1 pistes + %1 pistes 1 Track (%1) Singular - 1 piste (%1) + 1 piste (%1) %1 Tracks (%2) Plural (N!=1) - %1 pistes (%2) + %1 pistes (%2) 1 Album Singular - 1 album + 1 album %1 Albums Plural (N!=1) - %1 albums + %1 albums 1 Artist Singular - 1 artiste + 1 artiste %1 Artists Plural (N!=1) - %1 artistes + %1 artistes 1 Stream Singular - 1 flux + 1 flux %1 Streams Plural (N!=1) - %1 flux + %1 flux 1 Entry Singular - 1 entrée + 1 entrée %1 Entries Plural (N!=1) - %1 entrées + %1 entrées 1 Rule Singular - 1 règle + 1 règle %1 Rules Plural (N!=1) - %1 règles + %1 règles 1 Podcast Singular - 1 podcast + 1 podcast %1 Podcasts Plural (N!=1) - %1 podcasts + %1 podcasts 1 Episode Singular - 1 Épisode + 1 Épisode %1 Episodes Plural (N!=1) - %1 Épisodes + %1 Épisodes 1 Update available Singular - 1 mise à jour disponible + 1 mise à jour disponible %1 Updates available Plural (N!=1) - %1 mises à jour disponibles + %1 mises à jour disponibles ActionDialog + Calculating size of files to be copied, please wait... - + Calcul de la taille des fichiers à copier, patientez s'il vous plaît... + Copy songs from: - Copier les pistes depuis: + Copier les pistes depuis: + + Configure - Configurer + Configurer + + (Needs configuring) - (Configuration nécessaire) + (Configuration nécessaire) + Copy songs to: - Copier les pistes vers: + Copier les pistes vers: + Destination format: - Fichier de destination: + Fichier de destination: + Overwrite songs - Remplacer les chansons + Remplacer les chansons + To copy: - À copier: + À copier: - + <b>INVALID</b> - <b>INVALIDE</b> + <b>INVALIDE</b> - - + + <i>(When different)</i> - <i>(Si différent)</i> + <i>(Si différent)</i> - + Artists:%1, Albums:%2, Songs:%3 - Artistes:%1, Albums:%2, Pistes:%3 + Artistes:%1, Albums:%2, Pistes:%3 - + %1 free - %1 libre + %1 libre - - + + Local Music Library - Bibliothèque musicale locale + Bibliothèque musicale locale - + Audio CD - CD Audio + CD Audio - + There is insufficient space left on the destination device. The selected songs consume %1, but there is only %2 left. The songs will need to be transcoded to a smaller filesize in order to be successfully copied. - Il n'y a pas assez d'espace libre sur le périphérique. + Il n'y a pas assez d'espace libre sur le périphérique. Les pistes sélectionnées occupent %1, mais il ne reste que %2 de libre. Les pistes doivent être converties vers un format plus léger afin d'être copiées sur le périphérique. - + There is insufficient space left on the destination. The selected songs consume %1, but there is only %2 left. - Il n'y a pas assez d'espace libre sur le périphérique. + Il n'y a pas assez d'espace libre sur le périphérique. Les pistes sélectionnées occupent %1, mais il ne reste que %2 de libre. - - - + + + Copy Songs To Library - + Copier les pistes vers la bibliothèque - - + + Copy Songs To Device - Copier les pistes sur le périphérique + Copier les pistes sur le périphérique - + Copy Songs - Copier les pistes + Copier les pistes - + Delete Songs - Supprimer les pistes + Supprimer les pistes - + You have not configured the destination device. Continue with the default settings? - Vous n'avez pas configuré le périphérique de destination. + Vous n'avez pas configuré le périphérique de destination. Continuer avec la configuration par défaut ? - - + + Not Configured - Non configuré + Non configuré - - + + Use Defaults - Utiliser la configuration par défaut + Utiliser la configuration par défaut - + You have not configured the source device. Continue with the default settings? - Vous n'avez pas configuré le périphérique source. + Vous n'avez pas configuré le périphérique source. Continuer avec les paramètres par défaut ? - + Are you sure you wish to stop? - Êtes vous sûr de vouloir arrêter ? + Êtes vous sûr de vouloir arrêter ? - + Stop - Arrêter + Arrêter - + Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! - + Device is not connected! - Le périphérique n'est pas connecté ! + Le périphérique n'est pas connecté ! - + Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? - + Device has been changed? - Le périphérique a été changé ? + Le périphérique a été changé ? - + Clearing unused folders - Nettoyage des dossiers non utilisés + Nettoyage des dossiers non utilisés - + Calculate ReplayGain for ripped tracks? - Calculer le ReplayGain des pistes extraites ? + Calculer le ReplayGain des pistes extraites ? - + ReplayGain - ReplayGain + ReplayGain - + Calculate - Calculer + Calculer - + The destination filename already exists! - Le fichier de destination existe déjà ! + Le fichier de destination existe déjà ! - + Song already exists! - La piste existe déjà ! + La piste existe déjà ! - + Song does not exist! - La piste n'existe pas ! + La piste n'existe pas ! - + Failed to create destination folder!<br/>Please check you have sufficient permissions. - La création du dossier de destination a échoué !<br/>Veuillez vérifier que vous avez les permissions requises. + La création du dossier de destination a échoué !<br/>Veuillez vérifier que vous avez les permissions requises. - + Source file no longer exists? - Le fichier source ne semble plus exister ? + Le fichier source ne semble plus exister ? - + Failed to copy. - Copie échouée. + Copie échouée. - + Failed to delete. - Suppression impossible. + Suppression impossible. - + Not connected to device. - Non connecté au périphérique. + Non connecté au périphérique. - + Selected codec is not available. - Le codec sélectionné n'est pas disponible. + Le codec sélectionné n'est pas disponible. - + Transcoding failed. - Le transcodage a échoué. + Le transcodage a échoué. - + Failed to create temporary file.<br/>(Required for transcoding to MTP devices.) - La création du fichier temporaire a échoué.<br/>(Requis pour transcoder vers les périphériques MTP.) + La création du fichier temporaire a échoué.<br/>(Requis pour transcoder vers les périphériques MTP.) - + Failed to read source file. - La création du fichier source a échoué. + La création du fichier source a échoué. - + Failed to write to destination file. - L'écriture du fichier cible a échoué. + L'écriture du fichier cible a échoué. - + No space left on device. - Plus d'espace restant sur le périphérique. + Plus d'espace restant sur le périphérique. - + Failed to update metadata. - La mise à jour des métadonnées a échoué + La mise à jour des métadonnées a échoué. - + Failed to download track. - Le téléchargement de la piste a échoué. + Le téléchargement de la piste a échoué. - + Failed to lock device. - Le verrouillage du périphérique a échoué. + Le verrouillage du périphérique a échoué. - + Local Music Library Properties - Propriétés de la Bibliothèque Musicale Locale + Propriétés de la Bibliothèque Musicale Locale - - + + Error - Erreur + Erreur - + Skip - Passer + Passer - + Auto Skip - Saut automatique + Saut automatique - + Retry - Réessayer + Réessayer - + Artist: - Artiste: + Artiste: - + Album: - Album: + Album: - + Track: - Piste: + Piste: - + Source file: - Fichier source: + Fichier source: - + Destination file: - Fichier de destination: + Fichier de destination: - + File: - Fichier: + Fichier: - - + + Saving cache - Sauvegarde du cache + Sauvegarde du cache Calculating... @@ -5540,63 +5550,75 @@ AlbumDetails + Album Details - Détails de l'album + Détails de l'album + Artist: - Artiste: + Artiste: + Composer: - Compositeur: + Compositeur: + Title: - Titre: + Titre: + Genre: - Genre: + Genre: + Year: - Année: + Année: + Disc: - Disque: + Disque: + Single artist - Piste unique: + Piste unique + Tracks - Pistes + Pistes + Track - Piste + Piste + Artist - Artiste + Artiste + Title - Titre + Titre @@ -5604,104 +5626,104 @@ Audio CD - CD Audio + CD Audio Apply "Various Artists" Workaround - Appliquer l'alternative "Artistes divers" + Appliquer l'alternative "Artistes divers" Revert "Various Artists" Workaround - Révoquer l'alternative "Artistes divers" + Révoquer l'alternative "Artistes divers" Capitalize - Mettre une majuscule + Mettre une majuscule Adjust Track Numbers - Ajuster les numéros des pistes + Ajuster les numéros des pistes Tools - Outils + Outils Apply "Various Artists" workaround? - Appliquer l'alternative "Artistes divers" ? + Appliquer l'alternative "Artistes divers" ? This will set 'Album artist' and 'Artist' to "Various Artists", and set 'Title' to "TrackArtist - TrackTitle" - Cela remplacera 'Artiste album' et 'Artiste' par "Artistes divers", et 'Titre' par "Artiste piste - Titre de la piste" + Cela remplacera 'Artiste album' et 'Artiste' par "Artistes divers", et 'Titre' par "Artiste piste - Titre de la piste" Revert "Various Artists" workaround? - Révoquer l'alternative "Artistes divers" ? + Révoquer l'alternative "Artistes divers" ? Where the 'Album artist' is the same as 'Artist' and the 'Title' is of the format "TrackArtist - TrackTitle", 'Artist' will be taken from 'Title' and 'Title' itself will be set to just the title. e.g. If 'Title' is "Wibble - Wobble", then 'Artist' will be set to "Wibble" and 'Title' will be set to "Wobble" - Lorsque la valeur de 'Artiste album' est la même que 'Artiste' et que celle de 'Titre' est au format "Artiste piste - Titre de la piste", 'Artiste' sera défini à partir de 'Titre' et 'Titre' sera réduit à la seule valeur du titre. e.g. + Lorsque la valeur de 'Artiste album' est la même que 'Artiste' et que celle de 'Titre' est au format "Artiste piste - Titre de la piste", 'Artiste' sera défini à partir de 'Titre' et 'Titre' sera réduit à la seule valeur du titre. e.g. Si 'Titre' est "Toto - Tata", alors 'Artiste' deviendra "Toto" et 'Titre' sera "Tata" Revert - Réinitialiser + Réinitialiser Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'? - Mettre une majuscule à 'Titre', 'Artiste', 'Artiste de l'album' et à 'Album' ? + Mettre une majuscule à 'Titre', 'Artiste', 'Artiste de l'album' et à 'Album' ? Adjust track number by: - Ajuster les numéros des pistes par: + Ajuster les numéros des pistes par: AlbumView - + Refresh Album Information - Rafraîchir les informations de l'album + Rafraîchir les informations de l'album - + Full Width Cover - + Pochette en pleine largeur - + Album - Album + Album - + Tracks - Pistes + Pistes ApiKeys - + The API call limit has been exceeded for %1, please try again later or register for your own API key. - + La limite d'appel pour l'API %1 a été atteinte. Merci d'essayer plus tard ou de vous enregistrer pour obtenir votre propre clé. @@ -5709,22 +5731,22 @@ Cantata uses various internet services to provide covers, radio stream listings, etc. Most of these require an application's developer to register with the service, and obtain an API Key. Cantata contains the keys required to access these services. Unfortunately, some of these services have a usage limit per API key. Therefore, some of Cantata's features may not function if the key (which is shared with all Cantata users) has reached its monthly usage limit. To work-around this, you can register with a service yourself, and configure Cantata to use your personal API key. This key may be entered below. For any blank values below, Cantata will use its default key. - + Cantata utilise plusieurs services pour obtenir les pochettes, paroles etc. La pluspart nécessitent que le développeur d'une application s'enregistre pour obtenir une clé d'API. Cantata inclue les clés nécessaires à ces services. Malheureusement, certains services ont une limite d'usage par clé. Ainsi, certaines fonctionalités de Cantata pourraient ne pas fonctionner si la clé (partagée entre tous les utilisateurs de Cantata) a atteint cette limite. Pour pallier à ceci, vous pouvez vous enregistrer sur ces services et configurer Cantata pour utiliser vote clé personnelle. Cette clé peut être entrée ci dessous. Pour les valeurs laissées vides, Cantata utilisera la clé par défaut. - + Service - + Service - + Service URL - + URL du service - + API Key - + Clé d'API @@ -5732,40 +5754,40 @@ Refresh Artist Information - Rafraîchir les informations de l'artiste + Rafraîchir les informations de l'artiste Artist - Artiste + Artiste - + Albums - Albums + Albums - + Web Links - Liens Web + Liens Web - + Similar Artists - Artistes similaires + Artistes similaires AudioCdDevice - + Reading disc - Lecture du disque + Lecture du disque - + %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -5775,76 +5797,84 @@ AudioCdSettings + Album and Track Information Retrieval - Récupérer les informations de l'album et des pistes + Récupérer les informations de l'album et des pistes + Initially look up via: - Vérifier initialement via: + Vérifier initialement via: + CDDB Host: - Hôte CDDB: + Hôte CDDB: + CDDB Port: - Port CDDB: + Port CDDB: + Lookup information as soon as CD is inserted - Récupérer les informations dès l’insertion d'un CD + Récupérer les informations dès l’insertion d'un CD + Audio Extraction - Extraction audio + Extraction audio + Full paranoia mode (best quality) - + Mode "Full paranoïa" (meilleure qualité) + Never skip on read error - Ne jamais sauter les erreurs de lecture + Ne jamais sauter les erreurs de lecture CDDB - CDDB + CDDB MusicBrainz - MusicBrainz + MusicBrainz BrowseModel - + Server Folders - + Dossiers du serveur - + MPD virtual file-system - + Système de fichier virtuel de MPD - + Cue Sheet - Liste Cue + Liste Cue - + Playlist - Liste de lecture + Liste de lecture @@ -5852,12 +5882,12 @@ Deleting... - Suppression… + Suppression… Calculating... - Calcul en cours… + Calcul en cours… @@ -5865,83 +5895,83 @@ Cantata caches various pieces of information (covers, lyrics, etc). Below is a summary of Cantata's current cache usage. - + Cantata met en cache plusieurs sortes d'informations (pochettes, paroles...). Voici un résumé d'utilisation de ce cache. - + Covers - Pochettes + Pochettes - + Scaled Covers - Pochettes redimensionnées + Pochettes redimensionnées - + Backdrops - Toile de fond + Toile de fond - + Lyrics - Paroles + Paroles - + Artist Information - Informations sur l'artiste + Informations sur l'artiste - + Album Information - Informations sur l'album + Informations sur l'album - + Track Information - Informations sur la piste + Informations sur la piste - + Stream Listings - Liste de flux + Liste de flux - + Podcast Directories - Répertoires des podcasts + Répertoires des podcasts - + Wikipedia Languages - Langues Wikipédia + Langues Wikipédia - + Scrobble Tracks - Scrobbler les pistes + Scrobbler les pistes - + Delete All - Tout supprimer + Tout supprimer - + Delete all '%1' items? - Supprimer les '%1' éléments ? + Supprimer les '%1' éléments ? - - + + Delete Cache Items - Supprimer tous les éléments en cache + Supprimer tous les éléments en cache - + Delete items from all selected categories? - Supprimer les éléments des catégories sélectionnées ? + Supprimer les éléments des catégories sélectionnées ? @@ -5949,17 +5979,17 @@ Name - Nom + Nom Item Count - Nombre d'éléments + Nombre d'éléments Space Used - Espace occupé + Espace occupé @@ -5967,39 +5997,39 @@ Data Track - Données de la piste + Données de la piste Failed to open CD device - L'ouverture du CD a échoué + L'ouverture du CD a échoué Track %1 - Piste %1 + Piste %1 Failed to create CDDB connection - La connexion à CDDB a échoué + La connexion à CDDB a échoué Failed to contact CDDB server, please check CDDB and network settings - + Impossible de contacter le serveur CDDB. Merci de vérifier les parametres réseau et CDDB No matches found in CDDB - Recherche CDDB infructueuse + Recherche CDDB infructueuse CDDB error: %1 - Erreur CDDB: %1 + Erreur CDDB: %1 @@ -6007,34 +6037,34 @@ Multiple matches were found. Please choose the relevant one from below: - Plusieurs résultats ont été trouvés. Veuillez sélectionner le résultat le plus pertinent dans la liste ci-dessous: + Plusieurs résultats ont été trouvés. Veuillez sélectionner le résultat le plus pertinent dans la liste ci-dessous: Artist - Artiste + Artiste Title - Titre + Titre Disc Selection - Sélection du disque + Sélection du disque %1 - %2 Disc %3 (%4) artist - album Disc disc (year) - %1 - %2 Disque %3 (%4) + %1 - %2 Disque %3 (%4) %1 - %2 (%3) artist - album (year) - %1 - %2 (%3) + %1 - %2 (%3) @@ -6042,135 +6072,139 @@ Lyrics Providers - Fournisseur de paroles + Fournisseur de paroles Wikipedia Languages - Langues Wikipédia + Langues Wikipédia Other - Autre + Autre ContextWidget - + &Artist - &Artiste + &Artiste - + Al&bum - Al&bum + Al&bum - + &Track - &Piste + &Piste CoverDialog + Search - Recherche + Recherche + Add a local file - Ajouter un fichier local + Ajouter un fichier local + Configure - Configurer + Configurer + This can only be used to change the file used for covers, it will not alter any embedded covers you may have in your song files. - + Ceci change uniquement le fichier utilisé comme pochette. Celà ne modifiera pas les pochettes incluses dans vos fichiers. CoverArt Archive - Archive de CoverArt + Archive de CoverArt An image already exists for this artist, and the file is not writeable. - Une image existe déjà pour cet artiste et ne peut être remplacée. + Une image existe déjà pour cet artiste et ne peut être remplacée. A cover already exists for this album, and the file is not writeable. - Une pochette existe déjà pour cet album et ne peut être remplacée. + Une pochette existe déjà pour cet album et ne peut être remplacée. '%1' Artist Image - '%1' Image de l'artiste + '%1' Image de l'artiste '%1 - %2' Album Cover 'Artist - Album' Album Cover - '%1 - %2' Pochette d'album + '%1 - %2' Pochette d'album Failed to set cover! Could not download to temporary file! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! La pochette n'a pas pu être téléchargée vers les fichiers temporaires ! Failed to download image! - Le téléchargement de l'image a échoué ! + Le téléchargement de l'image a échoué ! Load Local Cover - Chargement d'une pochette locale + Chargement d'une pochette locale Images (*.png *.jpg) - Images (*.png *.jpg) + Images (*.png *.jpg) File is already in list! - Le fichier est déjà dans la liste ! + Le fichier est déjà dans la liste ! Failed to read image! - La lecture de l'image a échoué ! + La lecture de l'image a échoué ! Display - Afficher + Afficher Remove - Supprimer + Supprimer Failed to set cover! Could not make copy! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! La copie ne peut être créée ! @@ -6179,7 +6213,7 @@ Failed to set cover! Could not backup original! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! Le fichier original ne peut être sauvegardé ! @@ -6188,14 +6222,14 @@ Failed to set cover! Could not copy file to '%1'! - L'affectation de la pochette a échoué ! + L'affectation de la pochette a échoué ! Le fichier ne peut être copié vers '%1' ! Searching... - Recherche en cours… + Recherche en cours… @@ -6203,17 +6237,17 @@ <tr><td align="right"><b>Composer:</b></td><td>%1</td></tr> - <tr><td align="right"><b>Compositeur:</b></td><td>%1</td></tr> + <tr><td align="right"><b>Compositeur:</b></td><td>%1</td></tr> <tr><td align="right"><b>Performer:</b></td><td>%1</td></tr> - <tr><td align="right"><b>Interprète:</b></td><td>%1</td></tr> + <tr><td align="right"><b>Interprète:</b></td><td>%1</td></tr> <tr><td align="right"><b>Artist:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Year:</b></td><td>%3</td></tr> - <tr><td align="right"><b>Artiste:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Année:</b></td><td>%3</td></tr> + <tr><td align="right"><b>Artiste:</b></td><td>%1</td></tr><tr><td align="right"><b>Album:</b></td><td>%2</td></tr><tr><td align="right"><b>Année:</b></td><td>%3</td></tr> @@ -6221,19 +6255,19 @@ Image - Image + Image Downloading... - Téléchargement… + Téléchargement… Image (%1 x %2 %3%) Image (width x height zoom%) - Image (%1 x %2 %3%) + Image (%1 x %2 %3%) @@ -6241,27 +6275,27 @@ Name: - Nom: + Nom: Command: - + Commande: In the command line above, %f will be replaced with the file list and %d with the folder list. If neither are supplied, the the list of files will be appended to the command. - + Dans la liste de commande ci dessous, %f sera remplacé par la liste des fichiers et %d par la liste des dossiers. Si aucun des 2 n'est fourni, la liste des fichiers sra ajoutée à la commande. Add New Command - + Ajouter une nouvelle commande Edit Command - + Editer la commande @@ -6269,7 +6303,7 @@ Custom Actions - + Actions personnalisées @@ -6277,51 +6311,51 @@ To have Cantata call external commands (e.g. to edit tags with another application), add an entry for the command below. When at least one command command is defined, a 'Custom Actions' entry will be added to the context menus in the Library, Folders, and Playlists views. - + Pour que Cantata appelle une commande externe (par exemple pour éditer des tages avec une autre application), ajoutez une entrée pour la commande ci dessous.Quand au moins une commande est définie, une entrée "actions personnalisées" sera ajoutée dans le menu contextuel des vues Bibliothèque, Dossiers et Listes de lecture. - + Add - Ajouter + Ajouter - + Edit - Éditer + Éditer - - + + Remove - Supprimer + Supprimer - + Name - Nom + Nom - + Command - + Commande - + Remove the selected commands? - + Supprimer les commandes sélectionnées ? Device - + Updating (%1)... - Mise à jour (%1)… + Mise à jour (%1)… - + Updating (%1%)... - Mise à jour (%1%)… + Mise à jour (%1%)… @@ -6329,176 +6363,193 @@ Device Properties - Propriétés du périphérique + Propriétés du périphérique DevicePropertiesWidget + These settings are only valid, and editable, when the device is connected. - Ces paramètres ne sont valables et éditables que quand le périphérique est connecté. + Ces paramètres ne sont valables et éditables que quand le périphérique est connecté. + Name: - Nom: + Nom: + Music folder: - Dossier musical: + Dossier musical: + Copy album covers as: - Copier la pochette en tant que: + Copier la pochette en tant que: + Maximum cover size: - Taille maximum des pochettes: + Taille maximum des pochettes: + Default volume: - Volume par défaut + Volume par défaut + 'Various Artists' workaround - Solution de contournement pour 'Artistes divers' + Solution de contournement pour 'Artistes divers' + Automatically scan music when attached - Analyser automatiquement les pistes + Analyser automatiquement les pistes + Use cache - Utiliser le cache + Utiliser le cache + Filenames - Nom des fichiers + Nom des fichiers + Filename scheme: - Schéma de nommage: + Schéma de nommage: + VFAT safe - + VFAT safe + Use only ASCII characters - Utiliser seulement des caractères ASCII + Utiliser seulement des caractères ASCII + Replace spaces with underscores - Remplacer les espaces avec des tirets-bas + Remplacer les espaces avec des tirets-bas + Append 'The' to artist names - Ajouter 'The' aux nom des artistes + Ajouter 'The' aux nom des artistes + If an artist name begins with 'The', then append this in the folder name. e.g. 'The Beatles' becomes 'Beatles, The' - + Si un nom d'artiste commence par "The", alors l'ajouter au nom de dossier: "The Beatles" devient "Beatles, The" + Transcoding - Transcodage + Transcodage Only transcode if source file is of a different format - Convertir seulement si le fichier source est dans un format différent + Convertir seulement si le fichier source est dans un format différent Only transcode if source is FLAC/WAV - + Transcoder seulement si la source est FLAC/WAV Don't copy covers - Ne pas copier les pochettes + Ne pas copier les pochettes Embed cover within each file - Ajouter la pochette à chaque fichier + Ajouter la pochette à chaque fichier No maximum size - Pas de taille maximum + Pas de taille maximum 400 pixels - 400 pixels + 400 pixels 300 pixels - 300 pixels + 300 pixels 200 pixels - 200 pixels + 200 pixels 100 pixels - 100 pixels + 100 pixels <p>When copying tracks to a device, and the 'Album Artist' is set to 'Various Artists', then Cantata will set the 'Artist' tag of all tracks to 'Various Artists' and the track 'Title' tag to 'TrackArtist - TrackTitle'.<hr/> When copying from a device, Cantata will check if 'Album Artist' and 'Artist' are both set to 'Various Artists'. If so, it will attempt to extract the real artist from the 'Title' tag, and remove the artist name from the 'Title' tag.</p> - <p>Lors de la copie de pistes vers un périphérique, au cours de laquelle la valeur de 'Artiste album' est remplacée par 'Artistes divers', Cantata remplacera l'étiquette 'Artiste' de toutes les pistes par 'Artistes divers' et l'étiquette 'Titre' de la piste par 'Artiste piste - Titre de la piste'.<hr/> Lors de la copie depuis un périphérique, Cantata vérifiera si les valeurs de 'Artiste album' et 'Artiste' sont bien 'Artistes divers'. Auquel cas, il essaiera d'extraire le véritable artiste de l'étiquette 'Titre', puis de supprimer le nom de l'artiste de l'étiquette 'Titre'.</p> + <p>Lors de la copie de pistes vers un périphérique, au cours de laquelle la valeur de 'Artiste album' est remplacée par 'Artistes divers', Cantata remplacera l'étiquette 'Artiste' de toutes les pistes par 'Artistes divers' et l'étiquette 'Titre' de la piste par 'Artiste piste - Titre de la piste'.<hr/> Lors de la copie depuis un périphérique, Cantata vérifiera si les valeurs de 'Artiste album' et 'Artiste' sont bien 'Artistes divers'. Auquel cas, il essaiera d'extraire le véritable artiste de l'étiquette 'Titre', puis de supprimer le nom de l'artiste de l'étiquette 'Titre'.</p> <p>If you enable this, then Cantata will create a cache of the device's music library. This will help to speed up subsequent library scans (as the cache file will be used instead of having to read the tags of each file.)<hr/><b>NOTE:</b> If you use another application to update the device's library, then this cache will become out-of-date. To rectify this, simply click on the 'refresh' icon in the device list. This will cause the cache file to be removed, and the contents of the device re-scanned.</p> - <p>Si vous activez cette option, Cantata créera un cache de la librairie musicale du périphérique. Cela permettra d'accélérer les analyses de la librairie (puisque le cache évitera la lecture des étiquettes de chaque fichier de la librairie.)<hr/><b>NOTE:</b> Si vous utilisez une autre application pour mettre à jour la librairie du périphérique, ce cache deviendra obsolète. Pour remédier à cela, cliquez simplement sur l'icône 'rafraîchir' dans la liste des périphériques. Cela supprimera le fichier de cache et provoquera une nouvelle analyse du contenu du périphérique.</p> + <p>Si vous activez cette option, Cantata créera un cache de la librairie musicale du périphérique. Cela permettra d'accélérer les analyses de la librairie (puisque le cache évitera la lecture des étiquettes de chaque fichier de la librairie.)<hr/><b>NOTE:</b> Si vous utilisez une autre application pour mettre à jour la librairie du périphérique, ce cache deviendra obsolète. Pour remédier à cela, cliquez simplement sur l'icône 'rafraîchir' dans la liste des périphériques. Cela supprimera le fichier de cache et provoquera une nouvelle analyse du contenu du périphérique.</p> Do not transcode - Ne pas convertir + Ne pas convertir Always transcode - + Toujours convertir Encoder - Encodeur + Encodeur Transcode to %1 - Convertir vers %1 + Convertir vers %1 %1 (%2 free) name (size free) - %1 (%2 libre) + %1 (%2 libre) @@ -6506,37 +6557,37 @@ Configure Device - Configurer le périphérique + Configurer le périphérique Refresh Device - Rafraîchir le périphérique + Rafraîchir le périphérique Connect Device - Connecter le périphérique + Connecter le périphérique Disconnect Device - Déconnecter le périphérique + Déconnecter le périphérique Edit CD Details - Éditer les propriétés du CD + Éditer les propriétés du CD Not Connected - Non connecté + Non connecté No Devices Attached - Pas de périphérique connecté + Pas de périphérique connecté @@ -6544,119 +6595,119 @@ Copy To Library - Copier vers la Librairie + Copier vers la Librairie Synchronise - + Synchroniser Forget Device - Oublier le périphérique + Oublier le périphérique Add Device - Ajouter le périphérique + Ajouter le périphérique Any supported devices will appear here when attached to your computer. - + Tous les périphériques supportés apparaitrons ici quand ils seront connectés à votre ordinateur. Lookup album and track details? - Voir les informations détaillées de l'album et des pistes ? + Voir les informations détaillées de l'album et des pistes ? Refresh - Rafraîchir + Rafraîchir Via CDDB - Via CDDB + Via CDDB Via MusicBrainz - Via MusicBrainz + Via MusicBrainz Which type of refresh do you wish to perform? - Quel type de rafraîchissement souhaitez-vous effectuer ? + Quel type de rafraîchissement souhaitez-vous effectuer ? Partial - Only new songs are scanned (quick) - Partiel - Seules les nouvelles pistes sont analysées (rapide) + Partiel - Seules les nouvelles pistes sont analysées (rapide) Full - All songs are rescanned (slow) - Complet - Toutes les pistes sont analysées (lent) + Complet - Toutes les pistes sont analysées (lent) Partial - Partiel + Partiel Full - Complet + Complet Are you sure you wish to delete the selected songs? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? + Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? Cette action est définitive. Delete Songs - Supprimer les pistes + Supprimer les pistes Are you sure you wish to forget '%1'? - Êtes-vous sûr de vouloir oublier '%1' ? + Êtes-vous sûr de vouloir oublier '%1' ? Are you sure you wish to eject Audio CD '%1 - %2'? - Êtes-vous sûr de vouloir éjecter le CD Audio '%1 - %2' ? + Êtes-vous sûr de vouloir éjecter le CD Audio '%1 - %2' ? Eject - Éjecter + Éjecter Are you sure you wish to disconnect '%1'? - Êtes-vous sûr de vouloir déconnecter '%1' ? + Êtes-vous sûr de vouloir déconnecter '%1' ? Disconnect - Déconnecter + Déconnecter Please close other dialogs first. - Veuillez fermer au préalable les autres boites de dialogue. + Veuillez fermer au préalable les autres boites de dialogue. @@ -6664,134 +6715,144 @@ Not logged in - Non connecté + Non connecté Logged in - Connecté + Connecté Unknown error - Erreur inconnue + Erreur inconnue No subscriptions - Pas de souscriptions + Pas de souscriptions You do not have an active subscription - Vous n'avez aucune souscription active + Vous n'avez aucune souscription active Logged in (expiry:%1) - Connecté (expiration:%1) + Connecté (expiration:%1) Session expired - Session expirée + Session expirée DigitallyImportedSettings + You can listen for free without an account, but Premium members can listen to higher quality streams without advertisements. Visit <a href="http://www.di.fm/premium/">http://www.di.fm/premium/</a> to upgrade to a premium account. - + Vous pouvez écouter gratuitement sans compte. Les membres premiums peuvent écouter des flux de meilleure qualité sans publicités. Visitez <a href="http://www.di.fm/premium/">http://www.di.fm/premium/</a> pour souscrire. + Premium Account - Compte Premium + Compte Premium + Username: - Identifiant: + Identifiant: + Password: - Mot de passe: + Mot de passe: + Stream type: - Type de flux: + Type de flux: + Status: - Status: + Status: + Login - Authentification + Authentification + Session expiry: - Session expirée: + Session expirée: + These settings apply to Digitally Imported, JazzRadio.com, RockRadio.com, and Sky.fm - + Ces parametres s'appliquent à Digitally Imported, JazzRadio.com, RockRadio.com, et Sky.fm + If you enter account details, then a 'DI' status item will appear under the list of streams. This will indicate if you are logged in or not. - + Si vous enrez des informations de compte, alors "DI status" apparaitra sous la liste des flux. Celà vous indiquera si vous êtes connecté. Digitally Imported Settings - + Parametres Digitally Imported MP3 256k - MP3 256k + MP3 256k AAC 64k - AAC 64k + AAC 64k AAC 128k - AAC 128k + AAC 128k Not Authenticated - Non authentifié + Non authentifié Authenticating... - Authentification… + Authentification… Authenticated - Authentifié… + Authentifié Logout - Déconnexion + Déconnexion @@ -6800,148 +6861,148 @@ Play - Lecture + Lecture Pause - Pause + Pause DynamicPlaylists - + Start Dynamic Playlist - Lancer la liste dynamique + Lancer la liste dynamique - + Stop Dynamic Mode - Arrêter la liste dynamique + Arrêter la liste dynamique - + Dynamic Playlists - Listes de lecture dynamiques + Listes de lecture dynamiques - + Dynamically generated playlists - + Liste de lecture générée dynamiquement - + You need to install "perl" on your system in order for Cantata's dynamic mode to function. - Vous devez installer "perl" sur votre système pour activer le mode dynamique de Cantata. + Vous devez installer "perl" sur votre système pour activer le mode dynamique de Cantata. - + Failed to locate rules file - %1 - La localisation du fichier contenant les règles a échoué - %1 + La localisation du fichier contenant les règles a échoué - %1 - + Failed to remove previous rules file - %1 - + La suppression du ficier de règles - %1 a échoué - + Failed to install rules file - %1 -> %2 - + L' installation du ficier de règles - %1 -> %2 a échoué - + Could not start dynamic helper. Please check all <a href="https://github.com/CDrummond/cantata/wiki/Dynamic-Palylists-Helper">dependencies</a> are installed. - + L'assistant dynamique ne peut être lancé. Vérifiez que les dépendances sont installées <a href="https://github.com/CDrummond/cantata/wiki/Dynamic-Palylists-Helper">dependencies</a>. - + Dynamizer has been terminated. - + Le Dynamiseur s'est arreté. - + Awaiting response for previous command. (%1) - En attente de la réponse pour la commande précédente. (%1) + En attente de la réponse pour la commande précédente. (%1) - + Saving rule - Sauvegarde des règles + Sauvegarde des règles - + Deleting rule - Suppression des règles + Suppression des règles - + Failed to save %1. (%2) - La sauvegarde de %1 a échoué. (%2) + La sauvegarde de %1 a échoué. (%2) - - + + Failed to delete rules file. (%1) - La suppression des droits sur le fichier a échoué. (%1) + La suppression des droits sur le fichier a échoué. (%1) - + Failed to control dynamizer state. (%1) - + Echec du contrôle de l'état du dynamiseur. (%1) - + Failed to set the current dynamic rules. (%1) - + Impossible d'établir les règles dynamiques en cours. (%1) DynamicPlaylistsPage - + Add - Ajouter + Ajouter - + Edit - Éditer + Éditer - + Remove - Supprimer + Supprimer - + A 'dynamic' playlist contains a set of rules to select tracks from your music library to play. The play queue is filled with random tracks matching your criteria, and the play queue will be dynamically updated after tracks are played. - + Une liste de lecture dynamique contient un ensemble de règlespour sélectionner les pistes à jouer dans votre bibliothèque. La liste de lecture est peuplée avec des pistes aléatoires correspondant à vos critères. La liste de lecture est mise à jour dynamiquement une fois les pistes jouées. - + Use the + icon (below) to create a new 'dynamic' playlist. - + Utilisez l'icone + ci dessous pour créer une nouvelle liste de lecture dynamique. - + Remote dynamizer is not running. In order to support 'dynamic' playlists under Windows, Cantata requires its 'cantata-dynamic' script to be running on the MPD server. - + Le dynamiseur distant n'est pas lancé. Pour que Cantata supporte les listes de lecture dynamiques sous Windows, il est nécessaire que le script 'cantata-dynamic-tourne sur le serveur MPD. - + Are you sure you wish to remove the selected rules? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? + Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? Cette action est définitive. - + Remove Dynamic Rules - Supprimer les règles dynamiques + Supprimer les règles dynamiques @@ -6966,164 +7027,186 @@ FilenameSchemeDialog + Example: - Exemple: + Exemple: + About filename schemes - À propos du schéma de nommage + À propos du schéma de nommage + The artist of the album. For most albums, this will be the same as the <i>Track Artist.</i> For compilations, this will often be <i>Various Artists.</i> - L'artiste de l'album. Pour la plupart des albums, il aura la même valeur que <i>l'artiste des pistes</i>. Pour les compilations, il sera souvent défini comme <i>Artistes Divers</i>. + L'artiste de l'album. Pour la plupart des albums, il aura la même valeur que <i>l'artiste des pistes</i>. Pour les compilations, il sera souvent défini comme <i>Artistes Divers</i> + Album Artist - Artiste Album + Artiste Album + The name of the album. - Le nom de l'album. + Le nom de l'album. + Album Title - Titre de l'album + Titre de l'album + The composer. - Le compositeur + Le compositeur. + Composer - Compositeur + Compositeur + The artist of each track. - L'artiste de chaque piste. + L'artiste de chaque piste. + Track Artist - Artiste de la piste + Artiste de la piste + The track title (without <i>Track Artist</i>). - Le titre de la piste (sans <i>l'artiste de la piste</i>). + Le titre de la piste (sans <i>l'artiste de la piste</i>). + Track Title - Titre de la piste + Titre de la piste + The track title (with <i>Track Artist</i>, if different to <i>Album Artist</i>). - Le titre de la piste (avec <i>l'artiste de la piste</i> s'il est différent de <i>l'artiste de l'album</i>). + Le titre de la piste (avec <i>l'artiste de la piste</i> s'il est différent de <i>l'artiste de l'album</i>). + Track Title (+Artist) - Titre de la piste (+Artiste) + Titre de la piste (+Artiste) + The track number. - Piste numéro + Le numero de la piste. + Track # - Piste # + Piste # + The album number of a multi-album album. Often compilations consist of several albums. - + Le numéro d'album d'un album multi albums. C'est souvent le cas des compliations. + CD # - CD # + CD # + The year of the album's release. - Année de sortie de l'album. + Année de sortie de l'album. + Year - Année + Année + The genre of the album. - Genre de l'album. + Genre de l'album. + Genre - Genre + Genre Filename Scheme - Schéma de nommage + Schéma de nommage Various Artists Example album artist - + Various Artists Wibble Example artist - Wibble + Wibble Vivaldi Example composer - Vivaldi + Vivaldi Now 5001 Example album - Now 5001 + Now 5001 Wobble Example song name - Wobble + Wobble Dance Example genre - Dance + Dance The following variables will be replaced with their corresponding meaning for each track name. - Les variables suivantes vont êtes remplacées par leurs valeurs respectives pour chaque nom de piste. + Les variables suivantes vont êtes remplacées par leurs valeurs respectives pour chaque nom de piste. <tr><th><em>Variable</em></th><th><em>Button</em></th><th><em>Description</em></th></tr> - <tr><th><em>Variable</em></th><th><em>Bouton</em></th><th><em>Description</em></th></tr> + <tr><th><em>Variable</em></th><th><em>Bouton</em></th><th><em>Description</em></th></tr> @@ -7131,27 +7214,27 @@ Server Detection - + Détection du serveur Please select your MPD. If you don't see your MPD listed here, check that zeroconf is activated in your MPD configuration or insert the host configuration manually. - + Merci de choisir votre MPD. Si vous ne le voyez pas dans la liste, vérifiez que zeroconf est activé dans la configuration de MPD ou entrée l'adresse de l'hôte manuellement. Name - Nom + Nom Address - + Adresse Port - + Port @@ -7178,23 +7261,23 @@ Updating... - Mise à jour… + Mise à jour… Reading cache - Lecture du cache + Lecture du cache Saving cache - Sauvegarde du cache + Sauvegarde du cache %1 %2% Message percent - %1 %2% + %1 %2% @@ -7202,12 +7285,12 @@ Filter On Genre - Filtrer sur le genre + Filtrer sur le genre All Genres - Tous les genres + Tous les genres @@ -7215,17 +7298,17 @@ Audio CD - CD Audio + CD Audio Streams - Flux + Flux %n Track(s) - + 1 piste %n pistes @@ -7235,13 +7318,16 @@ InitialSettingsWizard + Cantata First Run - Premier lancement de Cantanta + Premier lancement de Cantata + Premier lancement de Cantanta + Welcome to Cantata - Bienvenue sur Cantata + Bienvenue sur Cantata <html><head/><body><p>Welcome to Cantata</p></body></html> @@ -7249,119 +7335,143 @@ + <p>Cantata is a feature-rich and user friendly client for Music Player Daemon (MPD). MPD is a flexible, powerful, server-side application for playing music.</p><p>For more information on MPD itself, please refer to the MPD website <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a></p><p>This 'wizard' will guide you through the basic settings required for Cantata to function correctly.</p> - + <p>Cantata est un client complet et ergonomique pour Music Player Daemon (MPD). MPD est une application serveur flexible et puissante pour jouer de la musique</p><p>Pour plus d'information sur MPD visitez sons site web <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a></p><p>Cet assistant vous guidera dans le parametrage basique nécessaire au bon fonctionnement de Cantata.</p> + <p>Welcome to Cantata</p> - + Bienvenue sur Cantata + <p>Cantata is a feature-rich and user friendly client for Music Player Daemon (MPD). MPD is a flexible, powerful, server-side application for playing music. MPD may be started either system-wide, or on a per-user basis.<br/><br/>Please select how you would like to have Cantata initially connect to (or startup) MPD:</p> - + >Cantata est un client complet et ergonomique pour Music Player Daemon (MPD). MPD est une application serveur flexible et puissante pour jouer de la musique MPD peut être demarré à l'echelle du système ou sur la base de chaque utilisateur.<br/><br/>Choisissez comment vous souhaitez que Cantata se connecte à ou démarre MPD:</p> + Standard multi-user/server setup - Profil multi-utilisateurs/serveurs standard. + Profil multi-utilisateurs/serveurs standard + <i>Select this option if your music collection is shared between users, your MPD instance is running on another machine, you already have a personal MPD setup, or you wish to enable access from other clients (e.g. MPDroid). If you select this option then Cantata itself cannot control the starting and stopping of the MPD server. You will therefore need to ensure that MPD is already configured and running.</i> - + <i>Choisissez cette option si votre collection de musique est partegée entre plusieurs utilisateurs, votre MPD tourne sur une autre machine, vous avez déjà un MPD configuré ou si vous voulez permettre l'accès depuis d'autres clients (comme MPDroid). Si vous choisissez cette option, Cantata ne contrôlera pas le démarrage et l'arrêt du serveur MPD. Il vous appartient de vous assurer que MPD est configuré et lancé.</i> + Basic single user setup - Profil standard pour un simple utilisateur + Profil standard pour un simple utilisateur + <i>Select this option if your music collection is not shared with others, and you wish Cantata to configure and control the MPD instance. This setup will be exclusive to Cantata, and will <b>not</b> be accessible to other MPD clients (e.g. MPDroid)</i> - + <i>Choisissez cette option si votre collection de musique n'est pas partagée et que vous voulez que Cantata contrôle MPD. Ce réglage est exclusif à Cantata. Les autres clients (tel MPDroid) <b>ne pourront pas </b> y accéder.</i> + If you wish to have an advanced MPD setup (e.g. multiple audio outputs, full DSD support, etc) then you <b>must</b> choose 'Standard' - + Si vous voulez une installation avancée de MPD (plsieurs sorties audio, support du DSD etc.)vous <b>devez</b> choisir Standard + For more information on MPD itself, please refer to the MPD website <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a><br/><br/>This 'wizard' will guide you through the basic settings required for Cantata to function correctly. - + Pour plus d'information sur MPD visitez sons site web <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a></p><p>Cet assistant vous guidera dans le parametrage basique nécessaire au bon fonctionnement de Cantata. + Connection details - Détails de connexion + Détails de connexion + The settings below are the basic settings required by Cantata. Please enter the relevant details, and use the 'Connect' button to test the connection. - + Les réglages ci dessous sont le minimum requis par Cantata. Entrez les informations correspondantes et cliquez sur 'Connection' pour tester la connection + Host: - Hôte: + Hôte: + Password: - Mot de passe: + Mot de passe: + + Music folder: - Dossier musical: + Dossier musical: + Connect - Connecter + Connecter + The 'Music folder' setting is used to lookup cover-art, lyrics, etc. If your MPD instance is on a remote host, you may set this to a HTTP URL. - + Le paramètre "Dossier musical" est utilisé pour chercher les pochetttes, paroles, etc. Si votre MPD est sur une machine distante, vous devriez utiliser une url HTTP + Music folder - Dossier musical + Dossier musical + Please choose the folder containing your music collection. - Veuillez spécifier le dossier contenant votre collection musicale. + Veuillez spécifier le dossier contenant votre collection musicale. + Album Covers - + Pochettes des albums + <p>Cantata can download missing covers, and store these either in the music folder or within your personal cache folder.</p> - + <p>Cantata peut télécharger les pochettes manquantes et les sauvegarder soit dans votre dossier musical, soit dans le cache.</p> + Fetch missing covers - + Récupérer les pochettes manquantes. + Save downloaded covers into music folder - + Enregistrer les pochettes téléchargées dans votre dossier musical + If you elect to have Cantata store covers within the music folder, and you do not have write access to this folder (or you have set this as a HTTP address), then Cantata will revert to saving the files in your personal cache folder. - + Si vous choisissez que Cantata enregistre les pochettes dans votre dossier musical et que vous n'avez pas les droits d'accès en écriture (ou que vous avez choisi une adresse HTTP), alors Cantata les enregistrera d'office dans le cache. <p>Cantata will download missing covers, and lyrics, from the internet.</p><p>For each of these, please confirm whether you wish Cantata to store the relevant files within the music folder, or within your personal cache/config folders.</p> @@ -7377,48 +7487,50 @@ + Finished! - Terminé ! + Terminé ! + Cantata is now configured!<br/><br/>Cantata's configuration dialog maybe used to customise Cantata's appearance, as well as to add extra MPD hosts, etc. - + Cantata est maintenant configuré!<br/><br/>La boîte de dialogue de configuration de Cantata peut être utilisée pour personaliser l'apparence, ajouter d'autres serveurs MPD, etc + Cantata will groups tracks into albums by using the 'AlbumArtist' tag if it is set, otherwise it will fallback to the 'Artist' tag. If you have albums with multiple artists, you <b>must</b> set the 'AlbumArtist' tag for the grouping to function correctly. It is suggested to use 'Various Artists' in this scenario. - + Cantata regroupe les pistes en album en utilisant le tag 'artiste de l'album' s'il existe.Si vous avez des albums avec plusieurs artistes, vous devez utiliser ce tag pour que la fonction de groupage fonctionne corrrectement. Nous vous suggerons d'utiliser "various artists" dans cette situation - <b>Warning:</b> You are not currently a member of the 'users' group. Cantata will function better (saving of album covers, lyrics, etc. with the correct permissions) if you (or your administrator) add yourself to this group. If you do add yourself you will need to logout and back in for this to take effect. - + <b>Attention:</b>Vous n'êtes pas membre du groupe 'users'.Cantata fonctionnera mieux (sauvegarde des pochettes, paroles, etc) avec les bonnes permissions.Si vous vous ajoutez à ce groupe vous devez vous déconnecter et vous reconnecter pour que celà prenne effet. - + Not Connected - Non connecté + Non connecté - + Discover... - + Découverte... - + Connection Established - Connexion établie + Connexion établie - + Connection Failed - La connexion a échoué + La connexion a échoué - + Cantata will now terminate - + Cantata va s'arreter @@ -7426,318 +7538,380 @@ Password - Mot de passe + Mot de passe Please enter password: - Veuillez saisir le mot de passe à nouveau: + Veuillez saisir le mot de passe à nouveau: InterfaceSettings + Sidebar - Barre latérale + Barre latérale + Views - Vues + Vues + Use the checkboxes below to configure which views will appear in the sidebar. - + Utilisez les cases à cocher pour configurer quelles vues apparaitront dans la barre latérale. + If 'Play Queue' is not checked above, then it will appear to the side of the other views. If 'Info' is not checked above, then a button will be added to the toolbar allowing you to access song information. - + Si 'liste de lecture' n'est pas cochée, elle apparaitra à coté des autres vues. Si 'Info' n'est pas cochée, un bouton sera ajouté à la barre d'outils. + Options - Options + Options + + + Style: - Style: + Style: + Position: - Position: + Position: + Only show icons, no text - N'afficher que les icônes, sans le texte + N'afficher que les icônes, sans le texte + Auto-hide - Cacher automatiquement + Cacher automatiquement + Automatically change style when insufficient space - + Changer automatiquement de style quand l'espace est insuffisant. + <p>Change to a small top bar (containing all views) when the window is narrow.</p> - + <p> Changer pour une petite barre en haut (contenant tout)quand la fenêtre est étroite.</p> + Play Queue - Liste de lecture courante + Liste de lecture courante + Initially collapse albums - Regrouper les albums initialement + Regrouper les albums initialement + Automatically expand current album - + Développer automatiquement l'album en cours + Scroll to current track - Défiler jusqu'à la piste courante + Défiler jusqu'à la piste courante + Prompt before clearing - + Demander avant d'effacer + Separate action (and shortcut) for play queue search - + Actions (et racourcis) séparées pour la recherche dans la liste de lecture courante. + Background Image - Image de fond + Image de fond + None - Vide + Vide + Current album cover - Pochette courante + Pochette courante + Custom image: - Image personnalisée + Image personnalisée + Blur: - Flou: + Flou: + 10px - 10px + 10px + Opacity: - Opacité: + Opacité: + 40% - 40% + 40% + Toolbar - Outils + Outils + Show stop button - Afficher le bouton stop + Afficher le bouton stop + Show cover of current track - Afficher la pochette de la piste courante + Afficher la pochette de la piste courante + Show track rating - Afficher la note de la piste + Afficher la note de la piste + Show technical info - + Afficher les infos techniques + External - Externe + Externe + Enable MPRIS D-BUS interface - + Activer l'interface MPRIS D-BUS + Show popup messages when changing tracks - Afficher une notification lors du changement de piste + Afficher une notification lors du changement de piste + Show icon in notification area - Afficher un icône dans la zone de notifications + Afficher un icône dans la zone de notifications + Minimize to notification area when closed - Minimiser dans la zone de notification si la fenêtre est fermée + Minimiser dans la zone de notification si la fenêtre est fermée + On Start-up - Au lancement + Au lancement + Show main window - Afficher la fenêtre + Afficher la fenêtre + Hide main window - Cacher la fenêtre principale + Cacher la fenêtre principale + Restore previous state - Récupérer l'état précédent + Récupérer l'état précédent + Tweaks - + Avancés + Artist && Album Sorting - + Tri des albums et des artistes + Enter a (comma separated) list of prefixes to ignore when sorting artist and albums. e.g. if set to 'The' then 'The Beatles' would be sorted by 'Beatles' - + Entrez une liste des préfixes à ignorer, séparés par des virgules, pour le tri des artistes et des albums. Si vous entrez 'Les', 'Les négresses vertes' sera trié par 'négresses vertes'. + Enter comma separated list of prefixes... - + Entrez la liste des préfixes séparés par des virgules. + Composer Support - + Support du compositeur + By default, Cantata uses the 'Album Artist' tag (or 'Artist' tag if a song has no 'Album Artist') to group songs and albums. For certain genres, e.g 'Classical', it may be preferable to use the 'Composer' tag (if set) to perform this grouping. Please enter a (comma separated) list of the genres with which you would like Cantata to use the 'Composer' tag. - + Cantata utilise par défaut le tag 'artiste de l'album', s'il existe, pour trier les pistes et les albums. Pour certains genres comme le classique, il est préférable d'utiliser le tag 'compositeur', s'il existe, pour ce tri. Entrez uneliste de genres, séparés par une virgule, pour lesquels Cantata utilisera le tag 'compositeur'. + Enter comma separated list of genres... - + Entrez une liste de genres séparés par une virgule + Single Tracks - Piste unique + Piste unique + If you have a lot of artists in your collection that only contain a single track, then it can be cumbersome for each of these to have their own entry in the list of artists. As a work-around for this, if you place these tracks into a separate folder, and enter this folder name below, then Cantata will group these under an album named 'Single Tracks' with an album artist of 'Various Artists'. You may enter a comma separated list of folder names (without leading or trailing path separators) below. - + Si vous avez dans votre collection de nombreux artistes n'ayant qu'un piste, il peut être génant que chacun d'eux ait son entrée dans la liste des artistes. Pour pallier à ceci, en plaçant ces pistes dans un ou plusieurs dossiers particuliers, Cantata peut les grouper dans un album nommé 'piste unique' avec un artiste de l'album 'artistes divers'. Entrez ici une liste de ces dossiers séparés par une virgule. (Omettez le / de début et de fin) + Comma separated list of folders that contain single track files... - + Liste des dossiers contenant les pistes uniques, séparés par une virgule. + Miscellaneous - + Divers + CUE files: - + Fichiers CUE: + Year tag: - + Tag 'année' : + Changing 'Artist & Album Sorting', 'Single Tracks', or 'CUE files' will require a DB refresh in order to take effect. Changing 'Composer Support' or 'Year tag' will require restarting Cantata. - + Changer 'Tri artiste et album', 'pistes uniques', ou "fichiers CUE' nécessite de rafraichir la Base de données. Changer 'support du tag compositeur' ou 'tag 'année'' nécessite de redémarrer Cantata. + Covers - Pochettes + Pochettes + Fetch missing covers - + Récupérer les pochettes manquantes + Save downloaded covers into music folder - + Enregistrer les pochettes téléchargées dans le dossier musical + Filename: - + Nom de fichier: + <p>Filename (without extension) to save downloaded covers as.<br/>If left blank 'cover' will be used.<br/><br/><i>%artist% will be replaced with album artist of the current song, and %album% will be replaced with the album name.</i></p> - + <p>Nom de fichier (sans extention) à utiliser pour enregistrer les pochettes.<br/>Si laissé vide, 'cover' sera utilisé.<br/><br/><i>%artist% sera remplacé par l'artiste de l'album de la piste en cours et ùalbum% sera remplacé par le nom de l'album.</i></p> + If you enable 'Save downloaded covers into music folder' you may need to clear the cache of any previous covers to force downloading of new covers. See 'Cache' settings page for further details. - + Si vous activez l'enregistrement des pochettes dans le dossier musical vous pourriez avoir besoin de vider le cache pour forcer le chargement de nouvelles pochettes. Voir la page des paramètres du cache pour plus de détails. + General - Général + Général Fetch missing covers from Last.fm @@ -7745,18 +7919,21 @@ + Show delete action in context menus - + Montrer l'action 'effacer' dans les menus contextuels. + Enforce single-click activation of items - + Forcer l'activation par simple clic des éléments. + Changing the style setting will require a re-start of Cantata. - + Changer les parametres de style nécessite de redémarrer Cantata Make interface more touch friendly @@ -7764,8 +7941,9 @@ + Show song information tooltips - Informations sur la piste + Informations sur la piste Support retina displays @@ -7773,18 +7951,21 @@ + Language: - Langue : + Langue : + Changing the 'Enforce single-click activation of items' setting will require a re-start of Cantata. - + Changer le paramètre 'forcer l'activation par simple clic des éléments' nécessite le redémarrage de Cantata + Changing the language setting will require a re-start of Cantata. - + Changer la langue nécessite le redémarrage de Cantata Changing the 'touch friendly' setting will require a re-start of Cantata. @@ -7793,131 +7974,130 @@ Use 'Year' tag to display & sort - + Utiliser le tag 'année' pour l'affichage et le tri Use 'Original Year' tag to display & sort, fallback to 'Year' if not set - + Utiliser le tag 'année d'origine' pour l'affichage et le tri. Library - + Bibliothèque Folders - Dossiers + Dossiers Playlists - Listes de lecture + Listes de lecture Internet - Streams, Jamendo, Maganatune, SoundCloud, and Podcasts - + Flux Internet , Jamendo, Maganatune, SoundCloud, and Podcasts Devices - UMS, MTP (e.g. Android), and AudioCDs - Périphériques - UMS, MTP (ex: Android) et CD audio + Périphériques - UMS, MTP (ex: Android) et CD audio Search (via MPD) - Rechercher (via MPD) + Rechercher (via MPD) Info - Current song information (artist, album, and lyrics) - Info - Informations de la piste courante (artiste, album et paroles) + Info - Informations de la piste courante (artiste, album et paroles) Large - Grand + Grand Small - Petit + Petit Tab-bar - Barre d'onglets + Barre d'onglets Left - Gauche + Gauche Right - Droite + Droite Top - Haut + Haut Bottom - Bas + Bas Images (*.png *.jpg) - Images (*.png *.jpg) + Images (*.png *.jpg) 10px pixels - 10px + 10px Notifications - Notifications + Notifications If no setting is specified for 'Filename', then Cantata will use a default of <code>cover</code>. This filename is used when downloading covers, or when adding music to your library from devices. - + Si aucun paramètre n'est défini pour 'nom de fichier', Cantata utilisera <code>cover</code> par défaut. Ce nom de fichier est utilisé pour télécharger les pochettes ou pour ajouter de la musique depuis un périphérique. If no setting is specified for 'Filename', then Cantata will use a default of <code>cover</code>. This filename is used when downloading covers. - + Si aucun paramètre n'est défini pour 'nom de fichier', Cantata utilisera <code>cover</code> par défaut. Ce nom de fichier est utilisé pour télécharger les pochettes. - English (en) - + Français (fr) - - + + System default - Valeurs par défaut + Valeurs par défaut - + %1% value% - %1% + %1% - + %1 px pixels - %1 px + %1 px @@ -7925,20 +8105,20 @@ Go Back - Retour + Retour Updating... - Mise à jour… + Mise à jour… JamendoService - + The world's largest digital service for free music - + Le plus grand service digital de musique gratuite @@ -7946,35 +8126,35 @@ Jamendo Settings - Paramètres Jamendo + Paramètres Jamendo MP3 - MP3 + MP3 Ogg - Ogg + Ogg Streaming format: - Format du flux: + Format du flux: KeySequenceButton - + The key you just pressed is not supported by Qt. - + La touche que vous avez pressé n'est pas supportée par Qt - + Unsupported Key - + Touche non supportée @@ -7983,70 +8163,70 @@ Click on the button, then enter the shortcut like you would in the program. Example for Ctrl+a: hold the Ctrl key and press a. - + Cliquez le bouton et entrez le raccourci souhaité. Pour Ctrl+a: pressez et maintenez Ctrl puis pressez sur a - + Meta Meta key - + Méta - + Ctrl Ctrl key - + - + Alt Alt key - + Alt - + Shift Shift key - + Maj - + Input What the user inputs now will be taken as the new shortcut - + Entrée - + None No shortcut defined - Vide + Vide - - + + Shortcut Conflict - + Conflit de raccourci - + The "%1" shortcut is already in use, and cannot be configured. Please choose another one. - + Le raccourci "%1" est déjà utilisé et ne peut être configuré. Merci d'en choisir un autre. - + The "%1" shortcut is ambiguous with the shortcut for the following action: - + Le raccourci "%1" est ambigu avec celui de l'action suivante: - + Do you want to reassign this shortcut to the selected action? - + Voulez vou réassigner le raccourcis à l'action sélectionnée ? - + Reassign - + Réassigné @@ -8054,7 +8234,7 @@ Read more on last.fm - Continuer la lecture sur last.fm + Continuer la lecture sur last.fm @@ -8062,7 +8242,7 @@ Database error - please check Qt SQLite driver is installed - + Erreur de base de donnée. Vérifiez que le driver Qt SQLite est nstallé. @@ -8070,130 +8250,130 @@ <p>Enter a string to search artist, album, title, etc. To filter based on year, add <i>#year-range</i> to search string - e.g.</p><ul><li><b><i>#2000</i></b> return tracks from 2000</li><li><b><i>#1980-1989</i></b> return tracks from the 80's</li><li><b><i>Blah #2000</i></b> to search for string <i>Blah</i> and only return tracks from 2000</li></ul></p> - + Enrez un chaîne à rechercher. Pour filtrer par année, ajoutez <i>#année-fourchette</i> à la chaîne. </p><ul><li><b><i>#2000</i></b> renvoie les pistes de 2000</li><li><b><i>#1980-1989</i></b> renvoie les pistes des années 80</li><li><b><i>Blah #2000</i></b> recherche <i>Blah</i> et ne renvoie que les pistes de 2000</li></ul></p> Show Artist Images - + Afficher les images d'artistes Sort Albums - + Trier les albums Name - Nom + Nom Year - Année + Année Album, Artist, Year - Album, Artiste, Année + Album, Artiste, Année Album, Year, Artist - Album, Année, Artiste + Album, Année, Artiste Artist, Album, Year - Artiste, Album, Année + Artiste, Album, Année Artist, Year, Album - Artiste, Année, Album + Artiste, Année, Album Year, Album, Artist - Année, Album, Artiste + Année, Album, Artiste Year, Artist, Album - Année, Artiste, Album + Année, Artiste, Album Modified Date - + Date de modification Group By - + Grouper par Genre - Genre + Genre Artist - Artiste + Artiste Album - Album + Album No music? Looks like your MPD is not configured correctly. - + Pas de musique ? Il semblerait que MPD ne soit pas configuré correctement. Are you sure you wish to delete the selected songs? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? + Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? Cette action est définitive. Delete Songs - Supprimer les pistes + Supprimer les pistes LocalFolderBrowsePage - + Home - + Dossier personnel - + Browse files in your home folder - + Naviguer dans votre dossier personnel - + Root - + Dossier racine - + Browse files on your computer - + Naviguer dans votre ordinateur - + Open In File Manager - Ouvrir dans l'explorateur de fichiers + Ouvrir dans l'explorateur de fichiers @@ -8201,34 +8381,34 @@ Choose the websites you want to use when searching for lyrics. - Choisissez les sites sources pour la recherche de paroles. + Choisissez les sites sources pour la recherche de paroles. LyricsDialog - + If Cantata has failed to find lyrics, or has found the wrong ones, use this dialog to enter new search details. For example, the current song may actually be a cover-version - if so, then searching for lyrics by the original artist might help. If this search does find new lyrics, these will still be associated with the original song title and artist as displayed in Cantata. - Si Cantata n'a pas trouvé de paroles, ou n'a pas trouvé les bonnes, utilisez cette fenêtre pour entrer de nouveaux paramètres de recherche. Par exemple, la chanson dont vous cherchez les paroles est peut-être une reprise - dans ce cas, chercher les paroles de la version originale peut donner de meilleurs résultats. + Si Cantata n'a pas trouvé de paroles, ou n'a pas trouvé les bonnes, utilisez cette fenêtre pour entrer de nouveaux paramètres de recherche. Par exemple, la chanson dont vous cherchez les paroles est peut-être une reprise - dans ce cas, chercher les paroles de la version originale peut donner de meilleurs résultats. Si cette recherche donne de nouveaux résultats, ils seront toujours associés avec le titre et l'artiste de la version originale dans l'affichage de Cantata. - + Title: - Titre: + Titre: - + Artist: - Artiste: + Artiste: - + Search For Lyrics - Rechercher des paroles + Rechercher des paroles @@ -8236,128 +8416,128 @@ Unknown - Inconnu + Inconnu Connection to %1 failed - La connexion à %1 a échoué + La connexion à %1 a échoué Connection to %1 failed - please check your proxy settings - La connexion à %1 a échoué - Veuillez vérifier votre configuration proxy + La connexion à %1 a échoué - Veuillez vérifier votre configuration proxy Connection to %1 failed - incorrect password - La connexion à %1 a échoué - mot de passe incorrect + La connexion à %1 a échoué - mot de passe incorrect Connecting to %1 - Connecté à %1 + Connecté à %1 Failed to send command to %1 - not connected - L'envoie de la commande à %1 a échoué - non connecté + L'envoie de la commande à %1 a échoué - non connecté Failed to load. Please check user "mpd" has read permission. - Le chargement a échoué. Veuillez vérifier si "mpd" a les permissions de lecture. + Le chargement a échoué. Veuillez vérifier si "mpd" a les permissions de lecture. Failed to load. MPD can only play local files if connected via a local socket. - Le chargement a échoué. MPD peut lire les pistes locales uniquement s'il est connecté à un socket local. + Le chargement a échoué. MPD peut lire les pistes locales uniquement s'il est connecté à un socket local. MPD reported the following error: %1 - MPD a retourné l'erreur suivante: %1 + MPD a retourné l'erreur suivante: %1 Failed to send command. Disconnected from %1 - L'envoie de la commande a échoué. Déconnecté de %1 + L'envoie de la commande a échoué. Déconnecté de %1 - + Failed to rename <b>%1</b> to <b>%2</b> - Le renommage de <b>%1</b> à <b>%2</b> a échoué + Le renommage de <b>%1</b> à <b>%2</b> a échoué - + Failed to save <b>%1</b> - La sauvegarde de <b>%1</b> a échoué + La sauvegarde de <b>%1</b> a échoué - + You cannot add parts of a cue sheet to a playlist! - Vous ne pouvez pas ajouter des parties d'un fichier Cue à une liste de lecture ! + Vous ne pouvez pas ajouter des parties d'un fichier Cue à une liste de lecture ! - + You cannot add a playlist to another playlist! - Il est impossible d'ajouter une liste de lecture dans une autre ! + Il est impossible d'ajouter une liste de lecture dans une autre ! - + Failed to send '%1' to %2. Please check %2 is registered with MPD. - L'envoie de '%1' à %2 a échoué. Veuillez vérifier si %2 est présent dans MPD. + L'envoie de '%1' à %2 a échoué. Veuillez vérifier si %2 est présent dans MPD. - - + + Cannot store ratings, as the 'sticker' MPD command is not supported. - + Impossible d'enregistré les notes. La commande 'sticker' de MPD n'est pas supportée. MagnatuneService - + None - Vide + Vide - + Streaming - Flux continu + Flux continu - + MP3 128k - MP3 128K + MP3 128K - + MP3 VBR - MP3 VBR + MP3 VBR - + Ogg Vorbis - Ogg Vorbis + Ogg Vorbis - + FLAC - FLAC + FLAC - + WAV - WAV + WAV - + Online music from magnatune.com - + Musique en ligne par magnatune.com @@ -8365,530 +8545,532 @@ Magnatune Settings - Paramètres Magnatune + Paramètres Magnatune Username: - Identifiant: + Identifiant: Password: - Mot de passe: + Mot de passe: Membership: - Adhésion: + Adhésion: Downloads: - Téléchargements: + Téléchargements: MainWindow + [Dynamic] - [Dynamique] + [Dynamique] + Exit Full Screen - Sortir du mode plein écran + Sortir du mode plein écran - + Configure Cantata... - Configurer Cantata… + Configurer Cantata… Preferences Préférences - + Preferences... - Préférences... + Préférences... - + Quit - Quitter + Quitter - + About Cantata... - À propos de Cantata… + À propos de Cantata… - + Show Window - Afficher la fenêtre + Afficher la fenêtre - + Server information... - Informations sur le serveur… + Informations sur le serveur… - + Refresh Database - Rafraîchir la base de données + Rafraîchir la base de données - + Refresh - Rafraîchir + Rafraîchir - + Connect - Connecter + Connecter - + Collection - Collection + Collection - - - - + + + + Outputs - Sorties + Sorties - + Stop After Track - Arrêter après la piste + Arrêter après la piste - + Seek forward (%1 seconds) - + avancer (%1 secondes) - + Seek backward (%1 seconds) - + reculer (%1 secondes) - + Add To Stored Playlist - Ajouter à la liste sauvegardée + Ajouter à la liste sauvegardée - + Crop Others - + Enlever les autres - + Add Stream URL - Ajouter l'URL de flux + Ajouter l'URL de flux - + Add Local Files - + Ajouter des fichiers locaux - + Clear - Nettoyer + Nettoyer - + Center On Current Track - Centrer sur la piste courante + Centrer sur la piste courante - + Expanded Interface - Interface étendue + Interface étendue - + Show Current Song Information - Afficher les informations de la piste courante + Afficher les informations de la piste courante - + Full Screen - Plein écran + Plein écran - + Random - Aléatoire + Aléatoire - + Repeat - Répéter + Répéter - + Single - Single + Single - + When 'Single' is activated, playback is stopped after current song, or song is repeated if 'Repeat' is enabled. - Quand le mode 'Single' est activé, la lecture est stoppée après la piste courante ou la piste est répétée si le mode 'Répéter' est activé. + Quand le mode 'Single' est activé, la lecture est stoppée après la piste courante ou la piste est répétée si le mode 'Répéter' est activé. - + Consume - Consommer + Consommer - + When consume is activated, a song is removed from the play queue after it has been played. - Quand le mode 'Consommer' est activé, la piste courante est retirée de la liste de lecture après sa lecture. + Quand le mode 'Consommer' est activé, la piste courante est retirée de la liste de lecture après sa lecture. - + Find in Play Queue - Trouver dans la liste de lecture + Trouver dans la liste de lecture Play Stream Lire le flux - + Play HTTP Output Stream - + Jouer le flux HTTP - + Locate In Library - Trouver dans la bibliothèque + Trouver dans la bibliothèque - + Artist - Artiste + Artiste - + Album - Album + Album - + Track - Piste + Piste - - Play next - Lire la suite + + Play Next + Lire la suite - + Edit Track Information (Play Queue) - + Editer l'information de la piste (liste courante) - + Expand All - Tout étendre + Tout étendre - + Collapse All - Tout replier + Tout replier - + Cancel - Annuler + Annuler - + Play Queue - Liste de lecture courante + Liste de lecture courante - + Library - + Bibliothèque - + Folders - Dossiers + Dossiers - + Playlists - Listes de lecture + Listes de lecture - + Internet - Internet + Internet - + Devices - Périphériques + Périphériques - + Search - Recherche + Recherche - + Info - Infos + Infos - + <p>Enter a string to search artist, album, title, etc. To filter based on year, add <i>#year-range</i> to search string - e.g.</p><ul><li><b><i>#2000</i></b> return tracks from 2000</li><li><b><i>#1980-1989</i></b> return tracks from the 80's</li><li><b><i>Blah #2000</i></b> to search for string <i>Blah</i> and only return tracks from 2000</li></ul></p> - + Enrez un chaîne à rechercher. Pour filtrer par année, ajoutez <i>#année-fourchette</i> à la chaîne. </p><ul><li><b><i>#2000</i></b> renvoie les pistes de 2000</li><li><b><i>#1980-1989</i></b> renvoie les pistes des années 80</li><li><b><i>Blah #2000</i></b> recherche <i>Blah</i> et ne renvoie que les pistes de 2000</li></ul></p> - + Show Menubar - Afficher la barre de menu + Afficher la barre de menu - + &Music - &Musique + &Musique - + &Edit - &Éditer + &Éditer - + &View - &Voir + &Voir - + &Queue - &File + &File - + &Settings - &Paramètres + &Paramètres - + &Help - &Aide + &Aide - + Set Rating - Définir une note + Définir une note - + No Rating - Pas de note + Pas de note - + Failed to locate any songs matching the dynamic playlist rules. - Aucune piste respectant les choix définis pour la liste de lecture dynamique n'a été trouvée. + Aucune piste respectant les choix définis pour la liste de lecture dynamique n'a été trouvée. - + Connecting to %1 - Connecté à %1 + Connecté à %1 - + Refresh MPD Database? - Rafraîchir la base de données MPD ? + Rafraîchir la base de données MPD ? - + About Cantata - À propos de Cantata + À propos de Cantata - + <b>Cantata %1</b><br/><br/>MPD client.<br/><br/>&copy; 2011-2018 Craig Drummond<br/>Released under the <a href="http://www.gnu.org/licenses/gpl.html">GPLv3</a> - + <b>Cantata %1</b><br/><br/>client MPD.<br/><br/>&copy; 2011-2018 Craig Drummond<br/>publié sous la <a href="http://www.gnu.org/licenses/gpl.html">GPLv3</a> - + Please refer to <a href="https://github.com/CDrummond/cantata/issues">Cantata's issue tracker</a> for a list of known issues, and to report new issues. - + Visitez <a href="https://github.com/CDrummond/cantata/issues">le tracker de bug de Cantata,</a> pour une liste de bugs connus ou pour en reporter de nouveuax. - + Based upon <a href="http://lowblog.nl">QtMPC</a> - &copy; 2007-2010 The QtMPC Authors<br/> - + Basé sur <a href="http://lowblog.nl">QtMPC</a> - &copy; 2007-2010 The QtMPC Authors<br/> - + Context view backdrops courtesy of <a href="http://www.fanart.tv">FanArt.tv</a> - Les images de fond sont issues de <a href="http://www.fanart.tv">FanArt.tv</a> + Les images de fond sont issues de <a href="http://www.fanart.tv">FanArt.tv</a> - + Context view metadata courtesy of <a href="http://www.wikipedia.org">Wikipedia</a> and <a href="http://www.last.fm">Last.fm</a> - Les informations de lecture sont issues de <a href="http://www.wikipedia.org">Wikipedia</a> et <a href="http://www.last.fm">Last.fm</a> + Les informations de lecture sont issues de <a href="http://www.wikipedia.org">Wikipedia</a> et <a href="http://www.last.fm">Last.fm</a> - + Please consider uploading your own music fan-art to <a href="http://www.fanart.tv">FanArt.tv</a> - N'hésitez pas à envoyer vos propres images fan-art sur <a href="http://www.fanart.tv">FanArt.tv</a> + N'hésitez pas à envoyer vos propres images fan-art sur <a href="http://www.fanart.tv">FanArt.tv</a> - + A Podcast is currently being downloaded Quitting now will abort the download. - Un podcast est actuellement en téléchargement + Un podcast est actuellement en téléchargement Le téléchargement sera abandonné si vous quittez maintenant. - + Abort download and quit - Abandonner et quitter + Abandonner et quitter - + Please close other dialogs first. - Veuillez fermer au préalable les autres boites de dialogue. + Veuillez fermer au préalable les autres boites de dialogue. - - + + Enabled: %1 - Activé: %1 + Activé: %1 - - + + Disabled: %1 - Désactivé: %1 + Désactivé: %1 - - + + Server Information - Informations du serveur + Informations du serveur - + <tr><td colspan="2"><b>Server</b></td></tr><tr><td align="right">Protocol:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Uptime:&nbsp;</td><td>%4</td></tr><tr><td align="right">Playing:&nbsp;</td><td>%5</td></tr><tr><td align="right">Handlers:&nbsp;</td><td>%6</td></tr><tr><td align="right">Tags:&nbsp;</td><td>%7</td></tr> - <tr><td colspan="2"><b>Serveur</b></td></tr><tr><td align="right">Protocole:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Durée de fonctionnement:&nbsp;</td><td>%4</td></tr><tr><td align="right">Temps de lecture:&nbsp;</td><td>%5</td></tr><tr><td align="right">Formats:&nbsp;</td><td>%6</td></tr><tr><td align="right">Étiquettes:&nbsp;</td><td>%7</td></tr> + <tr><td colspan="2"><b>Serveur</b></td></tr><tr><td align="right">Protocole:&nbsp;</td><td>%1.%2.%3</td></tr><tr><td align="right">Durée de fonctionnement:&nbsp;</td><td>%4</td></tr><tr><td align="right">Temps de lecture:&nbsp;</td><td>%5</td></tr><tr><td align="right">Formats:&nbsp;</td><td>%6</td></tr><tr><td align="right">Étiquettes:&nbsp;</td><td>%7</td></tr> - + <tr><td colspan="2"><b>Database</b></td></tr><tr><td align="right">Artists:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Songs:&nbsp;</td><td>%3</td></tr><tr><td align="right">Duration:&nbsp;</td><td>%4</td></tr><tr><td align="right">Updated:&nbsp;</td><td>%5</td></tr> - <tr><td colspan="2"><b>Base de données</b></td></tr><tr><td align="right">Artistes:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Pistes:&nbsp;</td><td>%3</td></tr><tr><td align="right">Durée totale:&nbsp;</td><td>%4</td></tr><tr><td align="right">Mise à jour:&nbsp;</td><td>%5</td></tr> + <tr><td colspan="2"><b>Base de données</b></td></tr><tr><td align="right">Artistes:&nbsp;</td><td>%1</td></tr><tr><td align="right">Albums:&nbsp;</td><td>%2</td></tr><tr><td align="right">Pistes:&nbsp;</td><td>%3</td></tr><tr><td align="right">Durée totale:&nbsp;</td><td>%4</td></tr><tr><td align="right">Mise à jour:&nbsp;</td><td>%5</td></tr> - + Cantata (%1) - Cantata (%1) + Cantata (%1) - + MPD reported the following error: %1 - MPD a retourné l'erreur suivante: %1 + MPD a retourné l'erreur suivante: %1 - + Cantata - Cantata + Cantata - + Playback stopped - La lecture a été interrompue + La lecture a été interrompue - + Remove all songs from play queue? - Supprimer toutes les pistes de la liste de lecture ? + Supprimer toutes les pistes de la liste de lecture ? - + Priority - Priorité + Priorité - + Enter priority (0..255): - Saisir une priorité (0…255): + Saisir une priorité (0…255): - + Decrease priority for each subsequent track - + Réduire la priorité pour chaque piste subséquente - + Playlist Name - Nom de la liste de lecture + Nom de la liste de lecture - + Enter a name for the playlist: - Entrez un nom pour la liste de lecture: + Entrez un nom pour la liste de lecture: - + '%1' is used to store favorite streams, please choose another name. - Le nom '%1' est déjà utilisé pour enregistrer vos flux favoris, veuillez choisir un autre nom. + Le nom '%1' est déjà utilisé pour enregistrer vos flux favoris, veuillez choisir un autre nom. - + A playlist named '%1' already exists! Add to that playlist? - La liste de lecture '%1' existe déjà ! + La liste de lecture '%1' existe déjà ! Ajouter à cette liste de lecture ? - + Existing Playlist - Liste de lecture existante + Liste de lecture existante - + Select Music Files - + Sélectionnez les fichiers de musique - + Music Files - + Fichiers de musique - + %n Track(s) - + 1 piste %n pistes - + %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -8897,9 +9079,9 @@ MenuButton - + Menu - Menu + Menu @@ -8907,7 +9089,7 @@ Cancel - Annuler + Annuler @@ -8915,26 +9097,26 @@ Open In File Manager - Ouvrir dans l'explorateur de fichiers + Ouvrir dans l'explorateur de fichiers No folders? Looks like your MPD is not configured correctly. - + Pas de dossiers ? Il semblerait que MPD ne soit pas configuré correctement. Are you sure you wish to delete the selected songs? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? + Êtes-vous sûr de vouloir supprimer les pistes sélectionnées ? Cette action est définitive. Delete Songs - Supprimer les pistes + Supprimer les pistes @@ -8942,58 +9124,58 @@ (Stream) - (Flux) + (Flux) MtpConnection - + Connecting to device... - Connexion au périphérique + Connexion au périphérique - - + + No devices found - Pas de périphérique trouvé + Pas de périphérique trouvé - + Connected to device - Connecté au périphérique + Connecté au périphérique - + Disconnected from device - Déconnecté du périphérique + Déconnecté du périphérique - + Updating folders... - Mise à jour des dossiers… + Mise à jour des dossiers… Updating files... Mise à jour des fichiers… - + Updating tracks... - Mise à jour des pistes… + Mise à jour des pistes… MtpDevice - + Not Connected - Non connecté + Non connecté - + %1 free - %1 libre + %1 libre @@ -9001,22 +9183,22 @@ Failed to open CD device - L'ouverture du CD a échoué + L'ouverture du CD a échoué Track %1 - Piste %1 + Piste %1 %1 (Disc %2) - %1 (Disque %2) + %1 (Disque %2) No matches found in MusicBrainz - Aucun résultat trouvé dans MusicBrainz + Aucun résultat trouvé dans MusicBrainz @@ -9024,17 +9206,17 @@ Cue Sheet - Liste Cue + Liste Cue Playlist - Liste de lecture + Liste de lecture %n Track(s) - + 1 piste %n pistes @@ -9042,7 +9224,7 @@ %n Artist(s) - + 1 artiste %n artistes @@ -9050,7 +9232,7 @@ %n Album(s) - + 1 album %n albums @@ -9058,7 +9240,7 @@ %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -9067,7 +9249,7 @@ %1 by %2 Album by Artist - %1 par %2 + %1 par %2 @@ -9075,20 +9257,20 @@ <i><b>NOTE:</b> %1</i> - <i><b>NOTE:</b> %1</i> + <i><b>NOTE:</b> %1</i> NowPlayingWidget - + Copy To Clipboard - + Copier dans le presse papier - + Now Playing - + En cours (Stream) @@ -9100,22 +9282,22 @@ &Window - &Fenêtre + &Fenêtre Close - Fermer + Fermer Minimize - Minimiser + Minimiser Zoom - Zoomer + Zoomer @@ -9123,22 +9305,22 @@ Downloading...%1% - + Téléchargement de %1% Parsing music list.... - + Traitement de l liste... Failed to download - Le téléchargement a échoué + Le téléchargement a échoué %n Artist(s) - + 1 artiste %n artistes @@ -9149,43 +9331,43 @@ Group By - + Grouper par Genre - Genre + Genre Artist - Artiste + Artiste Configure - Configurer + Configurer - + The music listing needs to be downloaded, this can consume over %1Mb of disk space - + La liste de musique doit être téléchargée, celà peut occuper plus de %1 Mb d'espace disque - + Dowload music listing? - + Télécharger la liste de musique ? - - + + Download - Télécharger + Télécharger - + Re-download music listing? - + Re-télécharger la liste de musique ? @@ -9193,7 +9375,7 @@ Searching... - Recherche en cours… + Recherche en cours… @@ -9201,12 +9383,12 @@ No tracks found. - Pas de pistes trouvées: + Pas de pistes trouvées: %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -9217,12 +9399,12 @@ Use the checkboxes below to configure the list of active services. - Utilisez les cases ci-dessous pour configurer la liste des services actifs. + Utilisez les cases ci-dessous pour configurer la liste des services actifs. Configure Service - Configurer le service + Configurer le service @@ -9230,7 +9412,7 @@ Song Information - Informations sur la piste + Informations sur la piste @@ -9239,136 +9421,153 @@ Failed to parse - L'analyse a échoué + L'analyse a échoué OpmlBrowsePage - + Reload - Rafraîchir + Rafraîchir - + Failed to download directory listing - La récupération de la liste des dossiers a échoué + La récupération de la liste des dossiers a échoué - + Failed to parse directory listing - L'analyse de la liste des dossiers a échoué + L'analyse de la liste des dossiers a échoué OtherSettings + Background Image - Image de fond + Image de fond + None - Vide + Vide + Artist image - Image de l'artiste + Image de l'artiste + Custom image: - Image personnalisée + Image personnalisée + Blur: - Flou: + Flou: + 10px - 10px + 10px + Opacity: - Opacité: + Opacité: + 40% - 40% + 40% + Automatically switch to view after: - + Basculer automatiquement vers la vue après: + Do not auto-switch - Désactiver le changement automatique + Désactiver le changement automatique + ms - ms + ms + Dark background - Fond sombre + Fond sombre + Darken background, and use white text, regardless of current color palette. - + Assombrir le fond et utiliser du texte blanc, quelle que soit la palette de couleurs + Always collapse into a single pane - Toujours regrouper en un seul panneau + Toujours regrouper en un seul panneau + Only show 'Artist', 'Album', or 'Track' even if sufficient width to show all three. - + Afficher seulemnt 'artiste', 'lbum' ou 'piste' même si la largeur est suffisante pour afficherr les trois. + Only show basic wikipedia text - N'afficher que le texte Wikipédia de base + N'afficher que le texte Wikipédia de base + Cantata only shows a trimmed down version of wikipedia pages (no images, links, etc). This trimming is not always 100% accurate, which is why Cantata defaults to only showing the introduction. If you elect to show the full article, then there may be parsing errors. You will also need to remove any currently cached articles (using the 'Cache' page). - + Cantata affiche une version simplifiée des pages Wikipédia (pas d'image, de lien..). Cette simplification n'est pas parfaite c'est pourquoi Cantata n'affiche que l'introduction. Si vous choisissez d'afficher l'article en entier, il peut y avoir des erreurs. Vous devrez purger les articles présents dans le cache. (utilisez les paramètres du cache) Images (*.png *.jpg) - Images (*.png *.jpg) + Images (*.png *.jpg) 10px pixels - 10px + 10px %1% value% - %1% + %1% %1 px pixels - %1 px + %1 px @@ -9376,152 +9575,152 @@ Select Folder - Sélectionner le dossier + Sélectionner le dossier Select File - Sélectionner le fichier + Sélectionner le fichier PlayQueueModel - + Title - Titre + Titre - - + + Artist - Artiste + Artiste - - + + Album - Album + Album - + # Track number - + - + Length - Durée + Durée - + Disc - Disque + Disque - - + + Year - Année + Année - + Original Year - Année originale + Année d'origine - - + + Genre - Genre + Genre - + Priority - Priorité + Priorité - - + + Composer - Compositeur + Compositeur - - + + Performer - Interprète + Interprète - + Rating - Note + Note - + Filename - Nom du fichier + Nom du fichier - + Path - + Chemin - + Remove Duplicates - Supprimer les doublons + Supprimer les doublons - + Undo - Annuler + Annuler - + Redo - Refaire + Refaire - + Shuffle - Mélanger + Mélanger - + Tracks - Pistes + Pistes - + Albums - Albums + Albums - + Sort By - Trier par + Trier par - + Album Artist - Artiste Album + Artiste Album - + Track Title - Titre de la piste + Titre de la piste - + Track Number - + Numéro de piste - + # (Track Number) - + n° (numéro de piste) @@ -9529,217 +9728,254 @@ Remove - Supprimer + Supprimer PlaybackSettings + Playback - Lecture + Lecture + Fadeout on stop: - + Fondu en arretant + + None - Vide + Vide + ms - ms + ms + Stop playback on exit - Arrêter la lecture à la fermeture + Arrêter la lecture à la fermeture + Inhibit suspend whilst playing - + Empécher la mise en veille pendant la lecture + If you press and hold the stop button, then a menu will be shown allowing you to choose whether to stop playback now, or after the current track. (The stop button can be enabled in the Interface/Toolbar section) - + Si vous maintenez appuyé le bouton stop, un menu apparaitra vous permettant de choisir entre arreter la lecture immédiatement ou après la piste en cours. (Le bouton stop peut être activé dans la section interface/barre d'outils) + Output - Sortie + Sortie - + + <i>Not Connected!<br/>The entries below cannot be modified, as Cantata is not connected to MPD.</i> - <i>Non connecté !<br/>Les entrées ci-dessous ne peuvent être modifiées car Cantata n'est pas connecté à MPD.</i> + <i>Non connecté !<br/>Les entrées ci-dessous ne peuvent être modifiées car Cantata n'est pas connecté à MPD.</i> + Crossfade between tracks: - + Fondu entre les pistes + Replay gain: - + Replay gain: + s - + s + About replay gain - À propos du ReplayGain + À propos du ReplayGain + Volume step: - + Palier de volume + <p>Amount to change volume by when using either the volume control keyboard shortcuts, or the mouse wheel over the toolbar volume control.</p> - + <p>Quantité de volume à modifier en utilisant le raccourci clavier ou la roue de la souris sur la barre de volume.</p> + % - + % + Use the checkboxes below to control the active outputs. - Utilisez les cases ci-dessous pour contrôler les sorties actives. + Utilisez les cases ci-dessous pour contrôler les sorties actives. Track - Piste + Piste Album - Album + Album Auto - Automatique + Automatique - + <i>Connected to %1<br/>The entries below apply to the currently connected MPD collection.</i> - <i>Connecté à %1<br/>Les éléments ci-dessous sont liés à la collection MPD courante.</i> + <i>Connecté à %1<br/>Les éléments ci-dessous sont liés à la collection MPD courante.</i> - + Replay Gain is a proposed standard published in 2001 to normalize the perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It works on a track/album basis, and is now supported in a growing number of players.<br/><br/>The following ReplayGain settings may be used:<ul><li><i>None</i> - No ReplayGain is applied.</li><li><i>Track</i> - Volume will be adjusted using the track's ReplayGain tags.</li><li><i>Album</i> - Volume will be adjusted using the albums's ReplayGain tags.</li><li><i>Auto</i> - Volume will be adjusted using the track's ReplayGain tags if random play is activated, otherwise the album's tags will be used.</li></ul> - + ReplayGain est un standard publié en 2001 pour normaliser le volume perçu des formats audio numériques tels le mp3 ou le OggVorbis.Il fonctionne sur une base piste/album et est supporté par un grand nombre de lecteurs.<br/><br/>Les paramètres suivants peuvent être utilisés:<ul><li><i>Vide</i>Désactivé.</li><li><i>Piste</i>le volume est ajusté en fonction du tag 'ReplayGain' de la piste.</li><li><i>Album</i>le volume est ajusté en fonction du tag 'ReplayGain' de l'album.</li><li><i>Auto</i>Le volume est ajusté en fonction du tag de la piste si la lecture aléatoire est activée, sinon en fonction du tag de l'album.</li></ul> PlaylistRule + Type: - Type: + Type: + Include songs that match the following: - Inclure les pistes qui correspondent à: + Inclure les pistes qui correspondent à: + Exclude songs that match the following: - Exclure les pistes qui correspondent à: + Exclure les pistes qui correspondent à: + Artist: - Artiste: + Artiste: + Artists similar to: - Artistes similaires à: + Artistes similaires à: + Album Artist: - Artiste Album: + Artiste Album: + Composer: - Compositeur: + Compositeur: + Album: - Album: + Album: + Title: - Titre: + Titre: + Genre - Genre + Genre + From Year: - De l'année: + De l'année: + + Any - Tous + Tous + To Year: - À l'année: + À l'année: + Comment: - Commentaire: + Commentaire: + Filename / path: - + Nom de fichier / Chemin/ + Exact match - Correspondance exacte + Correspondance exacte + Only enter values for the tags you wish to be search on. - Veuillez ne saisir de valeurs que pour les étiquettes que vous souhaitez utiliser dans la recherche. + Veuillez ne saisir de valeurs que pour les étiquettes que vous souhaitez utiliser dans la recherche. + For genre, end string with an asterisk to match various genres. e.g 'rock*' matches 'Hard Rock' and 'Rock and Roll'. - + Pour les genres, termineez la chaîne par * pour trouvr plusieurs genres. 'rock*' renvoie 'Hard-Rock' et 'Rock and roll' @@ -9747,33 +9983,33 @@ Dynamic Rule - Règle dynamique + Règle dynamique Smart Rule - + Règle intelligente Add - Ajouter + Ajouter <i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i> - <i><b>ERROR</b>: L'année du début doit être inférieure à l'année de fin</i> + <i><b>ERROR</b>: L'année du début doit être inférieure à l'année de fin</i> <i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)</i> - <i><b>ERROR:</b> La fourchette de dates est trop large (limite de %1 au maximum)</i> + <i><b>ERROR:</b> La fourchette de dates est trop large (limite de %1 au maximum)</i> <i><b>ERROR:</b> You can only match on filename / path if 'Exact match' is <b>not</b> checked</i> - + <i><b>ERREUR:</b> Vous ne pouvez faire correspondre sur 'nom de fichier/chemin' que si 'correspondance exacte' n'est <b>pas</b>cochée</i> @@ -9784,75 +10020,91 @@ + Name of playlist - + Nom de la liste de lecture + Add - Ajouter + Ajouter + Edit - Éditer + Éditer + Remove - Supprimer + Supprimer + Songs with ratings between: - + Pistes avec une note entre: + + - - et + et + Songs with duration between: - + Pistes avec une durée entre: + + seconds - + secondes + Number of songs in play queue: - + Nombre de pistes dans la file: + Files added in the last: - + Fichiers ajoutés dans les derniers: + days - + Jours + No Limit - + Sans limite + Order songs: - + Ordre des pistes: + About Rules - À propos des règles dynamiques + À propos des règles dynamiques @@ -9866,88 +10118,92 @@ Vide - - + + No Limit - + Sans limite - + About dynamic rules - À propos des règles dynamiques + À propos des règles dynamiques - + Each playlist requires a unique name, enter that above. Use the 'Add' button to add a 'rule' to control which artists, genres, etc you want included in the playlist. Any rules added will be listed here. A playlist with no rules will use songs from your whole music library. Use the settings below to restrict the range of songs added. - + Chaque lste de lecture doit avoir un nom unique, entrez le ci dessous +. +Utilisez le bouton 'ajouter' pour ajouter une règle controllant quels artistes, genres, etc. vous voulez inclure dans la liste. Toutes les règles apparaissent ici. Une liste de lecture sans règles utilisera des pistes de toute la bibliothèque. + +Utilisez le paramètre ci dessous pour restreindre l'étendue des pistes ajoutées. - + Ascending - + Croissant - + Descending - + décroissant - + Dynamic Playlist - + Liste dynamique - + Smart Playlist - Liste de lecture intelligente + Liste de lecture intelligente - + Number of songs: - + Nombre de pistes: - + <p>Cantata will query your library using all of the rules listed. The list of <i>Include</i> rules will be used to build a set of songs that can be used. The list of <i>Exclude</i> rules will be used to build a set of songs that cannot be used. If there are no <i>Include</i> rules, Cantata will assume that all songs (bar those from <i>Exclude</i>) can be used.</p><p>e.g. to have Cantata look for 'Rock songs by Wibble OR songs by Various Artists', you would need the following: <ul><li>Include AlbumArtist=Wibble Genre=Rock</li><li>Include AlbumArtist=Various Artists</li></ul> To have Cantata look for 'Songs by Wibble but not from album Abc', you would need the following: <ul><li>Include AlbumArtist=Wibble</li><li>Exclude AlbumArtist=Wibble Album=Abc</li></ul>After the set of usable songs has been created, Cantata will randomly select songs to keep the play queue filled with specified number of entries (10 by default). If a range of ratings has been specified, then only songs with a rating within this range will be used. Likewise, if a duration has been set.</p> - + <p>Cantata.interroge votre bibliothèque en utilisant toutes les règles listées La liste des règles <i>Include</i> sera utilisée pour construire un ensemble de pistes pouvant être utilisées. La liste des règles <i>Exclude</i> sera utilisée pour construire un ensemble de piste ne pouvant pas être utilisées. S'il n'y a pas de règle <i>Include</i> Cantata considèrera que toutes les pistes (sauf celles de <i>Exclude</i>) peuvent être utilisées.</p><p>Pour que Cantata cherche 'Pistes Rock par Wibble OU pistes d'artistes divers', il faut ce qui suit: <ul><li>Include AlbumArtist=Wibble Genre=Rock</li><li>Include AlbumArtist=Various Artists</li></ul> Pour que Cantata cherche 'Piste de Wibble mais pas de l'album'abc': <ul><li>Include AlbumArtist=Wibble</li><li>Exclude AlbumArtist=Wibble Album=Abc</li></ul>Après que l'ensemble de pstes ait été crée, Cantata selectionne aléatoirement les pistes pour maintenir la liste de lecture avec le nombre spécifié de pistes (10 par défaut). Si une fourchette de note a été spécifiée, alors seules les pistes avec une note dans cette fourchetteseront utilisées. De même si une fourchette de durée a été spécifiée.</p> - + About smart rules - + A propos des règles intelligentes - + <p>Cantata will query your library using all of the rules listed. The list of <i>Include</i> rules will be used to build a set of songs that can be used. The list of <i>Exclude</i> rules will be used to build a set of songs that cannot be used. If there are no <i>Include</i> rules, Cantata will assume that all songs (bar those from <i>Exclude</i>) can be used.</p><p>e.g. to have Cantata look for 'Rock songs by Wibble OR songs by Various Artists', you would need the following: <ul><li>Include AlbumArtist=Wibble Genre=Rock</li><li>Include AlbumArtist=Various Artists</li></ul> To have Cantata look for 'Songs by Wibble but not from album Abc', you would need the following: <ul><li>Include AlbumArtist=Wibble</li><li>Exclude AlbumArtist=Wibble Album=Abc</li></ul>After the set of usable songs has been created, Cantata will add the desired number of songs to the play queue. If a range of ratings has been specified, then only songs with a rating within this range will be used. Likewise, if a duration has been set.</p> - + <p>Cantata.interroge votre bibliothèque en utilisant toutes les règles listées La liste des règles <i>Include</i> sera utilisée pour construire un ensemble de pistes pouvant être utilisées. La liste des règles <i>Exclude</i> sera utilisée pour construire un ensemble de piste ne pouvant pas être utilisées. S'il n'y a pas de règle <i>Include</i> Cantata considèrera que toutes les pistes (sauf celles de <i>Exclude</i>) peuvent être utilisées.</p><p>Pour que Cantata cherche 'Pistes Rock par Wibble OU pistes d'artistes divers', il faut ce qui suit: <ul><li>Include AlbumArtist=Wibble Genre=Rock</li><li>Include AlbumArtist=Various Artists</li></ul> Pour que Cantata cherche 'Piste de Wibble mais pas de l'album'abc': <ul><li>Include AlbumArtist=Wibble</li><li>Exclude AlbumArtist=Wibble Album=Abc</li></ul>Après que l'ensemble de pstes ait été crée, Cantata selectionne aléatoirement les pistes pour maintenir la liste de lecture avec le nombre spécifié de pistes (10 par défaut). Si une fourchette de note a été spécifiée, alors seules les pistes avec une note dans cette fourchetteseront utilisées. De même si une fourchette de durée a été spécifiée.</p> - + Failed to save %1 - La sauvegarde de %1 a échoué + La sauvegarde de %1 a échoué - + A set of rules named '%1' already exists! Overwrite? - Un ensemble de règles nommé '%1' existe déjà ! + Un ensemble de règles nommé '%1' existe déjà ! Remplacer ? - + Overwrite Rules - Remplacer les règles + Remplacer les règles - + Saving %1 - Sauvegarde de %1 + Sauvegarde de %1 @@ -9955,23 +10211,23 @@ New Playlist... - Nouvelle liste de lecture… + Nouvelle liste de lecture… Stored Playlists - Listes enregistrées + Listes enregistrées Standard playlists - + Listes de lecture standard %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -9979,7 +10235,7 @@ Smart Playlist - Liste de lecture intelligente + Liste de lecture intelligente @@ -10058,156 +10314,156 @@ PodcastPage - + RSS: - RSS : + RSS : - + Website: - Site web : + Site web : - + Podcast details - Détails du podcast + Détails du podcast - + Select a podcast to display its details - Choisissez un podcast pour afficher ses informations complémentaires + Choisissez un podcast pour afficher ses informations complémentaires PodcastSearchDialog - + Subscribe - Souscrire + Souscrire - + Enter URL - Entrer l'URL + Entrer l'URL - + Manual podcast URL - + URL de podcast manuelle - - + + Search %1 - Rechercher %1 + Rechercher %1 - - + + Search for podcasts on %1 - Recherche de podcasts sur %1 + Recherche de podcasts sur %1 - + Add Podcast Subscription - Ajouter la souscription au podcast + Ajouter la souscription au podcast - + Browse %1 - Parcourir %1 + Parcourir %1 - + Browse %1 podcasts - Parcourir les podcasts de %1 + Parcourir les podcasts de %1 - + You are already subscribed to this podcast! - Vous êtes désormais enregistré sur ce podcast! + Vous êtes désormais enregistré sur ce podcast! - + Subscription added - Souscription ajoutée + Souscription ajoutée PodcastSearchPage - + Enter search term... - Entrez les termes de la recherche… + Entrez les termes de la recherche… - + Search - Recherche + Recherche - + Failed to fetch podcasts from %1 - La récupération des podcasts depuis %1 a échoué + La récupération des podcasts depuis %1 a échoué - + There was a problem parsing the response from %1 - + Il y a eu un problème en traitant la réponse de %1 PodcastService - + Subscribe to RSS feeds - + Souscrire au flux RSS - + %n Podcast(s) - + 1 podcast %n podcasts - + %1 (%2) podcast name (num unplayed episodes) - %1 (%2) + %1 (%2) - - + + %n Episode(s) - + 1 Épisode %n Épisodes - + (Downloading: %1%) - (Téléchargement: %1%) + (Téléchargement: %1%) Failed to parse %1 - L'analyse de %1 a échoué + L'analyse de %1 a échoué Cantata only supports audio podcasts! %1 contains only video podcasts. - + Canatata ne supporte que les podcasts audio! %1 ne contient que de la vidéo Failed to download %1 - Le téléchargement de %1 a échoué + Le téléchargement de %1 a échoué @@ -10215,77 +10471,77 @@ Check for new episodes: - Vérifier l'existence de nouveaux épisodes: + Vérifier l'existence de nouveaux épisodes: Download episodes to: - Télécharger les épisodes vers: + Télécharger les épisodes vers: Download automatically: - Télécharger automatiquement: + Télécharger automatiquement: Podcast Settings - Paramètres des podcasts: + Paramètres des podcasts: Manually - Manuellement + Manuellement Every 15 minutes - Toutes les 15 minutes + Toutes les 15 minutes Every 30 minutes - Toutes les 30 minutes + Toutes les 30 minutes Every hour - Toutes heures + Toutes heures Every 2 hours - Toutes les 2 heures + Toutes les 2 heures Every 6 hours - Toutes les 6 heures + Toutes les 6 heures Every 12 hours - Toutes les 12 heures + Toutes les 12 heures Every day - Chaque jour + Chaque jour Every week - Chaque semaine + Chaque semaine Don't automatically download episodes - Ne pas télécharger automatiquement les épisodes + Ne pas télécharger automatiquement les épisodes Latest episode - Dernier épisode + Dernier épisode @@ -10295,165 +10551,158 @@ Latest %1 episodes - %1 derniers épisodes + %1 derniers épisodes All episodes - Tous les épisodes + Tous les épisodes PodcastUrlPage - + URL - URL + URL - + Enter podcast URL... - Entrer l'URL du podcast + Entrer l'URL du podcast - + Load - Charger + Charger - + Enter podcast URL below, and press 'Load' - Veuillez entrer l'URL du podcast ci-dessous, et cliquez sur 'Charger' + Veuillez entrer l'URL du podcast ci-dessous, et cliquez sur 'Charger' - + Invalid URL! - URL Invalide ! + URL Invalide ! - + Failed to fetch podcast! - + Echec de la récupération du podcast - + Failed to parse podcast. - + Ereur dans le traitement du podcast - + Cantata only supports audio podcasts! The URL entered contains only video podcasts. - + Cantata ne supporte que les podcasts audio ! L'adresse saisie ne contient que de la vidéo. PodcastWidget - + Add Subscription - Ajouter une souscription + Ajouter une souscription - + Remove Subscription - Supprimer la souscription + Supprimer la souscription - + Download Episodes - + Télécharger les épisodes - + Delete Downloaded Episodes - + Effacer les épisodes téléchargés. - + Cancel Download - + Annuler le téléchargement - + Mark Episodes As New - + Marquer l'épisode comme nouveau - + Mark Episodes As Listened - + Marquer l'épisode comme écouté - + Show Unplayed Only - + Afficher seulement les non écoutés - + Configure - Configurer + Configurer - + Use the + icon (below) to add podcast subscriptions. - + Utilisez l'icone + pour ajouter un abonnement a un podcast - + Unsubscribe from '%1'? - Se désabonner de '%1' ? + Se désabonner de '%1' ? - Do you wish to download the selected podcast episodes? - Souhaitez-vous télécharger les épisodes podcast sélectionnés ? + Souhaitez-vous télécharger les épisodes podcast sélectionnés ? - Cancel podcast episode downloads (both current and any that are queued)? - Annuler le téléchargement des épisodes (y compris ceux en téléchargement et en attente) ? + Annuler le téléchargement des épisodes (y compris ceux en téléchargement et en attente) ? - + Do you wish to the delete downloaded files of the selected podcast episodes? - Souhaitez vous supprimer les fichiers téléchargés des podcasts sélectionnés ? + Souhaitez vous supprimer les fichiers téléchargés des podcasts sélectionnés ? - Do you wish to mark the selected podcast episodes as new? - Souhaitez vous définir les podcasts sélectionnés comme nouveaux ? + Souhaitez vous définir les podcasts sélectionnés comme nouveaux ? - Do you wish to mark the selected podcast episodes as listened? - Souhaitez vous définir les podcasts sélectionnés comme écoutés ? + Souhaitez vous définir les podcasts sélectionnés comme écoutés ? - Refresh all subscriptions? - + Rafraichir tous les abonnements ? - - + Refresh - Rafraîchir + Rafraîchir - - + Refresh All - + Tout rafraichir - + Refresh all subscriptions, or only those selected? - + Rafraichir tous les abonnements ou seulement ceux sélectionnés ? - + Refresh Selected - + Rafraichir les sélectionnés @@ -10461,125 +10710,125 @@ Cantata is playing a track - Cantata est en train de lire une piste + Cantata est en train de lire une piste PreferencesDialog - + Collection - Collection + Collection - + Collection Settings - Paramètres de la collection + Paramètres de la collection - + Playback - Lecture + Lecture - + Playback Settings - Paramètres de lecture + Paramètres de lecture Interface - Interface + Interface Interface Settings - Paramètres de l'interface + Paramètres de l'interface Info - Infos + Infos Info View Settings - + Parametres de la vue Info Scrobbling - Scrobblage + Scrobblage Scrobbling Settings - Paramètres de scrobblage + Paramètres de scrobblage Audio CD - CD Audio + CD Audio Audio CD Settings - Paramètres des CD Audio + Paramètres des CD Audio Proxy - Proxy + Proxy Proxy Settings - Paramètres du proxy + Paramètres du proxy Shortcuts - Raccourcis + Raccourcis - + Keyboard Shortcut Settings - Raccourcis clavier + Raccourcis clavier - + Cache - Cache + Cache - + Cached Items - Éléments dans le cache + Éléments dans le cache - + Custom Actions - + Actions personnalisées - + Service Keys - + Clés de service - + Service API Keys - + Clé API de service - + Cantata Preferences - Préférences de Cantata + Préférences de Cantata - + Configure - Configurer + Configurer @@ -10587,57 +10836,57 @@ Mode: - Mode: + Mode: Type: - Type: + Type: HTTP Proxy - Proxy HTTP: + Proxy HTTP: SOCKS Proxy - Proxy SOCKS: + Proxy SOCKS: Host: - Hôte: + Hôte: Port: - Port: + Port: Username: - Identifiant: + Identifiant: Password: - Mot de passe: + Mot de passe: No proxy - Pas de proxy + Pas de proxy Use the system proxy settings - Utiliser les paramètres proxy du système + Utiliser les paramètres proxy du système Manual proxy configuration - Configuration manuelle du proxy + Configuration manuelle du proxy @@ -10645,33 +10894,33 @@ Track listing - Liste des pistes + Liste des pistes Read more on wikipedia - Lire plus sur Wikipédia + Lire plus sur Wikipédia Open in browser - Ouvrir dans le navigateur + Ouvrir dans le navigateur <a href=http://en.wikipedia.org/wiki/Advanced_Audio_Coding>Advanced Audio Coding</a> (AAC) is a patented lossy codec for digital audio.<br>AAC generally achieves better sound quality than MP3 at similar bit rates. It is a reasonable choice for the iPod and some other portable music players. - <a href="http://fr.wikipedia.org/wiki/Advanced_Audio_Coding">Advanced Audio Coding</a> (AAC, « Encodage Audio Avancé » en français) est un algorithme de compression audio avec perte de données ayant pour but d’offrir un meilleur ratio Qualité/débit binaire que le format plus ancien MPEG-1/2 Audio Layer 3 (plus connu sous le nom de MP3). Pour cette raison, il a été choisi par différentes firmes comme Apple ou RealNetworks. + <a href="http://fr.wikipedia.org/wiki/Advanced_Audio_Coding">Advanced Audio Coding</a> (AAC, « Encodage Audio Avancé » en français) est un algorithme de compression audio avec perte de données ayant pour but d’offrir un meilleur ratio Qualité/débit binaire que le format plus ancien MPEG-1/2 Audio Layer 3 (plus connu sous le nom de MP3). Pour cette raison, il a été choisi par différentes firmes comme Apple ou RealNetworks. The bitrate is a measure of the quantity of data used to represent a second of the audio track.<br>The <b>AAC</b> encoder used by Cantata supports a <a href=http://en.wikipedia.org/wiki/Variable_bitrate#Advantages_and_disadvantages_of_VBR>variable bitrate (VBR)</a> setting, which means that the bitrate value fluctuates along the track based on the complexity of the audio content. More complex intervals of data are encoded with a higher bitrate than less complex ones; this approach yields overall better quality and a smaller file than having a constant bitrate throughout the track.<br>For this reason, the bitrate measure in this slider is just an estimate of the <a href=http://www.ffmpeg.org/faq.html#SEC21>average bitrate</a> of the encoded track.<br><b>150kb/s</b> is a good choice for music listening on a portable player.<br/>Anything below <b>120kb/s</b> might be unsatisfactory for music and anything above <b>200kb/s</b> is probably overkill. - + Le 'bitrate' est une mesure de la quantité de données utilisée pour représenter une seconde de musique.<br>l'encodeur <b>AAC</b>utilisé par Cantata supporte un paramète <a href=http://en.wikipedia.org/wiki/Variable_bitrate#Advantages_and_disadvantages_of_VBR>variable bitrate (VBR)</a> ce qui signifie que le bitrate fluctue et est proportionnel à la complexité du contenu audio. Ctte approche conduit à une meilleure qualité pour un fichier plus petit. Pour cette raison, cette mesure de bitrate est une estimation du <a href=http://www.ffmpeg.org/faq.html#SEC21> bitrate moyen</a> de la piste encodée. <br><b>150kb/s</b>est un bon choix pour un appareil nomade.<br/>En dessous de <b>120kb/s</b> sera insuffisant pour de la musique et au dessus de <b>200kb/s</b> ne sert quasiment à rien. Expected average bitrate for variable bitrate encoding - Taux de compression moyen estimé pour un encodage à taux variable + Taux de compression moyen estimé pour un encodage à taux variable @@ -10681,7 +10930,7 @@ Smaller file - Fichier plus petit + Fichier plus petit @@ -10690,239 +10939,239 @@ Better sound quality - Meilleure qualité audio. + Meilleure qualité audio. <a href=http://en.wikipedia.org/wiki/MP3>MPEG Audio Layer 3</a> (MP3) is a patented digital audio codec using a form of lossy data compression.<br>In spite of its shortcomings, it is a common format for consumer audio storage, and is widely supported on portable music players. - + The bitrate is a measure of the quantity of data used to represent a second of the audio track.<br>The <b>MP3</b> encoder used by Cantata supports a <a href=http://en.wikipedia.org/wiki/MP3#VBR>variable bitrate (VBR)</a> setting, which means that the bitrate value fluctuates along the track based on the complexity of the audio content. More complex intervals of data are encoded with a higher bitrate than less complex ones; this approach yields overall better quality and a smaller file than having a constant bitrate throughout the track.<br>For this reason, the bitrate measure in this slider is just an estimate of the average bitrate of the encoded track.<br><b>160kb/s</b> is a good choice for music listening on a portable player.<br/>Anything below <b>120kb/s</b> might be unsatisfactory for music and anything above <b>205kb/s</b> is probably overkill. - + Ogg Vorbis - Ogg Vorbis + Ogg Vorbis <a href=http://en.wikipedia.org/wiki/Vorbis>Ogg Vorbis</a> is an open and royalty-free audio codec for lossy audio compression.<br>It produces smaller files than MP3 at equivalent or higher quality. Ogg Vorbis is an all-around excellent choice, especially for portable music players that support it. - + The bitrate is a measure of the quantity of data used to represent a second of the audio track.<br>The <b>Vorbis</b> encoder used by Cantata supports a <a href=http://en.wikipedia.org/wiki/Vorbis#Technical_Encoder>variable bitrate (VBR)</a> setting, which means that the bitrate value fluctuates along the track based on the complexity of the audio content. More complex intervals of data are encoded with a higher bitrate than less complex ones; this approach yields overall better quality and a smaller file than having a constant bitrate throughout the track.<br>The Vorbis encoder uses a quality rating between -1 and 10 to define a certain expected audio quality level. The bitrate measure in this slider is just a rough estimate (provided by Vorbis) of the average bitrate of the encoded track given a quality value. In fact, with newer and more efficient Vorbis versions the actual bitrate is even lower.<br><b>5</b> is a good choice for music listening on a portable player.<br/>Anything below <b>3</b> might be unsatisfactory for music and anything above <b>8</b> is probably overkill. - + Quality rating - Niveau de qualité + Niveau de qualité Opus - Opus + Opus <a href=http://en.wikipedia.org/wiki/Opus_(audio_format)>Opus</a> is a patent-free digital audio codec using a form of lossy data compression. - + The bitrate is a measure of the quantity of data used to represent a second of the audio track.<br>The <b>Opus</b> encoder used by Cantata supports a <a href=http://en.wikipedia.org/wiki/Variable_bitrate>variable bitrate (VBR)</a> setting, which means that the bitrate value fluctuates along the track based on the complexity of the audio content. More complex intervals of data are encoded with a higher bitrate than less complex ones; this approach yields overall better quality and a smaller file than having a constant bitrate throughout the track.<br>For this reason, the bitrate measure in this slider is just an estimate of the average bitrate of the encoded track.<br><b>128kb/s</b> is a good choice for music listening on a portable player.<br/>Anything below <b>100kb/s</b> might be unsatisfactory for music and anything above <b>256kb/s</b> is probably overkill. - + Bitrate - Débit binaire + Débit binaire Apple Lossless - Apple Lossless + Apple Lossless <a href=http://en.wikipedia.org/wiki/Apple_Lossless>Apple Lossless</a> (ALAC) is an audio codec for lossless compression of digital music.<br>Recommended only for Apple music players and players that do not support FLAC. - + FLAC - FLAC + FLAC <a href=http://en.wikipedia.org/wiki/Free_Lossless_Audio_Codec>Free Lossless Audio Codec</a> (FLAC) is an open and royalty-free codec for lossless compression of digital music.<br>If you wish to store your music without compromising on audio quality, FLAC is an excellent choice. - + The <a href=http://flac.sourceforge.net/documentation_tools_flac.html>compression level</a> is an integer value between 0 and 8 that represents the tradeoff between file size and compression speed while encoding with <b>FLAC</b>.<br/>Setting the compression level to <b>0</b> yields the shortest compression time but generates a comparably big file.<br/>On the other hand, a compression level of <b>8</b> makes compression quite slow but produces the smallest file.<br/>Note that since FLAC is by definition a lossless codec, the audio quality of the output is exactly the same regardless of the compression level.<br/>Also, levels above <b>5</b> dramatically increase compression time but create an only slightly smaller file, and are not recommended. - + Compression level - Niveau de compression + Niveau de compression Faster compression - Compression rapide + Compression rapide Windows Media Audio - Windows Media Audio + Windows Media Audio <a href=http://en.wikipedia.org/wiki/Windows_Media_Audio>Windows Media Audio</a> (WMA) is a proprietary codec developed by Microsoft for lossy audio compression.<br>Recommended only for portable music players that do not support Ogg Vorbis. - + The bitrate is a measure of the quantity of data used to represent a second of the audio track.<br>Due to the limitations of the proprietary <b>WMA</b> format and the difficulty of reverse-engineering a proprietary encoder, the WMA encoder used by Cantata sets a <a href=http://en.wikipedia.org/wiki/Windows_Media_Audio#Windows_Media_Audio>constant bitrate (CBR)</a> setting.<br>For this reason, the bitrate measure in this slider is a pretty accurate estimate of the bitrate of the encoded track.<br><b>136kb/s</b> is a good choice for music listening on a portable player.<br/>Anything below <b>112kb/s</b> might be unsatisfactory for music and anything above <b>182kb/s</b> is probably overkill. - + - + Empty filename. - Nom de fichier vide + Nom de fichier vide - + Invalid filename. (%1) - Nom de fichier invalide. (%1) + Nom de fichier invalide. (%1) - + Failed to save %1. - La sauvegarde de %1 a échoué. + La sauvegarde de %1 a échoué. - + Failed to delete rules file. (%1) - La suppression des droits sur le fichier a échoué. (%1) + La suppression des droits sur le fichier a échoué. (%1) - + Invalid command. (%1) - Commande invalide. (%1) + Commande invalide. (%1) - + Could not remove active rules link. - La suppression des règles actives ne peut être effectuée. + La suppression des règles actives ne peut être effectuée. - + Active rules is not a link. - + Les règles actives ne sont pas un lien - + Could not create active rules link. - + Impossible de créer le lien des règles actives - + Rules file, %1, does not exist. - Le fichier de droits, %1, n'existe pas. + Le fichier de droits, %1, n'existe pas. - + Incorrect arguments supplied. - L'argument renseigné est incorrect. + L'argument renseigné est incorrect. - + Unknown method called. - La méthode appelée est inconnue. + La méthode appelée est inconnue. - + Unknown error - Erreur inconnue + Erreur inconnue - - + + Artist - Artiste + Artiste - + SimilarArtists - Artistes similaires + Artistes similaires - + AlbumArtist - Artiste de l'album + Artiste de l'album - - + + Composer - Compositeur + Compositeur - + Comment - Commentaire + Commentaire - - + + Album - Album + Album - - + + Title - Titre + Titre - - + + Genre - Genre + Genre - + Date - Date + Date - + File - + Fichier - + Include - Inclure + Inclure - + Exclude - Exclure + Exclure - + (Exact) - (Exacte) + (Exacte) @@ -10930,7 +11179,7 @@ %2 x %3 (%4) name width x height (file size) - %1 + %1 %2 x %3 (%4) @@ -10939,45 +11188,45 @@ %2 x %3 name width x height - %1 + %1 %2 x %3 Current Cover - Pochette courante + Pochette courante CoverArt Archive - Archive de CoverArt + Archive de CoverArt Grouped Albums - Albums groupés + Albums groupés Table - Tableau + Tableau Parse in Library view, and show in Folders view - + Traiter dans la bibliothèque et afficher dans la vue dossiers Only show in Folders view - + Afficher seulement dans la vue dossiers Do not list - + Ne pas lister %1 Tracks @@ -11037,204 +11286,204 @@ Previous Track - Piste précédente + Piste précédente Next Track - Piste suivante + Piste suivante Play/Pause - Lecture/Pause + Lecture/Pause Stop - Arrêter + Arrêter Stop After Current Track - Arrêter après cette piste + Arrêter après cette piste Stop After Track - Arrêter après la piste + Arrêter après la piste Increase Volume - Augmenter le volume + Augmenter le volume Decrease Volume - Baisser le volume + Baisser le volume Save As - Enregistrer en tant que + Enregistrer en tant que Append - Ajouter + Ajouter Append To Play Queue - Ajouter à la liste courante + Ajouter à la liste courante Append And Play - Ajouter et lire + Ajouter et lire Add And Play - Ajouter en tête, et lire + Ajouter en tête, et lire Append To Play Queue And Play - Ajouter à la liste courante, et lire + Ajouter à la liste courante, et lire Insert After Current - Insérer après l'actuel + Insérer après l'actuel Append Random Album - + Ajouter un album au hasard Play Now (And Replace Play Queue) - Lire maintenant (et remplacer la liste courante) + Lire maintenant (et remplacer la liste courante) Add With Priority - Ajouter en priorité + Ajouter en priorité Set Priority - Définir la priorité + Définir la priorité Zoom In - + Zoom avant Zoom Out - + Zoom arrière Highest Priority (255) - Priorité la plus forte (255) + Priorité la plus forte (255) High Priority (200) - Priorité forte (200) + Priorité forte (200) Medium Priority (125) - Priorité moyenne (125) + Priorité moyenne (125) Low Priority (50) - Priorité faible (50) + Priorité faible (50) Default Priority (0) - Priorité par défaut (0) + Priorité par défaut (0) Custom Priority... - Priorité personnalisée… + Priorité personnalisée… Add To Playlist - Ajouter à la liste de lecture + Ajouter à la liste de lecture Organize Files - Organiser les fichiers + Organiser les fichiers Edit Track Information - Éditer les informations de la piste + Éditer les informations de la piste ReplayGain - ReplayGain + ReplayGain Copy Songs To Device - Copier les pistes sur le périphérique + Copier les pistes sur le périphérique Delete Songs - Supprimer les pistes + Supprimer les pistes Set Image - Appliquer l'image + Appliquer l'image Remove - Supprimer + Supprimer Find - Rechercher + Rechercher Add To Play Queue - Ajouter à la liste courante + Ajouter à la liste courante Parse error loading cache file, please check your songs tags. - + Erreur au chargement du fichier cache. Vérifiez vos tags - - + + Other - Autre + Autre Default - Par défaut + Par défaut "%1" @@ -11245,339 +11494,339 @@ "%1" (%2:%3) name (host:port) - "%1" (%2:%3) + "%1" (%2:%3) - + Single Tracks - Piste unique + Piste unique Personal - Personnel + Personnel - + Unknown - Inconnu + Inconnu - + Various Artists - Artistes divers + Artistes divers - + Album artist - Artiste de l'album + Artiste de l'album - + Performer - Interprète + Interprète - + Track number - Piste numéro + Piste numéro - + Disc number - Disque numéro + Disque numéro - + Year - Année + Année - + Original Year - Année originale + Année originale - + Length - Durée + Durée - + <b>%1</b> on <b>%2</b> Song on Album - <b>%1</b> sur <b>%2</b> + <b>%1</b> sur <b>%2</b> - + <b>%1</b> by <b>%2</b> on <b>%3</b> Song by Artist on Album - <b>%1</b> par <b>%2</b> sur <b>%3</b> + <b>%1</b> par <b>%2</b> sur <b>%3</b> - + (Stream) - (Flux) + (Flux) Invalid service - Service incorrect + Service incorrect Invalid method - Méthode incorrecte + Méthode incorrecte Authentication failed - L'authentification a échouée + L'authentification a échouée Invalid format - Format incorrect + Format incorrect Invalid parameters - Paramètres incorrects + Paramètres incorrects Invalid resource specified - La ressource spécifiée est incorrecte + La ressource spécifiée est incorrecte Operation failed - L'opération a échoué + L'opération a échoué Invalid session key - Clef de session incorrecte + Clef de session incorrecte Invalid API key - Clef de l'API incorrecte + Clef de l'API incorrecte Service offline - Services hors ligne + Services hors ligne Last.fm is currently busy, please try again in a few minutes - Last.fm est actuellement indisponible, veuillez réessayer dans quelques minutes + Last.fm est actuellement indisponible, veuillez réessayer dans quelques minutes Rate-limit exceeded - Limite dépassée + Limite dépassée General - Général + Général Digitally Imported - + Digitally Imported Local and National Radio (ListenLive) - + Radio locale et nationale (écoute en direct) &OK - &OK + &OK &Cancel - &Annuler + &Annuler &Yes - &Oui + &Oui &No - &Non + &Non &Discard - &Abandonner + &Abandonner &Save - &Sauvegarder + &Sauvegarder &Apply - &Appliquer + &Appliquer &Close - &Fermer + &Fermer &Help - &Aide + &Aide &Overwrite - &Écraser + &Écraser &Reset - &Réinitialiser + &Réinitialiser &Continue - &Continuer + &Continuer &Delete - &Effacer + &Effacer &Stop - &Arrêter + &Arrêter &Remove - &Supprimer + &Supprimer &Previous - &Précédent + &Précédent &Next - &Suivant + &Suivant Close - Fermer + Fermer Error - Erreur + Erreur Information - Informations + Informations Warning - Attention + Attention Question - Question + Question %1 B - %1 o + %1 o %1 kB - %1 ko + %1 ko %1 MB - %1 Mo + %1 Mo %1 GB - %1 Go + %1 Go %1 KiB - %1 Kio + %1 Kio %1 MiB - %1 Mio + %1 Mio %1 GiB - %1 Gio + %1 Gio Basic Tree (No Icons) - Arbre basique (sans icônes) + Arbre basique (sans icônes) Simple Tree - Arbre simple + Arbre simple Detailed Tree - Arbre détaillé + Arbre détaillé List - Liste + Liste Grid - Grille + Grille Categorized - + Catégorisée %n Track(s) @@ -11650,135 +11899,135 @@ - + mpd - MPD communication - + mpd - communication MPD - + mpdparse - Parsing of MPD response - + mpdparse - traitement des réponses MPD - + covers - Cover fetching, and loading - + covers-verbose - traitement et affichage des pochettes - + covers-verbose - Cover fetching, and loading (verbose) - + covers-verbose - traitement et affichage des pochettes (bavard) - + context-wikipedia - Wikipedia info in context view - + context-wikipedia - info Wikipedia - + context-lastfm - Last.fm info in context view - + context-lastfm - Last.fm info in context view - + context-widget - General debug in context view - + context-widget - débogage général des vues - + context-lyrics - Lyrics in context view - + context-lyrics - Paroles dans les vues - + dynamic - Dynamic playlists - + dynamic - liste de lecture dynamyque - + stream-fetcher - Fetching of stream URLs - + stream fetcher - traitement des flux HTTP - + http-server - Built-in HTTP server - + http-server - serveur http embarqué - + song-dialog - Song dialogs (tags, replaygain, organiser) - + song-dialog - Song dialogs (tags, replaygain, organiser) - + network-access - Network access - + network-acces - accès réseau - + threads - Threads - + threads - Threads - + scrobbler - Scrobbling - + scrobbler - scroblage - + sql - SQL access - + sql - accès SQL - + media-keys - Media-keys - + media-keys - Media-keys - + custom-actions - Custom actions - + custom-actions - Actions personnalisées - + tags - Tag reading/writing - + tags - lecture/écriture des tags - + devices - Device support - + devices - support des périphériques - + http-stream - Playback of MPD output streams - + http-stream - Lecture de flux HTTP provenant de MPD - + avahi - Auto-discovery of MPD servers - + avahi-Découverte automatique de serveurs MPD - + MPD Client - + Client MPD - + Comma-separated list of debug areas - possible values: - + Liste de valeurs séparées par une virgule des aires de débogage - valeurs possibles: - + Log debug messages to %1 - + Loggre les messages de débogage vers %1 - + Disable network access - + Désactiver l'accès au réseau @@ -11786,29 +12035,29 @@ Device Properties - Propriétés du périphérique + Propriétés du périphérique Connection - Connexion + Connexion Music Library - Bibliothèque musicale + Bibliothèque musicale Add Device - Ajouter le périphérique + Ajouter le périphérique A remote device named '%1' already exists! Please choose a different name. - Un périphérique distant possède déjà le même nom '%1' + Un périphérique distant possède déjà le même nom '%1' Veuillez choisir un nom différent. @@ -11817,203 +12066,228 @@ RemoteDevicePropertiesWidget + These settings are only editable when the device is not connected. - Ces paramètres ne sont modifiables que lorsque le périphérique est déconnecté. + Ces paramètres ne sont modifiables que lorsque le périphérique est déconnecté. + Type: - Type: + Type: + Name: - Nom: + Nom: + Options - Options + Options + + Host: - Hôte: + Hôte: + + Port: - Port: + Port: + + + User: - Identifiant: + Identifiant: + + Domain: - Domaine: + Domaine: + + Password: - Mot de passe: + Mot de passe: + + Share: - Partager: + Partager: + + If you enter a password here, it will be stored <b>unencrypted</b> in Cantata's config file. To have Cantata prompt for the password before accessing the share, set the password to '-' - Si un mot de passe est saisi ici, il sera stocké <b>en clair</b> dans le fichier de configuration de Cantata. Si vous souhaitez re-saisir votre mot de passe à chaque fois, entrez '-'. + Si un mot de passe est saisi ici, il sera stocké <b>en clair</b> dans le fichier de configuration de Cantata. Si vous souhaitez re-saisir votre mot de passe à chaque fois, entrez '-'. + Service name: - Nom du service: + Nom du service: + + Folder: - Dossier: + Dossier: + Extra Options: - Paramètres supplémentaires: + Paramètres supplémentaires: + Due to the way sshfs works, a suitable ssh-askpass application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter the password. - Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. + Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. + This dialog is only used to add remote devices (e.g. via Samba), or to access locally mounted folders. For normal media players, attached via USB, Cantata will automatically display the device when it is attached. - + Cette boite de dialogue n'est utilisée ue pour ajouter des périphériques distants (par exemple via samba) ou pour acceder à des dossiers montés localement. Pour des lecteurs standards, connectés par USB, Cantata les affiche automatiquement lors de leur branchement. Samba Share - Partage Samba + Partage Samba Samba Share (Auto-discover host and port) - Partage Samba (découverte automatique de l'hôte et du port) + Partage Samba (découverte automatique de l'hôte et du port) Secure Shell (sshfs) - Secure Shell (sshfs) + Secure Shell (sshfs) Locally Mounted Folder - Dossiers montés localement + Dossiers montés localement RemoteFsDevice - - + + Available - Disponible + Disponible - - + + Not Available - Non disponible + Non disponible - + Failed to resolve connection details for %1 - La récupération des détails de connexion pour %1 a échoué + La récupération des détails de connexion pour %1 a échoué - - - + + + Connecting... - Connection… + Connection… - Password prompting does not work when cantata is started from the commandline. - La boite de dialogue pour le mot de passe n'est pas disponible quand Cantata est démarré depuis une console. + La boite de dialogue pour le mot de passe n'est pas disponible quand Cantata est démarré depuis une console. - + No suitable ssh-askpass application installed! This is required for entering passwords. - Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. + Aucune application ssh-sakpass est disponible ! Cette dépendance est requise pour la saisie du mot de passe. - + Mount point ("%1") is not empty! - Le point de montage ("%1") nest pas vide ! + Le point de montage ("%1") nest pas vide ! - + + "sshfs" is not installed! - "sshfs" n'est pas installé ! + "sshfs" n'est pas installé ! - - + + Disconnecting... - Déconnexion… + Déconnexion… - + "fusermount" is not installed! - "fusermount" n'est pas installé ! + "fusermount" n'est pas installé ! - - + + Failed to connect to "%1" - La connexion à "%1" a échoué + La connexion à "%1" a échoué - - + + Failed to disconnect from "%1" - La déconnexion à "%1" a échoué + La déconnexion à "%1" a échoué - - + + Updating tracks... - Mise à jour des pistes… + Mise à jour des pistes… - + Not Connected - Non connecté + Non connecté - + Capacity Unknown - Capacité inconnue + Capacité inconnue - + %1 free - %1 libre + %1 libre @@ -12021,79 +12295,79 @@ ReplayGain - ReplayGain + ReplayGain Show All Tracks - Afficher toutes les pistes + Afficher toutes les pistes Show Untagged Tracks - Afficher les pistes non renseignées + Afficher les pistes non renseignées Remove From List - Supprimer de la liste + Supprimer de la liste Artist - Artiste + Artiste Album - Album + Album Title - Titre + Titre Album Gain - Gain de l'album + Gain de l'album Track Gain - Gain de la piste + Gain de la piste Album Peak - Pic de l'album + Pic de l'album Track Peak - Pic de la piste + Pic de la piste Scan - Analyser + Analyser Update ReplayGain tags in tracks? - Mettre à jour les étiquettes ReplayGain dans les pistes ? + Mettre à jour les étiquettes ReplayGain dans les pistes ? Update Tags - Mettre à jour les étiquettes + Mettre à jour les étiquettes Abort scanning of tracks? - Arrêter l'analyse des pistes ? + Arrêter l'analyse des pistes ? @@ -12101,68 +12375,68 @@ Abort - Annuler + Annuler Abort reading of existing tags? - Annuler la lecture des étiquettes existantes ? + Annuler la lecture des étiquettes existantes ? Scan <b>all</b> tracks?<br/><br/><i>All tracks have existing ReplayGain tags.</i> - Analyser <b>toutes</b> les pistes ?<br/><br/><i>Toutes les pistes ont déjà une étiquette ReplayGain.</i> + Analyser <b>toutes</b> les pistes ?<br/><br/><i>Toutes les pistes ont déjà une étiquette ReplayGain.</i> Do you wish to scan all tracks, or only tracks without existing tags? - + Voulez vous scanner toutes les pistes, ou seulement celles sans tags ? Untagged Tracks - Pistes non étiquetées + Pistes non étiquetées All Tracks - Toutes les pistes + Toutes les pistes Scanning tracks... - Analyse des pistes… + Analyse des pistes… Reading existing tags... - Lecture des étiquettes existantes… + Lecture des étiquettes existantes… %1 (Corrupt tags?) filename (Corrupt tags?) - %1 (Étiquettes corrompues ?) + %1 (Étiquettes corrompues ?) Failed to update the tags of the following tracks: - La mise à jour des étiquettes des pistes suivantes a échoué: + La mise à jour des étiquettes des pistes suivantes a échoué: Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! Device is not connected. - Le périphérique n'est pas connecté. + Le périphérique n'est pas connecté. Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? @@ -12170,7 +12444,7 @@ %1 dB - %1 dB + %1 dB @@ -12182,29 +12456,29 @@ Failed - Échoué + Échoué Original: %1 dB - Originale: %1 dB + Originale: %1 dB Original: %1 - Original: %1 + Original: %1 Remove the selected tracks from the list? - Supprimer la piste sélectionnée de la liste ? + Supprimer la piste sélectionnée de la liste ? Remove Tracks - Supprimer les pistes + Supprimer les pistes @@ -12214,166 +12488,172 @@ - Note: %1..%2 - + Album Artist - Artiste Album + Artiste Album - + Artist - Artiste + Artiste - + Album - Album + Album - + Composer - Compositeur + Compositeur - + Date - Date + Date - + Genre - Genre + Genre - + Rating - Note + Note - + File Age - + Age du fichier - + Random - Aléatoire + Aléatoire - + %n Rule(s) - + 1 règle %n règles - + , Rating: %1..%2 - + Note: %1..%2 - + Ascending - + Croissant - + Descending - + Décroissant Scrobbler - - + + %1 error: %2 - %1 erreur: %2 + %1 erreur: %2 ScrobblingLove - + %1: Loved Current Track - %1: Piste courante aimée + %1: Piste courante aimée - + %1: Love Current Track - %1: Aimer la piste courante + %1: Aimer la piste courante ScrobblingSettings + Scrobble using: - Scrobbler avec: + Scrobbler avec: + Username: - Identifiant: + Identifiant: + Password: - Mot de passe: + Mot de passe: + Status: - Status: + Status: + Login - Authentification + Authentification + Scrobble tracks - Scrobbler les pistes: + Scrobbler les pistes: + Show 'Love' button - Afficher le bouton 'Aimer' + Afficher le bouton 'Aimer' %1 (via MPD) scrobbler name (via MPD) - %1 (via MPD) + %1 (via MPD) If you use a scrobbler which is marked as '(via MPD)' (such as %1), then you will need to have this already started and running. Cantata can only 'Love' tracks via this, and cannot enable/disable scrobbling. - + Si vous utilisez un scrobbler marqué '(via MPD)' (tel que %1), il est nécessaire qu'il soit démarré. Cantata ne peut 'aimer' les pistes que par son intermédiaire et ne peut l'activer/le désactiver. Authenticating... - Authentification… + Authentification… Authenticated - Authentifié… + Authentifié… Not Authenticated - Non authentifié + Non authentifié ScrobblingStatus - %1: Scrobble Tracks - %1: Scrobbler les pistes + %1: Scrobbler les pistes @@ -12381,7 +12661,7 @@ # (Track Number) - + n°(numéro de piste) @@ -12389,142 +12669,142 @@ Locate In Library - Trouver dans la bibliothèque + Trouver dans la bibliothèque Use the text field above to search for music in your library via MPD's search mechanism. Clicking the label next to the field will produce a menu allowing you to control the search area. - + Utilisez le champ de texte ci dessous pour rechercher de la musique par le mechanisme de recherche de MPD. Cliquer l'étiquette à coté du champ produit un menu pour controller la zone de recherche. Artist: - Artiste: + Artiste: Search for songs by artist. - + Rechercher une piste par artiste Composer: - Compositeur: + Compositeur: Search for songs by composer. - + Recherche de piste par compositeur Performer: - Interprète: + Interprète: Search for songs by performer. - + Recherche de piste par interprète Album: - Album: + Album: Search for songs by album. - + recherche de pistes par album Title: - Titre: + Titre: Search for songs by title. - + recherche de piste par titre Genre: - Genre: + Genre: Search for songs by genre. - + recherche de piste par genre Comment: - Commentaire: + Commentaire: Search for songs containing comment. - + Recherche de piste contenant un commentaire Date: - Date: + Date: Find songs be searching the 'Date' tag.<br/><br/>Usually just entering the year should suffice. - + Recherche de pistes par le tag 'année'<br/><br/>Entrer l'année devrait suffire. Original Date: - + Date d'origine Find songs be searching the 'Original Date' tag.<br/><br/>Usually just entering the year should suffice. - + Recherche de pistes par le tag 'année d'origine'<br/><br/>Entrer l'année devrait suffire. Modified: - Modifié: + Modifié: Enter date (YYYY/MM/DD - e.g. 2015/01/31) to search for files modified since that date.<br/><br>Or enter a number of days to find files that were modified in the previous number of days. - + Entrez la date (AAA/MM/JJ) pour trouver les fichiers modifiés depuis cette date.<br/><br>Ou entrer le nombre de jours pour trouver les fichiers modifiés depuis ce nombre de jours File: - Fichier: + Fichier: Search for songs by filename or path. - + Chercher des pistes par nom de fichier ou chemin Any: - Tous: + Tous: Search for songs by any matching metadata. - + Recherche de pistes par metadata No tracks found. - Pas de pistes trouvées: + Pas de pistes trouvées: %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) @@ -12535,42 +12815,48 @@ Search... - Rechercher… + Rechercher… Close Search Bar - Fermer la barre de recherche + Fermer la barre de recherche ServerSettings + Collection: - Collection: + Collection: + Name: - Nom: + Nom: - + + Host: - Hôte: + Hôte: + Password: - Mot de passe: + Mot de passe: + + Music folder: - Dossier musical: + Dossier musical: Cover filename: @@ -12578,138 +12864,149 @@ + HTTP stream URL: - URL du flux HTTP: + URL du flux HTTP: + Local file playback: - + Lecture du fichier local: + Use a simple in-built HTTP server to allow MPD to playback files dropped onto the playqueue. - + Utilise un simple serveur HTTP embarqué pour permettre à MPD de lire les fichiers déposés sur la liste courante + Via in-built HTTP server - + Via le serveur HTTP embarqué + Auto update: - + Mise à jour automatique: + <p>Select this option if your MPD server detects modifications (e.g. newly added files) automatically. If so there is no need for Cantata to send update commands for certain actions.</p> - + <p> Choisissez cette option si votre serveur MPDdetecte les modifications (comme les fichiers ajoutés) automatiquement. Si c'est le cas, il est inutile pour Cantata d'envoyer des commandes de mise à jour pour certaines actions.</p> + Server detects changes automatically - + Le serveur detecte les changements automatiquement. + The 'Music folder' setting is used to lookup cover-art. It may be set to a HTTP URL if your MPD is on another machine, and covers are accessible via HTTP. If it is not set to a HTTP URL, and you also have write permissions to this folder (and it's sub-folders), then Cantata will save any downloaded covers into the respective album folder. - + Le paramètre 'dossier musical' est utilisé pour récupérer les pochettes. Il doit être positionné sur une url HTTP si votre serveur MPD est sur une autre machine et que les pochettes sont accessibles par HTTP. Si il est positionné sur un dossier local et que vous avez les droits d'écriture sur le dossier et ses sous dossiers, Canatata enregistrera les pochettes téléchargées dans les dossiers des albums. + 'HTTP Stream URL' is only of use if you have MPD configured to output to a HTTP stream, and you wish Cantata to be able to play that stream. - + 'HTTP Stream URL' n'est utile que si votre MPD est configuré pour emettre un flux HTTP et ue vous voulez que Cantata joue ce flux. + MPD usually only plays songs from within your collection. Newer MPD's (from v0.19 onwards) can also playback other files if you are connected to a local MPD server (e.g. address is '127.0.0.1' or 'localhost') For this to work, the MPD server needs read-access to wherever the files are located. If you are using an older MPD, a non-local MPD, or your local files are not accessible to other users, then you may elect to use the simple HTTP server that is supplied with Cantata. This server will only allow access to files in the playqueue, and only whilst Cantata is running. - + MPD ne joue normalement que des pistes provenant de votre collection. Les MPD récents (depuis v0.19) peuvent aussi jouer d'autres fichiers si vous êtes connectés à un MPD local (à l'adresse 127.0.0.1 ou localhost). Pour que celà fonctionne, le serveur MPD doit avoir les droits en lecture là où les fichiers sont stockés.Si vous utilisez un MPD ancien ou distant, ou que vos fichiers locaux ne sont pass accessibles, vous voudrez vous orienter vers l'utilisation du serveur HTTP embarqué dans Cantata. Ce serveur accedera aux fichires dans la liste ded lecture courante et seulement pendant que Cantata est lancé. + If you change the 'Music folder' setting, then you will need to manually update the music database. This can be performed by pressing the 'Refresh Database' button in the 'Artists' or 'Albums' views. - + Si vous changez le paramètre 'dossier musical" vous devez mettre à jour manuellement la base de donnée. Ceci peut être réalisé en pressant le bouton 'mettre à jour la base de donnée' dans les vues 'artistes' ou 'albums'. - + This folder will also be used to locate music files for tag-editing, replay gain, and transferring to (and from) devices. - + Ce dossier sera aussi utilisé pour localiser les fichiers pour l'édition de tags, le replay Gain et les transfert depuis et vers les périphériques. - + This folder will also be used to locate music files for tag-editing, replay gain, etc. - + Ce dossier sera aussi utilisé pour localiser les fichiers pour l'édition de tags, le replay Gain et les transfert depuis et vers les périphériques. - + More information - + Plus d'information - + Discover... - + Découverte.... - + Which type of collection do you wish to connect to? - À quel type de collection souhaitez-vous vous connecter ? + À quel type de collection souhaitez-vous vous connecter ? - + Standard - music collection may be shared, is on another machine, is already setup, or you wish to enable access from other clients (e.g. MPDroid) - + Standard - La collection musicale peut être partagée, est sur une autre machine, est déjà configurée, ou vous voulez activer l'accès depuis d'autres clients (tels MPDroid) - + Basic - music collection is not shared with others, and Cantata will configure and control the MPD instance. This setup will be exclusive to Cantata, and will <b>not</b> be accessible to other MPD clients. - + Basique - La collection musicale n'est pas partagée et Cantata configure et controle MPD. Cette installation est exclusive à Cantata et ne sera pas accesible aux autres clients. - + <i><b>NOTE:</b> %1</i> - <i><b>NOTE:</b> %1</i> + <i><b>NOTE:</b> %1</i> - + If you wish to have an advanced MPD setup (e.g. multiple audio outputs, full DSD support, etc) then you <b>must</b> choose 'Standard' - + Si vous voulez une installation avancée de MPD (sorties audio multiples, support du DSD etc..) vous devez choisir 'Standard' - + Add Collection - Ajouter une Collection + Ajouter une Collection - + Standard - Standard + Standard - + Basic - Basique + Basique - + Delete '%1'? - Supprimer '%1' ? + Supprimer '%1' ? - + Delete - Supprimer + Supprimer - + New Collection %1 - Nouvelle collection %1 + Nouvelle collection %1 - + Default - Par défaut + Par défaut @@ -12717,12 +13014,12 @@ Logged into %1 - Connecté sur %1 + Connecté sur %1 <b>NOT</b> logged into %1 - <b>NON</b> connecté sur %1 + <b>NON</b> connecté sur %1 @@ -12730,68 +13027,73 @@ Action - + Action Shortcut - + Raccourci ShortcutsSettingsWidget + Search: - Recherche: + Recherche: + Shortcut for Selected Action - Raccourcis pour l'action choisie + Raccourcis pour l'action choisie + Default: - Par défaut: + Par défaut: + None - Vide + Vide + Custom: - Personnalisé: + Personnalisé: SinglePageWidget - + Refresh - Rafraîchir + Rafraîchir - + View - + Vue SmartPlaylists - + Smart Playlists - Liste intelligente + Liste intelligente - + Rules based playlists - Liste basée sur des règles + Liste basée sur des règles @@ -12799,48 +13101,48 @@ Add - Ajouter + Ajouter Edit - Éditer + Éditer Remove - Supprimer + Supprimer A 'smart' playlist contains a set of rules to select tracks from your music library to play. The playlist also controls the order in which tracks are added. Unlike 'dynamic' playlists, the play queue is not dynamically updated. - + Une 'liste de lecture intelligente' contient des règles pour sélectionner des pistes depuis votre bibliothèque musicale. La liste ded lecture controle aussi l'ordre dans lequel les pistes sont ajoutées. A la différence des listes de lecture 'dynamiques', la file n'est pas mise à jour dynamiquement. Use the + icon (below) to create a new 'smart' playlist. - + Utilisez l'icone + pour créer une nouvelle liste de leture intelligente Are you sure you wish to remove the selected rules? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? + Êtes-vous sûr de vouloir supprimer les règles sélectionnées ? Cette action est définitive. Remove Smart Rules - + Supprimer les règles intelligente. Failed to locate any matching songs - + Impossible de trouver des pistes correspondantes. @@ -12850,7 +13152,7 @@ Cannot access song files! Please check Cantata's "Music folder" setting, and MPD's "music_directory" setting. - Cantata ne peut accéder aux musiques ! + Cantata ne peut accéder aux musiques ! Veuillez vérifier le paramètre "Dossier musical" ainsi que la valeur du paramètre "music_directory" dans la configuration de MPD. @@ -12859,7 +13161,7 @@ Cannot access song files! Please check that the device is still attached. - Cantata ne peut accéder aux musiques ! + Cantata ne peut accéder aux musiques ! Veuillez vérifier si le périphérique est toujours attaché. @@ -12869,306 +13171,306 @@ Lyrics - Paroles + Paroles Information - Informations + Informations Metadata - Métadonnées + Métadonnées Scroll Lyrics - + Faire défiler les paroles Refresh Lyrics - Rafraîchir les paroles + Rafraîchir les paroles Edit Lyrics - Éditer les paroles + Éditer les paroles Delete Lyrics File - Supprimer le fichier contenant les paroles + Supprimer le fichier contenant les paroles Refresh Track Information - Rafraîchir les informations sur la piste + Rafraîchir les informations sur la piste Cancel - Annuler + Annuler Track - Piste + Piste Reload lyrics? Reload from disk, or delete disk copy and download? - Recharger les paroles ? + Recharger les paroles ? Recharger depuis le disque, ou effacer la copie disque et télécharger ? Reload - Rafraîchir + Rafraîchir Reload From Disk - Rafraîchir à partir du disque + Rafraîchir à partir du disque Download - Télécharger + Télécharger Current playing song has changed, still perform search? - La piste courante a changé, continuer la recherche ? + La piste courante a changé, continuer la recherche ? Song Changed - Piste modifiée + Piste modifiée Perform Search - Effectuer la recherche + Effectuer la recherche Delete lyrics file? - Supprimer les paroles ? + Supprimer les paroles ? Delete File - Supprimer le fichier + Supprimer le fichier - - + + Artist - Artiste + Artiste - - + + Album artist - Artiste de l'album + Artiste de l'album - - + + Composer - Compositeur + Compositeur - + Lyricist - Parolier + Parolier - + Conductor - Chef d'orchestre + Chef d'orchestre - + Remixer - Remixeur + Remixeur - - + + Album - Album + Album - + Subtitle - Sous-titre + Sous-titre - - + + Track number - Piste numéro + Piste numéro - - + + Disc number - Disque numéro + Disque numéro - - + + Genre - Genre + Genre - + Date - Date + Date - + Original date - Date originale + Date originale - - + + Comment - Commentaire + Commentaire - + Copyright - Copyright + Copyright - + Label - Label + Label - + Catalogue number - Numéro du catalogue + Numéro du catalogue - + Title sort - Trier par titre + Trier par titre - + Artist sort - Trier par artiste + Trier par artiste - + Album artist sort - Trier par artiste de l'album + Trier par artiste de l'album - + Album sort - Trier par album + Trier par album - + Encoded by - Encodé par + Encodé par - + Encoder - Encodeur + Encodeur - + Mood - Humeur + Humeur - + Media - Média + Média - - + + Bitrate - Débit binaire + Débit binaire - - + + Sample rate - Échantillonnage + Échantillonnage - - + + Channels - Canaux + Canaux - + Tagging time - Date de l’étiquetage + Date de l’étiquetage - + Performer (%1) - Interprète (%1) + Interprète (%1) - + %1 kb/s - %1 kb/s + %1 kb/s - + %1 Hz - %1 Hz + %1 Hz - + Bits - Bits + Bits - + Performer - Interprète + Interprète - + Year - Année + Année - - + + Filename - Nom du fichier + Nom du fichier - + Fetching lyrics via %1 - Recherche des paroles via %1 + Recherche des paroles via %1 SoundCloudService - + Search for tracks from soundcloud.com - + Rechercher des pistes sur soundcloud.com @@ -13176,12 +13478,12 @@ Calculating... - Calcul en cours… + Calcul en cours… Total space used: %1 - Espace occupé total: %1 + Espace occupé total: %1 @@ -13189,88 +13491,88 @@ %n Artist(s) - + 1 artiste %n artistes - + %n Album(s) - + 1 album %n albums - + Modified in the last week - + Modifié dans la dernière semaine - + Modified in the last 2 weeks - + Modifié dans les 2 dernières semaines - + Modified in the last 30 days - + Modifié dans le dernier mois - + Modified in the last 60 days - + Modifié dans les 2 derrniers mois - + Modified in the last 90 days - + odifié dans les 3 derniers mois - + Modified in the last year - + Modifié dans la dernière année - + Modified in the last 2 years - + Modifié dans les 2 dernières années - + Modified in the last 3 years - + Modifié dans les 3 dernières années - + Modified more than 3 years ago - + Modifié il y a plus de 3 ans - - + + %n Tracks (%1) - + 1 piste (%1) %n pistes (%1) - + Cue Sheet - Liste Cue + Liste Cue - + Playlist - Liste de lecture + Liste de lecture - + %1 by %2 - %1 par %2 + %1 par %2 @@ -13278,75 +13580,75 @@ Rename - Renommer + Renommer Remove Duplicates - Supprimer les doublons + Supprimer les doublons Initially Collapse Albums - + Initialement Réduire les albums Either save the play queue, or use the context menu in the library, to create new playlists. - + Sauve la file ou utilisez le menu contextuel pour créer une nouvelle liste de lecture Are you sure you wish to remove the selected playlists? This cannot be undone. - Êtes-vous sûr de vouloir supprimer les listes de lecture sélectionnées ? + Êtes-vous sûr de vouloir supprimer les listes de lecture sélectionnées ? Ce choix est définitif. Remove Playlists - Supprimer les listes de lecture + Supprimer les listes de lecture Playlist Name - Nom de la liste de lecture + Nom de la liste de lecture Enter a name for the playlist: - Entrez un nom pour la liste de lecture: + Entrez un nom pour la liste de lecture: A playlist named '%1' already exists! Overwrite? - Une liste nommée '%1' existe déjà ! + Une liste nommée '%1' existe déjà ! Remplacer ? Overwrite Playlist - Remplacer la liste de lecture + Remplacer la liste de lecture Rename Playlist - Renommer la liste de lecture + Renommer la liste de lecture Enter new name for playlist: - Entrez un nouveau nom pour la liste de lecture: + Entrez un nouveau nom pour la liste de lecture: Cannot add songs from '%1' to '%2' - Les pistes de '%1' à '%2' ne peuvent être ajoutées + Les pistes de '%1' à '%2' ne peuvent être ajoutées @@ -13354,32 +13656,32 @@ Add stream to favourites - + Ajouter le flux aux favoris Name: - Nom: + Nom: URL: - URL: + URL: Add Stream - Ajouter un flux + Ajouter un flux Edit Stream - Éditer le flux + Éditer le flux <i><b>ERROR:</b> Invalid protocol</i> - + <i><b>ERREUR::</b> Protocole invalide</i> @@ -13387,7 +13689,7 @@ Loading %1 - + Chargement de %1 @@ -13395,144 +13697,140 @@ Installed - Installé + Installé Update available - Mise à jour disponible + Mise à jour disponible Check the providers you wish to install/update. - Veuillez vérifier les fournisseurs que vous souhaitez installer/mettre à jour. + Veuillez vérifier les fournisseurs que vous souhaitez installer/mettre à jour. Install/Update Stream Providers - Installer/Mettre à jour les fournisseurs de flux + Installer/Mettre à jour les fournisseurs de flux Downloading list... - Téléchargement de la liste… + Téléchargement de la liste… - + Failed to download list of stream providers! - La téléchargement de la liste des fournisseurs de flux a échoué. + La téléchargement de la liste des fournisseurs de flux a échoué. Installing/updating %1 - Installation/Mise à jour de %1 + Installation/Mise à jour de %1 Failed to install '%1' - L'installation de '%1' a échoué + L'installation de '%1' a échoué Failed to download '%1' - Le téléchargement de '%1' a échoué + Le téléchargement de '%1' a échoué - Install/update the selected stream providers? - Installer/Mettre à jour les fournisseurs de flux sélectionnés ? + Installer/Mettre à jour les fournisseurs de flux sélectionnés ? - Install the selected stream providers? - Installer les fournisseurs de flux sélectionnés ? + Installer les fournisseurs de flux sélectionnés ? - Update the selected stream providers? - Mettre à jour le fournisseur de flux sélectionné ? + Mettre à jour le fournisseur de flux sélectionné ? - - + Install/Update - Installation/Mise à jour + Installation/Mise à jour - + Abort installation/update? - Abandonner l'installation/la mise à jour ? + Abandonner l'installation/la mise à jour ? - + Abort - Annuler + Annuler - + %n Update(s) available - + 1 mise à jour disponible %n mises à jour disponibles - + Downloading %1 - Téléchargement de %1 + Téléchargement de %1 - + Update all updateable providers - Mettre à jour tous les fournisseurs disponibles + Mettre à jour tous les fournisseurs disponibles StreamSearchModel - + TuneIn - TuneIn + TuneIn - + ShoutCast - ShoutCast + ShoutCast - + Dirble - Dirble + Dirble - + Stream Search - + Recherche de flux - + Search for radio streams - + Recherche de flux radio - + Enter string to search - + Entrez la chaîne à rechercher - + Not Loaded - Non chargé + Non chargé - + Loading... - Chargement… + Chargement… - + %n Entry(s) - + 1 entrée %n entrées @@ -13543,7 +13841,7 @@ Added '%1'' to favorites - Ajout de '%1' aux favoris + Ajout de '%1' aux favoris @@ -13551,199 +13849,199 @@ Import Streams Into Favorites - Importer les flux dans les favoris + Importer les flux dans les favoris Export Favorite Streams - Exporter les flux favoris + Exporter les flux favoris Add New Stream To Favorites - Ajouter un nouveau flux aux favoris + Ajouter un nouveau flux aux favoris Edit - Éditer + Éditer Seatch For Streams - + Recherche de flux Configure - Configurer + Configurer Digitally Imported Service name - + Digitally Imported Import Streams - Importer les flux + Importer les flux XML Streams (*.xml *.xml.gz *.cantata) - Flux XML (*.xml *.xml.gz *.cantata) + Flux XML (*.xml *.xml.gz *.cantata) Export Streams - Exporter les flux + Exporter les flux XML Streams (*.xml.gz) - Flux XML (*.xml.gz) + Flux XML (*.xml.gz) Failed to create '%1'! - La création de '%1' a échoué ! + La création de '%1' a échoué ! Stream '%1' already exists! - Le flux '%1' existe déjà ! + Le flux '%1' existe déjà ! A stream named '%1' already exists! - Il existe déjà un flux nommé '%1' ! + Il existe déjà un flux nommé '%1' ! Bookmark added - Marque-page ajouté + Marque-page ajouté Already bookmarked - Déjà dans les marque-pages + Déjà dans les marque-pages Already in favorites - Déjà dans les favoris. + Déjà dans les favoris. Reload '%1' streams? - Rafraîchir le flux '%1' ? + Rafraîchir le flux '%1' ? Are you sure you wish to remove bookmark to '%1'? - Êtes-vous sûr de vouloir supprimer '%1' des marque-pages ? + Êtes-vous sûr de vouloir supprimer '%1' des marque-pages ? Are you sure you wish to remove all '%1' bookmarks? - Êtes-vous sûr de vouloir supprimer tous les marque-pages '%1' ? + Êtes-vous sûr de vouloir supprimer tous les marque-pages '%1' ? Are you sure you wish to remove the %1 selected streams? - Êtes-vous sûr de vouloir supprimer les %1 flux sélectionnés ? + Êtes-vous sûr de vouloir supprimer les %1 flux sélectionnés ? Are you sure you wish to remove '%1'? - Êtes-vous sûr de supprimer '%1' ? + Êtes-vous sûr de supprimer '%1' ? Added '%1'' to favorites - Ajout de '%1' aux favoris + Ajout de '%1' aux favoris StreamsModel - + Bookmarks - Favoris + Favoris - + TuneIn - TuneIn + TuneIn - + IceCast - IceCast + IceCast - + ShoutCast - ShoutCast + ShoutCast - + Dirble - Dirble + Dirble - + Favorites - Favoris + Favoris - + Bookmark Category - Catégorie des favoris + Catégorie des favoris - + Add Stream To Favorites - Ajouter le flux aux favoris + Ajouter le flux aux favoris - + Configure Digitally Imported - + Configurer Digitally Imported - + Reload - Rafraîchir + Rafraîchir - + Streams - Flux + Flux - + Radio stations - Stations de radio + Stations de radio - + Not Loaded - Non chargé + Non chargé - + Loading... - Chargement… + Chargement… - + %n Entry(s) - + 1 entrée %n entrées @@ -13753,67 +14051,69 @@ StreamsSettings + Use the checkboxes below to configure the list of active providers. - + Utilisez les boites à cocher ci dessous pour configurer la liste des fournisseurs actifs. + Built-in categories are shown in italic, and these cannot be removed. - + Les catégories en italiques ne peuvent être supprimées Configure Streams - Configurer le flux + Configurer le flux From File... - Depuis le fichier… + Depuis le fichier… Download... - Télécharger… + Télécharger… Configure Provider - Configurer le service: + Configurer le service: Install - Installer + Installer Remove - Supprimer + Supprimer Install Streams - Installer des flux + Installer des flux Cantata Streams (*.streams) - Flux Cantata (*.streams) + Flux Cantata (*.streams) A category named '%1' already exists! Overwrite? - Une catégorie nommée '%1' est déjà présente ! + Une catégorie nommée '%1' est déjà présente ! Remplacer ? Failed to open package file. - + L'ouverture de l'archive a échoué. Failed top open package file. @@ -13823,27 +14123,27 @@ Invalid file format! - Type de fichier non pris en charge ! + Type de fichier non pris en charge ! Failed to create stream category folder! - La création du dossier de catégorie du flux a échoué ! + La création du dossier de catégorie du flux a échoué ! Failed to save stream list! - L'enregistrement de la liste des flux a échoué. + L'enregistrement de la liste des flux a échoué. Are you sure you wish to remove '%1'? - Êtes-vous sûr de supprimer '%1' ? + Êtes-vous sûr de supprimer '%1' ? Failed to remove streams folder! - La suppression du dossier de flux a échoué ! + La suppression du dossier de flux a échoué ! @@ -13851,17 +14151,17 @@ Search - Recherche + Recherche Check Items - Cocher les items + Cocher les items Uncheck Items - Décocher les items + Décocher les items @@ -13869,58 +14169,58 @@ Library: - + Bibliothèque: Device: - + Périphérique: Loading all songs from library, please wait... - + Chargement de toutes les pistes de la bibliothèque, patientez... <code>Library</code> lists only songs that are in your library, but not on the device. Likewise <code>Device</code> lists songs that are only on the device.<br/>Select songs from <code>Library</code> that you would like to copy to <code>Device</code>, and select songs from <code>Device</code> that you would like to copy to <code>Library</code>. Then press the <code>Synchronize</code> button. - + <code>Bibliothèque</code> liste seulement les pistes de votre bibliothèque, pas de votre périphérique. De même <code>Périphérique</code> liste les pistes qui ne sont que sur le périphérique.<br/>Selectionnez les pistes de votre <code>Bibliothèque</code>que vous voulez copier sur le <code>Périphérique</code>, et selectionnez les pistes du <code>Périphérique</code> que vous voulez copier dans la <code>Bibliothèque</code>. puis appuyez sur le bouton <code>Synchroniser</code>. Synchronize - Synchroniser + Synchroniser Device and library are in sync. - Le périphérique et la bibliothèque sont synchronisés. + Le périphérique et la bibliothèque sont synchronisés. Loading all songs from library, please wait...%1%... - + Chargement de pistes depuis la bibliothèque, patientez...%1%... Local Music Library Properties - Propriétés de la Bibliothèque Musicale Locale + Propriétés de la Bibliothèque Musicale Locale Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! Device has been changed? - Le périphérique a été changé ? + Le périphérique a été changé ? Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? @@ -13928,358 +14228,373 @@ Stretch Columns To Fit Window - Adapter les colonnes à la fenêtre + Adapter les colonnes à la fenêtre Left - Gauche + Gauche Center - + Centre Right - Droite + Droite Alignment - + Alignement TagEditor + Track: - Piste: + Piste: + Title: - Titre: + Titre: + Artist: - Artiste: + Artiste: + Album artist: - Artiste de l'album: + Artiste de l'album: + Composer: - Compositeur: + Compositeur: + Album: - Album: + Album: + Track number: - Piste numéro: + Piste numéro: + Disc number: - Disque numéro: + Disque numéro: + Genre: - Genre: + Genre: + Year: - Année: + Année: + Rating: - Note: + Note: + <i>(Various)</i> - <i>Divers</i> + <i>Divers</i> + Comment: - Commentaire: + Commentaire: + Multiple genres should be separated via a comma (e.g. 'Rock,Hard Rock') - Les genres devraient être séparés par des virgules (ex 'Rock,Hard Rock') + Les genres devraient être séparés par des virgules (ex 'Rock,Hard Rock') + Ratings are stored in an external database, and <b>not</b> in the song's file. - + Les notes sont stockées dans une base de donnée externe et <b> non</b> dans les fichiers Tags - Étiquettes + Étiquettes Tools - Outils + Outils Apply "Various Artists" Workaround - Appliquer l'alternative "Artistes divers" + Appliquer l'alternative "Artistes divers" Revert "Various Artists" Workaround - Révoquer l'alternative "Artistes divers" + Révoquer l'alternative "Artistes divers" Set 'Album Artist' from 'Artist' - Récupérer la valeur de 'Artiste de l'album' depuis 'Artiste' + Récupérer la valeur de 'Artiste de l'album' depuis 'Artiste' Capitalize - Mettre une majuscule + Mettre une majuscule Adjust Track Numbers - Ajuster les numéros des pistes + Ajuster les numéros des pistes Read Ratings from File - Lire la note à partir du fichier + Lire la note à partir du fichier Write Ratings to File - Écrire les notes sur les fichiers + Écrire les notes sur les fichiers All tracks - Toutes les pistes + Toutes les pistes Apply "Various Artists" workaround to <b>all</b> tracks? - + Appliquer l'alternative 'Artistes divers' à <b>toutes</b> les pistes ? Apply "Various Artists" workaround? - Appliquer l'alternative "Artistes divers" ? + Appliquer l'alternative "Artistes divers" ? <i>This will set 'Album artist' and 'Artist' to "Various Artists", and set 'Title' to "TrackArtist - TrackTitle"</i> - + <i>Ceci définira 'Artiste de l'album' et 'Artiste' à 'Artiste divers' et 'Titre' à 'Artiste de la piste'-'Titre de la piste'</i> Revert "Various Artists" workaround on <b>all</b> tracks? - + Annuler l'alternative 'Artistes divers' à <b>toutes</b> les pistes ? Revert "Various Artists" workaround - + Annuler l'alternative "Artistes divers" ? <i>Where the 'Album artist' is the same as 'Artist' and the 'Title' is of the format "TrackArtist - TrackTitle", 'Artist' will be taken from 'Title' and 'Title' itself will be set to just the title. e.g. <br/><br/>If 'Title' is "Wibble - Wobble", then 'Artist' will be set to "Wibble" and 'Title' will be set to "Wobble"</i> - + <i>Quand 'Artiste de l'album' et 'Artiste' sont les mêmes et que 'titre'est au format 'Artiste de la piste'-'Titre de la piste', 'Artiste' sera extrait de 'Titre' et 'titre' sera défini au seul titre. <br/><br/>Si 'Titre' est "Wibble - Wobble", 'Artiste' sera "Wibble" et 'Titre' sera "Wobble"</i> Revert - Réinitialiser + Réinitialiser Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> tracks? - + Définir 'Artiste de l'album' (si vide) depuis 'Artiste' pour <b>toutes<b/> les pistes ? Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)? - + Définir 'Artiste de l'album' (si vide) depuis 'Artiste' ? Album Artist from Artist - + Artiste de l'album depuis Artiste Capitalize the first letter of text fields (e.g. 'Title', 'Artist', etc) of <b>all</b> tracks? - + Mettre en majuscule la première lettre des champs de texte (Titre, Artistte...) de <b>toutes</b> les pistes ? Capitalize the first letter of text fields (e.g. 'Title', 'Artist', etc)? - + Mettre en majuscule la première lettre des champs de texte (Titre, Artistte...) ? Adjust the value of each track number by: - + Ajuster la valeur de chaque numéro de piste de: Adjust track number by: - Ajuster les numéros des pistes par: + Ajuster les numéros des pistes par: Read ratings for all tracks from the music files? - + Lire la note de la piste pour toutes les pistes? Read rating from music file? - Lire la note de la piste ? + Lire la note de la piste ? Ratings - Notes + Notes Read Ratings - Lire les notes + Lire les notes Read Rating - Lire la note + Lire la note Read, and updated, ratings from the following tracks: - Lire + Lire Not all Song ratings have been read from MPD! - + Toutes les pistes n'ont pas été lues depuis MPD! Song ratings are not stored in the song files, but within MPD's 'sticker' database. In order to save these into the actual file, Cantata must first read them from MPD. - + Les notes de chansons sont stockées dans la base de donnée 'Sticker' de MPD, non dans les fichiers. Pour les enregistrer dans le fichier, Cantata doit d'abord les lire depuis MPD. Song rating has not been read from MPD! - + Les notes n'ont pu être lues depuis MPD! Write ratings for all tracks to the music files? - Enregistrer les notes dans l'ensemble des pistes ? + Enregistrer les notes dans l'ensemble des pistes ? Write rating to music file? - Écrire la note dans le fichier musical ? + Écrire la note dans le fichier musical ? Write Ratings - Écrire les notes + Écrire les notes Write Rating - Écrire la note + Écrire la note Failed to write ratings of the following tracks: - L'écriture des notes sur les fichiers suivants a échoué: + L'écriture des notes sur les fichiers suivants a échoué: Failed to write rating to music file! - L'écriture de la note sur la piste a échoué ! + L'écriture de la note sur la piste a échoué ! All tracks [modified] - Toutes les pistes [modifier] + Toutes les pistes [modifiées] %1 [modified] - %1 [modifier] + %1 [modifiées] %1 (Corrupt tags?) filename (Corrupt tags?) - %1 (Étiquettes corrompues ?) + %1 (Étiquettes corrompues ?) Failed to update the tags of the following tracks: - La mise à jour des étiquettes des pistes suivantes a échoué: + La mise à jour des étiquettes des pistes suivantes a échoué: Would you also like to rename your song files, so as to match your tags? - Souhaitez vous renommer vos fichiers musicaux afin de les faire correspondre avec leurs étiquettes ? + Souhaitez vous renommer vos fichiers musicaux afin de les faire correspondre avec leurs étiquettes ? Rename Files - Renommer les fichiers + Renommer les fichiers Rename - Renommer + Renommer Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! Device is not connected. - Le périphérique n'est pas connecté. + Le périphérique n'est pas connecté. Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? @@ -14287,7 +14602,7 @@ (Various) - (Divers) + (Divers) @@ -14295,7 +14610,7 @@ Reset Spacing - Réinitialiser l'espacement + Réinitialiser l'espacement @@ -14303,108 +14618,119 @@ Click to go back - + Cliquerr pour revenir en arrière Add All To Play Queue - + Tout ajouter à la liste courante Add All And Replace Play Queue - + Tout ajouter et remplacer la liste courante ToggleList + Available: - Disponible: + Disponible: + Selected: - Sélectionner le fichier: + Sélectionner le fichier: TrackOrganiser + Filenames - Nom des fichiers + Nom des fichiers + Filename scheme: - Schéma de nommage: + Schéma de nommage: + VFAT safe - + Compatible VFAT + Use only ASCII characters - Utiliser seulement des caractères ASCII + Utiliser seulement des caractères ASCII + Replace spaces with underscores - Remplacer les espaces avec des tirets-bas + Remplacer les espaces avec des tirets-bas + Append 'The' to artist names - Ajouter 'The' aux nom des artistes + Ajouter 'The' aux nom des artistes + Original Name - Nom original + Nom original + New Name - Nouveau nom + Nouveau nom + Ratings will be lost if a file is renamed. - Les notes seront perdues si les fichiers sont renommés. + Les notes seront perdues si les fichiers sont renommés. Organize Files - Organiser les fichiers + Organiser les fichiers Rename - Renommer + Renommer Remove From List - Supprimer de la liste + Supprimer de la liste Abort renaming of files? - Abandonner le renommage des fichiers ? + Abandonner le renommage des fichiers ? Abort - Annuler + Annuler Source file does not exist! - Le fichier source n'existe pas ! + Le fichier source n'existe pas ! @@ -14412,7 +14738,7 @@ Skip - Passer + Passer @@ -14420,64 +14746,64 @@ Auto Skip - Saut automatique + Saut automatique Destination file already exists! - Le fichier de destination existe déjà ! + Le fichier de destination existe déjà ! Failed to create destination folder! - La création du dossier cible a échoué ! + La création du dossier cible a échoué ! Failed to rename '%1' to '%2' - Le renommage de '%1' à '%2' a échoué + Le renommage de '%1' à '%2' a échoué Remove the selected tracks from the list? - Supprimer la piste sélectionnée de la liste ? + Supprimer la piste sélectionnée de la liste ? Remove Tracks - Supprimer les pistes + Supprimer les pistes Song ratings are not stored in the song files, but within MPD's 'sticker' database. If you rename a file (or the folder it is within), then the rating associated with the song will be lost. - Les notes des chansons ne sont pas enregistrées dans leur fichier audio mais dans la base de données d'étiquettes de MPD. + Les notes des chansons ne sont pas enregistrées dans leur fichier audio mais dans la base de données d'étiquettes de MPD. Si vous renommez un fichier (ou le dossier le contenant) la note associée à la piste sera perdue. Device has been removed! - Le périphérique a été retiré ! + Le périphérique a été retiré ! Device is not connected. - Le périphérique n'est pas connecté. + Le périphérique n'est pas connecté. Device is busy? - Le périphérique est occupé ? + Le périphérique est occupé ? TrayItem - + Cantata - Cantata + Cantata Now playing @@ -14489,12 +14815,12 @@ (Polish Translations) - (Traduction polonaise) + (Traduction polonaise) (Portuguese Translations) - (Traduction portugaise) + (Traduction portugaise) @@ -14503,17 +14829,17 @@ Not Scanned - Non analysé + Non analysé Not Connected - Non connecté + Non connecté %1 free - %1 libre + %1 libre @@ -14521,7 +14847,7 @@ (recommended) - (recommandé) + (recommandé) @@ -14529,7 +14855,7 @@ Cancel - Annuler + Annuler @@ -14539,22 +14865,22 @@ Mute - Muet + Muet Unmute - Rétablir le son + Rétablir le son Volume %1% (Muted) - Volume %1% (Silencieux) + Volume %1% (Silencieux) Volume %1% - Volume %1% + Volume %1% @@ -14563,13 +14889,13 @@ artist|band|singer|vocalist|musician Search pattern for an artist or band, separated by | - artiste|groupe|chanteur|vocaliste|musicien + artiste|groupe|chanteur|vocaliste|musicien album|score|soundtrack Search pattern for an album, separated by | - album|partition|bande + album|partition|bande @@ -14577,12 +14903,12 @@ Choose the wikipedia languages you want to use when searching for artist and album information. - Choisissez les langues Wikipédia à utiliser lors de la recherche d'informations sur les artistes et albums. + Choisissez les langues Wikipédia à utiliser lors de la recherche d'informations sur les artistes et albums. Reload - Rafraîchir + Rafraîchir diff -Nru cantata-2.3.0/translations/cantata_hu.ts cantata-2.3.1/translations/cantata_hu.ts --- cantata-2.3.0/translations/cantata_hu.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_hu.ts 2018-05-26 17:52:05.000000000 +0000 @@ -9113,7 +9113,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_it.ts cantata-2.3.1/translations/cantata_it.ts --- cantata-2.3.0/translations/cantata_it.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_it.ts 2018-05-26 17:52:14.000000000 +0000 @@ -3463,7 +3463,7 @@ - Play next + Play Next Riproduci il prossimo @@ -6647,7 +6647,7 @@ Failed to resolve connection details for %1 - Impossibile risolbere i dettagli per la connessione di %1 + Impossibile risolvere i dettagli per la connessione di %1 diff -Nru cantata-2.3.0/translations/cantata_ja.ts cantata-2.3.1/translations/cantata_ja.ts --- cantata-2.3.0/translations/cantata_ja.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_ja.ts 2018-05-26 17:52:22.000000000 +0000 @@ -9605,7 +9605,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_ko.ts cantata-2.3.1/translations/cantata_ko.ts --- cantata-2.3.0/translations/cantata_ko.ts 2018-04-02 09:54:34.000000000 +0000 +++ cantata-2.3.1/translations/cantata_ko.ts 2018-05-26 17:52:28.000000000 +0000 @@ -9731,7 +9731,7 @@ - Play next + Play Next 다음 곡 재생 diff -Nru cantata-2.3.0/translations/cantata_pl.ts cantata-2.3.1/translations/cantata_pl.ts --- cantata-2.3.0/translations/cantata_pl.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_pl.ts 2018-05-26 17:52:36.000000000 +0000 @@ -6796,7 +6796,7 @@ Full Width Cover - + Okładka pełnej szerokości @@ -6814,7 +6814,7 @@ The API call limit has been exceeded for %1, please try again later or register for your own API key. - + Przekroczono limit zapytań API dla %1, spróbuj ponownie później lub użyj własnego klucza API. @@ -6822,22 +6822,22 @@ Cantata uses various internet services to provide covers, radio stream listings, etc. Most of these require an application's developer to register with the service, and obtain an API Key. Cantata contains the keys required to access these services. Unfortunately, some of these services have a usage limit per API key. Therefore, some of Cantata's features may not function if the key (which is shared with all Cantata users) has reached its monthly usage limit. To work-around this, you can register with a service yourself, and configure Cantata to use your personal API key. This key may be entered below. For any blank values below, Cantata will use its default key. - + Cantata używa wielu serwisów internetowych aby dostarczać okładki, listy strumieni radiowych itp. Większość z nich wymaga, aby twórca aplikacji zarejestrował się w tym serwisie w celu pozyskania klucza API. Cantata zawiera klucze potrzebne do odpytywania tych serwisów. Niestety, część z tych serwisów narzuca ograniczenia na liczbę zapytań związanych z danym kluczem. Dlatego część z funkcji programu Cantata może przestać działać jeśli dany klucz (który jest współdzielony między wszystkimi instalacjami programu) osiągnie miesięczny limit zapytań. Aby obejść to ograniczenie, możliwe jest samodzielne zarejestrowanie się w serwisie i skonfigurowanie, aby program Cantata używał osobistego klucza API. Ten klucz można wpisać poniżej. Dla pól, które nie zostały wypełnione, domyślna wartość klucza zostanie użyta. Service - + Serwis Service URL - + URL serwisu API Key - + Klucz API @@ -6943,12 +6943,12 @@ Server Folders - + Katalogi serwera MPD virtual file-system - + Wirtualny system plików MPD @@ -7526,7 +7526,7 @@ If an artist name begins with 'The', then append this in the folder name. e.g. 'The Beatles' becomes 'Beatles, The' - + Jeżeli nazwa artysty zaczyna się na 'The', to przenieś ten przedrostek na koniec nazwy katalogu, np. 'The Beatles' zostanie zmienione na 'Beatles, The' If an artist name begins with 'The', then prepend this in the folder name. e.g. 'The Beatles' becomes 'Beatles, The' @@ -7600,7 +7600,7 @@ Always transcode - + Zawsze konwertuj @@ -7682,7 +7682,7 @@ Any supported devices will appear here when attached to your computer. - + Wszystkie wspierane urządzenia pojawią się tutaj gdy zostaną podłączone do komputera. @@ -7983,7 +7983,7 @@ Could not start dynamic helper. Please check all <a href="https://github.com/CDrummond/cantata/wiki/Dynamic-Palylists-Helper">dependencies</a> are installed. - + Wystartowanie pomocniczej aplikacji do trybu dynamicznego nie powiodło się. Należy sprawdzić czy wszystkie <a href="https://github.com/CDrummond/cantata/wiki/Dynamic-Palylists-Helper">zależności</a> zostały zainstalowane. @@ -8047,17 +8047,17 @@ A 'dynamic' playlist contains a set of rules to select tracks from your music library to play. The play queue is filled with random tracks matching your criteria, and the play queue will be dynamically updated after tracks are played. - + 'Dynamiczna' playlista zawiera zestaw reguł do wyboru utwórów z biblioteki. Kolejka odtwarzania jest wypełniana losowymi utowrami pasującymi do podanych reguł i dynamicznie uzupełniana gdy utwory zostaną odtworzone. Use the + icon (below) to create a new 'dynamic' playlist. - + W celu utworzenia nowej 'dynamicznej' playlisty należy użyć przycisku + poniżej. Remote dynamizer is not running. In order to support 'dynamic' playlists under Windows, Cantata requires its 'cantata-dynamic' script to be running on the MPD server. - + Zdalne narzędzie do dynamicznych playlist nie jest uruchomione. W celu obsługi 'dynamicznych' playlist w systemie Windows, program Cantata wymaga, aby skrypt 'cantata-dynamic' był uruchomiony na serwerze MPD. Remote dynamizer is not running. @@ -8277,27 +8277,27 @@ Server Detection - + Wykrywanie serwera Please select your MPD. If you don't see your MPD listed here, check that zeroconf is activated in your MPD configuration or insert the host configuration manually. - + Proszę wybrać serwer MPD. Jeżeli serwer MPD nie pojawia się na tej liście, należy sprawdzić, czy usługa zeroconf jest aktywna w konfiguracji MPD, albo ręcznie podać parametry połączenia. Name - Nazwa + Nazwa Address - + Adres Port - + Port @@ -8401,12 +8401,12 @@ <p>Cantata is a feature-rich and user friendly client for Music Player Daemon (MPD). MPD is a flexible, powerful, server-side application for playing music.</p><p>For more information on MPD itself, please refer to the MPD website <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a></p><p>This 'wizard' will guide you through the basic settings required for Cantata to function correctly.</p> - + <p>Cantata jest bogatym w funkcje i przyjaznym dla użytkownika klientem Music Player Daemon (MPD). MPD jest elastyczną i potężną aplikacją serwerową do odtwarzania muzyki.</p><p>W celu uzyskania informacji na temat MPD prosimy o odwiedzenie strony <a href="http://www.musicpd.org"><span style=" text-decoration: underline; color:#0000ff;">http://www.musicpd.org</span></a></p><p>Ten 'kreator konfiguracji' pomoże przy podstawowych ustawieniach potrzebnych do poprawnego działania programu Cantata.</p> <p>Welcome to Cantata</p> - + <p>Witamy w programie Cantata</p> @@ -8492,27 +8492,27 @@ Album Covers - + Okładki albumów <p>Cantata can download missing covers, and store these either in the music folder or within your personal cache folder.</p> - + <p>Program Cantata może pobrać brakujące okładki i przechowywać je w katalogu z muzyką lub w osobistym katalogu pamięci podręcznej.</p> Fetch missing covers - + Pobierz brakujące okładki Save downloaded covers into music folder - + Zapisz pobrane okładki w katalogu muzyki If you elect to have Cantata store covers within the music folder, and you do not have write access to this folder (or you have set this as a HTTP address), then Cantata will revert to saving the files in your personal cache folder. - + Jeżeli wybrano opcję, aby program Cantata przechowywał okładki w katalogu muzyki, a użytkownik nie ma praw do zapisu w tym katalogu (albo jest on ustawiony na adres HTTP), to Cantata wróci do opcji zapisu tych plików w osobistym katalogu pamięci podręcznej. Covers and Lyrics @@ -8574,7 +8574,7 @@ Discover... - + Odkryj... @@ -8657,12 +8657,12 @@ Automatically change style when insufficient space - + Automatycznie zmień styl gdy jest za mało miejsca <p>Change to a small top bar (containing all views) when the window is narrow.</p> - + <p>Zmienia widok na wąski pasek górny (zawierający wszystkie widoki) gdy okno programu jest wąskie.</p> @@ -8758,7 +8758,7 @@ Show technical info - + Pokaż informacje techniczne @@ -8848,62 +8848,62 @@ If you have a lot of artists in your collection that only contain a single track, then it can be cumbersome for each of these to have their own entry in the list of artists. As a work-around for this, if you place these tracks into a separate folder, and enter this folder name below, then Cantata will group these under an album named 'Single Tracks' with an album artist of 'Various Artists'. You may enter a comma separated list of folder names (without leading or trailing path separators) below. - + Jeżeli w kolekcji znajduje się duża liczba artystów z pojedynczym utworem, to może być uciążliwe, aby każdy posiadał własny wpis w bibliotece w liście artystów. Jako obejście tego problemu, jeżeli wszystkie te utwory zostaną umieszczone w osobnym katalogu, którego adres zostanie podany poniżej, to program Cantata pogrupuje te utwory w albumie o nazwie 'Pojedyncze utwory' jako artysta 'Various Artists'. Poniżej można podać listę katalogów oddzieloną przecinkiem (bez poprzedzających i kończących znaków podziału ścieżki). Comma separated list of folders that contain single track files... - + Lista katalogów oddzielonych przecinkiem, które zawierają pojedyncze utwory... Miscellaneous - + Różne CUE files: - + Pliki CUE: Year tag: - + Tag roku: Changing 'Artist & Album Sorting', 'Single Tracks', or 'CUE files' will require a DB refresh in order to take effect. Changing 'Composer Support' or 'Year tag' will require restarting Cantata. - + Zmiana ustawień 'Sortowanie Artysty i Albumu', 'Pojedyncze utwory' oraz 'Pliki CUE' wymaga odświeżenia bazy danych. Zmiana ustawień 'Obsługa tagu Kompozytor' i 'Tag roku' wymaga restartu programu Cantata. Covers - Okładki + Okładki Fetch missing covers - + Pobierz brakujące okładki Save downloaded covers into music folder - + Zapisz pobrane okładki w katalogu muzyki Filename: - + Nazwa pliku: <p>Filename (without extension) to save downloaded covers as.<br/>If left blank 'cover' will be used.<br/><br/><i>%artist% will be replaced with album artist of the current song, and %album% will be replaced with the album name.</i></p> - <p>Nazwa pliku (bez rozszerzenia) do zapisu okładek.<br/>Przy pozostawieniu tego pola pustego, nazwa 'cover' zostanie użyta.<br/><br/><i>%artist% zostanie zastąpiony przez nazwę artysty albumu obecnego utworu, natomiast %album% zostanie zastąpiony przez nazwę albumu.</i></p> + <p>Nazwa pliku (bez rozszerzenia) do zapisu okładek.<br/>Przy pozostawieniu tego pola pustego, nazwa 'cover' zostanie użyta.<br/><br/><i>%artist% zostanie zastąpiony przez nazwę artysty albumu obecnego utworu, natomiast %album% zostanie zastąpiony przez nazwę albumu.</i></p> If you enable 'Save downloaded covers into music folder' you may need to clear the cache of any previous covers to force downloading of new covers. See 'Cache' settings page for further details. - + Jeśli zostanie wybrana opcja 'Zapisz pobrane okładki w katalogu muzyki' konieczne będzie wyczyszczenie pamięci podręcznej okładek, aby wymusić ponowne pobranie nowych okładek. W tym celu należy otworzyć sekcję ustawień 'Pamięć podręczna'. If you have a lot of artists in your collection that only contain a single track, then it can be cumbersome for each of these to have their own entry in the list of artists. As a work-around for this, if you place these tracks into a separate folder, and enter this folder name below, then Cantata will group these under an album named 'Single Tracks' with an album artist of 'Various Artists' @@ -8994,12 +8994,12 @@ Use 'Year' tag to display & sort - + Użyj tagu 'Rok' do wyświetlania i sortowania Use 'Original Year' tag to display & sort, fallback to 'Year' if not set - + Używaj tagu 'Rok oryginału' do wyświetlania i sortowania, a gdy ten nie jest ustawiony, użyj tagu 'Rok' @@ -9090,12 +9090,12 @@ If no setting is specified for 'Filename', then Cantata will use a default of <code>cover</code>. This filename is used when downloading covers, or when adding music to your library from devices. - + Jeżeli nie podano ustawienia 'Nazwa pliku', to Cantata użyje domyślnej wartości <code>cover</code>. Ta nazwa pliku zostanie użyta do zapisu pobranych okładek, lub przy dodawaniu muzyki do biblioteki z urządzeń zewnętrznych. If no setting is specified for 'Filename', then Cantata will use a default of <code>cover</code>. This filename is used when downloading covers. - + Jeżeli nie podano ustawienia 'Nazwa pliku', to Cantata użyje domyślnej wartości <code>cover</code>. Ta nazwa pliku zostanie użyta do zapisu pobranych okładek. @@ -9273,7 +9273,7 @@ <p>Enter a string to search artist, album, title, etc. To filter based on year, add <i>#year-range</i> to search string - e.g.</p><ul><li><b><i>#2000</i></b> return tracks from 2000</li><li><b><i>#1980-1989</i></b> return tracks from the 80's</li><li><b><i>Blah #2000</i></b> to search for string <i>Blah</i> and only return tracks from 2000</li></ul></p> - + <p>Wprowadź tekst by wyszukać artystę, album, tytuł, itp. Aby wyszukać po roku, należy dodać <i>#zakres-dat</i> do wyszukiwanej frazy - np.</p><ul><li><b><i>#2000</i></b> wyszuka utworów z roku 2000</li><li><b><i>#1980-1989</i></b> zwóci utwory z lat 80tych</li><li><b><i>Blah #2000</i></b> wyszuka utwory z frazą <i>Blah</i> i zwróci wyniki tylko z roku 2000</li></ul></p> @@ -9354,7 +9354,7 @@ No music? Looks like your MPD is not configured correctly. - + Brak muzyki? Wygląda na to że MPD nie jest skonfigurowany poprawnie. @@ -9376,27 +9376,27 @@ Home - + Katalog domowy Browse files in your home folder - + Przeglądaj pliki z katalogu domowego Root - + Root Browse files on your computer - + Przeglądaj pliki z komputera Open In File Manager - Otwórz w menedżerze plików + Otwórz w menedżerze plików @@ -9615,7 +9615,7 @@ Preferences... - Ustawienia... + Ustawienia... @@ -9698,7 +9698,7 @@ Add Local Files - + Dodaj pliki lokalne @@ -9767,7 +9767,7 @@ Play HTTP Output Stream - + Odtwarzaj strumień wyjściowy HTTP @@ -9777,21 +9777,21 @@ Artist - Artysta + Artysta Album - Album + Album Track - Utwór + Utwór - Play next + Play Next Odtwarzaj następny @@ -9857,7 +9857,7 @@ <p>Enter a string to search artist, album, title, etc. To filter based on year, add <i>#year-range</i> to search string - e.g.</p><ul><li><b><i>#2000</i></b> return tracks from 2000</li><li><b><i>#1980-1989</i></b> return tracks from the 80's</li><li><b><i>Blah #2000</i></b> to search for string <i>Blah</i> and only return tracks from 2000</li></ul></p> - + <p>Wprowadź tekst by wyszukać artystę, album, tytuł, itp. Aby wyszukać po roku, należy dodać <i>#zakres-dat</i> do wyszukiwanej frazy - np.</p><ul><li><b><i>#2000</i></b> wyszuka utworów z roku 2000</li><li><b><i>#1980-1989</i></b> zwóci utwory z lat 80tych</li><li><b><i>Blah #2000</i></b> wyszuka utwory z frazą <i>Blah</i> i zwróci wyniki tylko z roku 2000</li></ul></p> @@ -9932,7 +9932,7 @@ Please refer to <a href="https://github.com/CDrummond/cantata/issues">Cantata's issue tracker</a> for a list of known issues, and to report new issues. - + Na stronie <a href="https://github.com/CDrummond/cantata/issues">listy problemów programu Cantata</a> można znaleźć znane błędy oraz zgłosić nowe problemy. @@ -10073,12 +10073,12 @@ Select Music Files - + Wybierz pliki z muzyką Music Files - + Pliki z muzyką @@ -10120,26 +10120,26 @@ Open In File Manager - Otwórz w menedżerze plików + Otwórz w menedżerze plików No folders? Looks like your MPD is not configured correctly. - + Brak katalogów? Wygląda na to że MPD nie jest skonfigurowany poprawnie. Are you sure you wish to delete the selected songs? This cannot be undone. - Czy na pewno usunąć zaznaczone utwory? + Czy na pewno usunąć zaznaczone utwory? Ta operacja nie może być cofnięta. Delete Songs - Usuń utwory + Usuń utwory @@ -10292,12 +10292,12 @@ Copy To Clipboard - + Skopiuj do schowka Now Playing - + Teraz odtwarzane (Stream) @@ -10672,12 +10672,12 @@ Filename - Nazwa pliku + Nazwa pliku Path - + Ścieżka @@ -10757,7 +10757,7 @@ Fadeout on stop: - + Wyciszanie przy zatrzymaniu: @@ -10800,12 +10800,12 @@ Crossfade between tracks: - + Przejście między utworami: Replay gain: - + Replay gain: &Crossfade between tracks: @@ -10828,17 +10828,17 @@ Volume step: - + Krok głośności: <p>Amount to change volume by when using either the volume control keyboard shortcuts, or the mouse wheel over the toolbar volume control.</p> - + <p>Wartość, o jaką zmieniana będzie glośność przy użyciu skrótów klawiszowych, kółka myszy lub kontrol głośności paska narzędziowego.</p> % - + % @@ -11008,7 +11008,7 @@ Name of playlist - + Nazwa playlisty @@ -11055,17 +11055,17 @@ Files added in the last: - + Pliki dodane przez ostatnie: days - + dni No Limit - Brak limitu + Brak limitu @@ -11114,7 +11114,11 @@ Use the 'Add' button to add a 'rule' to control which artists, genres, etc you want included in the playlist. Any rules added will be listed here. A playlist with no rules will use songs from your whole music library. Use the settings below to restrict the range of songs added. - + Każda playlista musi mieć unikalną nazwę, którą należy wprowadzić powyżej + +W celu ustawienia, którzy artyści, gatunki itp. mają być dodane do playlisty, należy stworzyć nową 'regułę' używając przycisku 'Dodaj'. Wszystkie dodane reguły będą wyświetlone poniżej. Playlista bez reguł będzie używać wszystkich utworów z całej biblioteki. + +Aby zawęzić zakres utworów do dodania należy użyć poniższych ustawień. @@ -11133,12 +11137,12 @@ Dynamic Playlist - + Dynamiczna playlista Smart Playlist - Inteligentna lista odtwarzania + Inteligentna playlista @@ -11215,7 +11219,7 @@ Smart Playlist - Inteligentna lista odtwarzania + Inteligentna playlista @@ -11639,12 +11643,12 @@ Configure - Konfiguruj + Konfiguruj Use the + icon (below) to add podcast subscriptions. - + Użyj ikony + (poniżej) aby dodać subskrypcję podcastu. @@ -11820,12 +11824,12 @@ Service Keys - + Klucze serwisu Service API Keys - + Klucze API serwisu @@ -12022,7 +12026,7 @@ The <a href=http://flac.sourceforge.net/documentation_tools_flac.html>compression level</a> is an integer value between 0 and 8 that represents the tradeoff between file size and compression speed while encoding with <b>FLAC</b>.<br/>Setting the compression level to <b>0</b> yields the shortest compression time but generates a comparably big file.<br/>On the other hand, a compression level of <b>8</b> makes compression quite slow but produces the smallest file.<br/>Note that since FLAC is by definition a lossless codec, the audio quality of the output is exactly the same regardless of the compression level.<br/>Also, levels above <b>5</b> dramatically increase compression time but create an only slightly smaller file, and are not recommended. - + <a href=http://flac.sourceforge.net/documentation_tools_flac.html>Poziom kompresji</a> jest liczbą całkowitą z przedziału od 0 do 8 reprezentującą kompromis pomiędzy rozmiarem pliku a prędkością kompresji przy użyciu formatu <b>FLAC</b>.<br/>Ustawienie poziomu kompresji na <b>0</b> daje najkrótsze czasy kompresji jednak generowane pliki są stosunkowo duże.<br/>Z drugiej strony, poziom kompresji równy <b>8</b> powoduje, że kompresja jest dosyć powolna, jednak generowane pliki są najmniejsze.<br/>Należy pamiętać, że format FLAC jest z definicji bezstratny, więc jakość dźwięku wyjściowego jest identyczna z oryginałem niezależnie od ustawionego poziomu kompresji.<br/>Ponadto, poziomy powyżej <b>5</b> dramatycznie podnoszą czas kompresji dając jedynie niewiele mniejsze pliki wyjściowe i są niezalecane. The <a href=http://flac.sourceforge.net/documentation_tools_flac.html>compression level</a> is an integer value between 0 and 8 that represents the tradeoff between file size and compression speed while encoding with <b>FLAC</b>.<br/> Setting the compression level to <b>0</b> yields the shortest compression time but generates a comparably big file.<br/>On the other hand, a compression level of <b>8</b> makes compression quite slow but produces the smallest file.<br/>Note that since FLAC is by definition a lossless codec, the audio quality of the output is exactly the same regardless of the compression level.<br/>Also, levels above <b>5</b> dramatically increase compression time but create an only slightly smaller file, and are not recommended. @@ -12392,12 +12396,12 @@ Zoom In - + Przybliż Zoom Out - + Oddal @@ -12578,7 +12582,7 @@ (Stream) - (Strumień) + (Strumień) @@ -12837,7 +12841,7 @@ Categorized - + Skategoryzowany %n Track(s) @@ -12922,133 +12926,134 @@ mpd - MPD communication - + mpd - komunikacja MPD mpdparse - Parsing of MPD response - + mpdparse - Przetwarzanie odpowiedzi MPD covers - Cover fetching, and loading - + covers - Pobieranie i ładowanie okładek covers-verbose - Cover fetching, and loading (verbose) - + covers-verbose - Pobieranie i ładowanie okładek (verbose) context-wikipedia - Wikipedia info in context view - + context-wikipedia - Informacie z Wikipedii w widoku kontekstowym context-lastfm - Last.fm info in context view - + context-lastfm - Informacje z last.fm w widoku kontekstowym context-widget - General debug in context view - + context-widget - Informacje debug w widoku kontekstowym context-lyrics - Lyrics in context view - + context-lyrics - Teksty utworów w widoku kontekstowym dynamic - Dynamic playlists - + dynamic - Dynamiczne playlisty stream-fetcher - Fetching of stream URLs - + stream-fetcher - Pobieranie adresów URL strumieni http-server - Built-in HTTP server - + http-server - Wbudowany serwer HTTP song-dialog - Song dialogs (tags, replaygain, organiser) - + song-dialog - Okna dialogowe utworów (tagi, replaygain, organizator) network-access - Network access - + network-access - Dostęp do sieci threads - Threads - + threads - Wątki scrobbler - Scrobbling - + scrobbler - Scrobbling sql - SQL access - + sql - dostęp do bazy SQL media-keys - Media-keys - + media-keys - Klawisze multimedialne custom-actions - Custom actions - + custom-actions - Własne akcje tags - Tag reading/writing - + tags - Czytanie/zapis tagów devices - Device support - + devices - Obsługa urządzeń http-stream - Playback of MPD output streams - + http-stream - Odtwarzanie strumieni wyjściowych MPD avahi - Auto-discovery of MPD servers - + avahi - Automatyczne wykrywanie serwerów MPD MPD Client - + Klient MPD Comma-separated list of debug areas - possible values: - + Oddzielana przecinkami lista obszarów debugowania - dostępne wartości: + Log debug messages to %1 - + Loguj informacje debugowania do %1 Disable network access - + Wyłącz dostęp sieciowy @@ -13530,7 +13535,7 @@ %n reguła %n reguły - % reguł + %n reguł @@ -13661,7 +13666,7 @@ Use the text field above to search for music in your library via MPD's search mechanism. Clicking the label next to the field will produce a menu allowing you to control the search area. - + Powyższe pole tekstowe służy do wyszukiwania muzyki w bibliotece przy użyciu mechanizmu MPD. Kliknięcie na etykietę przy polu otworzy menu pozwalające na kontrolę obszaru wyszukiwania. @@ -13671,7 +13676,7 @@ Search for songs by artist. - + Szukaj utworów według artysty. @@ -13681,7 +13686,7 @@ Search for songs by composer. - + Szukaj utworów według kompozytora. @@ -13691,7 +13696,7 @@ Search for songs by performer. - + Szukaj utworów według wykonawcy. @@ -13701,7 +13706,7 @@ Search for songs by album. - + Szukaj utworów według albumu. @@ -13711,7 +13716,7 @@ Search for songs by title. - + Szukaj utworów według tytułu. @@ -13721,7 +13726,7 @@ Search for songs by genre. - + Szukaj utworów według gatunku. @@ -13731,7 +13736,7 @@ Search for songs containing comment. - + Szukaj utworów zawierających komentarz. @@ -13771,7 +13776,7 @@ Search for songs by filename or path. - + Szukaj utworów według nazwy pliku lub ścieżki. @@ -13781,7 +13786,7 @@ Search for songs by any matching metadata. - + Szukaj utworów według dowolnych pasujących metadanych. @@ -13856,32 +13861,32 @@ Local file playback: - + Odtwarzanie lokalnych plików: Use a simple in-built HTTP server to allow MPD to playback files dropped onto the playqueue. - + Użyj prostego wbudowanego serwera HTTP aby pozwolić MPD na odtwarzanie plików przeciągniętych do kolejki odtwarzania. Via in-built HTTP server - + Przy użyciu wbudowanego serwera HTTP Auto update: - + Automatyczne uaktualnienie: <p>Select this option if your MPD server detects modifications (e.g. newly added files) automatically. If so there is no need for Cantata to send update commands for certain actions.</p> - + <p>Należy wybrać tę opcję jeżeli serwer MPD ma automatycznie wykrywać zmiany (np. nowo dodane pliki). Jeżeli ta opcja jest włączona, to nie ma potrzeba aby Cantata wysyłała komenty uaktualnień przy niektórych akcjach.</p> Server detects changes automatically - + Serwer wykrywa zmiany automatycznie @@ -13900,7 +13905,7 @@ MPD usually only plays songs from within your collection. Newer MPD's (from v0.19 onwards) can also playback other files if you are connected to a local MPD server (e.g. address is '127.0.0.1' or 'localhost') For this to work, the MPD server needs read-access to wherever the files are located. If you are using an older MPD, a non-local MPD, or your local files are not accessible to other users, then you may elect to use the simple HTTP server that is supplied with Cantata. This server will only allow access to files in the playqueue, and only whilst Cantata is running. - + Serwer MPD zazwyczaj odtwarza tylko utwory z kolekcji muzyki. Nowsze wersje MPD (od wersji v0.19 wzwyż) pozwalają również na odtwarzanie innych plików, jeżeli klient połączony jest z lokalnym serwerem MPD (np. jeżeli adres to '127.0.0.1' albo 'localhost'). Aby ta funkcja działała, serwer MPD musi mieć uprawnienia do odczytu lokalizacji tych plików. Jeżli używana jest starsza wersja MPD, nie lokalna instancja MPD, albo lokalne pliki nie są dostępne dla innych użytkowników, wtedy można użyć prostego serwera HTTP, który dostarczony jest z programem Cantata. Ten serwer pozwala tylko na dostęp do plików z kolejki odtwarzania, i tylko gdy program Cantata jest uruchomiony. @@ -13920,12 +13925,12 @@ More information - + Więcej informacji Discover... - + Odkryj... @@ -14090,12 +14095,12 @@ A 'smart' playlist contains a set of rules to select tracks from your music library to play. The playlist also controls the order in which tracks are added. Unlike 'dynamic' playlists, the play queue is not dynamically updated. - + 'Inteligentna' playlista zawiera zestaw reguł do wyboru utwórów z biblioteki. Ta playlista kontroluje również kolejność w jakiej dodane są utwory. W przeciwieństwie do 'dynamicznej' playlisty, kolejka odtwarzania nie jest aktualizowana na bieżąco. Use the + icon (below) to create a new 'smart' playlist. - + Użyj ikony + (poniżej) aby dodać nową 'inteligentną' playlistę. @@ -14484,47 +14489,47 @@ Modified in the last week - + Zmodyfikowane w ostatnim tygodniu Modified in the last 2 weeks - + Zmodyfikowane w ostatnich 2 tygodniach Modified in the last 30 days - + Zmodyfikowane w ostatnich 30 dniach Modified in the last 60 days - + Zmodyfikowane w ostatnich 60 dniach Modified in the last 90 days - + Zmodyfikowane w ostatnich 90 dniach Modified in the last year - + Zmodyfikowane w ostatnim roku Modified in the last 2 years - + Zmodyfikowane w ostatnich 2 latach Modified in the last 3 years - + Zmodyfikowane w ostatnich 3 latach Modified more than 3 years ago - + Zmodyfikowane więcej niż 3 lata temu @@ -14549,7 +14554,7 @@ %1 by %2 - + %1 w wykonaniu %2 @@ -14572,7 +14577,7 @@ Either save the play queue, or use the context menu in the library, to create new playlists. - + Zapisz kolejkę odtwarzania, lub użyj menu kontekstowego w bibliotece aby stworzyć nową playlistę. @@ -15095,7 +15100,7 @@ Failed to open package file. - + Otwarcie pliku paczki nie powiodło się. Failed top open package file. diff -Nru cantata-2.3.0/translations/cantata_ru.ts cantata-2.3.1/translations/cantata_ru.ts --- cantata-2.3.0/translations/cantata_ru.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_ru.ts 2018-05-26 17:52:41.000000000 +0000 @@ -9133,7 +9133,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/cantata_zh_CN.ts cantata-2.3.1/translations/cantata_zh_CN.ts --- cantata-2.3.0/translations/cantata_zh_CN.ts 2018-04-01 18:53:58.000000000 +0000 +++ cantata-2.3.1/translations/cantata_zh_CN.ts 2018-05-26 17:52:47.000000000 +0000 @@ -5759,7 +5759,7 @@ - Play next + Play Next diff -Nru cantata-2.3.0/translations/CMakeLists.txt cantata-2.3.1/translations/CMakeLists.txt --- cantata-2.3.0/translations/CMakeLists.txt 2017-04-09 08:51:49.000000000 +0000 +++ cantata-2.3.1/translations/CMakeLists.txt 2018-05-24 16:58:57.000000000 +0000 @@ -1,4 +1,4 @@ -file(GLOB TS_FILES *.ts) +file(GLOB TS_FILES cantata_*.ts) foreach (TS_FILE ${TS_FILES}) get_filename_component(TRANS ${TS_FILE} NAME_WE) list(APPEND CANTATA_TRANS "${TRANS}") diff -Nru cantata-2.3.0/widgets/actionlabel.cpp cantata-2.3.1/widgets/actionlabel.cpp --- cantata-2.3.0/widgets/actionlabel.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/widgets/actionlabel.cpp 2018-05-14 16:33:32.000000000 +0000 @@ -61,7 +61,7 @@ setAlignment(Qt::AlignCenter); if(0==theUsageCount++) { - QImage img(Icons::self()->audioFileIcon.pixmap(iconSize, iconSize).toImage()); + QImage img(Icons::self()->audioListIcon.pixmap(iconSize, iconSize).toImage()); double increment=360.0/constNumIcons; for(int i=0; idrawPixmap(r.x()+r.width()-layoutSize.width(), r.y()+((r.height()-layoutSize.height())/2), layoutSize.width(), layoutSize.height(), pix); r.adjust(3, 0, -(3+adjust), 0); } else { - painter->drawPixmap(r.x(), r.y()+((r.height()-layoutSize.height())/2), layoutSize.width(), layoutSize.height(), pix); - r.adjust(adjust+3, 0, -3, 0); + painter->drawPixmap(r.x()+2, r.y()+((r.height()-layoutSize.height())/2), layoutSize.width(), layoutSize.height(), pix); + r.adjust(adjust+5, 0, -3, 0); } } } diff -Nru cantata-2.3.0/widgets/itemview.h cantata-2.3.1/widgets/itemview.h --- cantata-2.3.0/widgets/itemview.h 2018-03-09 17:25:34.000000000 +0000 +++ cantata-2.3.1/widgets/itemview.h 2018-05-24 17:50:24.000000000 +0000 @@ -36,7 +36,6 @@ class GroupedView; class ActionItemDelegate; class MessageOverlay; -class Icon; class TableView; class QMenu; class Configuration; diff -Nru cantata-2.3.0/widgets/menubutton.cpp cantata-2.3.1/widgets/menubutton.cpp --- cantata-2.3.0/widgets/menubutton.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/widgets/menubutton.cpp 2018-05-03 16:06:36.000000000 +0000 @@ -31,6 +31,14 @@ #include #include +#ifdef Q_OS_WIN +#include +#include +#ifndef _WIN32_WINNT_WIN10 +#define _WIN32_WINNT_WIN10 0x0A00 +#endif +#endif + MenuButton::MenuButton(QWidget *parent) : ToolButton(parent) { @@ -57,6 +65,11 @@ void MenuButton::setAlignedMenu(QMenu *m) { QToolButton::setMenu(m); + #ifdef Q_OS_WIN + if (!IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 0)) { + return; + } + #endif m->installEventFilter(this); } diff -Nru cantata-2.3.0/widgets/multipagewidget.cpp cantata-2.3.1/widgets/multipagewidget.cpp --- cantata-2.3.0/widgets/multipagewidget.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/widgets/multipagewidget.cpp 2018-05-26 15:12:37.000000000 +0000 @@ -22,6 +22,7 @@ */ #include "multipagewidget.h" +#include "gui/application.h" #include "support/icon.h" #include "support/utils.h" #include "support/squeezedtextlabel.h" @@ -31,7 +32,6 @@ #include "support/osxstyle.h" #endif #include "listview.h" -#include "sizewidget.h" #include "singlepagewidget.h" #include "toolbutton.h" #include @@ -43,7 +43,7 @@ class SelectorButton : public ToolButton { public: - SelectorButton(const QString &t, const QString &s, const Icon &icn, QWidget *p) + SelectorButton(const QString &t, const QString &s, const QIcon &icn, QWidget *p) : ToolButton(p) { QGridLayout *layout=new QGridLayout(this); @@ -70,7 +70,7 @@ subText->setAlignment(Qt::AlignTop); icon->setAlignment(Qt::AlignCenter); double dpr=DEVICE_PIXEL_RATIO(); - QPixmap pix=icn.getScaledPixmap(icon->width()*dpr, icon->height()*dpr, 96*dpr); + QPixmap pix=Icon::getScaledPixmap(icn, icon->width()*dpr, icon->height()*dpr, 96*dpr); pix.setDevicePixelRatio(dpr); icon->setPixmap(pix); setAutoRaise(true); @@ -127,7 +127,8 @@ mainPage=new QWidget(this); QVBoxLayout *mainLayout=new QVBoxLayout(mainPage); infoLabel=new QLabel(mainPage); - sizer=new SizeWidget(mainPage); + QWidget *sizer=new QWidget(mainPage); + Application::fixSize(sizer); QScrollArea *scroll = new QScrollArea(this); view = new QWidget(scroll); QVBoxLayout *layout = new QVBoxLayout(view); @@ -196,12 +197,12 @@ void MultiPageWidget::addPage(const QString &name, const QString &icon, const QString &text, const QString &subText, QWidget *widget) { - Icon i; + QIcon i; i.addFile(":"+icon); addPage(name, i, text, subText, widget); } -void MultiPageWidget::addPage(const QString &name, const Icon &icon, const QString &text, const QString &subText, QWidget *widget) +void MultiPageWidget::addPage(const QString &name, const QIcon &icon, const QString &text, const QString &subText, QWidget *widget) { if (entries.contains(name)) { return; diff -Nru cantata-2.3.0/widgets/multipagewidget.h cantata-2.3.1/widgets/multipagewidget.h --- cantata-2.3.0/widgets/multipagewidget.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/widgets/multipagewidget.h 2018-05-26 15:12:37.000000000 +0000 @@ -29,7 +29,7 @@ #include "gui/page.h" #include -class Icon; +class QIcon; class SelectorButton; class SizeWidget; class QLabel; @@ -54,7 +54,7 @@ void save(Configuration &config) const; void setInfoText(const QString &text); void addPage(const QString &name, const QString &icon, const QString &text, const QString &subText, QWidget *widget); - void addPage(const QString &name, const Icon &icon, const QString &text, const QString &subText, QWidget *widget); + void addPage(const QString &name, const QIcon &icon, const QString &text, const QString &subText, QWidget *widget); void removePage(const QString &name); void sortItems(); bool onMainPage() const { return mainPage==currentWidget(); } @@ -70,7 +70,6 @@ QWidget *mainPage; QWidget *view; QLabel *infoLabel; - SizeWidget *sizer; QMap entries; }; diff -Nru cantata-2.3.0/widgets/nowplayingwidget.cpp cantata-2.3.1/widgets/nowplayingwidget.cpp --- cantata-2.3.0/widgets/nowplayingwidget.cpp 2018-03-23 18:54:58.000000000 +0000 +++ cantata-2.3.1/widgets/nowplayingwidget.cpp 2018-05-14 21:28:49.000000000 +0000 @@ -31,6 +31,7 @@ #include "mpd-interface/mpdconnection.h" #include "models/playqueuemodel.h" #include "support/utils.h" +#include "scrobbling/scrobblinglove.h" #ifdef Q_OS_MAC #include "support/osxstyle.h" #endif @@ -46,7 +47,7 @@ #include #include -static const int constPollMpd = 2; // Poll every 2 seconds when playing +static const int constPollMpd = 5; // Poll every X seconds when playing static const char * constUserSettingProp = "user-setting"; class PosSliderProxyStyle : public QProxyStyle @@ -264,6 +265,11 @@ time=new TimeLabel(this, slider); ratingWidget=new RatingWidget(this); infoLabel=new QLabel(this); + ScrobblingLove *love = new ScrobblingLove(this); + ratingWidget->ensurePolished(); + int loveSize = ratingWidget->height()+Utils::scaleForDpi(4); + love->setIconSize(QSize(ratingWidget->height(), ratingWidget->height())); + love->setFixedSize(loveSize, loveSize); QFont f=track->font(); QFont small=Utils::smallFont(f); f.setBold(true); @@ -271,6 +277,7 @@ artist->setFont(small); time->setFont(small); infoLabel->setFont(small); + infoLabel->setAlignment((Qt::LeftToRight==infoLabel->layoutDirection() ? Qt::AlignLeft : Qt::AlignRight)|Qt::AlignVCenter); slider->setOrientation(Qt::Horizontal); QBoxLayout *layout=new QBoxLayout(QBoxLayout::TopToBottom, this); QBoxLayout *topLayout=new QBoxLayout(QBoxLayout::LeftToRight, nullptr); @@ -288,8 +295,9 @@ topLayout->setSpacing(space/2); botLayout->setSpacing(space/2); topLayout->addWidget(track); - topLayout->addWidget(ratingWidget); topLayout->addWidget(infoLabel); + topLayout->addWidget(ratingWidget); + topLayout->addWidget(love); layout->addLayout(topLayout); botLayout->addWidget(artist); botLayout->addWidget(time); @@ -353,10 +361,12 @@ void NowPlayingWidget::setValue(int v) { - startTime.restart(); - lastVal=v; - slider->setValue(v); - updateTimes(); + if (qAbs(v-slider->value())>1 || MPDState_Playing!=MPDStatus::self()->state()) { + startTime.restart(); + lastVal=v; + slider->setValue(v); + updateTimes(); + } } void NowPlayingWidget::setRange(int min, int max) @@ -464,7 +474,11 @@ info+=ext; } } - infoLabel->setText(QLatin1Char(' ') + info); + if (info.isEmpty()) { + infoLabel->setText(QString()); + } else { + infoLabel->setText(info+QLatin1Char(' ')); + } } void NowPlayingWidget::copyInfo() diff -Nru cantata-2.3.0/widgets/searchwidget.h cantata-2.3.1/widgets/searchwidget.h --- cantata-2.3.0/widgets/searchwidget.h 2018-02-12 18:13:02.000000000 +0000 +++ cantata-2.3.1/widgets/searchwidget.h 2018-05-24 17:49:53.000000000 +0000 @@ -32,8 +32,6 @@ #include #include -class Icon; - class SearchWidget : public QWidget { Q_OBJECT diff -Nru cantata-2.3.0/widgets/singlepagewidget.cpp cantata-2.3.1/widgets/singlepagewidget.cpp --- cantata-2.3.0/widgets/singlepagewidget.cpp 2018-03-09 17:25:34.000000000 +0000 +++ cantata-2.3.1/widgets/singlepagewidget.cpp 2018-05-26 15:12:37.000000000 +0000 @@ -22,11 +22,11 @@ */ #include "singlepagewidget.h" -#include "widgets/sizewidget.h" #include "widgets/spacerwidget.h" #include "widgets/toolbutton.h" #include "widgets/icons.h" #include "gui/stdactions.h" +#include "gui/application.h" #include "mpd-interface/mpdconnection.h" #include #include @@ -53,10 +53,10 @@ { QGridLayout *layout=new QGridLayout(this); view=new ItemView(this); + QWidget *sizer=new QWidget(this); + Application::fixSize(sizer); layout->addWidget(view, 1, 0, 1, 5); -// layout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Preferred), 2, 1, 1, 1); - layout->addWidget(new SizeWidget(this), 2, 2, 1, 1); -// layout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Preferred), 2, 3, 1, 1); + layout->addWidget(sizer, 2, 2, 1, 1); layout->setMargin(0); layout->setSpacing(0); connect(view, SIGNAL(searchItems()), this, SIGNAL(searchItems())); @@ -67,6 +67,7 @@ void SinglePageWidget::addWidget(QWidget *w) { + Application::fixSize(w); static_cast(layout())->addWidget(w, 0, 0, 1, 5); } @@ -112,14 +113,20 @@ if (!left.isEmpty()) { QHBoxLayout *ll=new QHBoxLayout(); + ll->setMargin(0); + ll->setSpacing(1); for (QWidget *b: left) { + Application::fixSize(b); ll->addWidget(b); } static_cast(layout())->addItem(ll, 2, 0, 1, 1); } if (!right.isEmpty()) { QHBoxLayout *rl=new QHBoxLayout(); + rl->setMargin(0); + rl->setSpacing(1); for (QWidget *b: right) { + Application::fixSize(b); rl->addWidget(b); } static_cast(layout())->addItem(rl, 2, 4, 1, 1); diff -Nru cantata-2.3.0/widgets/sizewidget.cpp cantata-2.3.1/widgets/sizewidget.cpp --- cantata-2.3.0/widgets/sizewidget.cpp 2018-02-12 18:16:31.000000000 +0000 +++ cantata-2.3.1/widgets/sizewidget.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,49 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "sizewidget.h" -#include "toolbutton.h" -#include "sizegrip.h" -#include "support/combobox.h" - -static int swHeight=-1; - -SizeWidget::SizeWidget(QWidget *parent) - : QWidget(parent) -{ - if (-1 == swHeight) { - ComboBox c(this); - ToolButton b(this); - SizeGrip g(this); - c.ensurePolished(); - b.ensurePolished(); - g.ensurePolished(); - swHeight=qMax(c.sizeHint().height(), qMax(b.sizeHint().height(), g.sizeHint().height())); - } - setFixedHeight(swHeight); -} - -void SizeWidget::paintEvent(QPaintEvent *e) -{ - Q_UNUSED(e) -} diff -Nru cantata-2.3.0/widgets/sizewidget.h cantata-2.3.1/widgets/sizewidget.h --- cantata-2.3.0/widgets/sizewidget.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/widgets/sizewidget.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,36 +0,0 @@ -/* - * Cantata - * - * Copyright (c) 2011-2018 Craig Drummond - * - * ---- - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#ifndef SIZEWIDGET_H -#define SIZEWIDGET_H - -#include - -class SizeWidget : public QWidget -{ -public: - explicit SizeWidget(QWidget *parent = nullptr); - void paintEvent(QPaintEvent *e) override; -}; - -#endif diff -Nru cantata-2.3.0/widgets/spacerwidget.cpp cantata-2.3.1/widgets/spacerwidget.cpp --- cantata-2.3.0/widgets/spacerwidget.cpp 2018-01-01 10:09:02.000000000 +0000 +++ cantata-2.3.1/widgets/spacerwidget.cpp 2018-04-30 16:41:40.000000000 +0000 @@ -34,7 +34,7 @@ if (0==fixedWidth) { ToolButton tb(parent); tb.ensurePolished(); - fixedWidth=tb.sizeHint().width()*0.75; + fixedWidth=tb.sizeHint().width()*0.5; } setFixedWidth(fixedWidth); } diff -Nru cantata-2.3.0/widgets/stackedpagewidget.cpp cantata-2.3.1/widgets/stackedpagewidget.cpp --- cantata-2.3.0/widgets/stackedpagewidget.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/widgets/stackedpagewidget.cpp 2018-05-26 15:12:37.000000000 +0000 @@ -22,12 +22,10 @@ */ #include "stackedpagewidget.h" -#include "support/icon.h" #include "support/utils.h" #include "support/squeezedtextlabel.h" #include "support/proxystyle.h" #include "listview.h" -#include "sizewidget.h" #include "singlepagewidget.h" #include #include diff -Nru cantata-2.3.0/widgets/stackedpagewidget.h cantata-2.3.1/widgets/stackedpagewidget.h --- cantata-2.3.0/widgets/stackedpagewidget.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/widgets/stackedpagewidget.h 2018-05-24 17:48:36.000000000 +0000 @@ -29,7 +29,6 @@ #include "mpd-interface/song.h" #include "gui/page.h" -class Icon; class SelectorButton; class SizeWidget; class QLabel; diff -Nru cantata-2.3.0/widgets/titlewidget.h cantata-2.3.1/widgets/titlewidget.h --- cantata-2.3.0/widgets/titlewidget.h 2018-02-05 19:24:55.000000000 +0000 +++ cantata-2.3.1/widgets/titlewidget.h 2018-05-24 17:50:07.000000000 +0000 @@ -28,7 +28,7 @@ #include "mpd-interface/song.h" class QImage; -class Icon; +class QIcon; class SqueezedTextLabel; class QLabel; diff -Nru cantata-2.3.0/widgets/treeview.cpp cantata-2.3.1/widgets/treeview.cpp --- cantata-2.3.0/widgets/treeview.cpp 2018-03-07 19:04:41.000000000 +0000 +++ cantata-2.3.1/widgets/treeview.cpp 2018-05-24 17:55:48.000000000 +0000 @@ -159,7 +159,7 @@ QDrag *drag = new QDrag(view); drag->setMimeData(data); int pixSize=Icon::stdSize(Utils::scaleForDpi(32)); - drag->setPixmap(Icon("audio-x-generic").pixmap(pixSize, pixSize)); + drag->setPixmap(Icons::self()->audioListIcon.pixmap(pixSize, pixSize)); drag->start(supportedActions); } } diff -Nru cantata-2.3.0/widgets/wizardpage.cpp cantata-2.3.1/widgets/wizardpage.cpp --- cantata-2.3.0/widgets/wizardpage.cpp 2018-01-01 10:09:02.000000000 +0000 +++ cantata-2.3.1/widgets/wizardpage.cpp 2018-05-24 17:48:12.000000000 +0000 @@ -27,7 +27,7 @@ #include #include -void WizardPage::setBackground(const Icon &i) +void WizardPage::setBackground(const QIcon &i) { int size=fontMetrics().height()*10; size=((int)(size/4))*4; diff -Nru cantata-2.3.0/widgets/wizardpage.h cantata-2.3.1/widgets/wizardpage.h --- cantata-2.3.0/widgets/wizardpage.h 2018-01-09 19:22:33.000000000 +0000 +++ cantata-2.3.1/widgets/wizardpage.h 2018-05-24 17:48:12.000000000 +0000 @@ -27,7 +27,7 @@ #include #include -class Icon; +class QIcon; class WizardPage : public QWizardPage { @@ -35,7 +35,7 @@ WizardPage(QWidget *parent = nullptr) : QWizardPage(parent) { } ~WizardPage() override { } - void setBackground(const Icon &i); + void setBackground(const QIcon &i); void paintEvent(QPaintEvent *e) override; private: diff -Nru cantata-2.3.0/windows/cantata.nsi.cmake cantata-2.3.1/windows/cantata.nsi.cmake --- cantata-2.3.0/windows/cantata.nsi.cmake 2018-03-13 19:53:14.000000000 +0000 +++ cantata-2.3.1/windows/cantata.nsi.cmake 2018-06-05 17:42:15.000000000 +0000 @@ -117,12 +117,6 @@ file "libwinpthread-1.dll" file "libz-1.dll" @CANTATA_SSL_WIN_NSIS_INSTALL@ - setOutPath $INSTDIR\config - file "config\lyrics_providers.xml" - file "config\podcast_directories.xml" - file "config\scrobblers.xml" - file "config\tag_fixes.xml" - file "config\weblinks.xml" setOutPath $INSTDIR\iconengines file "iconengines\qsvgicon.dll" setOutPath $INSTDIR\sqldrivers @@ -132,51 +126,10 @@ setOutPath $INSTDIR\mediaservice file "mediaservice\dsengine.dll" file "mediaservice\qtmedia_audioengine.dll" - setOutPath $INSTDIR\fonts - file "fonts\fontawesome-webfont.ttf" setOutPath $INSTDIR\icons - file "icons\bbc.svg" - file "icons\cbc.svg" - file "icons\npr.svg" file "icons\podcasts.png" file "icons\soundcloud.png" file "icons\stream.png" - setOutPath $INSTDIR\icons\cantata - file "icons\cantata\index.theme" - file "icons\cantata\LICENSE" - file "icons\cantata\AUTHORS" - setOutPath $INSTDIR\icons\cantata\128 - file "icons\cantata\128\cantata.png" - setOutPath $INSTDIR\icons\cantata\64 - file "icons\cantata\64\cantata.png" - setOutPath $INSTDIR\icons\cantata\48 - file "icons\cantata\48\cantata.png" - setOutPath $INSTDIR\icons\cantata\32 - file "icons\cantata\32\cantata.png" - setOutPath $INSTDIR\icons\cantata\22 - file "icons\cantata\22\cantata.png" - setOutPath $INSTDIR\icons\cantata\16 - file "icons\cantata\16\cantata.png" - setOutPath $INSTDIR\icons\cantata\svg - file "icons\cantata\svg\audio-x-generic.svg" - file "icons\cantata\svg\folder-temp.svg" - file "icons\cantata\svg\fork.svg" - file "icons\cantata\svg\information.svg" - file "icons\cantata\svg\inode-directory.svg" - file "icons\cantata\svg\key.svg" - file "icons\cantata\svg\network-server-database.svg" - file "icons\cantata\svg\preferences-desktop-keyboard.svg" - file "icons\cantata\svg\preferences-other.svg" - @CANTATA_PROXY_ICON_INSTALL@ - @CANTATA_DEVICES_ICON_INSTALL@ - @CANTATA_REMOTE_DEVICES_ICON_INSTALL@ - file "icons\cantata\svg\speaker.svg" - file "icons\cantata\svg\cantata.svg" - setOutPath $INSTDIR\icons\cantata\svg64 - file "icons\cantata\svg64\dialog-error.svg" - file "icons\cantata\svg64\dialog-information.svg" - file "icons\cantata\svg64\dialog-question.svg" - file "icons\cantata\svg64\dialog-warning.svg" setOutPath $INSTDIR\imageformats file "imageformats\qjpeg.dll" @@ -267,10 +220,11 @@ delete "$INSTDIR\sqldrivers\qsqlite4.dll" delete "$INSTDIR\sqldrivers\qsqlite.dll" delete "$INSTDIR\mediaservice\dsengine.dll" - delete "$INSTDIR\qtmedia_audioengine.dll" + delete "$INSTDIR\mediaservice\qtmedia_audioengine.dll" delete "$INSTDIR\fonts\fontawesome-4.3.0.ttf" delete "$INSTDIR\fonts\fontawesome-webfont.ttf" + delete "$INSTDIR\fonts\Cantata-FontAwesome.ttf" delete "$INSTDIR\icons\bbc.svg" delete "$INSTDIR\icons\cbc.svg" delete "$INSTDIR\icons\npr.svg" diff -Nru cantata-2.3.0/windows/CMakeLists.txt cantata-2.3.1/windows/CMakeLists.txt --- cantata-2.3.0/windows/CMakeLists.txt 2018-01-26 20:38:13.000000000 +0000 +++ cantata-2.3.1/windows/CMakeLists.txt 2018-05-14 16:23:32.000000000 +0000 @@ -12,24 +12,6 @@ set(QT_PLUGINS_DIR ${QT_DIR}/plugins) set(QT_TRANSLATIONS_DIR ${QT_DIR}/translations) -if (ENABLE_PROXY_CONFIG) - set(CANTATA_PROXY_ICON_INSTALL "file \"icons\\cantata\\svg\\preferences-system-network.svg\"") -else () - set(CANTATA_PROXY_ICON_INSTALL "") -endif () - -if (ENABLE_DEVICES_SUPPORT) - set(CANTATA_DEVICES_ICON_INSTALL "file \"icons\\cantata\\svg\\drive-removable-media-usb-pendrive.svg\"\n file \"icons\\cantata\\svg\\multimedia-player.svg\"") - if (ENABLE_REMOTE_DEVICES) - set(CANTATA_REMOTE_DEVICES_ICON_INSTALL "file \"icons\\cantata\\svg\\folder-network.svg\"\n file \"icons\\cantata\\svg\\folder-samba.svg\"") - else () - set(CANTATA_REMOTE_DEVICES_ICON_INSTALL "") - endif () -else () - set(CANTATA_DEVICES_ICON_INSTALL "") - set(CANTATA_REMOTE_DEVICES_ICON_INSTALL "") -endif () - configure_file(cantata.nsi.cmake ${CMAKE_CURRENT_BINARY_DIR}/cantata.nsi) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cantata.nsi cantata.ico LICENSE.txt "Cantata README.txt" "Qt License (LGPL V2).txt" "TagLib README.txt" DESTINATION ${CMAKE_INSTALL_PREFIX})