|
|
|
|
@ -53,6 +53,7 @@ MediaLibrary *myLibrary; |
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
bool hasTwoColumns; |
|
|
|
|
bool isAlbumOnly; |
|
|
|
|
size_t itsLeftColStartX; |
|
|
|
|
size_t itsLeftColWidth; |
|
|
|
|
size_t itsMiddleColWidth; |
|
|
|
|
@ -73,12 +74,15 @@ std::string Date_(std::string date) |
|
|
|
|
MPD::SongIterator getSongsFromAlbum(const AlbumEntry &album) |
|
|
|
|
{ |
|
|
|
|
Mpd.StartSearch(true); |
|
|
|
|
Mpd.AddSearch(Config.media_lib_primary_tag, album.entry().tag()); |
|
|
|
|
if (!isAlbumOnly) |
|
|
|
|
Mpd.AddSearch(Config.media_lib_primary_tag, album.entry().tag()); |
|
|
|
|
if (!album.isAllTracksEntry()) |
|
|
|
|
{ |
|
|
|
|
Mpd.AddSearch(MPD_TAG_ALBUM, album.entry().album()); |
|
|
|
|
if (Config.media_library_albums_split_by_date) |
|
|
|
|
Mpd.AddSearch(MPD_TAG_DATE, album.entry().date()); |
|
|
|
|
if(!isAlbumOnly) { |
|
|
|
|
if (Config.media_library_albums_split_by_date) |
|
|
|
|
Mpd.AddSearch(MPD_TAG_DATE, album.entry().date()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return Mpd.CommitSearchSongs(); |
|
|
|
|
} |
|
|
|
|
@ -135,14 +139,14 @@ class SortAlbumEntries { |
|
|
|
|
typedef MediaLibrary::Album Album; |
|
|
|
|
|
|
|
|
|
LocaleStringComparison m_cmp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
|
SortAlbumEntries() : m_cmp(std::locale(), Config.ignore_leading_the) { } |
|
|
|
|
|
|
|
|
|
bool operator()(const AlbumEntry &a, const AlbumEntry &b) const { |
|
|
|
|
return (*this)(a.entry(), b.entry()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator()(const Album &a, const Album &b) const { |
|
|
|
|
if (Config.media_library_sort_by_mtime) |
|
|
|
|
return a.mtime() > b.mtime(); |
|
|
|
|
@ -182,6 +186,7 @@ MediaLibrary::MediaLibrary() |
|
|
|
|
, m_fetching_delay(boost::posix_time::milliseconds(Config.data_fetching_delay ? 250 : -1)) |
|
|
|
|
{ |
|
|
|
|
hasTwoColumns = 0; |
|
|
|
|
isAlbumOnly = 0; |
|
|
|
|
itsLeftColWidth = COLS/3-1; |
|
|
|
|
itsMiddleColWidth = COLS/3; |
|
|
|
|
itsMiddleColStartX = itsLeftColWidth+1; |
|
|
|
|
@ -299,15 +304,28 @@ void MediaLibrary::update() |
|
|
|
|
unsigned idx = 0; |
|
|
|
|
while (!(tag = s->get(Config.media_lib_primary_tag, idx++)).empty()) |
|
|
|
|
{ |
|
|
|
|
auto key = std::make_tuple( |
|
|
|
|
std::move(tag), |
|
|
|
|
s->getAlbum(), |
|
|
|
|
Date_(s->getDate())); |
|
|
|
|
auto it = albums.find(key); |
|
|
|
|
if (it == albums.end()) |
|
|
|
|
albums[std::move(key)] = s->getMTime(); |
|
|
|
|
else |
|
|
|
|
it->second = s->getMTime(); |
|
|
|
|
if (isAlbumOnly) { |
|
|
|
|
auto key = std::make_tuple( |
|
|
|
|
"", |
|
|
|
|
s->getAlbum(), |
|
|
|
|
""); |
|
|
|
|
auto it = albums.find(key); |
|
|
|
|
if (it == albums.end()) |
|
|
|
|
albums[std::move(key)] = s->getMTime(); |
|
|
|
|
else |
|
|
|
|
it->second = s->getMTime(); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
auto key = std::make_tuple( |
|
|
|
|
std::move(tag), |
|
|
|
|
s->getAlbum(), |
|
|
|
|
Date_(s->getDate())); |
|
|
|
|
auto it = albums.find(key); |
|
|
|
|
if (it == albums.end()) |
|
|
|
|
albums[std::move(key)] = s->getMTime(); |
|
|
|
|
else |
|
|
|
|
it->second = s->getMTime(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
size_t idx = 0; |
|
|
|
|
@ -873,7 +891,15 @@ void MediaLibrary::updateTimer() |
|
|
|
|
|
|
|
|
|
void MediaLibrary::toggleColumnsMode() |
|
|
|
|
{ |
|
|
|
|
hasTwoColumns = !hasTwoColumns; |
|
|
|
|
if (isAlbumOnly) { |
|
|
|
|
hasTwoColumns = 0; |
|
|
|
|
isAlbumOnly = 0; |
|
|
|
|
} |
|
|
|
|
else if (hasTwoColumns) |
|
|
|
|
isAlbumOnly = 1; |
|
|
|
|
else |
|
|
|
|
hasTwoColumns = 1; |
|
|
|
|
|
|
|
|
|
Tags.clear(); |
|
|
|
|
Albums.clear(); |
|
|
|
|
Albums.reset(); |
|
|
|
|
@ -886,8 +912,14 @@ void MediaLibrary::toggleColumnsMode() |
|
|
|
|
{ |
|
|
|
|
std::string item_type = boost::locale::to_lower( |
|
|
|
|
tagTypeToString(Config.media_lib_primary_tag)); |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? " and mtime" : ""; |
|
|
|
|
Albums.setTitle("Albums (sorted by " + item_type + and_mtime + ")"); |
|
|
|
|
if(!isAlbumOnly) { |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? " and mtime" : ""; |
|
|
|
|
Albums.setTitle("Albums (sorted by " + item_type + and_mtime + ")"); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? " (sorted by mtime)" : ""; |
|
|
|
|
Albums.setTitle("Albums" + and_mtime); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
@ -918,8 +950,14 @@ void MediaLibrary::toggleSortMode() |
|
|
|
|
{ |
|
|
|
|
std::string item_type = boost::locale::to_lower( |
|
|
|
|
tagTypeToString(Config.media_lib_primary_tag)); |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? (" " "and mtime") : ""; |
|
|
|
|
Albums.setTitle("Albums (sorted by " + item_type + and_mtime + ")"); |
|
|
|
|
if(!isAlbumOnly) { |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? (" " "and mtime") : ""; |
|
|
|
|
Albums.setTitle("Albums (sorted by " + item_type + and_mtime + ")"); |
|
|
|
|
} |
|
|
|
|
else { |
|
|
|
|
std::string and_mtime = Config.media_library_sort_by_mtime ? " (sorted by mtime)" : ""; |
|
|
|
|
Albums.setTitle("Albums" + and_mtime); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
@ -1064,13 +1102,15 @@ std::string AlbumToString(const AlbumEntry &ae) |
|
|
|
|
{ |
|
|
|
|
if (hasTwoColumns) |
|
|
|
|
{ |
|
|
|
|
if (ae.entry().tag().empty()) |
|
|
|
|
result += Config.empty_tag; |
|
|
|
|
else |
|
|
|
|
result += ae.entry().tag(); |
|
|
|
|
result += " - "; |
|
|
|
|
if(!isAlbumOnly) { |
|
|
|
|
if (ae.entry().tag().empty()) |
|
|
|
|
result += Config.empty_tag; |
|
|
|
|
else |
|
|
|
|
result += ae.entry().tag(); |
|
|
|
|
result += " - "; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (Config.media_lib_primary_tag != MPD_TAG_DATE && !ae.entry().date().empty()) |
|
|
|
|
if (Config.media_lib_primary_tag != MPD_TAG_DATE && !ae.entry().date().empty() && !isAlbumOnly) |
|
|
|
|
result += "(" + ae.entry().date() + ") "; |
|
|
|
|
result += ae.entry().album().empty() ? "<no album>" : ae.entry().album(); |
|
|
|
|
} |
|
|
|
|
|