summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pages/Makefile2
-rw-r--r--pages/edit_recording.ecpp162
-rw-r--r--pages/edit_user.ecpp6
-rw-r--r--pages/recordings.ecpp34
-rw-r--r--po/ca_ES.po48
-rw-r--r--po/cs_CZ.po48
-rw-r--r--po/da_DK.po48
-rw-r--r--po/de_DE.po49
-rw-r--r--po/el_GR.po48
-rw-r--r--po/es_ES.po48
-rw-r--r--po/et_EE.po48
-rw-r--r--po/fi_FI.po48
-rw-r--r--po/fr_FR.po48
-rw-r--r--po/hr_HR.po48
-rw-r--r--po/hu_HU.po48
-rw-r--r--po/it_IT.po48
-rw-r--r--po/lt_LT.po48
-rw-r--r--po/nl_NL.po48
-rw-r--r--po/nn_NO.po48
-rw-r--r--po/pl_PL.po48
-rw-r--r--po/pt_PT.po48
-rw-r--r--po/ro_RO.po48
-rw-r--r--po/ru_RU.po48
-rw-r--r--po/sl_SI.po48
-rw-r--r--po/sv_SE.po48
-rw-r--r--po/tr_TR.po48
-rw-r--r--recman.cpp144
-rw-r--r--recman.h73
-rw-r--r--tools.cpp169
-rw-r--r--tools.h6
-rw-r--r--users.h3
31 files changed, 1380 insertions, 276 deletions
diff --git a/pages/Makefile b/pages/Makefile
index c70ecb6..f4f1583 100644
--- a/pages/Makefile
+++ b/pages/Makefile
@@ -20,7 +20,7 @@ OBJS = menu.o recordings.o schedule.o multischedule.o screenshot.o \
searchepg.o login.o ibox.o xmlresponse.o play_recording.o \
pause_recording.o stop_recording.o ffw_recording.o \
rwd_recording.o setup.o content.o epginfo.o timerconflicts.o \
- recstream.o users.o edit_user.o
+ recstream.o users.o edit_user.o edit_recording.o
### Default rules:
diff --git a/pages/edit_recording.ecpp b/pages/edit_recording.ecpp
new file mode 100644
index 0000000..a6862ba
--- /dev/null
+++ b/pages/edit_recording.ecpp
@@ -0,0 +1,162 @@
+<%pre>
+#include <vdr/recording.h>
+#include <vdr/config.h>
+#include <vdr/i18n.h>
+#include "exception.h"
+#include "tools.h"
+#include "epg_events.h"
+#include "recman.h"
+#include "setup.h"
+#include "i18n.h"
+#include "livefeatures.h"
+#include "users.h"
+
+using namespace std;
+using namespace vdrlive;
+
+</%pre>
+<%args>
+ // input parameters
+ string recid;
+ string async;
+ // form parameters
+ string name = "";
+ string directory = "";
+ string deletions[];
+</%args>
+<%session scope="global">
+bool logged_in(false);
+string edit_rec_referer;
+</%session>
+<%request scope="page">
+const cRecording* recording;
+</%request>
+<%include>page_init.eh</%include>
+<%cpp>
+ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html");
+
+ if (!cUser::CurrentUserHasRightTo(UR_EDITRECS))
+ throw HtmlError( tr("Sorry, no permission. Please contact your administrator!") );
+
+ bool ajaxReq = !async.empty() && (lexical_cast<int>(async) != 0);
+
+ string message;
+
+ recording = NULL;
+ if (!recid.empty()) {
+ recording = LiveRecordingsManager()->GetByMd5Hash(recid);
+ if (!recording)
+ throw HtmlError(tr("Couldn't find recording. Maybe you mistyped your request?"));
+ }
+
+ if (request.getMethod() == "POST") {
+ if (name.empty())
+ message = tr("Please set a name for the recording!");
+ else if (recording) {
+ for (deletions_type::const_iterator it = deletions.begin(); it != deletions.end(); ++it) {
+ if (*it == "resume")
+ LiveRecordingsManager()->DeleteResume(recording);
+ else if (*it == "marks")
+ LiveRecordingsManager()->DeleteMarks(recording);
+ }
+ deletions.clear();
+ string filename = directory.empty() ? name : StringReplace(directory, "/", "~") + "~" + name;
+ if (LiveRecordingsManager()->RenameRecording(recording, FileSystemExchangeChars(filename, true)))
+ return reply.redirect(!edit_rec_referer.empty() ? edit_rec_referer : "recordings.html");
+ else
+ message = tr("Cannot rename or move the recording.");
+ }
+ }
+
+ if (message.empty())
+ edit_rec_referer = request.getHeader("Referer:", "recordings.html");
+
+ if (recording) {
+ string path = recording->Name();
+ size_t found = path.find_last_of("~");
+
+ if (found != string::npos) {
+ directory = StringReplace(path.substr(0, found), "~", "/");
+ name = path.substr(found + 1);
+ }
+ else {
+ directory = "";
+ name = path;
+ }
+ }
+</%cpp>
+<& pageelems.doc_type &>
+<html>
+ <head>
+ <title>VDR Live - <$ tr("Edit recording") $></title>
+<%cpp>
+ if (!ajaxReq) {
+</%cpp>
+ <& pageelems.stylesheets &>
+ <& pageelems.ajax_js &>
+<%cpp>
+ }
+</%cpp>
+ </head>
+ <body>
+<%cpp>
+ if (!ajaxReq) {
+</%cpp>
+ <& pageelems.logo &>
+ <& menu active=("recordings") &>
+<%cpp>
+ }
+</%cpp>
+ <div class="inhalt">
+ <form method="post" name="edit_recording" id="<$ recid $>" action="edit_recording.ecpp">
+ <input type="hidden" name="recid" value="<$ recid $>"/>
+ <table class="formular" cellpadding="0" cellspacing="0">
+ <tr class="head">
+ <td class="toprow leftcol rightcol" colspan="2"><div class="boxheader"><div><div class="caption"><$ tr("Edit recording") $></div></div></div></td>
+ </tr>
+ <tr>
+ <td class="label leftcol"><div class="withmargin"><$ tr("Name") $>:</div></td>
+ <td class="rightcol"><input type="text" name="name" value="<$ name $>" size="80"/></td>
+ </tr>
+ <tr>
+ <td class="label leftcol"><div class="withmargin"><$ tr("Directory") $>:</div></td>
+ <td class="rightcol">
+ <select name="directory" size="1" id="directory" style="margin-top: 5px">
+<%cpp>
+ DirectoryListPtr dirList(LiveRecordingsManager()->GetDirectoryList());
+ DirectoryList::DirVecType::const_iterator dir;
+
+ for (dir = dirList->begin(); dir != dirList->end(); ++dir) {
+</%cpp>
+ <option value="<$ *dir $>"<$ (*dir == directory) ? "selected=\"selected\"" : "" $>><$ *dir $></option>
+<%cpp>
+ }
+</%cpp>
+ </select>
+ </td>
+ </tr>
+ <tr>
+ <td class="label leftcol"><div class="withmargin"><$ tr("Delete resume information") $>:</div></td>
+ <td class="rightcol"><input type="checkbox" name="deletions" value="resume"/></td>
+ </tr>
+ <tr>
+ <td class="label leftcol"><div class="withmargin"><$ tr("Delete marks information") $>:</div></td>
+ <td class="rightcol"><input type="checkbox" name="deletions" value="marks"/></td>
+ </tr>
+ <tr>
+ <td class="buttonpanel leftcol rightcol bottomrow" colspan="2">
+ <div class="withmargin">
+ <button class="green" type="submit"><$ tr("Save") $></button>
+ <button class="red" type="button" onclick="history.back()"><$ tr("Cancel") $></button>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <div style="color: red; margin: 0 auto;">
+ <$ message $>
+ </div>
+ </div>
+ </body>
+</html>
+<%include>page_exit.eh</%include>
diff --git a/pages/edit_user.ecpp b/pages/edit_user.ecpp
index 2ae510a..e1d977c 100644
--- a/pages/edit_user.ecpp
+++ b/pages/edit_user.ecpp
@@ -24,6 +24,7 @@ using namespace vdrlive;
bool ur_switchchnl = false;
bool ur_addstimers = false;
bool ur_delstimers = false;
+ bool ur_editrecs = false;
</%args>
<%session scope="global">
bool logged_in(false);
@@ -65,6 +66,7 @@ cUser* editUser;
if (ur_switchchnl) editUser->SetRight(UR_SWITCHCHNL);
if (ur_addstimers) editUser->SetRight(UR_EDITSTIMERS);
if (ur_delstimers) editUser->SetRight(UR_DELSTIMERS);
+ if (ur_editrecs) editUser->SetRight(UR_EDITRECS);
Users.Save();
@@ -89,6 +91,7 @@ cUser* editUser;
ur_switchchnl = User->HasRightTo(UR_SWITCHCHNL);
ur_addstimers = User->HasRightTo(UR_EDITSTIMERS);
ur_delstimers = User->HasRightTo(UR_DELSTIMERS);
+ ur_editrecs = User->HasRightTo(UR_EDITRECS);
editUser = User;
}
else
@@ -102,6 +105,7 @@ cUser* editUser;
ur_switchchnl = true;
ur_addstimers = true;
ur_delstimers = true;
+ ur_editrecs = true;
}
</%cpp>
<& pageelems.doc_type &>
@@ -158,6 +162,8 @@ cUser* editUser;
<%cpp>
}
</%cpp>
+ <input type="checkbox" name="ur_editrecs" value="1" <{ CHECKIF(ur_editrecs) }> />
+ <label for="ur_editrecs"><$ tr("Edit recordings") $></label><br>
</td>
</tr>
<tr>
diff --git a/pages/recordings.ecpp b/pages/recordings.ecpp
index b5272b9..b6630d1 100644
--- a/pages/recordings.ecpp
+++ b/pages/recordings.ecpp
@@ -24,6 +24,7 @@ using namespace std;
<%args>
string todel;
string diskinfo;
+ string deletions[];
</%args>
<%session scope="global">
bool logged_in(false);
@@ -37,14 +38,20 @@ if (!logged_in && LiveSetup().UseAuth()) return reply.redirect("login.html");
pageTitle = tr("Recordings");
+deleteResult = "";
if (!todel.empty()) {
- RemoveRecordingTask task(todel);
+ deletions.push_back(todel);
+}
+for (deletions_type::const_iterator it = deletions.begin(); it != deletions.end(); ++it) {
+ RemoveRecordingTask task(*it);
LiveTaskManager().Execute(task);
if (!task.Result())
- deleteResult = string() + tr("ERROR:") + " " + task.Error();
+ deleteResult += string() + tr("ERROR:") + " " + task.Error() + "<br/>";
else
- deleteResult = string() + tr("Deleted recording:") + " " + StringReplace(task.RecName(), "~", "/");
+ deleteResult += string() + tr("Deleted recording:") + " " + StringReplace(task.RecName(), "~", "/") + "<br/>";
}
+deletions.clear();
+
int FreeMB, UsedMB;
int Percent = VideoDiskSpace(&FreeMB, &UsedMB);
int Minutes = int(double(FreeMB) / MB_PER_MINUTE);
@@ -82,11 +89,14 @@ if (! deleteResult.empty()) {
<%cpp>
} else {
</%cpp>
+ <form method="post" name="recordings" action="recordings.ecpp">
<div class="recordings">
<ul class="recordingslist" style="display: block;">
<& recordings.recordings_item &>
</ul>
</div>
+ <div class="withmargin"><button class="red" type="submit"><$ tr("Delete selected") $></button></div>
+ </form>
<%cpp>
}
</%cpp>
@@ -165,6 +175,16 @@ for (iter = recordingsTree->begin(path); iter != end; ++iter) {
<# ---------------------------------------------------------------------- #>
+<%def edit_rec>
+<%args>
+ string id;
+</%args>
+<%cpp> { </%cpp><a href="edit_recording.html?recid=<$ id $>"><img src="<$ LiveSetup().GetThemedLink("img", "edit.png") $>" alt="" <& tooltip.hint text=(tr("Edit recording")) &> /></a><%cpp> } </%cpp>
+</%def>
+
+<# ---------------------------------------------------------------------- #>
+
+
<%def rec_tools>
<%args>
string id;
@@ -173,6 +193,7 @@ for (iter = recordingsTree->begin(path); iter != end; ++iter) {
<& pageelems.ajax_action_href action="play_recording" param=(id) tip=(tr("play this recording.")) image="play.png" alt="" &>
<& pageelems.vlc_stream_recording recid=(id) &>
<& pageelems.imdb_info_href title=(title) &>
+<& recordings.edit_rec id=(id) &>
<& recordings.del_rec id=(id) &>
</%def>
@@ -226,7 +247,7 @@ for (iter = recordingsTree->begin(path); iter != end; ++iter) {
char const * recFormatStr( tr("%a %x %X") );
</%cpp>
<div class="recording_item">
- <div class="recording_imgs"><%cpp> reply.out() << StringRepeat(level + 1, "<img src=\"img/transparent.png\" alt=\"\" width=\"16px\" height=\"16px\" />"); </%cpp><%cpp> if (!archived.empty()) { </%cpp><img src="<$ LiveSetup().GetThemedLink("img", "on_dvd.png") $>" alt="on_dvd" <& tooltip.hint text=(archived) &> /><%cpp> } else { </%cpp><img src="<$ LiveSetup().GetThemedLink("img", "movie.png") $>" alt="movie" /><%cpp> } </%cpp></div>
+ <div class="recording_imgs"><%cpp> reply.out() << StringRepeat(level + 1, "<img src=\"img/transparent.png\" alt=\"\" width=\"16px\" height=\"16px\" />"); </%cpp><%cpp> if (!archived.empty()) { </%cpp><img src="<$ LiveSetup().GetThemedLink("img", "on_dvd.png") $>" alt="on_dvd" <& tooltip.hint text=(archived) &> /><%cpp> } else { </%cpp><input type="checkbox" name="deletions" value="<$ id $>" /><%cpp> } </%cpp></div>
<div class="recording_spec">
<div class="recording_day"><$ FormatDateTime(recFormatStr, startTime) $></div>
<div class="recording_duration"><$ duration $></div>
@@ -246,9 +267,6 @@ for (iter = recordingsTree->begin(path); iter != end; ++iter) {
<%cpp>
}
</%cpp>
- <!-- not supported yet ...
- <img src="<$ LiveSetup().GetThemedLink("img", "edit.png") $>" alt="" />
- -->
</div>
<%cpp>
if (! archived.empty()) {
@@ -263,5 +281,5 @@ for (iter = recordingsTree->begin(path); iter != end; ++iter) {
<# ---------------------------------------------------------------------- #>
<%def delete_error>
-<%cpp> { </%cpp><$ deleteResult $><%cpp> } </%cpp>
+<%cpp> { reply.out() << deleteResult; } </%cpp>
</%def>
diff --git a/po/ca_ES.po b/po/ca_ES.po
index 3833a40..40d3f67 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
@@ -132,6 +132,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -301,9 +331,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -355,12 +382,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -388,9 +409,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -424,6 +442,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -676,6 +697,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
index 0df69ad..c4d7d07 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/da_DK.po b/po/da_DK.po
index eda9629..12476c5 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/de_DE.po b/po/de_DE.po
index 3bd2c24..22f91be 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
@@ -132,6 +132,36 @@ msgstr "Zugriff auf die Kanäle wurde verweigert. Bitte später versuchen."
msgid "Sorry, no permission. Please contact your administrator!"
msgstr "Leider nicht erlaubt. Bitte kontaktieren Sie Ihren Administrator!"
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr "Name"
+
+msgid "Directory"
+msgstr "Verzeichnis"
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr "Speichern"
+
+msgid "Cancel"
+msgstr "Abbrechen"
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr "Keinen Suchtimer gefunden. Möglicherweise ein Tippfehler in der Anfrage?"
@@ -301,9 +331,6 @@ msgstr "Nur umschalten"
msgid "Series recording"
msgstr "Serienaufnahme"
-msgid "Directory"
-msgstr "Verzeichnis"
-
msgid "Delete recordings after ... days"
msgstr "Aufn. nach ... Tagen löschen"
@@ -355,12 +382,6 @@ msgstr "Umschalten ... Minuten vor Start"
msgid "Test"
msgstr "Testen"
-msgid "Save"
-msgstr "Speichern"
-
-msgid "Cancel"
-msgstr "Abbrechen"
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr "Konnte Timer nicht finden. Evtl. fehlerhafte Anforderung?"
@@ -388,9 +409,6 @@ msgstr "Benutzer bearbeiten"
msgid "New user"
msgstr "Neuen Benutzer anlegen"
-msgid "Name"
-msgstr "Name"
-
msgid "Password"
msgstr "Passwort"
@@ -424,6 +442,9 @@ msgstr "Suchtimer hinzufügen oder ändern"
msgid "Delete search timers"
msgstr "Suchtimer löschen"
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr "Elektronische Programminformation"
@@ -676,6 +697,9 @@ msgstr "Liste der Aufnahmen"
msgid "No recordings found"
msgstr "Keine Aufnahmen vorhanden"
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr "Diese Aufnahme von der Festplatte löschen!"
@@ -891,4 +915,3 @@ msgstr ""
msgid "No EPG information available"
msgstr "Keine EPG Daten vorhanden"
-
diff --git a/po/el_GR.po b/po/el_GR.po
index 948cace..73f2bbf 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/es_ES.po b/po/es_ES.po
index 8c94267..ca5e239 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/et_EE.po b/po/et_EE.po
index 8969d1e..2d72264 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/fi_FI.po b/po/fi_FI.po
index c3ec1e7..8da804a 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
@@ -130,6 +130,36 @@ msgstr "Kanavien käyttäminen epäonnistui! Yritä myöhemmin uudelleen."
msgid "Sorry, no permission. Please contact your administrator!"
msgstr "Ei käyttöoikeutta. Ota yhteyttä ylläpitäjään!"
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr "Tallennetta ei löydy. Kirjoititko varmasti oikein?"
+
+msgid "Please set a name for the recording!"
+msgstr "Aseta nimi tallenteelle!"
+
+msgid "Cannot rename or move the recording."
+msgstr "Tallenteen uudelleen nimeäminen tai siirto epäonnistui!"
+
+msgid "Edit recording"
+msgstr "Muokkaa tallennetta"
+
+msgid "Name"
+msgstr "Nimi"
+
+msgid "Directory"
+msgstr "Hakemisto"
+
+msgid "Delete resume information"
+msgstr "Poista paluutiedot"
+
+msgid "Delete marks information"
+msgstr "Poista merkinnät"
+
+msgid "Save"
+msgstr "Tallenna"
+
+msgid "Cancel"
+msgstr "Peru"
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr "Hakuajastimia ei löydetä! Onko pyyntö oikein kirjoitettu?"
@@ -299,9 +329,6 @@ msgstr "Kanavanvaihto"
msgid "Series recording"
msgstr "Sarjatallennus"
-msgid "Directory"
-msgstr "Hakemisto"
-
msgid "Delete recordings after ... days"
msgstr "Poista tallenteet ... päivän jälkeen"
@@ -353,12 +380,6 @@ msgstr "Vaihda ... minuuttia ennen alkua"
msgid "Test"
msgstr "Testaa"
-msgid "Save"
-msgstr "Tallenna"
-
-msgid "Cancel"
-msgstr "Peru"
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr "Ajastinta ei löydy. Kirjoititko varmasti oikein?"
@@ -386,9 +407,6 @@ msgstr "Muokkaa käyttäjää"
msgid "New user"
msgstr "Luo uusi käyttäjä"
-msgid "Name"
-msgstr "Nimi"
-
msgid "Password"
msgstr "Salasana"
@@ -422,6 +440,9 @@ msgstr "Lisää/muokkaa hakuajastimia"
msgid "Delete search timers"
msgstr "Poista hakuajastimia"
+msgid "Edit recordings"
+msgstr "Muokkaa tallenteita"
+
msgid "Electronic program guide information"
msgstr "Ohjelmaoppaan tiedot"
@@ -674,6 +695,9 @@ msgstr "Tallennelistaus"
msgid "No recordings found"
msgstr "Tallenteita ei löydy"
+msgid "Delete selected"
+msgstr "Poista valitut"
+
msgid "Delete this recording from hard disc!"
msgstr "Poista tallenne kovalevyltä!"
diff --git a/po/fr_FR.po b/po/fr_FR.po
index e875bd5..82f3e08 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
@@ -136,6 +136,36 @@ msgstr "Impossible d'avoir accès à des chaînes, réessayer ultérieurement."
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr "Dossier"
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr "Sauvegarde"
+
+msgid "Cancel"
+msgstr "Interrompre"
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr "Impossible de trouver la programmation de recherche. Peut-être que votre demande de fautes de frappe?"
@@ -305,9 +335,6 @@ msgstr "Seulement changer de chaine"
msgid "Series recording"
msgstr "Enregistrement de série"
-msgid "Directory"
-msgstr "Dossier"
-
msgid "Delete recordings after ... days"
msgstr "Effacer l'enregistrement après ... jours"
@@ -359,12 +386,6 @@ msgstr "Changer ... minutes avant le début"
msgid "Test"
msgstr "Tester"
-msgid "Save"
-msgstr "Sauvegarde"
-
-msgid "Cancel"
-msgstr "Interrompre"
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr "N'a pas pu trouver la programmation. Peut-être vous avez une erreur dans votre requête?"
@@ -395,9 +416,6 @@ msgstr "Editer la programmation"
msgid "New user"
msgstr "Nouvelle programmation"
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr "Mot de passe"
@@ -441,6 +459,9 @@ msgstr "Editer l'expression de recherche"
msgid "Delete search timers"
msgstr "Effacer la programmation de recherche"
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr "Guide électronique d'information des programmes EPG"
@@ -695,6 +716,9 @@ msgstr "Liste des enregistrements"
msgid "No recordings found"
msgstr "Pas d'enregistrement"
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/hr_HR.po b/po/hr_HR.po
index 394579d..c3446b9 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/hu_HU.po b/po/hu_HU.po
index 9e22a49..a04971c 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/it_IT.po b/po/it_IT.po
index a3623e5..f9b098c 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
@@ -136,6 +136,36 @@ msgstr "Impossibile avere accesso ai canali, riprova più tardi."
msgid "Sorry, no permission. Please contact your administrator!"
msgstr "Spiacenti, senza permessi. Per favore contatta l'amministratore!"
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr "Nome"
+
+msgid "Directory"
+msgstr "Directory"
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr "Salva"
+
+msgid "Cancel"
+msgstr "Annulla"
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr "Impossibile trovare timer ricerca. Hai digitato correttamente la richiesta?"
@@ -305,9 +335,6 @@ msgstr "Cambia soltanto"
msgid "Series recording"
msgstr "Registrazione serie"
-msgid "Directory"
-msgstr "Directory"
-
msgid "Delete recordings after ... days"
msgstr "Elimina registrazioni dopo ... giorni"
@@ -359,12 +386,6 @@ msgstr "Cambia ... minuti prima dell'inizio"
msgid "Test"
msgstr "Prova"
-msgid "Save"
-msgstr "Salva"
-
-msgid "Cancel"
-msgstr "Annulla"
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr "Impossibile trovare timer. Hai digitato correttamente la richiesta?"
@@ -392,9 +413,6 @@ msgstr "Modifica utente"
msgid "New user"
msgstr "Nuovo utente"
-msgid "Name"
-msgstr "Nome"
-
msgid "Password"
msgstr "Password"
@@ -428,6 +446,9 @@ msgstr "Aggiungi o modifica timer di ricerca"
msgid "Delete search timers"
msgstr "Elimina timer di ricerca"
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr "Info Guida Elettronica Programmi (EPG)"
@@ -680,6 +701,9 @@ msgstr "Elenco registrazioni"
msgid "No recordings found"
msgstr "Nessuna registrazione trovata"
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr "Elimina questa registrazione dal disco fisso!"
diff --git a/po/lt_LT.po b/po/lt_LT.po
index 37363f3..377e0ee 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
@@ -131,6 +131,36 @@ msgstr "Neprieina prie kanalų, pabandykit vėliau."
msgid "Sorry, no permission. Please contact your administrator!"
msgstr "Atleiskit, bet jūs neturite užtektinai teisių. Susisiekite su sistemos administratoriumi!"
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr "Vardas"
+
+msgid "Directory"
+msgstr "Katalogas"
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr "IÅ¡saugoti"
+
+msgid "Cancel"
+msgstr "Atmesti"
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr "Nerandamas paieškos laikmatis. Gal pateikėte netikslią užklausą?"
@@ -300,9 +330,6 @@ msgstr "Tik pereina"
msgid "Series recording"
msgstr "Įrašai"
-msgid "Directory"
-msgstr "Katalogas"
-
msgid "Delete recordings after ... days"
msgstr "Ištrinti įrašus po ... dienų"
@@ -354,12 +381,6 @@ msgstr "Ä®jungti ... minutÄ—mis anksÄiau prieÅ¡ pradedant įraÅ¡Ä…"
msgid "Test"
msgstr "Pabandyti"
-msgid "Save"
-msgstr "IÅ¡saugoti"
-
-msgid "Cancel"
-msgstr "Atmesti"
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr "Toks laikmatis nerastas. Gal įvedėte klaidingą paieškos frazę?"
@@ -387,9 +408,6 @@ msgstr "Koreguoti vartotojÄ…"
msgid "New user"
msgstr "Naujas vartotojas"
-msgid "Name"
-msgstr "Vardas"
-
msgid "Password"
msgstr "Slapyvardis"
@@ -423,6 +441,9 @@ msgstr "PridÄ—ti arba koreguoti paieÅ¡kos laikmaÄius"
msgid "Delete search timers"
msgstr "IÅ¡trinti paieÅ¡kos laikmaÄius"
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr "Elektroninis programų gidas"
@@ -675,6 +696,9 @@ msgstr "Įrašų sąrašas"
msgid "No recordings found"
msgstr "Įrašų nėra"
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr "Ištrinti šį įrašą iš disko!"
diff --git a/po/nl_NL.po b/po/nl_NL.po
index af1b1f3..9257518 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
@@ -136,6 +136,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr "Directory"
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -305,9 +335,6 @@ msgstr ""
msgid "Series recording"
msgstr "Serie's opnemen"
-msgid "Directory"
-msgstr "Directory"
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -359,12 +386,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -393,9 +414,6 @@ msgstr "Serie's opnemen"
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -438,6 +456,9 @@ msgstr "Gebruik als zoek timer"
msgid "Delete search timers"
msgstr "Serie's opnemen"
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -691,6 +712,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/nn_NO.po b/po/nn_NO.po
index 6bd33ed..be3fe5e 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/pl_PL.po b/po/pl_PL.po
index 507e3c9..aae24b7 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/pt_PT.po b/po/pt_PT.po
index e45a915..4d23aca 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/ro_RO.po b/po/ro_RO.po
index deb06e4..be02c5c 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/ru_RU.po b/po/ru_RU.po
index 8fe10cf..a32c64a 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
@@ -130,6 +130,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -299,9 +329,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -353,12 +380,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -386,9 +407,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -422,6 +440,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -674,6 +695,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/sl_SI.po b/po/sl_SI.po
index 8428983..01f8687 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/sv_SE.po b/po/sv_SE.po
index e57739e..14d3ac1 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/po/tr_TR.po b/po/tr_TR.po
index fd49593..a13eef9 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
@@ -131,6 +131,36 @@ msgstr ""
msgid "Sorry, no permission. Please contact your administrator!"
msgstr ""
+msgid "Couldn't find recording. Maybe you mistyped your request?"
+msgstr ""
+
+msgid "Please set a name for the recording!"
+msgstr ""
+
+msgid "Cannot rename or move the recording."
+msgstr ""
+
+msgid "Edit recording"
+msgstr ""
+
+msgid "Name"
+msgstr ""
+
+msgid "Directory"
+msgstr ""
+
+msgid "Delete resume information"
+msgstr ""
+
+msgid "Delete marks information"
+msgstr ""
+
+msgid "Save"
+msgstr ""
+
+msgid "Cancel"
+msgstr ""
+
msgid "Couldn't find searchtimer. Maybe you mistyped your request?"
msgstr ""
@@ -300,9 +330,6 @@ msgstr ""
msgid "Series recording"
msgstr ""
-msgid "Directory"
-msgstr ""
-
msgid "Delete recordings after ... days"
msgstr ""
@@ -354,12 +381,6 @@ msgstr ""
msgid "Test"
msgstr ""
-msgid "Save"
-msgstr ""
-
-msgid "Cancel"
-msgstr ""
-
msgid "Couldn't find timer. Maybe you mistyped your request?"
msgstr ""
@@ -387,9 +408,6 @@ msgstr ""
msgid "New user"
msgstr ""
-msgid "Name"
-msgstr ""
-
msgid "Password"
msgstr ""
@@ -423,6 +441,9 @@ msgstr ""
msgid "Delete search timers"
msgstr ""
+msgid "Edit recordings"
+msgstr ""
+
msgid "Electronic program guide information"
msgstr ""
@@ -675,6 +696,9 @@ msgstr ""
msgid "No recordings found"
msgstr ""
+msgid "Delete selected"
+msgstr ""
+
msgid "Delete this recording from hard disc!"
msgstr ""
diff --git a/recman.cpp b/recman.cpp
index 1f6f40f..db2d5fc 100644
--- a/recman.cpp
+++ b/recman.cpp
@@ -25,6 +25,7 @@ namespace vdrlive {
weak_ptr< RecordingsManager > RecordingsManager::m_recMan;
shared_ptr< RecordingsTree > RecordingsManager::m_recTree;
shared_ptr< RecordingsList > RecordingsManager::m_recList;
+ shared_ptr< DirectoryList > RecordingsManager::m_recDirs;
int RecordingsManager::m_recordingsState = 0;
// The RecordingsManager holds a VDR lock on the
@@ -75,6 +76,15 @@ namespace vdrlive {
return RecordingsListPtr(recMan, shared_ptr< RecordingsList >(new RecordingsList(m_recList, ascending)));
}
+ DirectoryListPtr RecordingsManager::GetDirectoryList() const
+ {
+ RecordingsManagerPtr recMan = EnsureValidData();
+ if (!recMan) {
+ return DirectoryListPtr(recMan, shared_ptr< DirectoryList >());
+ }
+ return DirectoryListPtr(recMan, m_recDirs);
+ }
+
string RecordingsManager::Md5Hash(cRecording const * recording) const
{
return "recording_" + MD5Hash(recording->FileName());
@@ -91,6 +101,60 @@ namespace vdrlive {
return 0;
}
+ bool RecordingsManager::RenameRecording(cRecording const * recording, string const & name) const
+ {
+ if (!recording)
+ return false;
+
+ string oldname = recording->FileName();
+ size_t found = oldname.find_last_of("/");
+
+ if (found == string::npos)
+ return false;
+
+ string newname = string(VideoDirectory) + "/" + name + oldname.substr(found);
+
+ if (!MoveDirectory(oldname.c_str(), newname.c_str())) {
+ esyslog("[LIVE]: renaming failed from '%s' to '%s'", oldname.c_str(), newname.c_str());
+ return false;
+ }
+
+ Recordings.DelByName(oldname.c_str());
+ Recordings.AddByName(newname.c_str());
+ cRecordingUserCommand::InvokeCommand(*cString::sprintf("rename \"%s\"", *strescape(oldname.c_str(), "\\\"$'")), newname.c_str());
+
+ return true;
+ }
+
+ void RecordingsManager::DeleteResume(cRecording const * recording) const
+ {
+ if (!recording)
+ return;
+
+ //dsyslog("[LIVE]: deleting resume '%s'", recording->Name());
+ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording());
+ ResumeFile.Delete();
+ }
+
+ void RecordingsManager::DeleteMarks(cRecording const * recording) const
+ {
+ if (!recording)
+ return;
+
+ //dsyslog("[LIVE]: deleting marks '%s'", recording->Name());
+ cMarks marks;
+ marks.Load(recording->FileName());
+ if (marks.Count()) {
+ cMark *mark = marks.First();
+ while (mark) {
+ cMark *nextmark = marks.Next(mark);
+ marks.Del(mark);
+ mark = nextmark;
+ }
+ marks.Save();
+ }
+ }
+
void RecordingsManager::DeleteRecording(cRecording const * recording) const
{
if (!recording)
@@ -184,10 +248,11 @@ namespace vdrlive {
// StateChanged must be executed every time, so not part of
// the short cut evaluation in the if statement below.
bool stateChanged = Recordings.StateChanged(m_recordingsState);
- if (stateChanged || (!m_recTree) || (!m_recList)) {
+ if (stateChanged || (!m_recTree) || (!m_recList) || (!m_recDirs)) {
if (stateChanged) {
m_recTree.reset();
m_recList.reset();
+ m_recDirs.reset();
}
if (stateChanged || !m_recTree) {
m_recTree = shared_ptr< RecordingsTree >(new RecordingsTree(recMan));
@@ -203,6 +268,14 @@ namespace vdrlive {
esyslog("[LIVE]: creation of recordings list failed!");
return RecordingsManagerPtr();
}
+ if (stateChanged || !m_recDirs) {
+ m_recDirs = shared_ptr< DirectoryList >(new DirectoryList(recMan));
+ }
+ if (!m_recDirs) {
+ esyslog("[LIVE]: creation of directory list failed!");
+ return RecordingsManagerPtr();
+ }
+
}
return recMan;
}
@@ -523,6 +596,75 @@ namespace vdrlive {
/**
+ * Implementation of class DirectoryList:
+ */
+ DirectoryList::DirectoryList(RecordingsManagerPtr recManPtr) :
+ m_pDirVec(new DirVecType())
+ {
+ if (!m_pDirVec) {
+ return;
+ }
+
+ m_pDirVec->push_back(""); // always add root directory
+#if APIVERSNUM >= 10712
+ for (cNestedItem* item = Folders.First(); item; item = Folders.Next(item)) { // add folders.conf entries
+ InjectFoldersConf(item);
+ }
+#endif
+ for (cRecording* recording = Recordings.First(); recording; recording = Recordings.Next(recording)) {
+ string name = recording->Name();
+ size_t found = name.find_last_of("~");
+
+ if (found != string::npos) {
+ m_pDirVec->push_back(StringReplace(name.substr(0, found), "~", "/"));
+ }
+ }
+ m_pDirVec->sort();
+ m_pDirVec->unique();
+ }
+
+ DirectoryList::~DirectoryList()
+ {
+ if (m_pDirVec) {
+ delete m_pDirVec, m_pDirVec = 0;
+ }
+ }
+
+#if APIVERSNUM >= 10712
+ void DirectoryList::InjectFoldersConf(cNestedItem * folder, string parent)
+ {
+ if (!folder) {
+ return;
+ }
+
+ string dir = string((parent.size() == 0) ? "" : parent + "/") + folder->Text();
+ m_pDirVec->push_back(StringReplace(dir, "_", " "));
+
+ if (!folder->SubItems()) {
+ return;
+ }
+
+ for(cNestedItem* item = folder->SubItems()->First(); item; item = folder->SubItems()->Next(item)) {
+ InjectFoldersConf(item, dir);
+ }
+ }
+#endif
+
+ /**
+ * Implementation of class DirectoryListPtr:
+ */
+ DirectoryListPtr::DirectoryListPtr(RecordingsManagerPtr recManPtr, shared_ptr< DirectoryList > recDirs) :
+ shared_ptr< DirectoryList >(recDirs),
+ m_recManPtr(recManPtr)
+ {
+ }
+
+ DirectoryListPtr::~DirectoryListPtr()
+ {
+ }
+
+
+ /**
* Implementation of function LiveRecordingsManager:
*/
RecordingsManagerPtr LiveRecordingsManager()
diff --git a/recman.h b/recman.h
index e04c16b..dc766ed 100644
--- a/recman.h
+++ b/recman.h
@@ -4,6 +4,7 @@
#include <ctime>
#include <map>
#include <vector>
+#include <list>
#include <vdr/recording.h>
#include "stdext.h"
@@ -21,6 +22,8 @@ namespace vdrlive {
class RecordingsTreePtr;
class RecordingsList;
class RecordingsListPtr;
+ class DirectoryList;
+ class DirectoryListPtr;
class RecordingsItem;
typedef std::tr1::shared_ptr< RecordingsManager > RecordingsManagerPtr;
@@ -57,6 +60,12 @@ namespace vdrlive {
RecordingsListPtr GetRecordingsList(time_t begin, time_t end, bool ascending = true) const;
/**
+ * Returns a shared pointer to a fully populated
+ * directory list.
+ */
+ DirectoryListPtr GetDirectoryList() const;
+
+ /**
* generates a Md5 hash from a cRecording entry. It can be used
* to reidentify a recording.
*/
@@ -69,6 +78,24 @@ namespace vdrlive {
cRecording const* GetByMd5Hash(std::string const & hash) const;
/**
+ * Rename a recording with the given hash according to
+ * VDRs recording mechanisms.
+ */
+ bool RenameRecording(cRecording const * recording, std::string const & name) const;
+
+ /**
+ * Delete recording resume with the given hash according to
+ * VDRs recording mechanisms.
+ */
+ void DeleteResume(cRecording const * recording) const;
+
+ /**
+ * Delete recording marks with the given hash according to
+ * VDRs recording mechanisms.
+ */
+ void DeleteMarks(cRecording const * recording) const;
+
+ /**
* Delete a recording with the given hash according to
* VDRs recording deletion mechanisms.
*/
@@ -97,6 +124,7 @@ namespace vdrlive {
static std::tr1::weak_ptr< RecordingsManager > m_recMan;
static std::tr1::shared_ptr< RecordingsTree > m_recTree;
static std::tr1::shared_ptr< RecordingsList > m_recList;
+ static std::tr1::shared_ptr< DirectoryList > m_recDirs;
static int m_recordingsState;
cThreadLock m_recordingsLock;
@@ -310,6 +338,51 @@ namespace vdrlive {
/**
+ * The recording directory list contains all real directory entries.
+ */
+ class DirectoryList
+ {
+ friend class RecordingsManager;
+
+ private:
+ DirectoryList(RecordingsManagerPtr recManPtr);
+#if APIVERSNUM >= 10712
+ void InjectFoldersConf(cNestedItem * folder, std::string parent = "");
+#endif
+ public:
+ typedef std::list< std::string > DirVecType;
+
+ virtual ~DirectoryList();
+
+ DirVecType::const_iterator begin() const { return m_pDirVec->begin(); }
+ DirVecType::const_iterator end() const { return m_pDirVec->end(); }
+ DirVecType::size_type size() const { return m_pDirVec->size(); }
+
+ private:
+ DirVecType *m_pDirVec;
+ };
+
+
+ /**
+ * A smart pointer to a directory list. As long as an instance of this
+ * exists the recordings are locked in the vdr.
+ */
+ class DirectoryListPtr : public std::tr1::shared_ptr< DirectoryList >
+ {
+ friend class RecordingsManager;
+
+ private:
+ DirectoryListPtr(RecordingsManagerPtr recManPtr, std::tr1::shared_ptr< DirectoryList > recDirs);
+
+ public:
+ virtual ~DirectoryListPtr();
+
+ private:
+ RecordingsManagerPtr m_recManPtr;
+ };
+
+
+ /**
* return singleton instance of RecordingsManager as a shared Pointer.
* This ensures that after last use of the RecordingsManager it is
* deleted. After deletion of the original RecordingsManager a repeated
diff --git a/tools.cpp b/tools.cpp
index e8589d7..a1ed4ee 100644
--- a/tools.cpp
+++ b/tools.cpp
@@ -5,6 +5,7 @@
#include <tnt/htmlescostream.h>
#include <tnt/httprequest.h>
#include <tnt/httpreply.h>
+#include <vdr/recording.h>
#include "exception.h"
#include "live.h"
#include "setup.h"
@@ -312,5 +313,173 @@ namespace vdrlive {
return decoded;
}
+ std::string FileSystemExchangeChars(std::string const & s, bool ToFileSystem)
+ {
+ char *str = strdup(s.c_str());
+ str = ExchangeChars(str, ToFileSystem);
+ std::string data = str;
+ if (str) {
+ free(str);
+ }
+ return data;
+ }
+
+ bool MoveDirectory(std::string const & sourceDir, std::string const & targetDir)
+ {
+ const char* delim = "/";
+ std::string source = sourceDir;
+ std::string target = targetDir;
+
+ // add missing directory delimiters
+ if (source.compare(source.size() - 1, 1, delim) != 0) {
+ source += "/";
+ }
+ if (target.compare(target.size() - 1, 1, delim) != 0) {
+ target += "/";
+ }
+
+ if (source != target) {
+ // validate target directory
+ if (target.find(source) != std::string::npos) {
+ esyslog("[LIVE]: cannot move under sub-directory\n");
+ return false;
+ }
+ RemoveFileOrDir(target.c_str());
+ if (!MakeDirs(target.c_str(), true)) {
+ esyslog("[LIVE]: cannot create directory %s", target.c_str());
+ return false;
+ }
+
+ struct stat st1, st2;
+ stat(source.c_str(), &st1);
+ stat(target.c_str(),&st2);
+ if (st1.st_dev == st2.st_dev) {
+ if (!RenameVideoFile(source.c_str(), target.c_str())) {
+ esyslog("[LIVE]: rename failed from %s to %s", source.c_str(), target.c_str());
+ return false;
+ }
+ }
+ else {
+ int required = DirSizeMB(source.c_str());
+ int available = FreeDiskSpaceMB(target.c_str());
+
+ // validate free space
+ if (required < available) {
+ cReadDir d(source.c_str());
+ struct dirent *e;
+ bool success = true;
+
+ // allocate copying buffer
+ const int len = 1024 * 1024;
+ char *buffer = MALLOC(char, len);
+ if (!buffer) {
+ esyslog("[LIVE]: cannot allocate renaming buffer");
+ return false;
+ }
+
+ // loop through all files, but skip all subdirectories
+ while ((e = d.Next()) != NULL) {
+ // skip generic entries
+ if (strcmp(e->d_name, ".") && strcmp(e->d_name, "..") && strcmp(e->d_name, "lost+found")) {
+ string sourceFile = source + e->d_name;
+ string targetFile = target + e->d_name;
+
+ // copy only regular files
+ if (!stat(sourceFile.c_str(), &st1) && S_ISREG(st1.st_mode)) {
+ int r = -1, w = -1;
+ cUnbufferedFile *inputFile = cUnbufferedFile::Create(sourceFile.c_str(), O_RDONLY | O_LARGEFILE);
+ cUnbufferedFile *outputFile = cUnbufferedFile::Create(targetFile.c_str(), O_RDWR | O_CREAT | O_LARGEFILE);
+
+ // validate files
+ if (!inputFile || !outputFile) {
+ esyslog("[LIVE]: cannot open file %s or %s", sourceFile.c_str(), targetFile.c_str());
+ success = false;
+ break;
+ }
+
+ // do actual copy
+ dsyslog("[LIVE]: copying %s to %s", sourceFile.c_str(), targetFile.c_str());
+ do {
+ r = inputFile->Read(buffer, len);
+ if (r > 0)
+ w = outputFile->Write(buffer, r);
+ else
+ w = 0;
+ } while (r > 0 && w > 0);
+ DELETENULL(inputFile);
+ DELETENULL(outputFile);
+
+ // validate result
+ if (r < 0 || w < 0) {
+ success = false;
+ break;
+ }
+ }
+ }
+ }
+
+ // release allocated buffer
+ free(buffer);
+
+ // delete all created target files and directories
+ if (!success) {
+ size_t found = target.find_last_of(delim);
+ if (found != std::string::npos) {
+ target = target.substr(0, found);
+ }
+ if (!RemoveFileOrDir(target.c_str(), true)) {
+ esyslog("[LIVE]: cannot remove target %s", target.c_str());
+ }
+ found = target.find_last_of(delim);
+ if (found != std::string::npos) {
+ target = target.substr(0, found);
+ }
+ if (!RemoveEmptyDirectories(target.c_str(), true)) {
+ esyslog("[LIVE]: cannot remove target directory %s", target.c_str());
+ }
+ esyslog("[LIVE]: copying failed");
+ return false;
+ }
+ else if (!RemoveFileOrDir(source.c_str(), true)) { // delete source files
+ esyslog("[LIVE]: cannot remove source directory %s", source.c_str());
+ return false;
+ }
+
+ // delete all empty source directories
+ size_t found = source.find_last_of(delim);
+ if (found != std::string::npos) {
+ source = source.substr(0, found);
+ while (source != VideoDirectory) {
+ found = source.find_last_of(delim);
+ if (found == std::string::npos)
+ break;
+ source = source.substr(0, found);
+ if (!RemoveEmptyDirectories(source.c_str(), true))
+ break;
+ }
+ }
+ }
+ else {
+ esyslog("[LIVE]: renaming requires %dMB - only %dMB available", required, available);
+ // delete all created empty target directories
+ size_t found = target.find_last_of(delim);
+ if (found != std::string::npos) {
+ target = target.substr(0, found);
+ while (target != VideoDirectory) {
+ found = target.find_last_of(delim);
+ if (found == std::string::npos)
+ break;
+ target = target.substr(0, found);
+ if (!RemoveEmptyDirectories(target.c_str(), true))
+ break;
+ }
+ }
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
} // namespace vdrlive
diff --git a/tools.h b/tools.h
index f4020ac..272dce8 100644
--- a/tools.h
+++ b/tools.h
@@ -11,6 +11,8 @@
#include <vector>
#include <vdr/channels.h>
#include <vdr/thread.h>
+#include <vdr/videodir.h>
+#include <vdr/tools.h>
std::istream& operator>>( std::istream& is, tChannelID& ret );
@@ -57,6 +59,10 @@ namespace vdrlive {
std::string EncodeDomId(std::string const & toEncode, char const * from = ".-:", char const * to = "pmc");
std::string DecodeDomId(std::string const & toDecode, char const * from = "pmc", char const * to = ".-:");
+ std::string FileSystemExchangeChars(std::string const & s, bool ToFileSystem);
+
+ bool MoveDirectory(std::string const & sourceDir, std::string const & targetDir);
+
struct bad_lexical_cast: std::runtime_error
{
bad_lexical_cast(): std::runtime_error( "bad lexical cast" ) {}
diff --git a/users.h b/users.h
index b845352..fe4a0b0 100644
--- a/users.h
+++ b/users.h
@@ -19,7 +19,8 @@ enum eUserRights
UR_STARTREPLAY,
UR_SWITCHCHNL,
UR_EDITSTIMERS,
- UR_DELSTIMERS
+ UR_DELSTIMERS,
+ UR_EDITRECS
};
// --- cUser --------------------------------------------------------