migrated all scripts
This commit is contained in:
parent
aa0e9490be
commit
2d6f03086f
36
flake.nix
36
flake.nix
@ -4,28 +4,32 @@
|
|||||||
outputs =
|
outputs =
|
||||||
{ self, nixpkgs }@inputs:
|
{ self, nixpkgs }@inputs:
|
||||||
let
|
let
|
||||||
|
inherit (self) outputs;
|
||||||
pkgs = import nixpkgs {
|
pkgs = import nixpkgs {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
config.allowUnfree = true;
|
config.allowUnfree = true;
|
||||||
};
|
};
|
||||||
download = import ./pkgs/download.nix { inherit pkgs; };
|
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
packages.x86_64-linux.download = download;
|
packages.x86_64-linux = {
|
||||||
nixosModules.download =
|
download = import ./pkgs/download.nix { inherit pkgs; };
|
||||||
{
|
ffmpeg4discord = pkgs.writeScriptBin "ffmpeg4discord" (builtins.readFile ./nix/ffmpeg4discord.py);
|
||||||
config,
|
ffmpreg = pkgs.writeScriptBin "ffmpreg" (builtins.readFile ./nix/ffmpreg.sh);
|
||||||
lib,
|
find-dup-episodes = pkgs.writeScriptBin "find-dup-episodes" (
|
||||||
pkgs,
|
builtins.readFile ./nix/find-dup-episodes.sh
|
||||||
...
|
);
|
||||||
}:
|
manage-library = pkgs.writeScriptBin "manage-library" (builtins.readFile ./nix/manage-library.sh);
|
||||||
import ./modules/download.nix {
|
nextcloud-cronjob = pkgs.writeScriptBin "nextcloud-cronjob" (
|
||||||
inherit
|
builtins.readFile ./nix/nextcloud-cronjob.sh
|
||||||
pkgs
|
);
|
||||||
lib
|
pika-list = pkgs.writeScriptBin "pika-list" (builtins.readFile ./nix/pika-list.sh);
|
||||||
config
|
run = pkgs.writeScriptBin "run" (builtins.readFile ./nix/run.sh);
|
||||||
download
|
split-dir = pkgs.writeScriptBin "split-dir" (builtins.readFile ./nix/split-dir.sh);
|
||||||
;
|
stream-dl = pkgs.writeScriptBin "stream-dl" (builtins.readFile ./nix/stream-dl.sh);
|
||||||
|
sub-sync = pkgs.writeScriptBin "sub-sync" (builtins.readFile ./nix/sub-sync.sh);
|
||||||
|
package = pkgs.writeScriptBin "tasks" (builtins.readFile ./nix/tasks.sh);
|
||||||
|
update-dns = pkgs.writeScriptBin "update-dns" (builtins.readFile ./nix/update-dns.sh);
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,80 +0,0 @@
|
|||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
options.my.scripts = lib.mkOption {
|
|
||||||
type = lib.types.attrsOf (
|
|
||||||
lib.types.submodule {
|
|
||||||
options = {
|
|
||||||
enable = lib.mkEnableOption "Whether to enable this script";
|
|
||||||
install = lib.mkEnableOption "Whether to install the script package";
|
|
||||||
service = lib.mkEnableOption "Whether to enable the script service";
|
|
||||||
name = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Name of the script.";
|
|
||||||
};
|
|
||||||
timer = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
default = "*:0";
|
|
||||||
description = "Systemd timer schedule.";
|
|
||||||
};
|
|
||||||
description = lib.mkOption {
|
|
||||||
type = lib.types.str;
|
|
||||||
description = "Description of the service.";
|
|
||||||
};
|
|
||||||
package = lib.mkOption {
|
|
||||||
type = lib.types.package;
|
|
||||||
description = "Package containing the executable script.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
);
|
|
||||||
default = { };
|
|
||||||
description = "Configuration for multiple scripts.";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf (lib.any (s: s.enable) (lib.attrValues config.my.scripts)) {
|
|
||||||
users.users.jawz.packages = lib.flatten (
|
|
||||||
lib.mapAttrsToList (
|
|
||||||
_name: script: lib.optional (script.enable && script.install) script.package
|
|
||||||
) config.my.scripts
|
|
||||||
);
|
|
||||||
|
|
||||||
systemd.user.services = lib.mapAttrs' (
|
|
||||||
name: script:
|
|
||||||
lib.nameValuePair "${script.name}" (
|
|
||||||
lib.mkIf (script.enable && script.service) {
|
|
||||||
restartIfChanged = true;
|
|
||||||
inherit (script) description;
|
|
||||||
wantedBy = [ "default.target" ];
|
|
||||||
path = [
|
|
||||||
pkgs.nix
|
|
||||||
script.package
|
|
||||||
];
|
|
||||||
serviceConfig = {
|
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = 30;
|
|
||||||
ExecStart = "${script.package}/bin/${script.name}";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
) config.my.scripts;
|
|
||||||
|
|
||||||
systemd.user.timers = lib.mapAttrs' (
|
|
||||||
name: script:
|
|
||||||
lib.nameValuePair "${script.name}" (
|
|
||||||
lib.mkIf (script.enable && script.service) {
|
|
||||||
enable = true;
|
|
||||||
inherit (script) description;
|
|
||||||
wantedBy = [ "timers.target" ];
|
|
||||||
timerConfig = {
|
|
||||||
OnCalendar = script.timer;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
)
|
|
||||||
) config.my.scripts;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@ -1,109 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
download,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
{
|
|
||||||
imports = [ ./base.nix ];
|
|
||||||
options.my.units = {
|
|
||||||
download.enable = lib.mkEnableOption "enable";
|
|
||||||
downloadManga.enable = lib.mkEnableOption "enable";
|
|
||||||
};
|
|
||||||
config = {
|
|
||||||
home-manager.users.jawz = {
|
|
||||||
xdg.configFile."gallery-dl/config.json".source = ../dotfiles/gallery-dl/config.json;
|
|
||||||
services.lorri.enable = true;
|
|
||||||
programs.bash = {
|
|
||||||
shellAliases = {
|
|
||||||
dl = "download -u jawz -i";
|
|
||||||
comic = ''dl "$(cat "$LC" | fzf --multi --exact -i)"'';
|
|
||||||
gallery = ''dl "$(cat "$LW" | fzf --multi --exact -i)"'';
|
|
||||||
};
|
|
||||||
initExtra = ''
|
|
||||||
list_root=$XDG_CONFIG_HOME/jawz/lists/jawz
|
|
||||||
export LW=$list_root/watch.txt
|
|
||||||
export LI=$list_root/instant.txt
|
|
||||||
export LC=$list_root/comic.txt
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
systemd.user = {
|
|
||||||
services =
|
|
||||||
let
|
|
||||||
mkDownloadService = desc: execStartCmd: {
|
|
||||||
restartIfChanged = true;
|
|
||||||
description = "Downloads ${desc}";
|
|
||||||
wantedBy = [ "default.target" ];
|
|
||||||
path = [
|
|
||||||
pkgs.bash
|
|
||||||
download
|
|
||||||
];
|
|
||||||
serviceConfig = {
|
|
||||||
TimeoutStartSec = 2000;
|
|
||||||
TimeoutStopSec = 2000;
|
|
||||||
Restart = "on-failure";
|
|
||||||
RestartSec = 30;
|
|
||||||
ExecStart = "${download}/bin/download ${execStartCmd}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
tuhmayto = lib.mkIf config.my.units.download.enable (
|
|
||||||
mkDownloadService "tuhmayto stuff" ''
|
|
||||||
-u jawz -i https://x.com/tuhmayto/media \
|
|
||||||
https://www.furaffinity.net/user/tuhmayto/''
|
|
||||||
);
|
|
||||||
"download@" = lib.mkIf (config.my.units.download.enable || config.my.units.downloadManga.enable) (
|
|
||||||
mkDownloadService "post from multiple sources" "%I"
|
|
||||||
);
|
|
||||||
"instagram@" = lib.mkIf config.my.units.download.enable (
|
|
||||||
mkDownloadService "post types from instagram" "instagram -u jawz -t %I"
|
|
||||||
);
|
|
||||||
};
|
|
||||||
timers =
|
|
||||||
let
|
|
||||||
downloadTimer = time: delay: {
|
|
||||||
enable = true;
|
|
||||||
description = "Downloads post types from different sites";
|
|
||||||
wantedBy = [ "timers.target" ];
|
|
||||||
timerConfig = {
|
|
||||||
OnCalendar = time;
|
|
||||||
RandomizedDelaySec = delay;
|
|
||||||
Persistent = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
{
|
|
||||||
"instagram@stories" = lib.mkIf config.my.units.download.enable (
|
|
||||||
downloadTimer "*-*-* 08:12:00" 120 // { }
|
|
||||||
);
|
|
||||||
"download@main" = lib.mkIf config.my.units.download.enable (
|
|
||||||
downloadTimer "*-*-* 06,18:02:00" 30 // { }
|
|
||||||
);
|
|
||||||
"download@push" = lib.mkIf config.my.units.download.enable (downloadTimer "*:0/5" 30 // { });
|
|
||||||
"download@manga" = lib.mkIf config.my.units.downloadManga.enable (
|
|
||||||
downloadTimer "Mon,Fri *-*-* 03:08:00" 30 // { }
|
|
||||||
);
|
|
||||||
# "download@kemono" = downloadTimer
|
|
||||||
# "*-*-1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 18:06:00" 60 // { };
|
|
||||||
tuhmayto = lib.mkIf config.my.units.download.enable {
|
|
||||||
enable = true;
|
|
||||||
description = "Downloads tuhmayto stuff";
|
|
||||||
wantedBy = [ "timers.target" ];
|
|
||||||
timerConfig = {
|
|
||||||
OnCalendar = "*:0/10";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
my.scripts.download = {
|
|
||||||
enable = lib.mkDefault false;
|
|
||||||
install = true;
|
|
||||||
service = false;
|
|
||||||
name = "download";
|
|
||||||
package = download;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
138
nix/ffmpeg4discord.py
Normal file
138
nix/ffmpeg4discord.py
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i python3 -p python3
|
||||||
|
|
||||||
|
# Imports
|
||||||
|
import os
|
||||||
|
import math
|
||||||
|
|
||||||
|
|
||||||
|
# Function for calculating the appropriate bitrate to use during conversion
|
||||||
|
def get_bitrate(duration, filesize, audio_br):
|
||||||
|
br = math.floor(filesize / duration - audio_br)
|
||||||
|
return br, br * 0.50, br * 1.45
|
||||||
|
|
||||||
|
|
||||||
|
def encode(ffmpeg_string, output_name, fs):
|
||||||
|
os.system(ffmpeg_string)
|
||||||
|
end_size = (
|
||||||
|
os.path.getsize(
|
||||||
|
"/dev/shm/ffmpeg/out/{output_name}".format(output_name=output_name)
|
||||||
|
)
|
||||||
|
* 0.00000095367432
|
||||||
|
)
|
||||||
|
if end_size < fs:
|
||||||
|
print(
|
||||||
|
ffmpeg_string.replace("\t", "")
|
||||||
|
+ "\nThe FFMPEG string above has yielded a file whose size is "
|
||||||
|
+ str(end_size)
|
||||||
|
+ "MB.\n{output_name} is ready for Discord.\n".format(
|
||||||
|
output_name=output_name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
print(
|
||||||
|
ffmpeg_string.replace("\t", "")
|
||||||
|
+ "\nThe FFMPEG string above has yielded a file whose size is "
|
||||||
|
+ str(end_size)
|
||||||
|
+ "MB.\n{output_name} is NOT ready for Discord, and will be re-run.\nMy bad.".format(
|
||||||
|
output_name=output_name
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def time_calculations(fname, length):
|
||||||
|
startstring = fname[0:2] + ":" + fname[2:4] + ":" + fname[4:6]
|
||||||
|
endstring = fname[7:9] + ":" + fname[9:11] + ":" + fname[11:13]
|
||||||
|
|
||||||
|
try:
|
||||||
|
int(fname[0:6])
|
||||||
|
startseconds = (
|
||||||
|
int(fname[0:2]) * 60 * 60 + int(fname[2:4]) * 60 + int(fname[4:6])
|
||||||
|
)
|
||||||
|
try:
|
||||||
|
int(fname[11:13])
|
||||||
|
endseconds = (
|
||||||
|
int(fname[7:9]) * 60 * 60 + int(fname[9:11]) * 60 + int(fname[11:13])
|
||||||
|
)
|
||||||
|
duration = endseconds - startseconds
|
||||||
|
timestamped_section = f"-ss {startstring} -to {endstring}"
|
||||||
|
except:
|
||||||
|
duration = length - startseconds
|
||||||
|
timestamped_section = f"-ss {startstring}"
|
||||||
|
except:
|
||||||
|
duration = length
|
||||||
|
timestamped_section = ""
|
||||||
|
|
||||||
|
return duration, timestamped_section
|
||||||
|
|
||||||
|
|
||||||
|
fname = os.listdir("/dev/shm/ffmpeg/in/")[0]
|
||||||
|
os.rename("/dev/shm/ffmpeg/in/" + fname, "/dev/shm/ffmpeg/in/" + fname.replace(" ", ""))
|
||||||
|
fname = fname.replace(" ", "")
|
||||||
|
|
||||||
|
# ffprobe to calculate the total duration of the clip.
|
||||||
|
length = math.floor(
|
||||||
|
float(
|
||||||
|
os.popen(
|
||||||
|
"ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 /dev/shm/ffmpeg/in/{fname}".format(
|
||||||
|
fname=fname
|
||||||
|
)
|
||||||
|
).read()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
duration, timestamped_section = time_calculations(fname, length)
|
||||||
|
|
||||||
|
run = True
|
||||||
|
|
||||||
|
reso = os.getenv("reso")
|
||||||
|
codec = os.getenv("codec")
|
||||||
|
audio_br = os.getenv("audio_br")
|
||||||
|
audio_br = int(str(os.getenv("audio_br")))
|
||||||
|
fs = float(str(os.getenv("fs")))
|
||||||
|
target_fs = fs
|
||||||
|
|
||||||
|
codecs = {
|
||||||
|
"vp9": {
|
||||||
|
"pass1": f"-vf scale={reso} -g 240 -threads 8 -speed 4 -row-mt 1 -tile-columns 2 -vsync cfr -c:v libvpx-vp9 -pass 1 -an",
|
||||||
|
"pass2": f"-vf scale={reso} -g 240 -threads 8 -speed 2 -row-mt 1 -tile-columns 2 -c:v libvpx-vp9 -c:a libopus -pass 2",
|
||||||
|
"output_name": "small_" + fname.replace(".mp4", ".webm"),
|
||||||
|
},
|
||||||
|
"x264": {
|
||||||
|
"pass1": f"-vf scale={reso} -vsync cfr -c:v libx264 -pass 1 -an",
|
||||||
|
"pass2": f"-vf scale={reso} -c:v libx264 -c:a aac -pass 2 ",
|
||||||
|
"output_name": "small_" + fname,
|
||||||
|
},
|
||||||
|
"x265": {
|
||||||
|
"pass1": f"-vf scale={reso} -c:v libx265 -vsync cfr -x265-params pass=1 -an",
|
||||||
|
"pass2": f"-vf scale={reso} -c:v libx265 -x265-params pass=2 -c:a aac",
|
||||||
|
"output_name": "small_" + fname,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while run:
|
||||||
|
# Conversion to KiB
|
||||||
|
end_fs = fs * 8192
|
||||||
|
br, minbr, maxbr = get_bitrate(
|
||||||
|
duration=duration, filesize=end_fs, audio_br=audio_br
|
||||||
|
)
|
||||||
|
ffmpeg_string = f"""
|
||||||
|
ffpb {timestamped_section} -hwaccel cuda -i /dev/shm/ffmpeg/in/{fname} -y \
|
||||||
|
{codecs[str(codec)]['pass1']} \
|
||||||
|
-b:v {br}k -minrate {minbr}k -maxrate {maxbr}k \
|
||||||
|
-f null /dev/null && \
|
||||||
|
ffpb {timestamped_section} -hwaccel cuda -i /dev/shm/ffmpeg/in/{fname} \
|
||||||
|
{codecs[str(codec)]['pass2']} \
|
||||||
|
-b:a {audio_br}k -b:v {br}k -minrate {minbr}k -maxrate {maxbr}k \
|
||||||
|
/dev/shm/ffmpeg/out/{codecs[str(codec)]['output_name']} -y
|
||||||
|
"""
|
||||||
|
|
||||||
|
run = encode(
|
||||||
|
ffmpeg_string, output_name=codecs[str(codec)]["output_name"], fs=target_fs
|
||||||
|
)
|
||||||
|
|
||||||
|
if run:
|
||||||
|
fs = fs - 0.2
|
||||||
122
nix/ffmpreg.sh
Normal file
122
nix/ffmpreg.sh
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash gum trashy fd ripgrep mediainfo
|
||||||
|
|
||||||
|
replace_extension() {
|
||||||
|
local file_basename
|
||||||
|
file_basename=$(basename "$1")
|
||||||
|
echo "${file_basename%.*}.$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_gif() {
|
||||||
|
file_newname=$(replace_extension "$1" gif)
|
||||||
|
ffpb -i "$(realpath "$1")" -vf fps=12,scale=480:-1,smartblur=ls=-0.5 "$file_newname"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_av1() {
|
||||||
|
local file_newname
|
||||||
|
file_newname=$(replace_extension "$1" mp4)
|
||||||
|
local file_tempdest=/dev/shm/$file_newname
|
||||||
|
local file_destination
|
||||||
|
file_destination=$(dirname "$(realpath "$1")")/$file_newname
|
||||||
|
ffpb -i "$1" \
|
||||||
|
-c:v libaom-av1 \
|
||||||
|
-threads 12 -cpu-used 7 \
|
||||||
|
"$file_tempdest"
|
||||||
|
trash "$1"
|
||||||
|
mv -i "$file_tempdest" "$file_destination"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_mp4() {
|
||||||
|
local file_newname
|
||||||
|
file_newname=$(replace_extension "$1" mp4)
|
||||||
|
local file_tempdest=/dev/shm/$file_newname
|
||||||
|
local file_destination
|
||||||
|
file_destination=$(dirname "$(realpath "$1")")/$file_newname
|
||||||
|
ffpb -i "$1" \
|
||||||
|
-c:v libx265 \
|
||||||
|
-preset veryslow \
|
||||||
|
"$file_tempdest"
|
||||||
|
trash "$1"
|
||||||
|
mv -i "$file_tempdest" "$file_destination"
|
||||||
|
}
|
||||||
|
|
||||||
|
convert_discord() {
|
||||||
|
local file_newname
|
||||||
|
file_newname=$2_$(replace_extension "$1" mp4)
|
||||||
|
local dir_ram=/dev/shm/ffmpeg
|
||||||
|
mkdir -p $dir_ram/{in,out}
|
||||||
|
ffpb -hwaccel cuda -i "$(realpath "$1")" \
|
||||||
|
-c:v h264_nvenc \
|
||||||
|
"$dir_ram"/in/discord.mp4
|
||||||
|
cd "$dir_ram" || exit
|
||||||
|
codec=x264 audio_br=$3 fs=$4 reso=$5 ffmpeg4discord
|
||||||
|
mv "$dir_ram"/out/small_discord.mp4 ~/"$file_newname"
|
||||||
|
command rm -rf "$dir_ram"
|
||||||
|
}
|
||||||
|
|
||||||
|
operation=$(gum choose mp4 av1 discord nitro gif enc265)
|
||||||
|
|
||||||
|
case $operation in
|
||||||
|
1 | mp4)
|
||||||
|
to_convert=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
to_convert+=("$file")
|
||||||
|
done < <(fd . "$(pwd)" -tf -aL | fzf --multi -i)
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_mp4 "$file"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
2 | av1)
|
||||||
|
to_convert=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
to_convert+=("$file")
|
||||||
|
done < <(fd . "$(pwd)" -tf -aL | fzf --multi -i)
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_av1 "$file"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
3 | discord)
|
||||||
|
to_convert=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
to_convert+=("$file")
|
||||||
|
done < <(fd . "$(pwd)" -tf -aL | fzf --multi -i)
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_discord "$file" discord 96 8.0 "1280x720"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
4 | nitro)
|
||||||
|
to_convert=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
to_convert+=("$file")
|
||||||
|
done < <(fd . "$(pwd)" -tf -aL | fzf --multi -i)
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_discord "$file" nitro 128 50.0 "1920x1080"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
5 | gif)
|
||||||
|
to_convert=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
to_convert+=("$file")
|
||||||
|
done < <(fd . "$(pwd)" -tf -aL | fzf --multi -i)
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_gif "$file"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
6 | enc265)
|
||||||
|
to_convert=()
|
||||||
|
extensions=(flv m4v mpg avi mov ts mkv mp4 webm)
|
||||||
|
for ext in "${extensions[@]}"; do
|
||||||
|
while IFS= read -r file; do
|
||||||
|
if ! (mediainfo "$file" | grep Writing\ library | grep -q x265); then
|
||||||
|
to_convert+=("$file")
|
||||||
|
fi
|
||||||
|
done < <(fd . -e "$ext" -tf -aL)
|
||||||
|
done
|
||||||
|
for file in "${to_convert[@]}"; do
|
||||||
|
convert_mp4 "$file"
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -n "Please select a valid input"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
27
nix/find-dup-episodes.sh
Normal file
27
nix/find-dup-episodes.sh
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash fd ripgrep
|
||||||
|
|
||||||
|
root=/srv/pool/multimedia/media/Series
|
||||||
|
while IFS= read -r directory; do
|
||||||
|
while IFS= read -r season; do
|
||||||
|
season_episodes=()
|
||||||
|
while IFS= read -r episode; do
|
||||||
|
number="$(basename "$episode" |
|
||||||
|
rg --pcre2 -o "S\d+E\d+" |
|
||||||
|
rg --pcre2 -o "\d+$" |
|
||||||
|
awk '$0*=1')"
|
||||||
|
season_episodes+=($((number)))
|
||||||
|
done < <(fd . "$season" -tf -d1 \
|
||||||
|
-E '*.srt' \
|
||||||
|
-E '*.jpg' \
|
||||||
|
-E '*.nfo' \
|
||||||
|
-E '*.json')
|
||||||
|
dupe=$(printf '%s\n' "${season_episodes[@]}" | awk '!($0 in seen){seen[$0];next} 1')
|
||||||
|
if [[ -z $dupe ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "The episode $dupe is duplicated on $(basename "$season") of $(basename "$directory")"
|
||||||
|
echo "$season"
|
||||||
|
echo "_______________"
|
||||||
|
done < <(fd . "$directory" -td -d1)
|
||||||
|
done < <(fd . "$root" -td -d 1)
|
||||||
191
nix/manage-library.sh
Normal file
191
nix/manage-library.sh
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash gum fd ripgrep eza trash-cli zip unzip
|
||||||
|
|
||||||
|
root_directories=(
|
||||||
|
/srv/pool/multimedia/media/Library/Comics
|
||||||
|
/srv/pool/multimedia/media/Library/Manga
|
||||||
|
/srv/pool/multimedia/media/Library/Webtoons
|
||||||
|
/srv/pool/multimedia/media/Library/Espaniol/Manga
|
||||||
|
)
|
||||||
|
|
||||||
|
newname() {
|
||||||
|
echo "$1" | sed -E "s/$2/$3/g"
|
||||||
|
}
|
||||||
|
|
||||||
|
separator() {
|
||||||
|
gum style --foreground 7 _________________________
|
||||||
|
}
|
||||||
|
announce_changes() {
|
||||||
|
echo "Renaming:"
|
||||||
|
gum style --foreground 1 "$1"
|
||||||
|
echo "Into:"
|
||||||
|
gum style --foreground 2 "$2"
|
||||||
|
separator
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_file() {
|
||||||
|
while IFS= read -r file; do
|
||||||
|
local original_name
|
||||||
|
original_name=$(basename "$file")
|
||||||
|
local new_name
|
||||||
|
new_name=$(newname "$(basename "$file")" "$2" "$3")
|
||||||
|
|
||||||
|
announce_changes "$original_name" "$new_name"
|
||||||
|
command mv -n "$(dirname "$file")"/{"$original_name","$new_name"}
|
||||||
|
done < <(fd "$1" --absolute-path -tf -s "${root_directories[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_directory() {
|
||||||
|
while IFS= read -r dir; do
|
||||||
|
local new_name
|
||||||
|
new_name=$(newname "$(basename "$dir")" "$2" "$3")
|
||||||
|
local new_dir
|
||||||
|
new_dir=$(dirname "$dir")/$new_name
|
||||||
|
|
||||||
|
announce_changes "$dir" "$new_dir"
|
||||||
|
echo "Processing..."
|
||||||
|
if [ ! -d "$new_dir" ]; then
|
||||||
|
echo "$(basename "$new_dir") doesn't exist. Creating it."
|
||||||
|
command mkdir -p "$new_dir"
|
||||||
|
fi
|
||||||
|
if [ -d "$new_dir" ]; then
|
||||||
|
echo "$(basename "$new_dir") has been created!, moving the following files:"
|
||||||
|
eza "$dir"
|
||||||
|
fd . "$dir" -x mv -n {} "$(realpath "$new_dir")"
|
||||||
|
fi
|
||||||
|
separator
|
||||||
|
done < <(fd "$1" --absolute-path -td -s "${root_directories[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_numbered_files() {
|
||||||
|
while IFS= read -r file; do
|
||||||
|
local original_name
|
||||||
|
original_name=$(basename "$file")
|
||||||
|
local new_name
|
||||||
|
|
||||||
|
new_name=$(echo "$original_name" | sed -E 's/(.*) - 0*([[:digit:]]+)(\.cbz)/\1 #\2\3/')
|
||||||
|
|
||||||
|
if [[ "$new_name" != "$original_name" ]]; then
|
||||||
|
announce_changes "$original_name" "$new_name"
|
||||||
|
command mv -n "$(dirname "$file")"/{"$original_name","$new_name"}
|
||||||
|
fi
|
||||||
|
done < <(fd --absolute-path -tf -e cbz '\-[[:space:]]0*[[:digit:]]+' "${root_directories[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check directory existence
|
||||||
|
for dir in "${root_directories[@]}"; do
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "directory doesn't exist... creating $dir"
|
||||||
|
mkdir -vp "$dir"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Fix numbered issues (For migrating from old directory)
|
||||||
|
rename_numbered_files
|
||||||
|
|
||||||
|
# Capitalize Special words
|
||||||
|
words=(special tpb full annual)
|
||||||
|
Words=(Special TPB Full Annual)
|
||||||
|
counter=0
|
||||||
|
for word in "${words[@]}"; do
|
||||||
|
while IFS= read -r file; do
|
||||||
|
new_name=$(newname "$(basename "$file")" "$word" "${Words[$counter]}")
|
||||||
|
echo "Inproper capitalization of the word"
|
||||||
|
gum style --foreground 1 "$word"
|
||||||
|
echo "adjusting it into"
|
||||||
|
gum style --foreground 2 "${Words[$counter]}"
|
||||||
|
announce_changes "$(basename "$file")" "$new_name"
|
||||||
|
command mv -n "$(dirname "$file")"/{"$(basename "$file")","$new_name"}
|
||||||
|
done < <(fd "$word" --absolute-path -tf -s "${root_directories[@]}")
|
||||||
|
counter=$((counter + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Rename Year files
|
||||||
|
# set regex_year_grep "\([[:digit:]]{4}\)"
|
||||||
|
# set regex_year_string "(\()(\d{4})(\))"
|
||||||
|
# rename_directory $regex_year_grep $regex_year_string \$2
|
||||||
|
# rename_file $regex_year_grep $regex_year_string \$2
|
||||||
|
|
||||||
|
# Rename #_ downloads
|
||||||
|
regex_hashtag="#_"
|
||||||
|
rename_directory $regex_hashtag $regex_hashtag "#"
|
||||||
|
rename_file $regex_hashtag $regex_hashtag "#"
|
||||||
|
|
||||||
|
# Rename ~ to :
|
||||||
|
# rename_directory " ~ " " ~ " ": "
|
||||||
|
# rename_file " ~ " " ~ " ": "
|
||||||
|
|
||||||
|
rename_keywords() {
|
||||||
|
# Followed by digit
|
||||||
|
local regex_digit_fd="$1 \d+"
|
||||||
|
local regex_digit="($1 )([[:digit:]]+)"
|
||||||
|
rename_directory "$regex_digit_fd" "$regex_digit" "\1#\2"
|
||||||
|
rename_file "$regex_digit_fd" "$regex_digit" "\1#\2"
|
||||||
|
# Without digit
|
||||||
|
regex="#$1"
|
||||||
|
rename_directory "$regex" "$regex" "$1"
|
||||||
|
rename_file "$regex" "$regex" "$1"
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_keywords TPB
|
||||||
|
rename_keywords Special
|
||||||
|
rename_keywords Annual
|
||||||
|
|
||||||
|
# Rename #Full
|
||||||
|
rename_directory " #Full" " #Full" ""
|
||||||
|
rename_file " #Full" " #Full" ""
|
||||||
|
|
||||||
|
# Rename double space
|
||||||
|
rename_directory " " " " " "
|
||||||
|
rename_file " " " " " "
|
||||||
|
|
||||||
|
# Fix names
|
||||||
|
wrongnames=(
|
||||||
|
"Transformers: Spotlight"
|
||||||
|
"Dr. Stone"
|
||||||
|
i-dont-want-this-kind-of-hero
|
||||||
|
pure-of-heart
|
||||||
|
scoob-and-shag
|
||||||
|
stick-n-poke
|
||||||
|
"Houseki no Kuni"
|
||||||
|
"Gantz E"
|
||||||
|
"Gantz G"
|
||||||
|
)
|
||||||
|
rightname=(
|
||||||
|
"Transformers Spotlight:"
|
||||||
|
"Dr. STONE"
|
||||||
|
"I DON'T WANT THIS KIND OF HERO"
|
||||||
|
"Pure of Heart"
|
||||||
|
"Scoob and Shag"
|
||||||
|
"Stick n' Poke"
|
||||||
|
"Land of the Lustrous"
|
||||||
|
"Gatz:E"
|
||||||
|
"Gantz:G"
|
||||||
|
)
|
||||||
|
counter=0
|
||||||
|
for wrongname in "${wrongnames[@]}"; do
|
||||||
|
rename_directory "$wrongname" "$wrongname" "${rightname[$counter]}"
|
||||||
|
rename_file "$wrongname" "$wrongname" "${rightname[$counter]}"
|
||||||
|
counter=$((counter + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
# Merge TPB (Part X) files
|
||||||
|
while IFS= read -r file; do
|
||||||
|
new_name=$(newname "$(basename "$file" .cbz)" "TPB \(Part [[:digit:]]+\)" TPB)
|
||||||
|
extract_dir=$(realpath "$(dirname "$file")"/"$new_name")
|
||||||
|
if [ ! -d "$extract_dir" ]; then
|
||||||
|
mkdir -p "$extract_dir"
|
||||||
|
fi
|
||||||
|
unzip "$file" -d "$extract_dir"/"$(basename "$file" .cbz)"
|
||||||
|
cd "$extract_dir" || exit
|
||||||
|
zip -r "$(realpath "$(dirname "$file")")"/"$new_name"\.cbz ./
|
||||||
|
trash "$file"
|
||||||
|
trash "$extract_dir"/"$(basename "$file" .cbz)"
|
||||||
|
done < <(fd "Part \d+" --absolute-path -tf -s "${root_directories[@]}")
|
||||||
|
|
||||||
|
fd . --absolute-path -tf -td "${root_directories[@]}" -x chown jawz:kavita {}
|
||||||
|
fd . --absolute-path -tf "${root_directories[@]}" -x chmod 664 {}
|
||||||
|
fd . --absolute-path -td "${root_directories[@]}" -x chmod 775 {}
|
||||||
|
|
||||||
|
fd . --absolute-path -td -te "${root_directories[@]}" -x rmdir {}
|
||||||
59
nix/nextcloud-cronjob.sh
Normal file
59
nix/nextcloud-cronjob.sh
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#!/run/current-system/sw/bin/bash
|
||||||
|
|
||||||
|
# Cron tasks
|
||||||
|
if type /run/current-system/sw/bin/nextcloud-occ 2>/dev/null; then
|
||||||
|
/run/current-system/sw/bin/nextcloud-occ preview:pre-generate
|
||||||
|
# /run/current-system/sw/bin/nextcloud-occ face:background_job -t 900
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sync GDL stuff
|
||||||
|
root=/srv/pool/scrapping
|
||||||
|
|
||||||
|
cd $root || exit
|
||||||
|
set -- Aqp Ghekre
|
||||||
|
for user in "$@"; do
|
||||||
|
originDir=$root/$user
|
||||||
|
destDir=/srv/pool/nextcloud/$user/files/Requested
|
||||||
|
destDirDup=/srv/pool/nextcloud/$user/files/RequestedDupePlzCheckNDel
|
||||||
|
if [ ! -d "$destDir" ]; then
|
||||||
|
echo "$destDir does not exist, creating..."
|
||||||
|
mkdir -p "$destDir"
|
||||||
|
fi
|
||||||
|
cd "$originDir" || exit
|
||||||
|
find . -type f -not -name '*.part' | while read -r file; do
|
||||||
|
destination=$destDir/"$(echo "$file" | sed "s/^\.\///")"
|
||||||
|
destinationDup=$destDirDup/"$(echo "$file" | sed "s/^\.\///")"
|
||||||
|
|
||||||
|
if [ ! -f "$destination" ]; then
|
||||||
|
echo "Safe to move $(basename "$file")"
|
||||||
|
if [ ! -d "$(dirname "$destination")" ]; then
|
||||||
|
echo "Creating parent directory..."
|
||||||
|
mkdir -p "$(dirname "$destination")"
|
||||||
|
fi
|
||||||
|
mv -n "$file" "$destination"
|
||||||
|
else
|
||||||
|
echo "Duplicated encountered $(basename "$file")"
|
||||||
|
if [ ! -d "$(dirname "$destinationDup")" ]; then
|
||||||
|
echo "Creating parent directory..."
|
||||||
|
mkdir -p "$(dirname "$destinationDup")"
|
||||||
|
fi
|
||||||
|
mv -n "$file" "$destinationDup"
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
|
||||||
|
find ./ -mindepth 1 -type d -empty -delete
|
||||||
|
|
||||||
|
chown 987:988 -R "$destDir"
|
||||||
|
find "$destDir" -type d -exec chmod -R 755 {} \;
|
||||||
|
find "$destDir" -type f -exec chmod -R 644 {} \;
|
||||||
|
|
||||||
|
if [ -d "$destDirDup" ]; then
|
||||||
|
chown 987:988 -R "$destDirDup"
|
||||||
|
find "$destDirDup" -type d -exec chmod -R 755 {} \;
|
||||||
|
find "$destDirDup" -type f -exec chmod -R 644 {} \;
|
||||||
|
fi
|
||||||
|
if type /run/current-system/sw/bin/nextcloud-occ 2>/dev/null; then
|
||||||
|
/run/current-system/sw/bin/nextcloud-occ files:scan --all
|
||||||
|
fi
|
||||||
|
done
|
||||||
51
nix/pika-list.sh
Normal file
51
nix/pika-list.sh
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash fd borgbackup gum ripgrep
|
||||||
|
|
||||||
|
BORG_PASSPHRASE=$(gum input --password --placeholder "Type borg password")
|
||||||
|
export BORG_PASSPHRASE
|
||||||
|
|
||||||
|
d_root=$HOME/pika
|
||||||
|
f_string=home/jawz/.config/jawz/lists/jawz/watch.txt
|
||||||
|
d_borg=/srv/pool/backups/pika/lists
|
||||||
|
|
||||||
|
while IFS= read -r repo; do
|
||||||
|
IFS=" " read -r -a array <<<"$repo"
|
||||||
|
repo_id="${array[0]}"
|
||||||
|
mkdir -vp "$d_root/$repo_id" && cd "$d_root/$repo_id" || exit
|
||||||
|
borg extract $d_borg::"$repo_id" $f_string
|
||||||
|
cat "$d_root/$repo_id/$f_string" >>"$d_root/master"
|
||||||
|
done < <(borg list "$d_borg")
|
||||||
|
|
||||||
|
cd "$HOME" || exit
|
||||||
|
|
||||||
|
sort -u "$d_root/master" -o "$d_root/sorted"
|
||||||
|
sort -u "$LW" -o "$LW"
|
||||||
|
|
||||||
|
echo "Current $(wc -l <"$LW") archived $(wc -l <"$d_root/sorted")"
|
||||||
|
|
||||||
|
echo "Missing lines:"
|
||||||
|
diff "$d_root/sorted" "$LW"
|
||||||
|
|
||||||
|
# look for duped lines with different casing
|
||||||
|
echo "Duplicated lines:"
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if ! [ "$line" == "${line,,}" ]; then
|
||||||
|
if rg "${line,,}" <"$LW"; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done <"$LW"
|
||||||
|
|
||||||
|
# delete pika backups
|
||||||
|
if gum confirm "Limpiar pika?"; then
|
||||||
|
command rm -rf "$d_root"
|
||||||
|
while IFS= read -r repo; do
|
||||||
|
IFS=" " read -r -a array <<<"$repo"
|
||||||
|
repo_id="${array[0]}"
|
||||||
|
gum spin --spinner dot --title "Cleaning $repo_id..." -- borg delete $d_borg::"$repo_id"
|
||||||
|
done < <(borg list "$d_borg")
|
||||||
|
else
|
||||||
|
echo "Canceled, no files deleted"
|
||||||
|
fi
|
||||||
|
gum spin --spinner dot --title "Cleaning $repo_id..." -- borg compact "$d_borg"
|
||||||
|
gum spin --spinner dot --title "Cleaning $repo_id..." -- borg compact /srv/pool/backups/pika/home
|
||||||
44
nix/run.sh
Normal file
44
nix/run.sh
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash gnome.zenity rmlint git gum xclip
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
operation=$1
|
||||||
|
else
|
||||||
|
operation=$(gum choose rmlint download git)
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $operation in
|
||||||
|
# onlyfans)
|
||||||
|
# source ~/Development/Python/onlyfans/bin/activate.fish
|
||||||
|
# python ~/Development/Git/OnlyFans/start_ofd.py
|
||||||
|
# deactivate
|
||||||
|
rmlint)
|
||||||
|
rmlint -g --types="duplicates" \
|
||||||
|
--config=sh:handler=clone \
|
||||||
|
/srv/pool/
|
||||||
|
;;
|
||||||
|
download)
|
||||||
|
ENTRY=$(zenity --entry --width=250 --title "Push Manager" \
|
||||||
|
--text="Verify the following entry is correct" \
|
||||||
|
--add-entry="Clipboard:" --entry-text "$(xclip -o -sel clip)")
|
||||||
|
if [ -n "$ENTRY" ]; then
|
||||||
|
# kgx -e "download -u jawz -i '$ENTRY'"
|
||||||
|
kgx -e "ssh miniserver ""download -u jawz -i ""$ENTRY"" "" "
|
||||||
|
else
|
||||||
|
zenity --error --width=250 \
|
||||||
|
--text "Please verify and try again"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
git)
|
||||||
|
git_dir=$HOME/Development/Git
|
||||||
|
while IFS= read -r repo; do
|
||||||
|
if ! [ -d "$repo/.git" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
cd "$repo" || exit
|
||||||
|
gum style --foreground 2 "Updating $(basename "$repo")"
|
||||||
|
git fsck --full
|
||||||
|
git pull
|
||||||
|
done < <(fd . "$git_dir" -td --absolute-path -d 1)
|
||||||
|
;;
|
||||||
|
esac
|
||||||
33
nix/split-dir.sh
Normal file
33
nix/split-dir.sh
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash fd
|
||||||
|
|
||||||
|
before_count=$(fd -tf | wc -l)
|
||||||
|
i=0
|
||||||
|
|
||||||
|
for file in $(fd -d1 -tf -E '*.mp4' -E '*.webm'); do
|
||||||
|
dir_name=$(basename "$(pwd)")_$(printf %03d $((i / $1 + 1)))
|
||||||
|
mkdir -p "$dir_name"
|
||||||
|
mv -i "$file" "$(realpath "$dir_name")"/
|
||||||
|
i=$((i + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(fd -d1 -tf -e webm); do
|
||||||
|
mkdir -p webm
|
||||||
|
mv -i "$file" "$(realpath webm)"/
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $(fd -d1 -tf -e mp4); do
|
||||||
|
mkdir -p videos
|
||||||
|
mv -i "$file" "$(realpath videos)"/
|
||||||
|
done
|
||||||
|
|
||||||
|
after_count=$(fd -tf | wc -l)
|
||||||
|
|
||||||
|
if [[ "$before_count" == "$after_count" ]]; then
|
||||||
|
echo "No file count differences"
|
||||||
|
else
|
||||||
|
echo "Before count: $before_count"
|
||||||
|
echo "After count: $after_count"
|
||||||
|
fi
|
||||||
|
sleep 10
|
||||||
|
exit
|
||||||
29
nix/stream-dl.sh
Normal file
29
nix/stream-dl.sh
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash yt-dlp
|
||||||
|
|
||||||
|
minutes=5
|
||||||
|
time_alive=60
|
||||||
|
sleep_time=$((minutes * 60))
|
||||||
|
loops=$((time_alive / (sleep_time / time_alive)))
|
||||||
|
|
||||||
|
re="[[:space:]]+"
|
||||||
|
echo $1
|
||||||
|
if [[ $1 =~ $re ]]; then
|
||||||
|
read -ra arr <<<"$1"
|
||||||
|
url="https://picarto.tv/${arr[0]}"
|
||||||
|
else
|
||||||
|
url="https://chaturbate.com/$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
save_dir=/srv/pool/glue/stream-dl
|
||||||
|
if [ ! -d "$save_dir" ]; then
|
||||||
|
mkdir -p "$save_dir"
|
||||||
|
fi
|
||||||
|
cd $save_dir || exit
|
||||||
|
|
||||||
|
for i in $(seq 1 1 "$loops"); do
|
||||||
|
waiting_time=$(((i * sleep_time) / time_alive))
|
||||||
|
yt-dlp --hls-use-mpegts --prefer-ffmpeg -o '%(title)s.%(ext)s' "$url"
|
||||||
|
echo "sleeping for $sleep_time seconds… been waiting for $waiting_time minutes"
|
||||||
|
sleep $sleep_time
|
||||||
|
done
|
||||||
186
nix/sub-sync.sh
Executable file
186
nix/sub-sync.sh
Executable file
@ -0,0 +1,186 @@
|
|||||||
|
#!/run/current-system/sw/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
# nix-shell -i bash -p bash fd ripgrep file alass ffmpeg gum
|
||||||
|
|
||||||
|
MEDIA_ROOT=("/srv/pool/multimedia/media/Series" "/srv/pool/multimedia/media/Movies")
|
||||||
|
REPLACE_DIR="/srv/pool/multimedia/media"
|
||||||
|
SUBTITLE_MIRROR="/srv/pool/multimedia/backups/subtitles"
|
||||||
|
RAM_SUB="/dev/shm/sub.srt"
|
||||||
|
|
||||||
|
# BACKUPS SUBTITLES
|
||||||
|
backup_subtitles() {
|
||||||
|
while IFS= read -r subtitle; do
|
||||||
|
echo "backing up $subtitle"
|
||||||
|
dest_dir="$(dirname "$subtitle")"
|
||||||
|
dest_dir="${dest_dir/$REPLACE_DIR/$SUBTITLE_MIRROR}"
|
||||||
|
mkdir -p "$dest_dir"
|
||||||
|
cp "$subtitle" "${subtitle/$REPLACE_DIR/$SUBTITLE_MIRROR}"
|
||||||
|
done < <(fd . -tf -e srt --absolute-path "${MEDIA_ROOT[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
clean_up() {
|
||||||
|
while IFS= read -r directory; do
|
||||||
|
echo "cleaning up $directory"
|
||||||
|
subtitles=()
|
||||||
|
mapfile -d $'\0' subtitles < <(fd . "$directory" -e srt -tf -d 1 -0)
|
||||||
|
|
||||||
|
if [ "${#subtitles[@]}" -lt 2 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
unset base_subtitle
|
||||||
|
unset subtitles_group
|
||||||
|
for subtitle in "${subtitles[@]}"; do
|
||||||
|
group=()
|
||||||
|
mapfile -d $'\0' group < <(fd --fixed-strings \
|
||||||
|
"$(basename "$subtitle" .srt)" "$directory" \
|
||||||
|
-d 1 -tf -0 -e srt)
|
||||||
|
for key in "${!group[@]}"; do
|
||||||
|
if ! echo "${group[$key]}" | rg -P '\.\d{1,2}(\.\w+(-\w+)?)?\.srt' -q; then
|
||||||
|
unset "group[$key]"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ -z "${group[$key]}" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "removing $(basename "$subtitle")"
|
||||||
|
rm "$subtitle"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
done < <(fd . -td --absolute-path "${MEDIA_ROOT[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
rename_languages() {
|
||||||
|
while IFS= read -r file; do
|
||||||
|
base=$(basename "$file" .eng.srt)
|
||||||
|
dir=$(dirname "$file")
|
||||||
|
echo "renaming sub $base"
|
||||||
|
mv "$file" "$dir/$base.$2.srt"
|
||||||
|
done < <(fd . -tf --absolute-path "${MEDIA_ROOT[@]}" -e "$1.srt")
|
||||||
|
}
|
||||||
|
|
||||||
|
sync_subtitles() {
|
||||||
|
while IFS= read -r directory; do
|
||||||
|
echo "scanning for sync $directory"
|
||||||
|
while IFS= read -r subtitle; do
|
||||||
|
echo "processing $subtitle"
|
||||||
|
video=()
|
||||||
|
extension=$(echo "$subtitle" | rg -oP "(\.\w+(-\w+)?)?\.srt")
|
||||||
|
basename="$(basename "$subtitle" "$extension")"
|
||||||
|
mapfile -d $'\0' video < <(fd "$basename" \
|
||||||
|
"$directory" --fixed-strings \
|
||||||
|
-e mkv -e mp4 -e avi -e webm -tf -d 1 -0)
|
||||||
|
|
||||||
|
# skips directory if it contains more than 1 video file
|
||||||
|
# should never get triggered
|
||||||
|
if [ "${#video[@]}" -gt 1 ]; then
|
||||||
|
basename "$(dirname "$directory")"
|
||||||
|
echo "$(basename "$directory") has many video files: ${#video[@]}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# update subtitle in ram
|
||||||
|
if [ -e "$RAM_SUB" ]; then
|
||||||
|
rm "$RAM_SUB"
|
||||||
|
fi
|
||||||
|
cp "$subtitle" "$RAM_SUB"
|
||||||
|
|
||||||
|
if [ ! -e $RAM_SUB ] && [ ! -e "${video[0]}" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "processing...$subtitle"
|
||||||
|
alass-cli "${video[0]}" "$RAM_SUB" "$subtitle"
|
||||||
|
|
||||||
|
done < <(fd . "$directory" -tf -e srt -d 1 --newer "$1")
|
||||||
|
done < <(fd . -td --absolute-path "${MEDIA_ROOT[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
find_dupes() {
|
||||||
|
while IFS= read -r directory; do
|
||||||
|
videos=()
|
||||||
|
mapfile -d $'\0' videos < <(fd . \
|
||||||
|
"$directory" -tf -d 1 -0 \
|
||||||
|
-e mkv -e mp4 -e avi -e webm)
|
||||||
|
|
||||||
|
if [ "${#videos[@]}" == 0 ]; then
|
||||||
|
if [[ "$directory" != *"Season"* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "NO FILES ERROR: $directory"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#videos[@]}" == 1 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${#videos[@]}" -gt 1 ]; then
|
||||||
|
if [[ "$directory" == *"media/Movies"* ]]; then
|
||||||
|
echo "Movie directory has more than a movie"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
for episode in "${videos[@]}"; do
|
||||||
|
episode_number="$(echo "$episode" |
|
||||||
|
rg -oP "S\d+E\d+(-E\d+)? ")"
|
||||||
|
episode_files="$(
|
||||||
|
fd "$episode_number" "$directory" --fixed-strings \
|
||||||
|
-tf -d 1 \
|
||||||
|
-e mkv -e mp4 -e avi -e webm | wc -l
|
||||||
|
)"
|
||||||
|
if [ "$episode_files" == 1 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo ____________________________
|
||||||
|
echo "The episode $episode_number is repeated on"
|
||||||
|
echo "$directory"
|
||||||
|
fd "$episode_number" "$directory" --fixed-strings \
|
||||||
|
-tf -d 1 \
|
||||||
|
-e mkv -e mp4 -e avi -e webm
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
done < <(fd . -td --absolute-path "${MEDIA_ROOT[@]}")
|
||||||
|
}
|
||||||
|
|
||||||
|
fd . /srv/pool/multimedia/media/Series/ --owner jawz -x chown sonarr:piracy {}
|
||||||
|
fd . /srv/pool/multimedia/media/Movies/ --owner jawz -x chown radarr:piracy {}
|
||||||
|
fd . "${MEDIA_ROOT[@]}" -td -x chmod 775 {}
|
||||||
|
fd . "${MEDIA_ROOT[@]}" -tf -x chmod 664 {}
|
||||||
|
|
||||||
|
rename_languages eng en
|
||||||
|
rename_languages spa es
|
||||||
|
rename_languages mx es_MX
|
||||||
|
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
operation=$1
|
||||||
|
else
|
||||||
|
operation=$(gum choose backup clean sync all)
|
||||||
|
fi
|
||||||
|
if [ -n "$2" ]; then
|
||||||
|
start_time=$2
|
||||||
|
else
|
||||||
|
start_time="$(date '+%Y-%m-%d') 00:00:00"
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $operation in
|
||||||
|
backup)
|
||||||
|
backup_subtitles
|
||||||
|
;;
|
||||||
|
clean)
|
||||||
|
clean_up
|
||||||
|
;;
|
||||||
|
sync)
|
||||||
|
sync_subtitles "$start_time"
|
||||||
|
;;
|
||||||
|
dupe)
|
||||||
|
find_dupes
|
||||||
|
;;
|
||||||
|
all)
|
||||||
|
echo "backing up"
|
||||||
|
backup_subtitles
|
||||||
|
echo "cleaning up"
|
||||||
|
clean_up
|
||||||
|
echo "syncing"
|
||||||
|
sync_subtitles "$start_time"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
165
nix/tasks.sh
Executable file
165
nix/tasks.sh
Executable file
@ -0,0 +1,165 @@
|
|||||||
|
#! /usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash trashy fd ripgrep file
|
||||||
|
|
||||||
|
directories=("$HOME/Pictures/To Organize/" "$HOME/Downloads/" "$HOME/Downloads/cache")
|
||||||
|
|
||||||
|
replace_extension() {
|
||||||
|
local file_basename
|
||||||
|
file_basename=$(basename "$1")
|
||||||
|
echo "${file_basename%.*}.$2"
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_random_number() {
|
||||||
|
local min=0
|
||||||
|
local max=9999999999
|
||||||
|
printf "%010d\n" $((min + RANDOM % max))
|
||||||
|
}
|
||||||
|
|
||||||
|
test_name() {
|
||||||
|
local random_number
|
||||||
|
random_number=$(generate_random_number)
|
||||||
|
while (($(fd "$random_number"* "$HOME/Pictures/" "$HOME/Downloads/" -tf | wc -l) > 0)); do
|
||||||
|
echo "Conflicts found, generating a new filename"
|
||||||
|
random_number=$(generate_random_number)
|
||||||
|
echo "$random_number"
|
||||||
|
done
|
||||||
|
echo "$random_number"
|
||||||
|
}
|
||||||
|
|
||||||
|
while IFS= read -r file; do
|
||||||
|
regex_str='source|tenor|media|duckduckgo\.com|giphy|'
|
||||||
|
regex_str+='(?<!app)image|^download|unknown|zoom|'
|
||||||
|
regex_str+='new_canvas|untitled|drawpile|OIG|'
|
||||||
|
regex_str+='imgpsh_'
|
||||||
|
if ! basename "$file" | rg --pcre2 -q "$regex_str"; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
new_name=$(test_name)
|
||||||
|
echo renaming
|
||||||
|
echo "$file"
|
||||||
|
echo into
|
||||||
|
echo "$(dirname "$file")"/"$new_name"
|
||||||
|
echo ---------------
|
||||||
|
command mv -n "$(dirname "$file")"/{"$(basename "$file")","$new_name"}
|
||||||
|
if ! basename "$file" | rg -q 'Screenshot_\d{8}'; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "moving screenshot $file into $HOME/Pictures/Screenshots/"
|
||||||
|
command mv -n "$file" "$HOME/Pictures/Screenshots/"
|
||||||
|
done < <(fd . "${directories[@]}" -d 1 -tf --absolute-path)
|
||||||
|
|
||||||
|
# screenshots=$HOME/Pictures/Screenshots
|
||||||
|
classify_directories=("$HOME/Pictures/Screenshots" "$HOME/Pictures/Photos/Camera")
|
||||||
|
if (($(fd . "${classify_directories[@]}" -tf -d 1 | wc -l) > 0)); then
|
||||||
|
while IFS= read -r file; do
|
||||||
|
date=$(stat -c "%y" "$file" | rg -o "\d{4}-\d{2}-\d{2}")
|
||||||
|
year=$(echo "$date" | rg -o "\d{4}")
|
||||||
|
month=$(echo "$date" | rg -o "\d{4}-\d{2}" | rg -o --pcre2 "(?<=-)\d{2}")
|
||||||
|
parent_dir=$(dirname "$(realpath "$file")")
|
||||||
|
dest_dir=$(realpath "$parent_dir")/$year/$month
|
||||||
|
echo "Moving screenshot $(basename "$file") into $dest_dir"
|
||||||
|
mkdir -vp "$dest_dir"
|
||||||
|
command mv -n "$file" "$dest_dir/"
|
||||||
|
done < <(fd . "${classify_directories[@]}" --absolute-path -tf -d 1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Where steam screenshots are stored, may need to replace with ur ID
|
||||||
|
dir_steam=$XDG_DATA_HOME/Steam/userdata/107446271/760/remote
|
||||||
|
declare -A games
|
||||||
|
# Insert here new games, put between [] the ID of the game
|
||||||
|
# You can find it by visiting the $dir_steam directory
|
||||||
|
# the ID is simply the name of the folder in there.
|
||||||
|
games+=(
|
||||||
|
[386360]=Smite
|
||||||
|
[960090]="Bloons Tower Defense 6"
|
||||||
|
[648800]=Raft
|
||||||
|
[262060]="Darkest Dungeon"
|
||||||
|
[234140]="Mad Max"
|
||||||
|
[433340]="Slime Rancher"
|
||||||
|
[1190460]="Death Stranding"
|
||||||
|
[1850570]="Death Stranding"
|
||||||
|
[440900]="Conan Exiles"
|
||||||
|
[679110]="Werewolf Apocalypse"
|
||||||
|
[2221490]="The Division 2"
|
||||||
|
)
|
||||||
|
|
||||||
|
for key in "${!games[@]}"; do
|
||||||
|
# Modify this to store your screenshots somewhere else
|
||||||
|
dir_dest=$(realpath "$HOME/Pictures/Screenshots/Games")/${games[$key]}
|
||||||
|
dir_game=$(realpath "$dir_steam")/$key/screenshots
|
||||||
|
# If there are not screenshots currently stored, why bother lol
|
||||||
|
if ! [[ -d $dir_game ]]; then #
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# If screenshots exist however...
|
||||||
|
if ! (($(fd . "$dir_game" -d 1 -tf | wc -l) > 0)); then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
# Create destination directory
|
||||||
|
mkdir -vp "$dir_dest"
|
||||||
|
echo "Moving ${games[$key]} screenshots..."
|
||||||
|
fd . "$dir_game" -d 1 -tf -x mv -n {} "$dir_dest"/
|
||||||
|
# Delete thumnnails
|
||||||
|
echo "Deleting ${games[$key]} thumbnails..."
|
||||||
|
rm -rf "$dir_game"/thumbnails
|
||||||
|
done
|
||||||
|
# Clearing up empty directories
|
||||||
|
fd . "$dir_steam" -td -te -x trash {}
|
||||||
|
|
||||||
|
cyberpunk_dir=$HOME/Games/gog/cyberpunk-2077/drive_c/users/jawz/Pictures/"Cyberpunk 2077"
|
||||||
|
if [[ -d $cyberpunk_dir ]]; then
|
||||||
|
while IFS= read -r file; do
|
||||||
|
echo "Moving cyberpunk screenshots $(basename "$file")"
|
||||||
|
command mv -n "$file" "$HOME/Pictures/Screenshots/Games/Cyberpunk 2077/"
|
||||||
|
done < <(fd . "$cyberpunk_dir" -tf)
|
||||||
|
fi
|
||||||
|
|
||||||
|
proton_dir=$HOME/.steam/steam/compatibilitytools.d
|
||||||
|
if [[ -d "$proton_dir" ]]; then
|
||||||
|
while IFS= read -r protonver; do
|
||||||
|
lutrisdir=$XDG_DATA_HOME/lutris/runners/wine/$(basename "$protonver")
|
||||||
|
if [ -d "$lutrisdir" ] && [ -L "$lutrisdir" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "Symlink $lutrisdir doesn't exist, creating link..."
|
||||||
|
ln -s "$(realpath "$protonver")"/files "$lutrisdir"
|
||||||
|
done < <(fd . "$proton_dir" -d 1 -td)
|
||||||
|
fi
|
||||||
|
fd . "$XDG_DATA_HOME/lutris/runners/wine" -d1 -tl -Lx trash {}
|
||||||
|
|
||||||
|
while IFS= read -r file; do
|
||||||
|
ext=$(file --mime-type "$file" | rg -o '\w+$')
|
||||||
|
correct_ext=${ext,,}
|
||||||
|
filename=$(basename -- "$file")
|
||||||
|
current_ext="${filename##*.}"
|
||||||
|
filename="${filename%.*}"
|
||||||
|
if ! echo "$correct_ext" | rg -q 'jpe|jpg|jpeg|png|gif|webp'; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ "$current_ext" == "$correct_ext" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "The file $(basename "$file")" \
|
||||||
|
"will be renamed, the propper extension is $correct_ext"
|
||||||
|
new_name="$filename".$correct_ext
|
||||||
|
if command mv -n "$(dirname "$file")"/{"$(basename "$file")","$new_name"}; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
file_hash="$(sha256sum "$file" | gawk '{ print $1 }')"
|
||||||
|
if ! echo "$file_hash $(dirname "$file")/$new_name" | sha256sum -c; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "deleting duplicated: $file"
|
||||||
|
rm "$file"
|
||||||
|
done < <(fd . "${directories[@]}" -d 1 -tf)
|
||||||
|
|
||||||
|
files_home_clean=(.pki HuionCore.pid DriverUI.pid huion.log)
|
||||||
|
for file in "${files_home_clean[@]}"; do
|
||||||
|
file=$HOME/$file
|
||||||
|
if [ ! -e "$file" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
rm -rf "$file"
|
||||||
|
done
|
||||||
28
nix/update-dns.sh
Executable file
28
nix/update-dns.sh
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash -p bash curl
|
||||||
|
|
||||||
|
function header {
|
||||||
|
echo =============================================
|
||||||
|
echo "$1"
|
||||||
|
echo =============================================
|
||||||
|
}
|
||||||
|
|
||||||
|
ip=$(curl -s -X GET https://checkip.amazonaws.com)
|
||||||
|
header "$ip"
|
||||||
|
header NAMECHEAP
|
||||||
|
|
||||||
|
hostname=@
|
||||||
|
domain=rotehaare.art
|
||||||
|
password="$PASSROTE"
|
||||||
|
base="https://dynamicdns.park-your-domain.com/update"
|
||||||
|
|
||||||
|
if host "$domain" 1.1.1.1 | grep "has address" | grep "$ip"; then
|
||||||
|
echo "$domain is currently set to $ip; no changes needed"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
echo updating "$domain"
|
||||||
|
host="host=$hostname"
|
||||||
|
domain="domain=$domain"
|
||||||
|
password="password=$password"
|
||||||
|
curl "$base?$host&$domain&$password&ip=$ip"
|
||||||
|
echo
|
||||||
11
scripts.nix
Normal file
11
scripts.nix
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
let
|
||||||
|
scriptFiles = builtins.filter (file: builtins.match ".*\\.nix" file != null && file != "base.nix") (
|
||||||
|
builtins.attrNames (builtins.readDir ./scripts)
|
||||||
|
);
|
||||||
|
in
|
||||||
|
map (file: ./scripts/${file}) scriptFiles;
|
||||||
|
my.units.stream-dl.enable = lib.mkDefault false;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user