diff options
author | Timo Eskola <timo@tolleri.net> | 2018-09-03 11:35:43 +0300 |
---|---|---|
committer | Timo Eskola <timo@tolleri.net> | 2018-09-03 11:35:43 +0300 |
commit | 170e9ab1b4f04303ae7de32a858730dc595ba6fa (patch) | |
tree | c22d30d1a2c32ced822909cf84a0565bd0a1eeca | |
parent | 143c520f9894e777b95a72a65b1261922001c7b0 (diff) | |
download | vdr-plugin-duplicates-170e9ab1b4f04303ae7de32a858730dc595ba6fa.tar.gz vdr-plugin-duplicates-170e9ab1b4f04303ae7de32a858730dc595ba6fa.tar.bz2 |
Added removal of deleted recordings method.
-rw-r--r-- | menu.c | 37 | ||||
-rw-r--r-- | menu.h | 1 | ||||
-rw-r--r-- | recording.c | 22 | ||||
-rw-r--r-- | recording.h | 1 |
4 files changed, 32 insertions, 29 deletions
@@ -247,24 +247,6 @@ void cMenuDuplicates::SetCurrentIndex(int index) { } } -void cMenuDuplicates::Del(int index) { - cOsdMenu::Del(index); - // remove items that have less than 2 duplicates - int d = 0; - for (int i = Count() - 1; i >= 0; i--) { - if (!SelectableItem(i)) { - if (d < 2) { - for (int j = 0; j <= d; j++) { - cOsdMenu::Del(i); - } - } - d = 0; - } else - d++; - } - SetCurrentIndex(index); -} - eOSState cMenuDuplicates::Delete(void) { if (HasSubMenu() || Count() == 0) return osContinue; @@ -297,9 +279,11 @@ eOSState cMenuDuplicates::Delete(void) { cVideoDiskUsage::ForceCheck(); Recordings->SetModified(); recordingsStateKey.Remove(); - Del(Current()); + cStateKey stateKey; + DuplicateRecordings.Lock(stateKey, true); + stateKey.Remove(DuplicateRecordings.RemoveDeleted()); + Set(true); SetHelpKeys(); - Display(); } else { recordingsStateKey.Remove(); Skins.Message(mtError, trVDR("Error while deleting recording!")); @@ -355,14 +339,13 @@ eOSState cMenuDuplicates::ToggleHidden(void) { bool hidden = ri->Visibility().Read() == HIDDEN; if (Interface->Confirm(hidden ? tr("Unhide recording?") : tr("Hide recording?"))) { if (ri->Visibility().Write(hidden)) { - if (dc.hidden) { - ri->Visibility().Set(!hidden); - SetHelpKeys(); - } else { - Del(Current()); - SetHelpKeys(); - Display(); + if (!dc.hidden) { + cStateKey stateKey; + DuplicateRecordings.Lock(stateKey, true); + stateKey.Remove(DuplicateRecordings.RemoveDeleted()); + Set(true); } + SetHelpKeys(); } else Skins.Message(mtError, tr("Error while setting visibility!")); } @@ -30,7 +30,6 @@ private: void SetHelpKeys(void); void Set(bool Refresh = false); void SetCurrentIndex(int index); - void Del(int index); eOSState Play(void); eOSState Setup(void); eOSState Delete(void); diff --git a/recording.c b/recording.c index e670289..05cad27 100644 --- a/recording.c +++ b/recording.c @@ -90,6 +90,24 @@ bool cDuplicateRecording::IsDuplicate(cDuplicateRecording *DuplicateRecording) { cDuplicateRecordings::cDuplicateRecordings(void) : cList("duplicates") {} +bool cDuplicateRecordings::RemoveDeleted(void) { + LOCK_RECORDINGS_READ + int removed = 0; + for (cDuplicateRecording *duplicates = First(); duplicates; duplicates = Next(duplicates)) { + for (cDuplicateRecording *duplicate = duplicates->Duplicates()->First(); duplicate; duplicate = duplicates->Duplicates()->Next(duplicate)) { + const cRecording *recording = Recordings->GetByName(duplicate->FileName().c_str()); + if (!recording || !dc.hidden && duplicate->Visibility().Read() == HIDDEN) { + duplicates->Duplicates()->Del(duplicate); + removed++; + } + } + if (duplicates->Duplicates()->Count() < 2) + Del(duplicates); + } + dsyslog("duplicates: Removed %d deleted recordings.", removed); + return removed > 0; +} + cDuplicateRecordings DuplicateRecordings; // --- cDuplicateRecordingScannerThread ------------------------------------------ @@ -127,6 +145,9 @@ void cDuplicateRecordingScannerThread::Scan(void) { dsyslog("duplicates: Scanning of duplicates started."); struct timeval startTime, stopTime; gettimeofday(&startTime, NULL); + cStateKey duplicateRecordingsStateKey; + DuplicateRecordings.Lock(duplicateRecordingsStateKey, true); + duplicateRecordingsStateKey.Remove(DuplicateRecordings.RemoveDeleted()); cDuplicateRecording *descriptionless = new cDuplicateRecording(); cList<cDuplicateRecording> recordings; cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); // write access is necessary for sorting! @@ -173,7 +194,6 @@ void cDuplicateRecordingScannerThread::Scan(void) { delete descriptionless; if (RecordingsStateChanged()) return; - cStateKey duplicateRecordingsStateKey; DuplicateRecordings.Lock(duplicateRecordingsStateKey, true); DuplicateRecordings.Clear(); for (cDuplicateRecording *duplicate = duplicates.First(); duplicate; duplicate = duplicates.Next(duplicate)) { diff --git a/recording.h b/recording.h index 0a93dfb..1d2ffb2 100644 --- a/recording.h +++ b/recording.h @@ -45,6 +45,7 @@ public: class cDuplicateRecordings : public cList<cDuplicateRecording> { public: cDuplicateRecordings(void); + bool RemoveDeleted(void); }; extern cDuplicateRecordings DuplicateRecordings; |