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