From e4f72170d0bf4a6a5017c72d45be22a62d9bb49b Mon Sep 17 00:00:00 2001
From: Arun Prakash Jana <engineerarun@gmail.com>
Date: Sun, 14 May 2017 21:00:46 +0530
Subject: [PATCH] Fix #26: Provide an option to use a custom nlay file.

---
 README.md |  1 +
 nlay      |  6 ++++--
 nnn.c     | 26 ++++++++++++++++++++------
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index 83482b6a..d8831b3e 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,7 @@ nnn needs libreadline, libncursesw (on Linux or ncurses on OS X) and standard li
 
     optional arguments:
       -d             start in detail view mode
+      -p             path to custom nlay
       -S             start in disk usage analyzer mode
       -v             show program version and exit
       -h             show this help and exit
diff --git a/nlay b/nlay
index 0106125d..20d6e8ed 100755
--- a/nlay
+++ b/nlay
@@ -25,8 +25,10 @@
 # 3. Assuming you don't to play multiple audio/video files simultaneously,
 #    nlay kills any running instances of the audio/video player in bg mode.
 #
-# 4. Keep a personal backup (on GitHub Gist maybe?) of this file if you modify
-#    it. nlay is OVERWRITTEN during nnn upgrade.
+# 4. nlay is OVERWRITTEN during nnn upgrade. You can store your custom nlay in a
+#    location other than the default and have an alias with nnn option '-p' to
+#    invoke it. Remember it might break or lack new capabilities added to nlay
+#    in future releases. Check the file diff once in a while.
 #
 # Author: Arun Prakash Jana
 # Email: engineerarun@gmail.com
diff --git a/nnn.c b/nnn.c
index 512f20fe..0fb3d4b7 100644
--- a/nnn.c
+++ b/nnn.c
@@ -144,6 +144,7 @@ static int ndents, cur, total_dents;
 static int idle;
 static char *opener;
 static char *fb_opener;
+static char *player;
 static char *copier;
 static char *desktop_manager;
 static off_t blk_size;
@@ -1570,7 +1571,7 @@ nochange:
 				/* If NNN_OPENER is set, use it */
 				if (opener) {
 					sprintf(cmd, "%s \'", opener);
-					xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd));
+					xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd));
 					strcat(cmd, "\' > /dev/null 2>&1");
 					r = system(cmd);
 					continue;
@@ -1579,8 +1580,13 @@ nochange:
 				/* Play with nlay if identified */
 				mime = getmime(dents[cur].name);
 				if (mime) {
-					strcpy(cmd, "nlay \'");
-					xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd));
+					if (player) {
+						cmd[0] = '\'';
+						xstrlcpy(cmd + 1, player, MAX_CMD_LEN);
+						strcat(cmd, "\' \'");
+					} else
+						strcpy(cmd, "nlay \'");
+					xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd));
 					sprintf(cmd + strlen(cmd), "\' %s", mime);
 					exitcurses();
 					r = system(cmd);
@@ -1591,7 +1597,7 @@ nochange:
 				/* If nlay doesn't handle it, open plain text
 				   files with vi, then try NNN_FALLBACK_OPENER */
 				strcpy(cmd, "file -bi \'");
-				xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd));
+				xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd));
 				strcat(cmd, "\'");
 				if (get_output(cmd, MAX_CMD_LEN) == NULL)
 					continue;
@@ -1604,7 +1610,7 @@ nochange:
 					continue;
 				} else if (fb_opener) {
 					sprintf(cmd, "%s \'", fb_opener);
-					xstrlcpy(cmd + strlen(cmd), newpath, sizeof(cmd) - strlen(cmd));
+					xstrlcpy(cmd + strlen(cmd), newpath, MAX_CMD_LEN - strlen(cmd));
 					strcat(cmd, "\' > /dev/null 2>&1");
 					r = system(cmd);
 					continue;
@@ -2001,6 +2007,7 @@ positional arguments:\n\
   PATH           directory to open [default: current dir]\n\n\
 optional arguments:\n\
   -d             start in detail view mode\n\
+  -p             path to custom nlay\n\
   -S             start in disk usage analyzer mode\n\
   -v             show program version and exit\n\
   -h             show this help and exit\n\n\
@@ -2027,7 +2034,7 @@ main(int argc, char *argv[])
 	if (argc > 3)
 		usage();
 
-	while ((opt = getopt(argc, argv, "dSvh")) != -1) {
+	while ((opt = getopt(argc, argv, "dSp:vh")) != -1) {
 		switch (opt) {
 		case 'S':
 			bsizeorder = 1;
@@ -2036,6 +2043,13 @@ main(int argc, char *argv[])
 			showdetail = 1;
 			printptr = &printent_long;
 			break;
+		case 'p':
+			player = optarg;
+			if (strlen(player) > 512) {
+				fprintf(stderr, "path to player must be <= 512 characters\n");
+				exit(1);
+			}
+			break;
 		case 'v':
 			fprintf(stdout, "%s\n", VERSION);
 			return 0;
-- 
2.51.0