summaryrefslogtreecommitdiff
path: root/ripit.c
diff options
context:
space:
mode:
Diffstat (limited to 'ripit.c')
-rw-r--r--ripit.c317
1 files changed, 317 insertions, 0 deletions
diff --git a/ripit.c b/ripit.c
new file mode 100644
index 0000000..247cf73
--- /dev/null
+++ b/ripit.c
@@ -0,0 +1,317 @@
+/*
+ * mcrip.c: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ */
+
+#include <vdr/interface.h>
+#include "setup.h"
+#include "ripit.h"
+#include "i18n.h"
+
+cPluginRipit::cPluginRipit(void)
+{
+ // Initialize any member variables here.
+ // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
+ // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
+}
+
+cPluginRipit::~cPluginRipit()
+{
+ // Clean up after yourself!
+}
+
+
+const char *cPluginRipit::CommandLineHelp(void)
+{
+ // Return a string that describes all known command line options.
+ return NULL;
+}
+
+bool cPluginRipit::ProcessArgs(int argc, char *argv[])
+{
+ // Implement command line argument processing here if applicable.
+ return true;
+}
+
+bool cPluginRipit::Initialize(void)
+{
+ // Initialize any background activities the plugin shall perform.
+ return true;
+}
+
+
+bool cPluginRipit::Start(void)
+{
+ // Start any background activities the plugin shall perform.
+ RegisterI18n(Phrases);
+ return true;
+}
+
+
+void cPluginRipit::Housekeeping(void)
+{
+ // Perform any cleanup or other regular tasks.
+}
+
+
+const char *cPluginRipit::MainMenuEntry(void)
+{
+ return RipitSetup.Ripit_hidden ? 0 : tr(MAINMENUENTRY);
+}
+
+cOsdObject *cPluginRipit::MainMenuAction(void)
+{
+ return new cRipitOsd;
+}
+
+
+#if APIVERSNUM >= 10331
+const char **cPluginRipit::SVDRPHelpPages(void)
+{
+ static const char *HelpPages[] = {
+
+ "START\n"
+ " 'START [device]' Start a new rip process. If 'device' is given , use this one else from setup",
+ "ABORT\n"
+ " 'ABORT' Abort a running rip process",
+ "STATUS\n"
+ " 'STATUS' Shows status of ripit",
+ NULL
+ };
+ return HelpPages;
+}
+
+cString cPluginRipit::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
+{
+ if(!strcasecmp(Command,"START")) {
+ if(ripitosd->Rip_On()) {
+ ReplyCode=550;
+ return "Another rip process is running, Can't start new one";
+ }
+ else {
+ if(*Option) {
+ if(access(Option, F_OK)==0) {
+ ripitosd->External_Start(Option);
+ }
+ else {
+ ReplyCode=550;
+ return "Device don't exist, Stopped";
+ }
+ }
+ else
+ ripitosd->External_Start(0);
+
+ return "New rip process started";
+ }
+ }
+ else if(!strcasecmp(Command,"ABORT")) {
+ if(!ripitosd->Rip_On()) {
+ ReplyCode=550;
+ return "Can't abort process because no one is running";
+ }
+ else {
+ ripitosd->External_Abort();
+ return "Rip process aborted";
+ }
+ }
+ else if(!strcasecmp(Command,"STATUS")) {
+ if(ripitosd->Rip_On())
+ return "A rip process is running";
+ else
+ return "No rip process is running";
+ }
+ else {
+ ReplyCode=502; return "Wrong command";
+ }
+ return NULL;
+}
+#endif
+
+
+cMenuSetupPage *cPluginRipit::SetupMenu(void)
+{
+ // Return a setup menu in case the plugin supports one.
+ return new cMenuRipitSetup;
+}
+
+bool cPluginRipit::SetupParse(const char *Name, const char *Value)
+{
+ // Parse your own setup parameters and store their values.
+ if (!strcasecmp(Name, "Ripit_hidden")) RipitSetup.Ripit_hidden = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_halt")) RipitSetup.Ripit_halt = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_noquiet")) RipitSetup.Ripit_noquiet = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_eject")) RipitSetup.Ripit_eject = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_fastrip")) RipitSetup.Ripit_fastrip = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_lowbitrate")) RipitSetup.Ripit_lowbitrate = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_maxbitrate")) RipitSetup.Ripit_maxbitrate = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_preset")) RipitSetup.Ripit_preset = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_crc")) RipitSetup.Ripit_crc = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_encopts")) strn0cpy(RipitSetup.Ripit_encopts, Value, sizeof(RipitSetup.Ripit_encopts));
+ else if (!strcasecmp(Name, "Ripit_dev")) strn0cpy(RipitSetup.Ripit_dev, Value, sizeof(RipitSetup.Ripit_dev));
+ else if (!strcasecmp(Name, "Ripit_dir")) strn0cpy(RipitSetup.Ripit_dir, Value, sizeof(RipitSetup.Ripit_dir));
+ else if (!strcasecmp(Name, "Ripit_nice")) RipitSetup.Ripit_nice = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_remote")) RipitSetup.Ripit_remote = atoi(Value);
+ else if (!strcasecmp(Name, "Ripit_remotevalue")) strn0cpy(RipitSetup.Ripit_remotevalue, Value, sizeof(RipitSetup.Ripit_remotevalue));
+
+ else return false;
+ return true;
+}
+
+cMenuRipitSetup::cMenuRipitSetup(void)
+{
+
+ Setup();
+/* static const char allowed[] = { "abcdefghijklmnopqrstuvwxyz0123456789-_/" };
+ int current = Current();
+
+ Clear();
+
+ Add(new cMenuEditBoolItem( tr("Shutdown after finished"), &RipitSetup.Ripit_halt));
+ Add(new cMenuEditBoolItem( tr("Verbose output"), &RipitSetup.Ripit_noquiet));
+ Add(new cMenuEditBoolItem( tr("Eject after finished"), &RipitSetup.Ripit_eject));
+ Add(new cMenuEditBoolItem( tr("Fast mode"), &RipitSetup.Ripit_fastrip));
+
+ lowbitrate[0] = "32";
+ lowbitrate[1] = "64";
+ lowbitrate[2] = "96";
+ lowbitrate[3] = "112";
+ lowbitrate[4] = "128";
+ lowbitrate[5] = "160";
+ lowbitrate[6] = "192";
+ lowbitrate[7] = "224";
+ lowbitrate[8] = "256";
+ lowbitrate[9] = "320";
+ Add(new cMenuEditStraItem( tr("Min. bitrate"), &RipitSetup.Ripit_lowbitrate, 10, lowbitrate));
+
+ maxbitrate[0] = "32";
+ maxbitrate[1] = "64";
+ maxbitrate[2] = "96";
+ maxbitrate[3] = "112";
+ maxbitrate[4] = "128";
+ maxbitrate[5] = "160";
+ maxbitrate[6] = "192";
+ maxbitrate[7] = "224";
+ maxbitrate[8] = "256";
+ maxbitrate[9] = "320";
+ Add(new cMenuEditStraItem( tr("Max. bitrate"), &RipitSetup.Ripit_maxbitrate, 10, maxbitrate));
+
+ preset[0] = tr("none");
+ preset[1] = tr("low");
+ preset[2] = tr("standard");
+ preset[3] = tr("great");
+ preset[4] = tr("best");
+ Add(new cMenuEditStraItem( tr("Presets"), &RipitSetup.Ripit_preset, 5, preset));
+
+ Add(new cMenuEditBoolItem( tr("CRC-check"), &RipitSetup.Ripit_crc));
+ Add(new cMenuEditStrItem( tr("More encoder settings"), RipitSetup.Ripit_encopts, 255, allowed));
+ Add(new cMenuEditStrItem( tr("Device"), RipitSetup.Ripit_dev, 255, allowed));
+ Add(new cMenuEditStrItem( tr("Directory for ripped tracks"), RipitSetup.Ripit_dir, 255, allowed));
+ Add(new cMenuEditIntItem( tr("Priority of task (nice)"), &RipitSetup.Ripit_nice, -20, 19));
+
+ Add(new cMenuEditBoolItem( tr("Encode remotely"), &RipitSetup.Ripit_remote));
+ if(RipitSetup.Ripit_remote)
+ Add(new cMenuEditStrItem( tr("Options for remote encoding"), RipitSetup.Ripit_remotevalue, 255, allowed));
+
+ SetCurrent(Get(current));
+ Display();
+*/
+}
+
+void cMenuRipitSetup::Setup(void)
+{
+ static const char allowed[] = { "abcdefghijklmnopqrstuvwxyz0123456789-_/" };
+ int current = Current();
+
+ Clear();
+
+ Add(new cMenuEditBoolItem( tr("Hide mainmenu entry"), &RipitSetup.Ripit_hidden));
+ Add(new cMenuEditBoolItem( tr("Shutdown after finished"), &RipitSetup.Ripit_halt));
+ Add(new cMenuEditBoolItem( tr("Verbose output"), &RipitSetup.Ripit_noquiet));
+ Add(new cMenuEditBoolItem( tr("Eject after finished"), &RipitSetup.Ripit_eject));
+ Add(new cMenuEditBoolItem( tr("Fast mode"), &RipitSetup.Ripit_fastrip));
+
+ lowbitrate[0] = "32";
+ lowbitrate[1] = "64";
+ lowbitrate[2] = "96";
+ lowbitrate[3] = "112";
+ lowbitrate[4] = "128";
+ lowbitrate[5] = "160";
+ lowbitrate[6] = "192";
+ lowbitrate[7] = "224";
+ lowbitrate[8] = "256";
+ lowbitrate[9] = "320";
+ Add(new cMenuEditStraItem( tr("Min. bitrate"), &RipitSetup.Ripit_lowbitrate, 10, lowbitrate));
+
+ maxbitrate[0] = "32";
+ maxbitrate[1] = "64";
+ maxbitrate[2] = "96";
+ maxbitrate[3] = "112";
+ maxbitrate[4] = "128";
+ maxbitrate[5] = "160";
+ maxbitrate[6] = "192";
+ maxbitrate[7] = "224";
+ maxbitrate[8] = "256";
+ maxbitrate[9] = "320";
+ Add(new cMenuEditStraItem( tr("Max. bitrate"), &RipitSetup.Ripit_maxbitrate, 10, maxbitrate));
+
+ preset[0] = tr("none");
+ preset[1] = tr("low");
+ preset[2] = tr("standard");
+ preset[3] = tr("great");
+ preset[4] = tr("best");
+ Add(new cMenuEditStraItem( tr("Presets"), &RipitSetup.Ripit_preset, 5, preset));
+
+ Add(new cMenuEditBoolItem( tr("CRC-check"), &RipitSetup.Ripit_crc));
+ Add(new cMenuEditStrItem( tr("More encoder settings"), RipitSetup.Ripit_encopts, 255, allowed));
+ Add(new cMenuEditStrItem( tr("Device"), RipitSetup.Ripit_dev, 255, allowed));
+ Add(new cMenuEditStrItem( tr("Directory for ripped tracks"), RipitSetup.Ripit_dir, 255, allowed));
+ Add(new cMenuEditIntItem( tr("Priority of task (nice)"), &RipitSetup.Ripit_nice, -20, 19));
+
+ Add(new cMenuEditBoolItem( tr("Encode remotely"), &RipitSetup.Ripit_remote));
+ if(RipitSetup.Ripit_remote)
+ Add(new cMenuEditStrItem( tr("Options for remote encoding"), RipitSetup.Ripit_remotevalue, 255, allowed));
+
+ SetCurrent(Get(current));
+ Display();
+
+}
+
+
+void cMenuRipitSetup::Store(void)
+{
+ SetupStore("Ripit_hidden", RipitSetup.Ripit_hidden);
+ SetupStore("Ripit_halt", RipitSetup.Ripit_halt);
+ SetupStore("Ripit_noquiet", RipitSetup.Ripit_noquiet);
+ SetupStore("Ripit_eject", RipitSetup.Ripit_eject);
+ SetupStore("Ripit_fastrip", RipitSetup.Ripit_fastrip);
+ SetupStore("Ripit_lowbitrate", RipitSetup.Ripit_lowbitrate);
+ SetupStore("Ripit_maxbitrate", RipitSetup.Ripit_maxbitrate);
+ SetupStore("Ripit_crc", RipitSetup.Ripit_crc);
+ SetupStore("Ripit_preset", RipitSetup.Ripit_preset);
+ SetupStore("Ripit_encopts", RipitSetup.Ripit_encopts);
+ SetupStore("Ripit_dev", RipitSetup.Ripit_dev);
+ SetupStore("Ripit_dir", RipitSetup.Ripit_dir);
+ SetupStore("Ripit_nice", RipitSetup.Ripit_nice);
+ SetupStore("Ripit_remote", RipitSetup.Ripit_remote);
+ SetupStore("Ripit_remotevalue", RipitSetup.Ripit_remotevalue);
+}
+
+
+eOSState cMenuRipitSetup::ProcessKey(eKeys Key)
+{
+ int oldvalue = RipitSetup.Ripit_remote;
+
+ eOSState state = cMenuSetupPage::ProcessKey(Key);
+
+ if( (Key != kNone) && (RipitSetup.Ripit_remote != oldvalue) ) {
+ Setup();
+ }
+
+ return state;
+}
+
+
+
+VDRPLUGINCREATOR(cPluginRipit); // Don't touch this!