summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--HISTORY1
-rw-r--r--mymenurecordings.c75
-rw-r--r--mymenurecordings.h2
-rw-r--r--tools.c55
-rw-r--r--tools.h3
5 files changed, 73 insertions, 63 deletions
diff --git a/HISTORY b/HISTORY
index edd1aea..22be42a 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2,6 +2,7 @@ VDR Plugin 'extrecmenu' Revision History
----------------------------------------
2012-xx-xx: Version 1.2.3
+- [amair] Fix recording list problems with some recording names.
- [amair] Set menu category in VDR >= 1.7.28 (Closes #1110).
- [amair] Close replay OSD before starting cutter so that marks are saved to disk (submitted by mini73 @vdr-portal.de).
- [amair] Always use VDR's cutting feature in VDR >=1.7.32.
diff --git a/mymenurecordings.c b/mymenurecordings.c
index ef1dda5..99e735f 100644
--- a/mymenurecordings.c
+++ b/mymenurecordings.c
@@ -201,8 +201,6 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
title=MALLOC(char,s-p+1);
strn0cpy(title,p,s-p+1);
name=strdup(title);
-
- uniqid=name;
}
else
{
@@ -221,13 +219,6 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
#endif
struct tm *t=localtime_r(&start,&tm_r);
- const char *c = strrchr(filename, '/');
- if (c)
- idbuffer << (c + 1);
- else
- idbuffer << filename;
-
-
// display symbol
buffer=filename;
if (isPesRecording)
@@ -441,16 +432,13 @@ myMenuRecordingsItem::myMenuRecordingsItem(cRecording *Recording,int Level)
if(i!=string::npos)
{
titlebuffer << _s.substr(i+1,_s.length()-i);
- idbuffer << _s.substr(i+1,_s.length()-i);
}
else
{
titlebuffer << _s;
- idbuffer << _s;
}
title=strdup(titlebuffer.str().c_str());
- uniqid=idbuffer.str();
}
else
{
@@ -512,7 +500,6 @@ void myMenuRecordingsItem::SetMenuItem(cSkinDisplayMenu *displaymenu,int index,b
// --- myMenuRecordings -------------------------------------------------------
#define MB_PER_MINUTE 25.75 // this is just an estimate! (taken over from VDR)
-bool myMenuRecordings::golastreplayed=false;
bool myMenuRecordings::wasdvd;
bool myMenuRecordings::washdd;
dev_t myMenuRecordings::fsid=0;
@@ -598,7 +585,7 @@ myMenuRecordings::myMenuRecordings(const char *Base,int Level):cOsdMenu("")
Set();
- if(myReplayControl::LastReplayed())
+ if(mysetup.GoLastReplayed && myReplayControl::LastReplayed())
Open();
Display();
@@ -772,12 +759,12 @@ void myMenuRecordings::SetHelpKeys()
}
// create the menu list
-void myMenuRecordings::Set(bool Refresh,char *_current)
+void myMenuRecordings::Set(bool Refresh)
{
- const char *lastreplayed=_current?_current:myReplayControl::LastReplayed();
+ const char *lastreplayed=myReplayControl::LastReplayed();
cThreadLock RecordingsLock(&Recordings);
- if(Refresh && !_current)
+ if(Refresh)
{
fsid=0;
myMenuRecordingsItem *item=(myMenuRecordingsItem*)Get(Current());
@@ -809,7 +796,6 @@ void myMenuRecordings::Set(bool Refresh,char *_current)
hidepinprotectedrecs=pinplugin->SetupParse("hideProtectedRecordings","1");
#endif
- char *lastitemtext=NULL;
myMenuRecordingsItem *lastitem=NULL;
for(myRecListItem *listitem=list->First();listitem;listitem=list->Next(listitem))
{
@@ -817,47 +803,59 @@ void myMenuRecordings::Set(bool Refresh,char *_current)
if(!base||(strstr(recording->Name(),base)==recording->Name()&&recording->Name()[strlen(base)]=='~'))
{
myMenuRecordingsItem *recitem=new myMenuRecordingsItem(recording,level);
- if(*recitem->UniqID() && (!lastitem || strcmp(recitem->UniqID(),lastitemtext)))
+ myMenuRecordingsItem *lastdir=NULL;
+ if(recitem->IsDirectory())
+ {
+ // Sorting may ignore non-alphanumeric characters, so we need to explicitly handle directories in case they only differ in such characters:
+ for(myMenuRecordingsItem *p=lastitem;p;p=dynamic_cast<myMenuRecordingsItem *>(p->Prev()))
+ {
+ if(p->Name()&&strcmp(p->Name(),recitem->Name())==0)
+ {
+ lastdir=p;
+ break;
+ }
+ }
+ }
+ if(*recitem->Text()&&!lastdir)
{
#ifdef USE_PINPLUGIN
if(!(hidepinprotectedrecs && cStatus::MsgReplayProtected(recording,recitem->Name(),base,recitem->IsDirectory(),true)))
- {
+ {
#endif
Add(recitem);
lastitem=recitem;
- free(lastitemtext);
- lastitemtext=strdup(lastitem->UniqID());
+ if(recitem->IsDirectory())
+ lastdir=recitem;
#ifdef USE_PINPLUGIN
- }
- else
- lastitem=NULL;
+ }
+ else
+ lastitem=NULL;
#endif
}
else
delete recitem;
- if(lastitem)
+ if(lastitem||lastdir)
{
- if(!MoveCutterThread->IsMoving(recording->FileName()))
- lastitem->SetDirIsMoving(false);
+ if(lastitem)
+ {
+ if(!MoveCutterThread->IsMoving(recording->FileName()))
+ lastitem->SetDirIsMoving(false);
+ }
- if(lastitem->IsDirectory())
- lastitem->IncrementCounter(recording->IsNew());
- if(lastreplayed && !strcmp(lastreplayed,recording->FileName()))
+ if(lastreplayed&&strcmp(lastreplayed,recording->FileName())==0)
{
- if(golastreplayed||Refresh)
- {
- SetCurrent(lastitem);
- if(recitem && !recitem->IsDirectory() && !cControl::Control() && !mysetup.GoLastReplayed)
- golastreplayed=false;
- }
+ SetCurrent(lastdir?lastdir:lastitem);
if(recitem&&!recitem->IsDirectory()&&(recitem->IsDVD()||recitem->IsHDD())&&!cControl::Control())
cReplayControl::ClearLastReplayed(cReplayControl::LastReplayed());
}
+
+ if(lastdir){
+ lastdir->IncrementCounter(recording->IsNew());
+ }
}
}
}
- free(lastitemtext);
delete list;
ForceFreeMbUpdate();
@@ -1080,7 +1078,6 @@ eOSState myMenuRecordings::Play()
}
buffer=NULL;
}
- golastreplayed=true;
#if VDRVERSNUM >= 10728
myReplayControl::SetRecording(recording->FileName());
#else
diff --git a/mymenurecordings.h b/mymenurecordings.h
index 2000e44..e05046c 100644
--- a/mymenurecordings.h
+++ b/mymenurecordings.h
@@ -67,7 +67,7 @@ class myMenuRecordings:public cOsdMenu
public:
myMenuRecordings(const char *Base=NULL,int Level=0);
~myMenuRecordings();
- void Set(bool Refresh=false,char *current=NULL);
+ void Set(bool Refresh=false);
virtual eOSState ProcessKey(eKeys Key);
#ifdef USE_GRAPHTFT
virtual const char* MenuKind(){return"MenuExtRecordings";}
diff --git a/tools.c b/tools.c
index 461f8e6..d0614ba 100644
--- a/tools.c
+++ b/tools.c
@@ -195,10 +195,13 @@ myRecListItem::myRecListItem(cRecording *Recording)
{
recording=Recording;
filename=strdup(recording->FileName());
+ sortBufferName = sortBufferTime = NULL;
}
myRecListItem::~myRecListItem()
{
+ free(sortBufferName);
+ free(sortBufferTime);
free(filename);
}
@@ -220,39 +223,45 @@ char *myRecListItem::StripEpisodeName(char *s)
}
t++;
}
- if(mysetup.DescendSorting)
+ if(s1&&s2)
{
- if(SortByName)
- *s1=1;
- else
- *(s2+1)=(char)255;
+ // To have folders sorted before plain recordings, the '/' s1 points to
+ // is replaced by the character '1'. All other slashes will be replaced
+ // by '0' in SortName() (see below), which will result in the desired
+ // sequence:
+ *s1='1';
+ if(!SortByName)
+ {
+ s1++;
+ memmove(s1,s2,t-s2+1);
+ }
}
- else
- *s1=(char)255;
-
- if(s1 && s2 && !SortByName)
- memmove(s1+1,s2,t-s2+1);
-
return s;
}
-int myRecListItem::Compare(const cListObject &ListObject)const
+char *myRecListItem::SortName(void) const
{
- myRecListItem *item=(myRecListItem*)&ListObject;
+ char **sb=SortByName?&sortBufferName:&sortBufferTime;
+ if(!*sb)
+ {
+ char *s=StripEpisodeName(strdup(recording->FileName()+strlen(VideoDirectory)));
+ strreplace(s,'/','0'); // some locales ignore '/' when sorting
+ int l=strxfrm(NULL,s,0)+1;
+ *sb=MALLOC(char,l);
+ strxfrm(*sb,s,l);
+ free(s);
+ }
+ return *sb;
+}
- char *s1=StripEpisodeName(strdup(filename+strlen(VideoDirectory)));
- char *s2=StripEpisodeName(strdup(item->filename+strlen(VideoDirectory)));
+int myRecListItem::Compare(const cListObject &ListObject)const
+{
+ myRecListItem *r=(myRecListItem*)&ListObject;
- int compare;
if(mysetup.DescendSorting)
- compare=strcasecmp(s2,s1);
+ return strcasecmp(r->SortName(),SortName());
else
- compare=strcasecmp(s1,s2);
-
- free(s1);
- free(s2);
-
- return compare;
+ return strcasecmp(SortName(),r->SortName());
}
// --- myRecList --------------------------------------------------------------
diff --git a/tools.h b/tools.h
index 189d312..b075b64 100644
--- a/tools.h
+++ b/tools.h
@@ -33,7 +33,10 @@ class myRecListItem:public cListObject
private:
static bool SortByName;
char *filename;
+ mutable char *sortBufferName;
+ mutable char *sortBufferTime;
static char *StripEpisodeName(char *s);
+ char *SortName(void) const;
public:
myRecListItem(cRecording *Recording);
~myRecListItem();