summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Eskola <timo@tolleri.net>2018-09-03 11:35:43 +0300
committerTimo Eskola <timo@tolleri.net>2018-09-03 11:35:43 +0300
commit170e9ab1b4f04303ae7de32a858730dc595ba6fa (patch)
treec22d30d1a2c32ced822909cf84a0565bd0a1eeca
parent143c520f9894e777b95a72a65b1261922001c7b0 (diff)
downloadvdr-plugin-duplicates-170e9ab1b4f04303ae7de32a858730dc595ba6fa.tar.gz
vdr-plugin-duplicates-170e9ab1b4f04303ae7de32a858730dc595ba6fa.tar.bz2
Added removal of deleted recordings method.
-rw-r--r--menu.c37
-rw-r--r--menu.h1
-rw-r--r--recording.c22
-rw-r--r--recording.h1
4 files changed, 32 insertions, 29 deletions
diff --git a/menu.c b/menu.c
index 392e1cb..d584994 100644
--- a/menu.c
+++ b/menu.c
@@ -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!"));
}
diff --git a/menu.h b/menu.h
index ac43d9b..9d24481 100644
--- a/menu.h
+++ b/menu.h
@@ -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;