Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] Re: .mplayer.resume does not work



On 21 Nov 2004 Tony Houghton <h@realh.co.uk> wrote:

> If it can't save in the same directory as the movie file it should make
> an entry for the file, including its full pathname, in a file especially
> for this purpose in the config dir.

I added the above behaviour. The global file is located in the
video directory.

Please test.

Regards.

-- 
Stefan Huelswitt
s.huelswitt@gmx.de  | http://www.muempf.de/
--- mp3-0.9.8/player-mplayer.c	2004-11-28 15:10:47.000000000 +0100
+++ mp3-unstable/player-mplayer.c	2005-01-08 17:40:59.000000000 +0100
@@ -1,7 +1,7 @@
 /*
  * MP3/MPlayer plugin to VDR (C++)
  *
- * (C) 2001-2004 Stefan Huelswitt <s.huelswitt@gmx.de>
+ * (C) 2001-2005 Stefan Huelswitt <s.huelswitt@gmx.de>
  *
  * This code is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,6 +34,7 @@
 #include <locale.h>
 
 #include <vdr/device.h>
+#include <vdr/videodir.h>
 
 #include "common.h"
 #include "data.h"
@@ -106,11 +107,13 @@
 // --- cMPlayerResume ----------------------------------------------------------
 
 #define RESUME_FILE ".mplayer.resume"
+#define GLOBAL_RESUME_FILE "global.mplayer.resume"
 
 class cMPlayerResume : public cList<cResumeEntry> {
 private:
-  cFileObj *res;
-  bool modified;
+  char *resfile;
+  bool modified, global;
+  cFileObj *resobj;
   //
   bool OpenResume(const cFileObj *file);
   bool SaveResume(void);
@@ -125,13 +128,14 @@
 
 cMPlayerResume::cMPlayerResume(void)
 {
-  res=0;
+  resfile=0; resobj=0;
 }
 
 cMPlayerResume::~cMPlayerResume()
 {
   SaveResume();
-  delete res;
+  free(resfile);
+  delete resobj;
 }
 
 void cMPlayerResume::SetResume(const cFileObj *file, float pos)
@@ -144,7 +148,7 @@
     }
   else {
     re=new cResumeEntry;
-    re->name=strdup(file->Name());
+    re->name=strdup(global ? file->FullPath() : file->Name());
     Add(re);
     d(printf("resume: setting resume %f (new)",pos))
     }
@@ -164,20 +168,31 @@
 
 bool cMPlayerResume::OpenResume(const cFileObj *file)
 {
-  if(!res) {
+  if(!resfile) {
     Clear();
-    modified=false;
-    res=new cFileObj(file);
-    res->SetName(RESUME_FILE);
-    d(printf("resume: resume file is '%s'\n",res->FullPath()))
-    FILE *f=fopen(res->FullPath(),"r");
+    modified=global=false;
+    free(resfile); resfile=0;
+    delete resobj; resobj=new cFileObj(file);
+    char *s;
+    asprintf(&s,file->Subdir() ? "%s/%s":"%s",file->Source()->BaseDir(),file->Subdir());
+    if(access(s,W_OK) && (errno==EACCES || errno==EROFS)) {
+      global=true;
+      resfile=AddPath(VideoDirectory,GLOBAL_RESUME_FILE);
+      d(printf("resume: using global file\n"))
+      }
+    else {
+      resfile=AddPath(s,RESUME_FILE);
+      }
+    free(s);
+    d(printf("resume: resume file is '%s'\n",resfile))
+    FILE *f=fopen(resfile,"r");
     if(f) {
       d(printf("resume: successfully opened resume file\n"))
       char line[768];
       while(fgets(line,sizeof(line),f)) {
         char name[512];
         float p;
-        if(sscanf(line,"/%511[^/]/%f/",name,&p)==2) {
+        if(sscanf(line,"%f:%511s",&p,name)==2) {
           cResumeEntry *re=new cResumeEntry;
           re->name=strdup(name);
           re->pos=p;
@@ -197,13 +212,13 @@
 
 bool cMPlayerResume::SaveResume(void)
 {
-  if(res && modified) {
+  if(resfile && modified) {
     Purge();
     d(printf("resume: saving resume file\n"))
-    cSafeFile f(res->FullPath());
+    cSafeFile f(resfile);
     if(f.Open()) {
       for(cResumeEntry *re=First(); re; re=Next(re))
-        fprintf(f,"/%s/%06.2f/\n",re->name,re->pos);
+        fprintf(f,"%06.2f:%s\n",re->pos,re->name);
       f.Close();
       return true;
       }
@@ -216,16 +231,15 @@
 void cMPlayerResume::Purge(void)
 {
   d(printf("resume: purging from resume file\n"))
-  cFileObj fo(res);
   for(cResumeEntry *re=First(); re;) {
     bool del=false;
     if(re->pos<=0.0 || re->pos>99.0) {
       del=true;
       d(printf("resume: purging due to position: %s\n",re->name))
       }
-    else {
-      fo.SetName(re->name);
-      if(access(fo.FullPath(),F_OK)<0) {
+    else if(!global) {
+      resobj->SetName(re->name);
+      if(access(resobj->FullPath(),F_OK)<0) {
         del=true;
         d(printf("resume: purging due to access: %s\n",re->name))
         }
@@ -243,10 +257,11 @@
 
 cResumeEntry *cMPlayerResume::FindResume(const cFileObj *file)
 {
- if(res) {
+ if(resfile) {
    d(printf("resume: searching resume  position for '%s'\n",file->Name()))
+   const char *s=global ? file->FullPath() : file->Name();
    for(cResumeEntry *re=First(); re; re=Next(re))
-     if(!strcasecmp(re->name,file->Name())) {
+     if(!strcasecmp(re->name,s)) {
        d(printf("resume: found resume position %.1f%%\n",re->pos))
        return re;
        }

Home | Main Index | Thread Index