From 6bb67cf13b26bf867cabade29ecd1ca63881beb6 Mon Sep 17 00:00:00 2001 From: Mehdi Sabwat Date: Mon, 8 Nov 2021 10:17:59 +0100 Subject: [PATCH] Media: add isUnseen accessor It will return true if the playCount was set to 0, and if lastPosition is negative which means the media was never played or that it ended (in that case, the playCount won't be equal to 0) Ref. #388 --- include/medialibrary/IMedia.h | 1 + src/Media.cpp | 6 ++++++ src/Media.h | 1 + test/unittest/MediaTests.cpp | 16 +++++++++++++++- 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/medialibrary/IMedia.h b/include/medialibrary/IMedia.h index 05df904c..e0d8c9b2 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 c7a3c2c5..3f697593 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 c91f5d86..a9bd7529 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 389d57fc..aa8e1728 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 ) -- GitLab