diff --git a/include/medialibrary/IMedia.h b/include/medialibrary/IMedia.h index 05df904cf7105d7d26c90bbcdf055b9b5b63d237..e0d8c9b2caa537c1f88d6150334109ed11a5729c 100644 --- a/include/medialibrary/IMedia.h +++ b/include/medialibrary/IMedia.h @@ -224,6 +224,7 @@ public: * This method will not bump the media in the history */ virtual bool setPlayCount( uint32_t playCount ) = 0; + virtual bool isUnseen() const = 0; virtual time_t lastPlayedDate() const = 0; /** * @brief markAsPlayed Will mark the media as played and will bump it in the diff --git a/src/Media.cpp b/src/Media.cpp index c7a3c2c5d9e376d337328a9dc96c19ea737d7e89..3f6975934c264e5fea3ab8b7f6189fa91d9cc987 100644 --- a/src/Media.cpp +++ b/src/Media.cpp @@ -323,6 +323,12 @@ uint32_t Media::playCount() const return m_playCount; } +bool Media::isUnseen() const +{ + if ((m_playCount == 0) && (m_lastPosition < 0)) + return true; + return false; +} Media::PositionTypes Media::computePositionType( float position ) const { diff --git a/src/Media.h b/src/Media.h index c91f5d864e52624b3a1a86d7b61714c40c6b7bf4..a9bd7529d635436931820386c95f842c603cfbb1 100644 --- a/src/Media.h +++ b/src/Media.h @@ -191,6 +191,7 @@ class Media : public IMedia, virtual bool removeLabel( LabelPtr label ) override; virtual Query labels() const override; virtual uint32_t playCount() const override; + virtual bool isUnseen() const override; virtual ProgressResult setLastPosition( float lastPosition ) override; virtual ProgressResult setLastTime( int64_t lastTime ) override; virtual bool setPlayCount( uint32_t playCount ) override; diff --git a/test/unittest/MediaTests.cpp b/test/unittest/MediaTests.cpp index 389d57fc63276ce03ddf5f93f155b13236684182..aa8e17288e833cb720e51541776a17ca017ad834 100644 --- a/test/unittest/MediaTests.cpp +++ b/test/unittest/MediaTests.cpp @@ -52,6 +52,7 @@ static void Create( Tests* T ) ASSERT_NE( 0u, m->insertionDate() ); ASSERT_TRUE( m->isDiscoveredMedia() ); ASSERT_TRUE( m->isPresent() ); + ASSERT_TRUE( m->isUnseen() ); auto files = m->files(); ASSERT_EQ( 1u, files.size() ); @@ -127,6 +128,7 @@ static void SetProgress( Tests* T ) ASSERT_EQ( expectedPosition, m1->lastPosition() ); ASSERT_EQ( m1->duration() / 2, m1->lastTime() ); ASSERT_EQ( 0u, m1->playCount() ); + ASSERT_FALSE( m1->isUnseen() ); /* Then update to a progress to 3%. This should reset it to -1 */ @@ -139,6 +141,7 @@ static void SetProgress( Tests* T ) ASSERT_EQ( -1, m1->lastTime() ); ASSERT_EQ( -1.f, m1->lastPosition() ); ASSERT_EQ( 0u, m1->playCount() ); + ASSERT_TRUE( m1->isUnseen() ); /* Then again at 4% and ensure the progress is still -1 */ res = m1->setLastPosition( 0.04 ); @@ -148,6 +151,7 @@ static void SetProgress( Tests* T ) m1 = T->ml->media( m1->id() ); ASSERT_EQ( -1, m1->lastTime() ); ASSERT_EQ( -1.f, m1->lastPosition() ); + ASSERT_TRUE( m1->isUnseen() ); /* * Now set a progress of 99% and check the playcount was bumped, and @@ -162,7 +166,8 @@ static void SetProgress( Tests* T ) ASSERT_EQ( -1, m1->lastTime() ); ASSERT_EQ( -1.f, m1->lastPosition() ); ASSERT_EQ( 1u, m1->playCount() ); - + ASSERT_FALSE( m1->isUnseen() ); + /* Now do the same with a longer media to ensure the "margin" are updated */ expectedPosition = 0.5f; res = m2->setLastPosition( expectedPosition ); @@ -174,6 +179,7 @@ static void SetProgress( Tests* T ) ASSERT_EQ( expectedPosition, m2->lastPosition() ); ASSERT_EQ( m2->duration() / 2, m2->lastTime() ); ASSERT_EQ( 0u, m2->playCount() ); + ASSERT_FALSE( m2->isUnseen() ); /* This media should only ignore the first & last percent */ res = m2->setLastPosition( 0.009f ); @@ -185,6 +191,7 @@ static void SetProgress( Tests* T ) ASSERT_EQ( -1.f, m2->lastPosition() ); ASSERT_EQ( -1, m2->lastTime() ); ASSERT_EQ( 0u, m2->playCount() ); + ASSERT_TRUE( m2->isUnseen() ); /* So check 0.01 is not ignored */ expectedPosition = 0.01f; @@ -200,6 +207,7 @@ static void SetProgress( Tests* T ) ASSERT_TRUE( m2->lastTime() >= 180000 - 1 && m2->lastTime() <= 180000 ); ASSERT_EQ( 0u, m2->playCount() ); + ASSERT_FALSE( m2->isUnseen() ); /* * And finally check that 0.98 is just a regular progress and not the end of @@ -217,6 +225,7 @@ static void SetProgress( Tests* T ) ASSERT_TRUE( m2->lastTime() >= 17640000 - 1 && m2->lastTime() <= 17640000 ); ASSERT_EQ( 0u, m2->playCount() ); + ASSERT_FALSE( m2->isUnseen() ); } static void SetLastPositionNoDuration( Tests* T ) @@ -519,6 +528,7 @@ static void RemoveFromHistory( Tests* T ) ASSERT_EQ( 1u, history.size() ); ASSERT_EQ( m->id(), history[0]->id() ); ASSERT_EQ( 1u, m->playCount() ); + ASSERT_FALSE( m->isUnseen() ); m->removeFromHistory(); @@ -532,6 +542,7 @@ static void RemoveFromHistory( Tests* T ) ASSERT_EQ( 0u, m->playCount() ); ASSERT_EQ( -1.f, m->lastPosition() ); ASSERT_EQ( -1, m->lastTime() ); + ASSERT_TRUE( m->isUnseen() ); } static void SetReleaseDate( Tests* T ) @@ -1172,12 +1183,14 @@ static void SetPlayCount( Tests* T ) { auto m = T->ml->addMedia( "media.avi", IMedia::Type::Video ); ASSERT_EQ( 0u, m->playCount() ); + ASSERT_TRUE( m->isUnseen() ); auto res = m->setPlayCount( 123 ); ASSERT_TRUE( res ); ASSERT_EQ( 123u, m->playCount() ); m = T->ml->media( m->id() ); ASSERT_EQ( 123u, m->playCount() ); + ASSERT_FALSE( m->isUnseen() ); } static void CheckDbModel( Tests* T ) @@ -1324,6 +1337,7 @@ static void FetchInProgress( Tests* T ) ASSERT_EQ( -1.f, m1->lastPosition() ); ASSERT_EQ( -1, m1->lastTime() ); ASSERT_EQ( 1u, m1->playCount() ); + ASSERT_FALSE( m1->isUnseen() ); } static void ConvertToExternal( Tests* T )