migrated all scripts + function to generate output

This commit is contained in:
Danilo Reyes 2024-12-14 16:14:53 -06:00
parent c12e26ae7d
commit 171821bc9b
15 changed files with 1037 additions and 8 deletions

View File

@ -2,17 +2,43 @@
description = "Nix flake for the activity logging script";
outputs =
{ nixpkgs, ... }:
{
packages.x86_64-linux =
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
generatePackages =
args:
let
inherit (args) dir ext handler;
in
./${dir}
|> builtins.readDir
|> builtins.attrNames
|> builtins.filter (file: builtins.match ".*\\.${ext}$" file != null)
|> builtins.map (file: rec {
name = builtins.replaceStrings [ ".${ext}" ] [ "" ] file;
value = handler ./${dir}/${file} name;
})
|> builtins.listToAttrs;
in
{
tasks = pkgs.writeScriptBin "tasks" (builtins.readFile ./src/tasks.sh);
download = pkgs.callPackage ./pkgs/download.nix { };
webcomix = pkgs.callPackage ./pkgs/webcomix.nix { };
tuh-activity-logger = pkgs.callPackage ./pkgs/tuh-activity-logger.nix { };
packages.x86_64-linux =
let
scriptBin = path: name: pkgs.writeScriptBin name (builtins.readFile path);
in
generatePackages {
dir = "pkgs";
ext = "nix";
handler = (path: name: pkgs.callPackage path { });
}
// generatePackages {
dir = "src/scripts";
ext = "sh";
handler = scriptBin;
}
// generatePackages {
dir = "src/scripts";
ext = "py";
handler = scriptBin;
};
};
}

View File

@ -6,7 +6,7 @@ in
python3Packages.buildPythonApplication {
inherit pname version;
src = builtins.path {
path = ../../src/tuhmayto/.;
path = ../src/tuhmayto/.;
name = "${pname}-${version}";
};
build-system = [ python3Packages.setuptools ];

View 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
src/scripts/ffmpreg.sh Normal file
View 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

View 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)

61
src/scripts/library-report.sh Executable file
View File

@ -0,0 +1,61 @@
#! /etc/profiles/per-user/jawz/bin/bash
#! nix-shell -i bash -p bash
manga_dir="/srv/pool/multimedia/media/Library/manga/manga"
airing=()
completed=()
update_volumes=()
other=()
categorize_series() {
local series_dir="$1"
local has_ch=false
local has_vol=false
for file in "$series_dir"/*; do
if [[ $(basename "$file") == *"Ch."* ]]; then
has_ch=true
elif [[ $(basename "$file") == *"Vol."* ]]; then
has_vol=true
fi
done
if $has_ch && $has_vol; then
update_volumes+=("$(basename "$series_dir")")
elif $has_ch; then
airing+=("$(basename "$series_dir")")
elif $has_vol; then
completed+=("$(basename "$series_dir")")
else
other+=("$(basename "$series_dir")")
fi
}
for series in "$manga_dir"/*; do
if [ ! -d "$series" ]; then
continue
fi
categorize_series "$series"
done
echo "=== Categorized Manga Series ==="
echo "Airing:"
for series in "${airing[@]}"; do
echo " - $series"
done
echo "Completed:"
for series in "${completed[@]}"; do
echo " - $series"
done
echo "Update Volumes:"
for series in "${update_volumes[@]}"; do
echo " - $series"
done
echo "Other:"
for series in "${other[@]}"; do
echo " - $series"
done

View File

@ -0,0 +1,224 @@
#! /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/manga
/srv/pool/multimedia/media/Library/manga/webtoons
/srv/pool/multimedia/media/Library/manga/español
/srv/pool/multimedia/media/Library/webtoons
)
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[@]}")
webtoon_mangas=(
"Solo Leveling: Ragnarok"
"Solo Leveling"
"All Saints Street"
"God of Blackfield"
"The Non-Ability Fighter"
"Red Storm"
"Hardcore Leveling Warrior"
)
manga_dir=/srv/pool/multimedia/media/Library/manga/manga
webtoons_dir=/srv/pool/multimedia/media/Library/manga/webtoons
errors_dir=/srv/pool/multimedia/media/Library/manga/errors
for webtoon_manga in "${webtoon_mangas[@]}"; do
if [ ! -d "$webtoons_dir/$webtoon_manga" ]; then
fd "$webtoon_manga" -td --max-depth 1 -s \
"$manga_dir" -x mv -n {} "$webtoons_dir"/
else
fd "$webtoon_manga" -tf --min-depth 2 -s \
"$manga_dir" -e cbz -x mv -n {} "$webtoons_dir/$webtoon_manga"
fi
done
if [ ! -d "$errors_dir" ]; then
mkdir -p "$errors_dir"
fi
for directory in "${root_directories[@]}"; do
fd . -td --min-depth 2 -s \
"$directory" -x mv -n {} "$errors_dir/{/}"
done
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 {}

View 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
src/scripts/pika-list.sh Normal file
View 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

40
src/scripts/run.sh Normal file
View File

@ -0,0 +1,40 @@
#! /usr/bin/env nix-shell
#! nix-shell -i bash -p bash zenity rmlint git gum xclip
if [ -n "$1" ]; then
operation=$1
else
operation=$(gum choose rmlint download git)
fi
case $operation in
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
src/scripts/split-dir.sh Normal file
View 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
src/scripts/stream-dl.sh Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bash yt-dlp curl-impersonate
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
src/scripts/sub-sync.sh Executable file
View 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

33
src/scripts/update-dns.sh Executable file
View File

@ -0,0 +1,33 @@
#!/usr/bin/env nix-shell
#! nix-shell -i bash -p bash curl
function header {
echo =============================================
echo "$1"
echo =============================================
}
function update {
hostname=@
domain=$1
password=$2
ip=$3
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
}
ip=$(curl -s -X GET https://checkip.amazonaws.com)
header "$ip"
header NAMECHEAP
update rotehaare.art "$PASSROTE" "$ip"
update danilo-reyes.com "$PASSDANILO" "$ip"