Update to properly utilize docker
Trying this, time to see if it works.
This commit is contained in:
parent
a16654503d
commit
9833f81007
8
.gitignore
vendored
8
.gitignore
vendored
@ -98,11 +98,3 @@ ENV/
|
|||||||
# mypy
|
# mypy
|
||||||
.mypy_cache/
|
.mypy_cache/
|
||||||
|
|
||||||
# Personal Files
|
|
||||||
config.ini
|
|
||||||
defaults.ini
|
|
||||||
fanfiction_file
|
|
||||||
notifications.py
|
|
||||||
personal.ini
|
|
||||||
run.sh
|
|
||||||
|
|
||||||
|
77
Dockerfile
Normal file
77
Dockerfile
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
FROM python:3.9-alpine
|
||||||
|
|
||||||
|
# set version label
|
||||||
|
ARG BUILD_DATE
|
||||||
|
ARG VERSION
|
||||||
|
ARG CALIBRE_RELEASE
|
||||||
|
ARG FFF_RELEASE
|
||||||
|
LABEL build_version="FFDL-Auto version:- ${VERSION} Calibre: ${CALIBRE_RELEASE} FFF: ${FFF_RELEASE} Build-date:- ${BUILD_DATE}"
|
||||||
|
|
||||||
|
RUN set -x && \
|
||||||
|
addgroup --gid "$PGID" abc && \
|
||||||
|
adduser \
|
||||||
|
--gecos "" \
|
||||||
|
--disabled-password \
|
||||||
|
--no-create-home \
|
||||||
|
--uid "$PUID" \
|
||||||
|
--ingroup abc \
|
||||||
|
--shell /bin/bash \
|
||||||
|
abc
|
||||||
|
|
||||||
|
RUN mkdir -p /opt/calibre && \
|
||||||
|
apk update && \
|
||||||
|
apk add --no-cache --upgrade \
|
||||||
|
bash \
|
||||||
|
ca-certificates \
|
||||||
|
gcc \
|
||||||
|
mesa-gl \
|
||||||
|
qt5-qtbase-x11 \
|
||||||
|
wget \
|
||||||
|
xdg-utils \
|
||||||
|
xz \
|
||||||
|
curl \
|
||||||
|
dbus \
|
||||||
|
jq \
|
||||||
|
python3
|
||||||
|
|
||||||
|
RUN echo "**** install calibre ****" && \
|
||||||
|
mkdir -p \
|
||||||
|
/opt/calibre && \
|
||||||
|
if [ -z ${CALIBRE_RELEASE+x} ]; then \
|
||||||
|
CALIBRE_RELEASE=$(curl -sX GET "https://api.github.com/repos/kovidgoyal/calibre/releases/latest" \
|
||||||
|
| jq -r .tag_name); \
|
||||||
|
fi && \
|
||||||
|
CALIBRE_VERSION="$(echo ${CALIBRE_RELEASE} | cut -c2-)" && \
|
||||||
|
CALIBRE_URL="https://download.calibre-ebook.com/${CALIBRE_VERSION}/calibre-${CALIBRE_VERSION}-x86_64.txz" && \
|
||||||
|
curl -o \
|
||||||
|
/tmp/calibre-tarball.txz -L \
|
||||||
|
"$CALIBRE_URL" && \
|
||||||
|
tar xvf /tmp/calibre-tarball.txz -C \
|
||||||
|
/opt/calibre && \
|
||||||
|
/opt/calibre/calibre_postinstall && \
|
||||||
|
dbus-uuidgen > /etc/machine-id
|
||||||
|
|
||||||
|
RUN echo "**** cleanup ****" && \
|
||||||
|
apt-get clean && \
|
||||||
|
rm -rf \
|
||||||
|
/tmp/* \
|
||||||
|
/var/lib/apt/lists/* \
|
||||||
|
/var/tmp/*
|
||||||
|
|
||||||
|
RUN echo *** Install Packages *** && \
|
||||||
|
apk add --no-cache --upgrade py-pillow && \
|
||||||
|
if [ -z ${FFF_RELEASE+x} ]; then \
|
||||||
|
python3 -m pip --no-cache-dir install FanFicFare \
|
||||||
|
else \
|
||||||
|
python3 -m pip --no-cache-dir install --extra-index-url https://testpypi.python.org/pypi FanFicFare==${FFF_RELEASE} \
|
||||||
|
fi && \
|
||||||
|
python3 -m pip --no-cache-dir install pushbullet.py && \
|
||||||
|
ln -s /opt/calibre/calibredb /bin/calibredb
|
||||||
|
|
||||||
|
COPY root/ /
|
||||||
|
|
||||||
|
VOLUME /config
|
||||||
|
|
||||||
|
WORKDIR /config
|
||||||
|
|
||||||
|
ENTRYPOINT ["/init"]
|
17
README.md
17
README.md
@ -1,17 +0,0 @@
|
|||||||
# AutomatedFanfic
|
|
||||||
|
|
||||||
Python script to automate the use of FanFicFare CLI (https://github.com/JimmXinu/FanFicFare) with calibre.
|
|
||||||
|
|
||||||
Primary script is fanficdownload.py. Use -h or --help to see the options.
|
|
||||||
|
|
||||||
All of the options can be loaded into the config file, of which the template is provided in `config_template.ini`, and utilized with `python3 fanficdownload.py -c path_to_config.ini`.
|
|
||||||
|
|
||||||
There is additional support for notifications, including pushbullet integration, through runner_notify. Use -h to see options.
|
|
||||||
|
|
||||||
Works with Fanficfare 2.3.6+. Rewrite underway to take advantage of new features in Fanficfare 2.4.0
|
|
||||||
|
|
||||||
Requires Python 3.6.9. Unsure if it will work on higher versions of Python.
|
|
||||||
|
|
||||||
For basic cron usage, this is not needed, `fanficfare -dowload-imap -u` should work if you're not integrating into calibre. This script is best used if you want to update the calibre library, for the usage of calibre-server for instance.
|
|
||||||
|
|
||||||
If anything does not work, please open a ticket.
|
|
@ -1,85 +0,0 @@
|
|||||||
# -- coding: utf-8 --
|
|
||||||
|
|
||||||
from win32api import *
|
|
||||||
from win32gui import *
|
|
||||||
import win32con
|
|
||||||
import sys, os
|
|
||||||
import struct
|
|
||||||
import time
|
|
||||||
import threading
|
|
||||||
import cmd
|
|
||||||
from os.path import join, dirname, abspath
|
|
||||||
|
|
||||||
# Class
|
|
||||||
class WindowsBalloonTip:
|
|
||||||
def __init__(self, title, msg):
|
|
||||||
message_map = { win32con.WM_DESTROY: self.OnDestroy,}
|
|
||||||
|
|
||||||
# Register the window class.
|
|
||||||
wc = WNDCLASS()
|
|
||||||
hinst = wc.hInstance = GetModuleHandle(None)
|
|
||||||
wc.lpszClassName = 'PythonTaskbar'
|
|
||||||
wc.lpfnWndProc = message_map # could also specify a wndproc.
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
classAtom = RegisterClass(wc)
|
|
||||||
break
|
|
||||||
except:
|
|
||||||
continue
|
|
||||||
# Create the window.
|
|
||||||
style = win32con.WS_OVERLAPPED | win32con.WS_SYSMENU
|
|
||||||
self.hwnd = CreateWindow(classAtom, "Taskbar", style, 0, 0, win32con.CW_USEDEFAULT, win32con.CW_USEDEFAULT, 0, 0, hinst, None)
|
|
||||||
UpdateWindow(self.hwnd)
|
|
||||||
|
|
||||||
# Icons managment
|
|
||||||
iconPathName = join(dirname(abspath(__file__)), 'ff.png')
|
|
||||||
#print iconPathName
|
|
||||||
icon_flags = win32con.LR_LOADFROMFILE | win32con.LR_DEFAULTSIZE
|
|
||||||
try:
|
|
||||||
hicon = LoadImage(hinst, iconPathName, win32con.IMAGE_ICON, 0, 0, icon_flags)
|
|
||||||
except:
|
|
||||||
hicon = LoadIcon(0, win32con.IDI_APPLICATION)
|
|
||||||
flags = NIF_ICON | NIF_MESSAGE | NIF_TIP
|
|
||||||
nid = (self.hwnd, 0, flags, win32con.WM_USER+20, hicon, 'Tooltip')
|
|
||||||
|
|
||||||
# Notify
|
|
||||||
Shell_NotifyIcon(NIM_ADD, nid)
|
|
||||||
Shell_NotifyIcon(NIM_MODIFY, (self.hwnd, 0, NIF_INFO, win32con.WM_USER+20, hicon, 'Balloon Tooltip', msg, 200, title))
|
|
||||||
|
|
||||||
# self.show_balloon(title, msg)
|
|
||||||
time.sleep(5)
|
|
||||||
|
|
||||||
# Destroy
|
|
||||||
DestroyWindow(self.hwnd)
|
|
||||||
classAtom = UnregisterClass(classAtom, hinst)
|
|
||||||
def OnDestroy(self, hwnd, msg, wparam, lparam):
|
|
||||||
nid = (self.hwnd, 0)
|
|
||||||
Shell_NotifyIcon(NIM_DELETE, nid)
|
|
||||||
#PostQuitMessage(0) # Terminate the app.
|
|
||||||
|
|
||||||
# Function
|
|
||||||
|
|
||||||
class myThread(threading.Thread):
|
|
||||||
def __init__(self, title, msg):
|
|
||||||
|
|
||||||
threading.Thread.__init__(self)
|
|
||||||
self.title = title
|
|
||||||
self.msg = msg
|
|
||||||
def run(self):
|
|
||||||
w = WindowsBalloonTip(self.title, self.msg)
|
|
||||||
|
|
||||||
|
|
||||||
def balloon_tip(title, msg):
|
|
||||||
|
|
||||||
thread1 = myThread(title, msg)
|
|
||||||
thread1.start()
|
|
||||||
return
|
|
||||||
#w=WindowsBalloonTip(title, msg)
|
|
||||||
|
|
||||||
class Notification():
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def send_notification(self, title, text):
|
|
||||||
balloon_tip(title, msg)
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
# Email Login Information, so that the script can download from email subscription notifications.
|
|
||||||
[login]
|
|
||||||
# Username for email
|
|
||||||
user=
|
|
||||||
# Password for email
|
|
||||||
password=
|
|
||||||
# IMAP address for email
|
|
||||||
server=
|
|
||||||
# The mailbox to look in the emails for, such as INBOX
|
|
||||||
mailbox=
|
|
||||||
|
|
||||||
[locations]
|
|
||||||
# Web Address for the calibre library to update
|
|
||||||
library=
|
|
||||||
# Path to file to read links from, or to output links that didn't work.
|
|
||||||
input=
|
|
||||||
|
|
||||||
# If you want to user runner_notify.py to send alerts to your phone, fill out the fields here.
|
|
||||||
[runner]
|
|
||||||
notification=
|
|
||||||
pushbullet=
|
|
||||||
pbdevice=
|
|
||||||
tag=
|
|
||||||
|
|
||||||
# How to display output. True will display as the program runs, false will wait until the end.
|
|
||||||
[output]
|
|
||||||
live=
|
|
21
giNotify.py
21
giNotify.py
@ -1,21 +0,0 @@
|
|||||||
from gi import require_version as gir
|
|
||||||
|
|
||||||
gir('Notify', '0.7')
|
|
||||||
|
|
||||||
from gi.repository import GObject
|
|
||||||
from gi.repository import Notify
|
|
||||||
import sys
|
|
||||||
from os.path import join, dirname, abspath
|
|
||||||
|
|
||||||
class Notification(GObject.Object):
|
|
||||||
def __init__(self):
|
|
||||||
|
|
||||||
super(Notification, self).__init__()
|
|
||||||
# lets initialise with the application name
|
|
||||||
Notify.init("Fanfiction")
|
|
||||||
self.icon = join(dirname(abspath(__file__)), 'ff.png')
|
|
||||||
|
|
||||||
def send_notification(self, title, text):
|
|
||||||
|
|
||||||
n = Notify.Notification.new(title, text, self.icon)
|
|
||||||
n.show()
|
|
1
release-versions/calibre.txt
Normal file
1
release-versions/calibre.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
5.39.1
|
1
release-versions/fff.txt
Normal file
1
release-versions/fff.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
4.11.1
|
1
release-versions/latest.txt
Normal file
1
release-versions/latest.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
Release: v2022.02.25
|
@ -149,11 +149,12 @@ def downloader(args):
|
|||||||
# story is not in calibre
|
# story is not in calibre
|
||||||
cur = url
|
cur = url
|
||||||
moving = 'cd "{}" && '.format(loc)
|
moving = 'cd "{}" && '.format(loc)
|
||||||
copyfile("personal.ini", "{}/personal.ini".format(loc))
|
copyfile("/config/personal.ini", "{}/personal.ini".format(loc))
|
||||||
output += log('\tRunning: {}python -m fanficfare.cli -u "{}" --update-cover --non-interactive'.format(
|
copyfile("/config/defaults.ini", "{}/defaults.ini".format(moving))
|
||||||
|
output += log('\tRunning: {}python3.9 -m fanficfare.cli -u "{}" --update-cover --non-interactive'.format(
|
||||||
moving, cur), 'BLUE', live)
|
moving, cur), 'BLUE', live)
|
||||||
res = check_output('{}python -m fanficfare.cli -u "{}" --update-cover'.format(
|
res = check_output('{}python3.9 -m fanficfare.cli -u "{}" --update-cover --non-interactive --config={}/personal.ini'.format(
|
||||||
moving, cur), shell=True, stderr=STDOUT, stdin=PIPE).decode('utf-8')
|
moving, cur, loc), shell=True, stderr=STDOUT, stdin=PIPE).decode('utf-8')
|
||||||
check_regexes(res)
|
check_regexes(res)
|
||||||
if chapter_difference.search(res) or more_chapters.search(res):
|
if chapter_difference.search(res) or more_chapters.search(res):
|
||||||
output += log("\tForcing download update due to:",
|
output += log("\tForcing download update due to:",
|
||||||
@ -162,8 +163,8 @@ def downloader(args):
|
|||||||
if line:
|
if line:
|
||||||
output += log("\t\t{}".format(line), 'WARNING', live)
|
output += log("\t\t{}".format(line), 'WARNING', live)
|
||||||
res = check_output(
|
res = check_output(
|
||||||
'{}python -m fanficfare.cli -u "{}" --force --update-cover --non-interactive'.format(
|
'{}python3.9 -m fanficfare.cli -u "{}" --force --update-cover --non-interactive --config={}/personal.ini'.format(
|
||||||
moving, cur), shell=True, stderr=STDOUT, stdin=PIPE).decode('utf-8')
|
moving, cur, loc), shell=True, stderr=STDOUT, stdin=PIPE).decode('utf-8')
|
||||||
check_regexes(res)
|
check_regexes(res)
|
||||||
cur = get_files(loc, '.epub', True)[0]
|
cur = get_files(loc, '.epub', True)[0]
|
||||||
|
|
||||||
@ -275,9 +276,12 @@ def main(user, password, server, label, inout_file, path, live):
|
|||||||
if len(urls) == 1:
|
if len(urls) == 1:
|
||||||
downloader([list(urls)[0], inout_file, path, True])
|
downloader([list(urls)[0], inout_file, path, True])
|
||||||
else:
|
else:
|
||||||
p = Pool()
|
for url in urls:
|
||||||
p.map(downloader, [[url, inout_file, path, live] for url in urls])
|
downloader([url, inout_file, path, True])
|
||||||
|
with open(inout_file, "r") as fp:
|
||||||
|
urls = set([x.replace("\n", "") for x in fp.readlines()])
|
||||||
|
with open(inout_file, "w") as fp:
|
||||||
|
fp.writelines(["{}\n".format(x) for x in urls])
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
8
root/app/notifications.py
Normal file
8
root/app/notifications.py
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
class Notification():
|
||||||
|
def __init__(self):
|
||||||
|
|
||||||
|
self.name="Fanfiction"
|
||||||
|
|
||||||
|
def send_notification(self, title, text):
|
||||||
|
return
|
||||||
|
|
16
root/app/run.sh
Normal file
16
root/app/run.sh
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function fix_linux_internal_host() {
|
||||||
|
DOCKER_INTERNAL_HOST="host.docker.internal"
|
||||||
|
|
||||||
|
if ! grep $DOCKER_INTERNAL_HOST /etc/hosts > /dev/null ; then
|
||||||
|
DOCKER_INTERNAL_IP=`/sbin/ip route | awk '/default/ { print $3 }' | awk '!seen[$0]++'`
|
||||||
|
echo -e "$DOCKER_INTERNAL_IP\t$DOCKER_INTERNAL_HOST" | tee -a /etc/hosts > /dev/null
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
fix_linux_internal_host
|
||||||
|
|
||||||
|
python3 runner_notify.py -c config.ini
|
||||||
|
sleep 60
|
||||||
|
|
@ -7,13 +7,11 @@ import ntpath
|
|||||||
from os import utime
|
from os import utime
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
|
||||||
from notifications import Notification
|
|
||||||
from pushbullet import Pushbullet
|
from pushbullet import Pushbullet
|
||||||
|
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
|
|
||||||
|
|
||||||
def enable_notifications(options):
|
def enable_notifications(options):
|
||||||
if options.pushbullet:
|
if options.pushbullet:
|
||||||
fail = False
|
fail = False
|
||||||
@ -34,10 +32,6 @@ def enable_notifications(options):
|
|||||||
temp_note.send_notification = pb.push_note
|
temp_note.send_notification = pb.push_note
|
||||||
yield temp_note
|
yield temp_note
|
||||||
|
|
||||||
if options.notify:
|
|
||||||
notary = Notification()
|
|
||||||
yield notary
|
|
||||||
|
|
||||||
|
|
||||||
def touch(fname, times=None):
|
def touch(fname, times=None):
|
||||||
with open(fname, 'a'):
|
with open(fname, 'a'):
|
||||||
@ -47,7 +41,7 @@ def touch(fname, times=None):
|
|||||||
def main(options):
|
def main(options):
|
||||||
try:
|
try:
|
||||||
res = check_output(
|
res = check_output(
|
||||||
"python3 fanficdownload.py -c config.ini",
|
"python3.9 fanficdownload.py -c config.ini",
|
||||||
shell=True,
|
shell=True,
|
||||||
stderr=STDOUT)
|
stderr=STDOUT)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -134,13 +128,6 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
def updater(option, newval): return newval if newval != "" else option
|
def updater(option, newval): return newval if newval != "" else option
|
||||||
|
|
||||||
try:
|
|
||||||
options.notify = updater(
|
|
||||||
options.notify, config.getboolean(
|
|
||||||
'runner', 'notification'))
|
|
||||||
except BaseException:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
options.pushbullet = updater(
|
options.pushbullet = updater(
|
||||||
options.pushbullet, config.get(
|
options.pushbullet, config.get(
|
16
root/config.default/config.ini
Normal file
16
root/config.default/config.ini
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
[login]
|
||||||
|
user=
|
||||||
|
password=
|
||||||
|
server=
|
||||||
|
mailbox=
|
||||||
|
|
||||||
|
[locations]
|
||||||
|
library=
|
||||||
|
input=/config/fanfiction_file
|
||||||
|
|
||||||
|
[runner]
|
||||||
|
pushbullet=False
|
||||||
|
pbdevice=
|
||||||
|
|
||||||
|
[output]
|
||||||
|
live=False
|
2372
root/config.default/defaults.ini
Normal file
2372
root/config.default/defaults.ini
Normal file
File diff suppressed because it is too large
Load Diff
0
root/config.default/fanfiction_file
Normal file
0
root/config.default/fanfiction_file
Normal file
140
root/config.default/personal.ini
Normal file
140
root/config.default/personal.ini
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
## This is an example of what your personal configuration might look
|
||||||
|
## like. Uncomment options by removing the '#' in front of them.
|
||||||
|
|
||||||
|
[defaults]
|
||||||
|
## [defaults] section applies to all formats and sites but may be
|
||||||
|
## overridden at several levels. Example:
|
||||||
|
|
||||||
|
## [defaults]
|
||||||
|
## titlepage_entries: category,genre, status
|
||||||
|
## [www.whofic.com]
|
||||||
|
## # overrides defaults.
|
||||||
|
## titlepage_entries: category,genre, status,dateUpdated,rating
|
||||||
|
## [epub]
|
||||||
|
## # overrides defaults & site section
|
||||||
|
## titlepage_entries: category,genre, status,datePublished,dateUpdated,dateCreated
|
||||||
|
## [www.whofic.com:epub]
|
||||||
|
## # overrides defaults, site section & format section
|
||||||
|
## titlepage_entries: category,genre, status,datePublished
|
||||||
|
## [overrides]
|
||||||
|
## # overrides all other sections
|
||||||
|
## titlepage_entries: category
|
||||||
|
|
||||||
|
## Some sites also require the user to confirm they are adult for
|
||||||
|
## adult content. Uncomment by removing '#' in front of is_adult.
|
||||||
|
is_adult:true
|
||||||
|
|
||||||
|
## Don't like the numbers at the start of chapter titles on some
|
||||||
|
## sites? You can use strip_chapter_numbers to strip them off. Just
|
||||||
|
## want to make them all look the same? Strip them off, then add them
|
||||||
|
## back on with add_chapter_numbers. Don't like the way it strips
|
||||||
|
## numbers or adds them back? See chapter_title_strip_pattern and
|
||||||
|
## chapter_title_add_pattern.
|
||||||
|
#strip_chapter_numbers:true
|
||||||
|
#add_chapter_numbers:true
|
||||||
|
|
||||||
|
## Add this to genre if there's more than one category.
|
||||||
|
#add_genre_when_multi_category: Crossover
|
||||||
|
|
||||||
|
[epub]
|
||||||
|
## include images from img tags in the body and summary of stories.
|
||||||
|
## Images will be converted to jpg for size if possible. Images work
|
||||||
|
## in epub format only. To get mobi or other format with images,
|
||||||
|
## download as epub and use Calibre to convert.
|
||||||
|
include_images:true
|
||||||
|
|
||||||
|
## If not set, the summary will have all html stripped for safety.
|
||||||
|
## Both this and include_images must be true to get images in the
|
||||||
|
## summary.
|
||||||
|
#keep_summary_html:true
|
||||||
|
|
||||||
|
## If set, the first image found will be made the cover image. If
|
||||||
|
## keep_summary_html is true, any images in summary will be before any
|
||||||
|
## in chapters.
|
||||||
|
make_firstimage_cover:true
|
||||||
|
|
||||||
|
## Resize images down to width, height, preserving aspect ratio.
|
||||||
|
## Nook size, with margin.
|
||||||
|
#image_max_size: 580, 725
|
||||||
|
|
||||||
|
## Change image to grayscale, if graphics library allows, to save
|
||||||
|
## space.
|
||||||
|
#grayscale_images: false
|
||||||
|
|
||||||
|
|
||||||
|
## Most common, I expect will be using this to save username/passwords
|
||||||
|
## for different sites. Here are a few examples. See defaults.ini
|
||||||
|
## for the full list.
|
||||||
|
|
||||||
|
[www.twilighted.net]
|
||||||
|
#username:YourPenname
|
||||||
|
#password:YourPassword
|
||||||
|
## default is false
|
||||||
|
#collect_series: true
|
||||||
|
|
||||||
|
[ficwad.com]
|
||||||
|
#username:YourUsername
|
||||||
|
#password:YourPassword
|
||||||
|
|
||||||
|
[www.adastrafanfic.com]
|
||||||
|
## Some sites do not require a login, but do require the user to
|
||||||
|
## confirm they are adult for adult content.
|
||||||
|
#is_adult:true
|
||||||
|
|
||||||
|
[www.fictionalley.org]
|
||||||
|
#is_adult:true
|
||||||
|
|
||||||
|
[www.harrypotterfanfiction.com]
|
||||||
|
#is_adult:true
|
||||||
|
|
||||||
|
[www.fimfiction.net]
|
||||||
|
#is_adult:true
|
||||||
|
#fail_on_password: false
|
||||||
|
|
||||||
|
[www.tthfanfic.org]
|
||||||
|
#is_adult:true
|
||||||
|
## tth is a little unusual--it doesn't require user/pass, but the site
|
||||||
|
## keeps track of which chapters you've read and won't send another
|
||||||
|
## update until it thinks you're up to date. This way, on download,
|
||||||
|
## it thinks you're up to date.
|
||||||
|
#username:YourName
|
||||||
|
#password:yourpassword
|
||||||
|
|
||||||
|
[www.fanfiction.net]
|
||||||
|
check_next_chapter:true
|
||||||
|
skip_author_cover:false
|
||||||
|
user_agent:Mozilla/5.0
|
||||||
|
continue_on_chapter_error:false
|
||||||
|
# for use with the workaround
|
||||||
|
#use_nsapa_proxy:true
|
||||||
|
#use_cloudscraper:false
|
||||||
|
use_flaresolverr_proxy:true
|
||||||
|
# option settings, these are the defaults:
|
||||||
|
flaresolverr_proxy_address:localhost
|
||||||
|
flaresolverr_proxy_port:8191
|
||||||
|
flaresolverr_proxy_protocol:http
|
||||||
|
|
||||||
|
## This option if uncommented, will put a box around the spoiler
|
||||||
|
## blocks with the original spoiler button text as a label using
|
||||||
|
## fieldset and legend HTML tags. For a simple box, see the
|
||||||
|
## add_to_output_css example for [base_xenforoforum:epub].
|
||||||
|
#legend_spoilers:true
|
||||||
|
|
||||||
|
|
||||||
|
## This section will override anything in the system defaults or other
|
||||||
|
## sections here.
|
||||||
|
[overrides]
|
||||||
|
## default varies by site. Set true here to force all sites to
|
||||||
|
## collect series.
|
||||||
|
#collect_series: true
|
||||||
|
|
||||||
|
# Change oneshot to ['Completed'] to ['Completed','Oneshot'] only when
|
||||||
|
# numChapters is exactly 1.
|
||||||
|
# with ',' instead of '\,' it would be ['Completed'] to
|
||||||
|
# ['Completed,Oneshot']--one string instead of two.
|
||||||
|
add_to_replace_metadata:
|
||||||
|
oneshot=>Completed=>Completed\,Oneshot&&numChapters=>^1$
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
25
root/etc/cont-init.d/05-default-confs
Normal file
25
root/etc/cont-init.d/05-default-confs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#!/usr/bin/with-contenv sh
|
||||||
|
|
||||||
|
if ! [ -f "/config/config.ini" ]
|
||||||
|
then
|
||||||
|
echo "[default-confs] restoring default 'config.ini'."
|
||||||
|
cp /config.default/config.ini /config/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -f "/config/defaults.ini" ]
|
||||||
|
then
|
||||||
|
echo "[default-confs] restoring default 'defaults.ini'."
|
||||||
|
cp /config.default/defaults.ini /config/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -f "/config/personal.ini" ]
|
||||||
|
then
|
||||||
|
echo "[default-confs] restoring default 'personal.ini'."
|
||||||
|
cp /config.default/personal.ini /config/
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! [ -f "/config/fanfiction_file" ]
|
||||||
|
then
|
||||||
|
echo "[default-confs] restoring default 'fanfiction_file'."
|
||||||
|
cp /config.default/fanfiction_file /config/
|
||||||
|
fi
|
10
root/etc/cont-init.d/90-user-permissions
Normal file
10
root/etc/cont-init.d/90-user-permissions
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
#!/usr/bin/with-contenv bash
|
||||||
|
|
||||||
|
groupmod -o -g "$PGID" abc
|
||||||
|
usermod -o -u "$PUID" abc
|
||||||
|
|
||||||
|
chown -R abc:abc /app
|
||||||
|
chown -R abc:abc /config
|
||||||
|
|
||||||
|
chmod +x /app/run.sh
|
11
root/etc/cont-init.d/99-init.d-finish
Normal file
11
root/etc/cont-init.d/99-init.d-finish
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/with-contenv sh
|
||||||
|
|
||||||
|
echo "
|
||||||
|
UID/GID
|
||||||
|
---------------------------------------
|
||||||
|
User uid: $(id -u abc)
|
||||||
|
User gid: $(id -g abc)
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
Image Made By: MrTyton
|
||||||
|
"
|
4
root/etc/services.d/ffdl/run
Normal file
4
root/etc/services.d/ffdl/run
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/with-contenv bash
|
||||||
|
|
||||||
|
sleep 30s
|
||||||
|
exec s6-setuidgid abc /app/run.sh
|
Loading…
Reference in New Issue
Block a user