config now stored as json. dl commands only use wget, less deps
This commit is contained in:
@@ -7,16 +7,18 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import string
|
import string
|
||||||
|
import json
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from glob import fnmatch
|
from glob import fnmatch
|
||||||
import base64
|
import base64
|
||||||
import random
|
import random
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
VERSION = "20210128"
|
VERSION = "20210815"
|
||||||
IMAGE_EXTENSIONS = ["png", "gif", "jpg", "jpeg", "tif", "tiff"]
|
IMAGE_EXTENSIONS = ["png", "gif", "jpg", "jpeg", "tif", "tiff"]
|
||||||
AUDIO_EXTENSIONS = ["wav", "mp3", "ogg"]
|
AUDIO_EXTENSIONS = ["wav", "mp3", "ogg"]
|
||||||
VIDEO_EXTENSIONS = ["mp4", "ogg", "webm"]
|
VIDEO_EXTENSIONS = ["mp4", "ogg", "webm"]
|
||||||
|
SAFE_OPTS = ("hidden","title","parent","recursive","images","media","includes")
|
||||||
|
|
||||||
def setup():
|
def setup():
|
||||||
""" Setup the command line options """
|
""" Setup the command line options """
|
||||||
@@ -115,16 +117,22 @@ def setup():
|
|||||||
return options
|
return options
|
||||||
|
|
||||||
|
|
||||||
def setup2HTML(opts):
|
def print_setup(opts):
|
||||||
return '<meta name="SimpleWebPageSetup" content="%s"/>' % ";".join(
|
print("Current configuration:")
|
||||||
[
|
pprint(setup2safe(opts))
|
||||||
"hidden=%s" % opts.hidden,
|
|
||||||
"parent=%s" % opts.parent,
|
|
||||||
"title=%s" % urllib.parse.quote(opts.title),
|
def setup2safe(opts):
|
||||||
"images=%s" % opts.images,
|
safe_opts = {}
|
||||||
"media=%s" % opts.media,
|
opts_dict = vars(opts)
|
||||||
]
|
for key in opts_dict:
|
||||||
)
|
if key in SAFE_OPTS:
|
||||||
|
safe_opts[key] = opts_dict[key]
|
||||||
|
return safe_opts
|
||||||
|
|
||||||
|
|
||||||
|
def setup2JSON(opts):
|
||||||
|
return json.dumps(setup2safe(opts))
|
||||||
|
|
||||||
|
|
||||||
def HTML2setup(opts):
|
def HTML2setup(opts):
|
||||||
@@ -134,24 +142,18 @@ def HTML2setup(opts):
|
|||||||
with open(os.path.join(opts.path, opts.filename), "rt") as f:
|
with open(os.path.join(opts.path, opts.filename), "rt") as f:
|
||||||
for l in f.readlines():
|
for l in f.readlines():
|
||||||
if l.find('<meta name="SimpleWebPageSetup"') > -1:
|
if l.find('<meta name="SimpleWebPageSetup"') > -1:
|
||||||
content = l[l.find('name="SimpleWebPageSetup"') :]
|
content = l[l.find('content=') :].rstrip("'/>\n")
|
||||||
for s in content.split('"')[3].split(";"):
|
config = json.loads(content[9:])
|
||||||
(k, v) = s.split("=", 1)
|
for key in config:
|
||||||
if k == "hidden":
|
if key in SAFE_OPTS:
|
||||||
opts.hidden = v == "True"
|
setattr(opts, key, config[key])
|
||||||
if k == "parent":
|
|
||||||
opts.parent = v == "True"
|
|
||||||
if k == "title":
|
|
||||||
opts.title = urllib.parse.unquote(v)
|
|
||||||
if k == "images":
|
|
||||||
opts.images = v == "True"
|
|
||||||
if k == "media":
|
|
||||||
opts.media = v == "True"
|
|
||||||
read_config = True
|
read_config = True
|
||||||
print("Reading options from existing " + opts.filename)
|
print("Read options from existing " + opts.filename)
|
||||||
break
|
break
|
||||||
return (opts, read_config)
|
return (opts, read_config)
|
||||||
except:
|
except Exception as e:
|
||||||
|
print("Error parsing configuration")
|
||||||
|
print(e)
|
||||||
return (opts, False)
|
return (opts, False)
|
||||||
|
|
||||||
|
|
||||||
@@ -187,7 +189,6 @@ def generate_index(opts):
|
|||||||
if opts.password != None:
|
if opts.password != None:
|
||||||
opts.password_filename = opts.filename
|
opts.password_filename = opts.filename
|
||||||
opts.filename = generate_password_page(path, opts.filename, opts.password)
|
opts.filename = generate_password_page(path, opts.filename, opts.password)
|
||||||
existing_config = False
|
|
||||||
if opts.filename in files:
|
if opts.filename in files:
|
||||||
opts, existing_config = HTML2setup(opts)
|
opts, existing_config = HTML2setup(opts)
|
||||||
if not existing_config and not opts.overwrite:
|
if not existing_config and not opts.overwrite:
|
||||||
@@ -196,6 +197,9 @@ def generate_index(opts):
|
|||||||
+ " exists, and not generated with SimpleWebPage. Exiting."
|
+ " exists, and not generated with SimpleWebPage. Exiting."
|
||||||
)
|
)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
# Re-read files, with probably changed opts
|
||||||
|
dirs, files, path = get_files_and_folders(opts)
|
||||||
|
print_setup(opts)
|
||||||
files = [f for f in files if f != opts.filename]
|
files = [f for f in files if f != opts.filename]
|
||||||
files = [f for f in files if f != opts.password_filename]
|
files = [f for f in files if f != opts.password_filename]
|
||||||
files = match_files(files, opts.includes)
|
files = match_files(files, opts.includes)
|
||||||
@@ -212,7 +216,7 @@ def generate_index(opts):
|
|||||||
for fi in files:
|
for fi in files:
|
||||||
f.write(get_filelink(path, fi, opts.images, opts.media))
|
f.write(get_filelink(path, fi, opts.images, opts.media))
|
||||||
f.write(get_footer())
|
f.write(get_footer())
|
||||||
f.write(get_wget_lines(files))
|
f.write(get_download_lines(files, recursive = opts.recursive))
|
||||||
f.close()
|
f.close()
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -276,13 +280,15 @@ def get_filelink(path, fname, images=False, media=False):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_wget_lines(files):
|
def get_download_lines(files, recursive = False):
|
||||||
wget = "\n<!--\n"
|
s = "\n<!--\n"
|
||||||
for f in files:
|
for f in files:
|
||||||
wget += "#FILE %s\n" % (urllib.parse.quote(f),)
|
s += "#FILE %s\n" % (urllib.parse.quote(f),)
|
||||||
wget += "#WGET URL=[insert URL] && curl $URL | grep '^#FILE ' | cut -c7- | sed \"s,^,$URL,\" | xargs -n1 wget\n"
|
s += "#DL-CMD:\n#URL=[insert URL] && wget -qO - $URL | grep '^#FILE ' | cut -c7- | sed \"s,^,$URL,\" | xargs -n1 wget -Nc"
|
||||||
wget += "-->\n"
|
if recursive:
|
||||||
return wget
|
s += "x"
|
||||||
|
s += "\n-->\n"
|
||||||
|
return s
|
||||||
|
|
||||||
|
|
||||||
def get_imagestr(fname):
|
def get_imagestr(fname):
|
||||||
@@ -431,109 +437,9 @@ iframe {
|
|||||||
|
|
||||||
|
|
||||||
def get_header(opts):
|
def get_header(opts):
|
||||||
header = (
|
opts_str = setup2JSON(opts)
|
||||||
"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, height=device-height, viewport-fit=cover">
|
|
||||||
<meta name="generator" content="SimpleWebPage """
|
|
||||||
+ VERSION
|
|
||||||
+ """" />
|
|
||||||
"""
|
|
||||||
+ setup2HTML(opts)
|
|
||||||
+ """
|
|
||||||
<title>"""
|
|
||||||
+ opts.title
|
|
||||||
+ """</title>
|
|
||||||
<style>
|
|
||||||
/* Style modified from: https://css-tricks.com/snippets/php/display-styled-directory-contents/ */
|
|
||||||
* {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
body {
|
|
||||||
color: #222;
|
|
||||||
font: 14px monospace;
|
|
||||||
padding: 0;
|
|
||||||
background: #CCC;
|
|
||||||
}
|
|
||||||
h1 {
|
|
||||||
padding: 20px 0 12px 0;
|
|
||||||
margin: 0 0 0 70px;
|
|
||||||
font-family: sans-serif;
|
|
||||||
}
|
|
||||||
.container {
|
|
||||||
margin: 20px;
|
|
||||||
box-shadow: 0 5px 10px -5px rgba(0,0,0,0.5);
|
|
||||||
position: relative;
|
|
||||||
background: #eee;
|
|
||||||
border-top-left-radius: 70px;
|
|
||||||
display: inline-block;
|
|
||||||
min-width: calc(100% - 40px);
|
|
||||||
}
|
|
||||||
table {
|
|
||||||
background-color: #F3F3F3;
|
|
||||||
border-collapse: collapse;
|
|
||||||
width: 100%;
|
|
||||||
margin: 15px 0;
|
|
||||||
}
|
|
||||||
th {
|
|
||||||
background-color: #EB6000;
|
|
||||||
color: #FFF;
|
|
||||||
cursor: pointer;
|
|
||||||
padding: 5px 10px;
|
|
||||||
}
|
|
||||||
td {
|
|
||||||
padding-right: 5px;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
td a {
|
js_code = '''
|
||||||
color: #EB6000;
|
|
||||||
display: block;
|
|
||||||
padding: 5px 10px;
|
|
||||||
}
|
|
||||||
td a.link_dir {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
th a {
|
|
||||||
padding-left: 0
|
|
||||||
}
|
|
||||||
td:first-of-type a {
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
th:first-of-type {
|
|
||||||
padding-left: 5px;
|
|
||||||
}
|
|
||||||
tr:nth-of-type(odd) {
|
|
||||||
background-color: #e1e1e1;
|
|
||||||
}
|
|
||||||
tr.row_dir:hover td {
|
|
||||||
background-color: #fbe6b3;
|
|
||||||
}
|
|
||||||
tr.row_file:hover td {
|
|
||||||
background-color: #f9cba2;
|
|
||||||
}
|
|
||||||
tr:hover td a {
|
|
||||||
color: #222;
|
|
||||||
}
|
|
||||||
.right {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.bytes {
|
|
||||||
font-size: xx-small;
|
|
||||||
}
|
|
||||||
.audio {
|
|
||||||
width: 90%;
|
|
||||||
}
|
|
||||||
.video {
|
|
||||||
width: 320;
|
|
||||||
height: 240;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
/*
|
/*
|
||||||
Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
|
Table sorting script by Joost de Valk, check it out at http://www.joostdevalk.nl/code/sortable-table/.
|
||||||
@@ -857,14 +763,123 @@ function alternate(table) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
'''
|
||||||
|
css_style = '''
|
||||||
|
<style>
|
||||||
|
/* Style modified from: https://css-tricks.com/snippets/php/display-styled-directory-contents/ */
|
||||||
|
* {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
color: #222;
|
||||||
|
font: 14px monospace;
|
||||||
|
padding: 0;
|
||||||
|
background: #CCC;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
padding: 20px 0 12px 0;
|
||||||
|
margin: 0 0 0 70px;
|
||||||
|
font-family: sans-serif;
|
||||||
|
}
|
||||||
|
.container {
|
||||||
|
margin: 20px;
|
||||||
|
box-shadow: 0 5px 10px -5px rgba(0,0,0,0.5);
|
||||||
|
position: relative;
|
||||||
|
background: #eee;
|
||||||
|
border-top-left-radius: 70px;
|
||||||
|
display: inline-block;
|
||||||
|
min-width: calc(100% - 40px);
|
||||||
|
}
|
||||||
|
table {
|
||||||
|
background-color: #F3F3F3;
|
||||||
|
border-collapse: collapse;
|
||||||
|
width: 100%;
|
||||||
|
margin: 15px 0;
|
||||||
|
}
|
||||||
|
th {
|
||||||
|
background-color: #EB6000;
|
||||||
|
color: #FFF;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
td {
|
||||||
|
padding-right: 5px;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
td a {
|
||||||
|
color: #EB6000;
|
||||||
|
display: block;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
td a.link_dir {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
th a {
|
||||||
|
padding-left: 0
|
||||||
|
}
|
||||||
|
td:first-of-type a {
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
th:first-of-type {
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
tr:nth-of-type(odd) {
|
||||||
|
background-color: #e1e1e1;
|
||||||
|
}
|
||||||
|
tr.row_dir:hover td {
|
||||||
|
background-color: #fbe6b3;
|
||||||
|
}
|
||||||
|
tr.row_file:hover td {
|
||||||
|
background-color: #f9cba2;
|
||||||
|
}
|
||||||
|
tr:hover td a {
|
||||||
|
color: #222;
|
||||||
|
}
|
||||||
|
.right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.bytes {
|
||||||
|
font-size: xx-small;
|
||||||
|
}
|
||||||
|
.audio {
|
||||||
|
width: 90%;
|
||||||
|
}
|
||||||
|
.video {
|
||||||
|
width: 320;
|
||||||
|
height: 240;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
'''
|
||||||
|
header = (
|
||||||
|
"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, height=device-height, viewport-fit=cover">
|
||||||
|
<meta name="generator" content="{program}"/>
|
||||||
|
<meta name="SimpleWebPageVersion" content="{version}"/>
|
||||||
|
<meta name="SimpleWebPageSetup" content='{config}'/>
|
||||||
|
|
||||||
|
<title>{title}</title>
|
||||||
|
{css_style}
|
||||||
|
{js_code}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>"""
|
<h1>{title}</h1>
|
||||||
+ opts.title
|
|
||||||
+ """</h1>
|
|
||||||
<table class="sortable" id="fileList"><thead><tr><th>Name</th><th class="right">Size</th><th class="right">Size B</th><th class="right">Modified</th></tr></thead><tbody>
|
<table class="sortable" id="fileList"><thead><tr><th>Name</th><th class="right">Size</th><th class="right">Size B</th><th class="right">Modified</th></tr></thead><tbody>
|
||||||
"""
|
"""
|
||||||
|
).format(
|
||||||
|
title = opts.title,
|
||||||
|
config = opts_str,
|
||||||
|
program = "SimpleWebPage",
|
||||||
|
version = VERSION,
|
||||||
|
js_code = js_code,
|
||||||
|
css_style = css_style
|
||||||
)
|
)
|
||||||
return header
|
return header
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user