diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 7a81e86ea6f5e1a28cf2a15a0f4cf27fa969ca51..d6ddb02559339d35c21500822d189237232e0f5d 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -3348,10 +3348,8 @@ public class I2PSnarkServlet extends BasicServlet {
             // unless audio or video...
             if (storage != null && storage.complete()) {
                 String mime = getMimeType(r.getName());
-                boolean isAudio = mime != null && (mime.startsWith("audio/") || mime.equals("application/ogg"));
-                boolean isVideo = mime != null && mime.startsWith("video/") &&
-                                  !mime.equals("video/x-msvideo") && !mime.equals("video/x-matroska") &&
-                                  !mime.equals("video/quicktime");
+                boolean isAudio = mime != null && isAudio(mime);
+                boolean isVideo = mime != null && isVideo(mime);
                 if (isAudio || isVideo) {
                     // HTML5
                     if (isAudio)
@@ -3552,10 +3550,8 @@ public class I2PSnarkServlet extends BasicServlet {
             boolean isVideo = false;
             buf.append("<td class=\"snarkFileIcon\">");
             if (complete) {
-                isAudio = mime.startsWith("audio/") || mime.equals("application/ogg");
-                isVideo = mime.startsWith("video/") &&
-                          !mime.equals("video/x-msvideo") && !mime.equals("video/x-matroska") &&
-                          !mime.equals("video/quicktime");
+                isAudio = isAudio(mime);
+                isVideo = isVideo(mime);
                 if (isAudio || isVideo) {
                     // HTML5
                     if (isAudio)
@@ -3655,6 +3651,31 @@ public class I2PSnarkServlet extends BasicServlet {
         return buf.toString();
     }
 
+    /**
+     * @param mime non-null
+     * @since 0.9.44
+     */
+    private static boolean isAudio(String mime) {
+        // don't include playlist files as the browser doesn't support them
+        // in the HTML5 player,
+        // and if it did and prefetched, that could be a security issue
+        return (mime.startsWith("audio/") &&
+                !mime.equals("audio/mpegurl") &&
+                !mime.equals("audio/x-scpls")) ||
+               mime.equals("application/ogg");
+    }
+
+    /**
+     * @param mime non-null
+     * @since 0.9.44
+     */
+    private static boolean isVideo(String mime) {
+        return mime.startsWith("video/") &&
+               !mime.equals("video/x-msvideo") &&
+               !mime.equals("video/x-matroska") &&
+               !mime.equals("video/quicktime");
+    }
+
     /**
      * Is there at least one complete audio file in this directory or below?
      * Recursive.
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
index 71b70c5ae4e47e9c90d64c68da66f24dc8910239..b82c4a35a9c7b6b302aeb514e2d700453116ecd5 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/URIUtil.java
@@ -88,6 +88,7 @@ class URIUtil
                     case '[':
                     case ']':
                     case '&':
+                    case '|':
                         buf=new StringBuilder(path.length()*2);
                         break loop;
                     default:
@@ -156,6 +157,9 @@ class URIUtil
                       case '&':
                           buf.append("%26");
                           continue;
+                      case '|':
+                          buf.append("%7C");
+                          continue;
                       default:
                           if (c <= 0x1f) // includes negative
                               toHex(c,buf);
@@ -212,6 +216,9 @@ class URIUtil
                         case '&':
                             buf.append("%26");
                             continue;
+                        case '|':
+                            buf.append("%7C");
+                            continue;
                         default:
                             if (c <= 0x1f || (c >= 0x7f && c <= 0x9f) || Character.isSpaceChar(c))
                                 toHex(c,buf);