diff --git a/src/database/DbArtist.cpp b/src/database/DbArtist.cpp index ac332472..0f2ebacc 100644 --- a/src/database/DbArtist.cpp +++ b/src/database/DbArtist.cpp @@ -168,8 +168,7 @@ Artist::getReleases(const std::set& clusterIds) const if (!clusterIds.empty()) oss << " GROUP BY t.id HAVING COUNT(*) = " << clusterIds.size(); - // TODO order - oss << " ORDER BY t.date,r.name"; + oss << " ORDER BY t.year,r.name"; Wt::Dbo::Query query = session()->query( oss.str() ); diff --git a/src/database/Release.cpp b/src/database/Release.cpp index ad372248..92be18e2 100644 --- a/src/database/Release.cpp +++ b/src/database/Release.cpp @@ -139,10 +139,12 @@ Release::getReleaseYear(bool original) const { assert(session()); - Wt::Dbo::collection dates = session()->query( - std::string("SELECT ") + (original ? "t.original_date" : "t.date") + " FROM track t INNER JOIN release r ON r.id = t.release_id") + std::string field = original ? "t.original_year" : "t.year"; + + Wt::Dbo::collection dates = session()->query( + std::string("SELECT ") + field + " FROM track t INNER JOIN release r ON r.id = t.release_id") .where("r.id = ?") - .groupBy("t.date") + .groupBy(field) .bind(this->id()); /* various dates, no date */ @@ -151,10 +153,10 @@ Release::getReleaseYear(bool original) const auto date = dates.front(); - if (!date.isValid()) + if (date > 0) + return date; + else return boost::none; - - return date.year(); } std::vector> diff --git a/src/database/Track.cpp b/src/database/Track.cpp index 6054a367..9ef6ce9f 100644 --- a/src/database/Track.cpp +++ b/src/database/Track.cpp @@ -27,12 +27,7 @@ namespace Database { Track::Track(const boost::filesystem::path& p) : -_trackNumber(0), -_totalTrackNumber(0), -_discNumber(0), -_totalDiscNumber(0), -_filePath( p.string() ), -_coverType(CoverType::None) +_filePath( p.string() ) { } @@ -201,6 +196,17 @@ Track::getTotalDiscNumber(void) const return (_totalDiscNumber > 0) ? boost::make_optional(_totalDiscNumber) : boost::none; } +boost::optional +Track::getYear() const +{ + return (_year > 0) ? boost::make_optional(_year) : boost::none; +} + +boost::optional +Track::getOriginalYear() const +{ + return (_originalYear > 0) ? boost::make_optional(_originalYear) : boost::none; +} Cluster::Cluster() { diff --git a/src/database/Track.hpp b/src/database/Track.hpp index 1f2ef635..50bdd42f 100644 --- a/src/database/Track.hpp +++ b/src/database/Track.hpp @@ -171,8 +171,8 @@ class Track void setLastWriteTime(Wt::WDateTime time) { _fileLastWrite = time; } void setAddedTime(Wt::WDateTime time) { _fileAdded = time; } void setChecksum(const std::vector& checksum) { _fileChecksum = checksum; } - void setDate(Wt::WDate date) { _date = date; } - void setOriginalDate(Wt::WDate date) { _originalDate = date; } + void setYear(int year) { _year = year; } + void setOriginalYear(int year) { _originalYear = year; } void setGenres(const std::string& genreList) { _genreList = genreList; } void setCoverType(CoverType coverType) { _coverType = coverType; } void setMBID(const std::string& MBID) { _MBID = MBID; } @@ -186,8 +186,8 @@ class Track std::string getName(void) const { return _name; } boost::filesystem::path getPath(void) const { return _filePath; } std::chrono::milliseconds getDuration(void) const { return _duration; } - Wt::WDate getDate(void) const { return _date; } - Wt::WDate getOriginalDate(void) const { return _originalDate; } + boost::optional getYear(void) const; + boost::optional getOriginalYear(void) const; Wt::WDateTime getLastWriteTime(void) const { return _fileLastWrite; } Wt::WDateTime getAddedTime(void) const { return _fileAdded; } const std::vector& getChecksum(void) const { return _fileChecksum; } @@ -206,8 +206,8 @@ class Track Wt::Dbo::field(a, _totalDiscNumber, "total_disc_number"); Wt::Dbo::field(a, _name, "name"); Wt::Dbo::field(a, _duration, "duration"); - Wt::Dbo::field(a, _date, "date"); - Wt::Dbo::field(a, _originalDate, "original_date"); + Wt::Dbo::field(a, _year, "year"); + Wt::Dbo::field(a, _originalYear, "original_year"); Wt::Dbo::field(a, _genreList, "genre_list"); Wt::Dbo::field(a, _filePath, "file_path"); Wt::Dbo::field(a, _fileLastWrite, "file_last_write"); @@ -225,23 +225,23 @@ class Track static const std::size_t _maxNameLength = 128; - int _trackNumber; - int _totalTrackNumber; - int _discNumber; - int _totalDiscNumber; + int _trackNumber = 0; + int _totalTrackNumber = 0; + int _discNumber = 0; + int _totalDiscNumber = 0; std::string _name; std::string _artistName; std::string _releaseName; std::chrono::duration _duration; - Wt::WDate _date; - Wt::WDate _originalDate; // original date time + int _year = 0; + int _originalYear = 0; std::string _genreList; std::string _filePath; std::vector _fileChecksum; Wt::WDateTime _fileLastWrite; Wt::WDateTime _fileAdded; - CoverType _coverType; - std::string _MBID; // Musicbrainz Identifier + CoverType _coverType = CoverType::None; + std::string _MBID = ""; // Musicbrainz Identifier Wt::Dbo::ptr _artist; Wt::Dbo::ptr _release; diff --git a/src/metadata/AvFormat.cpp b/src/metadata/AvFormat.cpp index 50f89e7e..bb6dad82 100644 --- a/src/metadata/AvFormat.cpp +++ b/src/metadata/AvFormat.cpp @@ -124,16 +124,16 @@ AvFormat::parse(const boost::filesystem::path& p) || tag == "YEAR" || tag == "WM/Year") { - auto date = readAs(value); + auto date = readAs(value); if (date) - items.insert( std::make_pair(MetaData::Type::Date, *date)); + items.insert(std::make_pair(MetaData::Type::Year, *date)); } else if (tag == "TDOR" // Original release time (ID3v2 2.4) || tag == "TORY") // Original release year { - auto date = readAs(value); + auto date = readAs(value); if (date) - items.insert( std::make_pair(MetaData::Type::OriginalDate, *date)); + items.insert(std::make_pair(MetaData::Type::OriginalYear, *date)); } else if (tag == "MUSICBRAINZ ARTIST ID" || tag == "MUSICBRAINZ_ARTISTID") diff --git a/src/metadata/MetaData.hpp b/src/metadata/MetaData.hpp index a9ebc0c6..b2237a9f 100644 --- a/src/metadata/MetaData.hpp +++ b/src/metadata/MetaData.hpp @@ -42,8 +42,8 @@ namespace MetaData DiscNumber, // size_t TotalTrack, // size_t TotalDisc, // size_t - Date, // Wt::WDate - OriginalDate, // Wt::WDate + Year, // int + OriginalYear, // int HasCover, // bool AudioStreams, // vector MusicBrainzArtistID, // string diff --git a/src/metadata/TagLibParser.cpp b/src/metadata/TagLibParser.cpp index a5a48be1..ad27e481 100644 --- a/src/metadata/TagLibParser.cpp +++ b/src/metadata/TagLibParser.cpp @@ -156,28 +156,29 @@ TagLibParser::parse(const boost::filesystem::path& p) } else if (tag == "DATE") { - auto timePoint = readAs(values.front().to8Bit()); + auto timePoint = readAs(values.front().to8Bit()); if (timePoint) - items.insert( std::make_pair(MetaData::Type::Date, *timePoint)); + items.insert( std::make_pair(MetaData::Type::Year, *timePoint)); } else if (tag == "ORIGINALDATE") { - auto timePoint = readAs(values.front().to8Bit()); - if (timePoint) + // lower priority than original year + if (items.find(MetaData::Type::OriginalYear) == items.end()) { - // Take priority on original year - items.erase( MetaData::Type::OriginalDate ); - items.insert( std::make_pair(MetaData::Type::OriginalDate, *timePoint)); + auto timePoint = readAs(values.front().to8Bit()); + if (timePoint) + items.insert( std::make_pair(MetaData::Type::OriginalYear, *timePoint)); } } else if (tag == "ORIGINALYEAR") { - // lower priority than original date - if (items.find(MetaData::Type::OriginalDate) == items.end()) + auto timePoint = readAs(values.front().to8Bit()); + if (timePoint) { - auto timePoint = readAs(values.front().to8Bit()); - if (timePoint) - items.insert( std::make_pair(MetaData::Type::OriginalDate, *timePoint)); + // Take priority on original year + items[MetaData::Type::OriginalYear] = *timePoint; +// items.erase( MetaData::Type::OriginalYear ); +// items.insert( std::make_pair(MetaData::Type::OriginalYear, *timePoint)); } } else if (tag == "METADATA_BLOCK_PICTURE") diff --git a/src/scanner/MediaScanner.cpp b/src/scanner/MediaScanner.cpp index 41e0985c..9e3a7d56 100644 --- a/src/scanner/MediaScanner.cpp +++ b/src/scanner/MediaScanner.cpp @@ -570,16 +570,16 @@ MediaScanner::scanAudioFile( const boost::filesystem::path& file, Stats& stats) if ((*items).find(MetaData::Type::TotalDisc) != (*items).end()) track.modify()->setTotalDiscNumber( boost::any_cast((*items)[MetaData::Type::TotalDisc]) ); - if ((*items).find(MetaData::Type::Date) != (*items).end()) - track.modify()->setDate( boost::any_cast((*items)[MetaData::Type::Date]) ); + if ((*items).find(MetaData::Type::Year) != (*items).end()) + track.modify()->setYear( boost::any_cast((*items)[MetaData::Type::Year]) ); - if ((*items).find(MetaData::Type::OriginalDate) != (*items).end()) + if ((*items).find(MetaData::Type::OriginalYear) != (*items).end()) { - track.modify()->setOriginalDate( boost::any_cast((*items)[MetaData::Type::OriginalDate]) ); + track.modify()->setOriginalYear( boost::any_cast((*items)[MetaData::Type::OriginalYear]) ); - // If a file has an OriginalDate but no date, set the date to ease filtering - if ((*items).find(MetaData::Type::Date) == (*items).end()) - track.modify()->setDate( boost::any_cast((*items)[MetaData::Type::OriginalDate]) ); + // If a file has an OriginalYear but no Year, set it o ease filtering + if ((*items).find(MetaData::Type::Year) == (*items).end()) + track.modify()->setYear( boost::any_cast((*items)[MetaData::Type::OriginalYear]) ); } if ((*items).find(MetaData::Type::MusicBrainzRecordingID) != (*items).end()) diff --git a/src/utils/Utils.cpp b/src/utils/Utils.cpp index 07700578..a027b6f8 100644 --- a/src/utils/Utils.cpp +++ b/src/utils/Utils.cpp @@ -23,33 +23,9 @@ #include #include - +#include #include "Utils.hpp" -template<> -boost::optional readAs(const std::string& str) -{ - const std::vector formats = { - "yyyy-MM-dd", - "yyyy/MM/dd", - "yyyy-MM", - "yyyy/MM", - "yyyy" - }; - - for (auto format : formats) - { - auto date = Wt::WDate::fromString(str, format); - - if (!date.isValid()) - continue; - - return date; - } - - return boost::none; -} - bool readList(const std::string& str, const std::string& separators, std::list& results) { std::string curStr; diff --git a/src/utils/Utils.hpp b/src/utils/Utils.hpp index 497eac91..d5ab7d63 100644 --- a/src/utils/Utils.hpp +++ b/src/utils/Utils.hpp @@ -57,7 +57,3 @@ boost::optional readAs(const std::string& str) return res; } -template<> -boost::optional readAs(const std::string& str); - - diff --git a/test/TestAvMetadata.cpp b/test/TestAvMetadata.cpp index 8109a82e..9dc0d4c5 100644 --- a/test/TestAvMetadata.cpp +++ b/test/TestAvMetadata.cpp @@ -86,12 +86,12 @@ int main(int argc, char *argv[]) std::cout << "TotalDisc: " << boost::any_cast(item.second) << std::endl; break; - case MetaData::Type::Date: - std::cout << "Date: " << boost::any_cast(item.second).toString() << std::endl; + case MetaData::Type::Year: + std::cout << "Year: " << std::to_string(boost::any_cast(item.second)) << std::endl; break; - case MetaData::Type::OriginalDate: - std::cout << "Original date: " << boost::any_cast(item.second).toString() << std::endl; + case MetaData::Type::OriginalYear: + std::cout << "Original year: " << std::to_string(boost::any_cast(item.second)) << std::endl; break; case MetaData::Type::HasCover: