From e5109b1f9b43cacb8dad4f67837c404b284bb520 Mon Sep 17 00:00:00 2001 From: Joey Hafner Date: Mon, 28 Oct 2024 17:59:37 -0700 Subject: [PATCH] #19 Delete archive. Version control is my archive --- archive/5etools_on_oracle_cloud/.env | 2 - archive/5etools_on_oracle_cloud/README.md | 77 --- .../docker-compose.yml | 29 - .../5etools_on_oracle_cloud/ingress_rules.PNG | Bin 31984 -> 0 bytes archive/5etools_on_oracle_cloud/setup.sh | 7 - archive/5etools_on_oracle_cloud/traefik.toml | 18 - archive/PyClipIt/UsefulCommands.md | 19 - archive/PyClipIt/clip.code-workspace | 7 - archive/PyClipIt/main.py | 262 -------- archive/PyClipIt/preview.py | 35 - archive/PyClipIt/probe.py | 43 -- archive/PyClipIt/requirements.txt | 6 - archive/PyClipIt/test.py | 21 - archive/docker_config/arr/.env | 3 - archive/docker_config/arr/docker-compose.yml | 82 --- archive/docker_config/calibre-web/.env | 1 - .../calibre-web/docker-compose.yml | 40 -- .../cloudflare-ddns/docker-compose.yml | 12 - archive/docker_config/drawio/.env | 1 - .../docker_config/drawio/docker-compose.yml | 74 -- archive/docker_config/git_update.sh | 5 - archive/docker_config/grafana-stack/.env | 2 - .../grafana-stack/.forgetps.json | 1 - .../grafana-stack/docker-compose.yml | 63 -- .../docker_config/grafana-stack/grafana.ini | 622 ----------------- .../docker_config/grafana-stack/influxdb.conf | 305 --------- .../grafana-stack/scripts/diskstatus.sh | 19 - .../grafana-stack/scripts/forgepc.sh | 3 - .../grafana-stack/scripts/forgetps-to-json.sh | 19 - .../docker_config/grafana-stack/telegraf.conf | 32 - archive/docker_config/joplin/.env | 12 - .../docker_config/joplin/docker-compose.yml | 34 - archive/docker_config/landing/.env | 2 - .../docker_config/landing/docker-compose.yml | 46 -- .../landing/docker-php-memlimit.ini | 1 - .../mc-monitor/docker-compose.yml | 18 - .../docker_config/mc-monitor/telegraf.conf | 9 - archive/docker_config/minecraft/.env | 3 - archive/docker_config/minecraft/e6-056.yml | 23 - archive/docker_config/minecraft/router.yml | 17 - archive/docker_config/minecraft/telegraf.conf | 21 - archive/docker_config/minecraft/vanilla.yml | 18 - archive/docker_config/nvgm/.env | 2 - archive/docker_config/nvgm/docker-compose.yml | 45 -- archive/docker_config/peertube/.env | 51 -- .../docker_config/peertube/docker-compose.yml | 70 -- archive/docker_config/plex/.env | 1 - archive/docker_config/plex/docker-compose.yml | 53 -- archive/docker_config/portainer/.env | 0 .../portainer/docker-compose.yml | 24 - archive/docker_config/portfolio/.env | 2 - .../portfolio/docker-compose.yml | 45 -- archive/docker_config/prometheus/.env | 0 .../prometheus/docker-compose.yml | 45 -- .../docker_config/prometheus/prometheus.yml | 28 - archive/docker_config/traefik/.env | 0 archive/docker_config/traefik/acme.json | 380 ----------- .../traefik/authelia/configuration.yml | 59 -- .../docker_config/traefik/docker-compose.yml | 58 -- archive/docker_config/traefik/labels.txt | 8 - archive/docker_config/traefik/traefik.toml | 28 - .../traefik/traefik_dynamic.toml | 18 - .../unifi_controller/docker-compose.yml | 23 - .../uptime-kuma/docker-compose.yml | 21 - archive/docker_config/vaultwarden/.env | 1 - .../vaultwarden/docker-compose.yml | 17 - archive/docker_config/wikijs/.env | 1 - .../docker_config/wikijs/docker-compose.yml | 48 -- .../wireguard/config/.donoteditthisfile | 6 - .../wireguard/config/coredns/Corefile | 4 - .../peer_joey-phone/peer_joey-phone.conf | 10 - .../peer_joey-phone/peer_joey-phone.png | Bin 1013 -> 0 bytes .../privatekey-peer_joey-phone | 1 - .../peer_joey-phone/publickey-peer_joey-phone | 1 - .../peer_joey-xps13/peer_joey-xps13.conf | 10 - .../peer_joey-xps13/peer_joey-xps13.png | Bin 1012 -> 0 bytes .../privatekey-peer_joey-xps13 | 1 - .../peer_joey-xps13/publickey-peer_joey-xps13 | 1 - .../peer_maddie-phone/peer_maddie-phone.conf | 10 - .../peer_maddie-phone/peer_maddie-phone.png | Bin 1021 -> 0 bytes .../privatekey-peer_maddie-phone | 1 - .../publickey-peer_maddie-phone | 1 - .../wireguard/config/server/privatekey-server | 1 - .../wireguard/config/server/publickey-server | 1 - .../wireguard/config/templates/peer.conf | 10 - .../wireguard/config/templates/server.conf | 6 - .../docker_config/wireguard/config/wg0.conf | 22 - .../wireguard/docker-compose.yml | 23 - archive/doradash/API.md | 25 - archive/doradash/README.Docker.md | 22 - archive/doradash/app/main.py | 120 ---- archive/doradash/app/main_test.py | 18 - archive/doradash/requirements.txt | 4 - archive/doradash/test_deployments.sh | 6 - archive/doradash/test_service_events.sh | 11 - archive/dotfiles/.gitconfig | 25 - archive/dotfiles/.profile_img.webp | Bin 5306 -> 0 bytes archive/dotfiles/README.md | 0 .../dotfiles/config/goxlr/Default - Red.goxlr | Bin 30790 -> 0 bytes .../config/goxlr/Default - Teal Blue.goxlr | Bin 30413 -> 0 bytes .../config/goxlr/Default - Vaporwave.goxlr | Bin 30486 -> 0 bytes archive/dotfiles/config/goxlr/Default.goxlr | Bin 30938 -> 0 bytes archive/dotfiles/config/goxlr/GoXLR.service | 9 - archive/dotfiles/config/goxlr/Joey.goxlr | Bin 8835 -> 0 bytes archive/dotfiles/config/goxlr/Sleep.goxlr | Bin 28006 -> 0 bytes archive/dotfiles/config/kzones/layouts.json | 86 --- archive/dotfiles/config/tabby/tabby.yaml | 634 ------------------ archive/dotfiles/config/vscode/shellinit.sh | 334 --------- .../config/vscodium/continue.config.json | 90 --- .../config/vscodium/user.settings.json | 65 -- .../config/wooting/wooting-udev.rules | 27 - .../profiles/AV1_1440p120_CBR_15M/basic.ini | 139 ---- .../AV1_1440p120_CBR_15M/recordEncoder.json | 1 - .../recordEncoder.json.bak | 1 - .../AV1_1440p120_CBR_15M/service.json | 1 - .../AV1_1440p120_CBR_15M/streamEncoder.json | 1 - .../streamEncoder.json.bak | 1 - .../profiles/AV1_1440p60_CBR_15M/basic.ini | 142 ---- .../AV1_1440p60_CBR_15M/recordEncoder.json | 1 - .../recordEncoder.json.bak | 1 - .../profiles/AV1_1440p60_CBR_15M/service.json | 1 - .../AV1_1440p60_CBR_15M/streamEncoder.json | 1 - .../streamEncoder.json.bak | 1 - .../basic/profiles/H264_Testing/basic.ini | 140 ---- .../profiles/H264_Testing/recordEncoder.json | 1 - .../H264_Testing/recordEncoder.json.bak | 1 - .../basic/profiles/H264_Testing/service.json | 1 - .../profiles/H264_Testing/streamEncoder.json | 1 - .../H264_Testing/streamEncoder.json.bak | 1 - .../basic.ini | 143 ---- .../recordEncoder.json | 1 - .../recordEncoder.json.bak | 1 - .../service.json | 1 - .../service.json.bak | 1 - .../streamEncoder.json | 1 - .../streamEncoder.json.bak | 1 - .../Testing_High_Refresh_Rate/basic.ini | 145 ---- .../recordEncoder.json | 1 - .../recordEncoder.json.bak | 1 - .../Testing_High_Refresh_Rate/service.json | 1 - .../streamEncoder.json | 1 - .../streamEncoder.json.bak | 1 - .../basic/profiles/UHF_240/basic.ini | 140 ---- .../basic/profiles/UHF_240/recordEncoder.json | 1 - .../profiles/UHF_240/recordEncoder.json.bak | 1 - .../basic/profiles/UHF_240/service.json | 1 - .../basic/profiles/UHF_240/streamEncoder.json | 1 - .../profiles/UHF_240/streamEncoder.json.bak | 1 - .../obs-studio/basic/profiles/VHS/basic.ini | 46 -- .../basic/profiles/VHS/recordEncoder.json | 1 - .../basic/profiles/VHS/recordEncoder.json.bak | 1 - .../basic/profiles/VirtualCam/basic.ini | 12 - .../obs-studio/basic/scenes/Default.json | 1 - .../obs-studio/basic/scenes/Default.json.bak | 1 - .../obs-studio/basic/scenes/Fedora.json | 1 - .../obs-studio/basic/scenes/Fedora.json.bak | 1 - .../obs-studio/basic/scenes/Overwatch.json | 1 - .../basic/scenes/Overwatch.json.bak | 1 - .../basic/scenes/Troubleshooting.json | 1 - .../basic/scenes/Troubleshooting.json.bak | 1 - .../obs-studio/basic/scenes/Untitled.json | 1 - .../obs-studio/basic/scenes/Untitled.json.bak | 1 - .../dotfiles/obs-studio/basic/scenes/VHS.json | 1 - .../obs-studio/basic/scenes/VHS.json.bak | 1 - archive/dotfiles/obs-studio/global.ini | 86 --- .../servicemenus/video-scripts.desktop | 43 -- .../setup-scripts/fedora-install-docker.sh | 13 - .../setup-scripts/fedora-install-flatpaks.sh | 15 - .../fedora-install-multimedia-packages.sh | 6 - .../setup-scripts/fedora-install-obs.sh | 9 - .../setup-scripts/fedora-install-razer.sh | 6 - .../setup-scripts/fedora-install-vscode.sh | 12 - .../setup-scripts/fedora-install-zsh.sh | 29 - .../setup-scripts/fedora-setup-goxlr.sh | 16 - .../setup-scripts/install-utility-scripts.sh | 14 - archive/dotfiles/setup-scripts/wooting.sh | 1 - archive/dotfiles/shell/.aliases | 80 --- archive/dotfiles/shell/.bashrc | 10 - archive/dotfiles/shell/.shellrc | 6 - archive/dotfiles/shell/.zshrc | 71 -- archive/dotfiles/sieve/README.md | 3 - archive/dotfiles/sieve/compose_all.sh | 7 - archive/dotfiles/sieve/important_compose.sh | 14 - archive/dotfiles/sieve/important_domains.txt | 18 - archive/dotfiles/sieve/important_script.txt | 47 -- archive/dotfiles/sieve/promotions_compose.sh | 16 - archive/dotfiles/sieve/promotions_domains.txt | 120 ---- archive/dotfiles/sieve/promotions_script.txt | 13 - archive/dotfiles/sieve/receipts_compose.sh | 14 - archive/dotfiles/sieve/receipts_script.txt | 12 - archive/dotfiles/sieve/receipts_subjects.txt | 7 - archive/dotfiles/sieve/socials_compose.sh | 14 - archive/dotfiles/sieve/socials_domains.txt | 9 - archive/dotfiles/sieve/socials_script.txt | 13 - .../dotfiles/sieve/subscriptions_compose.sh | 14 - .../dotfiles/sieve/subscriptions_domains.txt | 34 - .../dotfiles/sieve/subscriptions_script.txt | 13 - archive/dotfiles/utility-scripts/ffmpeg/clip | 69 -- .../ffmpeg/clip-it-and-ship-it | 98 --- .../utility-scripts/ffmpeg/convert-to-av1 | 31 - .../utility-scripts/ffmpeg/convert-to-mp4 | 32 - .../utility-scripts/ffmpeg/convert-to-x264 | 43 -- .../utility-scripts/ffmpeg/quick-ffmpeg | 43 -- .../utility-scripts/ffmpeg/send-to-zipline | 35 - .../obs-studio/recording-toggle.py | 21 - .../qbittorrent/qbt-add-new.sh | 22 - archive/gitea/.env | 1 - archive/gitea/config.yaml | 99 --- archive/gitea/docker-compose.yml | 13 - archive/gitea/runner-ubuntu-internal.env | 4 - archive/jafner-dev/.env | 1 - archive/jafner-dev/db.env | 6 - archive/jafner-dev/docker-compose.yml | 42 -- archive/jafner-dev/jafner-dev.env | 7 - archive/jellyfin/.env | 3 - archive/jellyfin/docker-compose.yml | 24 - archive/jellyfin/jellyfin.env | 3 - archive/megan-portfolio/.env | 1 - archive/megan-portfolio/docker-compose.yml | 39 -- .../megan-portfolio/megan-portfolio-db.env | 4 - archive/megan-portfolio/megan-portfolio.env | 4 - archive/megan-portfolio/upload.ini | 5 - archive/nginx/docker-compose.yml | 14 - archive/nixos-anywhere/configuration.nix | 20 - archive/nixos-anywhere/disk-config.nix | 55 -- archive/nixos-anywhere/flake.lock | 48 -- archive/nixos-anywhere/flake.nix | 65 -- .../nixos-anywhere/hardware-configuration.nix | 25 - archive/nixos-anywhere/notes.md | 374 ----------- archive/nvgm/README.md | 7 - .../campaign-and-character-progression.md | 85 --- .../xp-and-party-loot-by-level.csv | 23 - archive/nvgm/the-three-pillars-of-gming.md | 46 -- archive/pamidi/README.md | 65 -- archive/pamidi/install_daemon_systemd.sh | 14 - archive/pamidi/pamidi.service | 9 - archive/pamidi/pamidi.sh | 395 ----------- .../self-hosting/5etools/docker-compose.yml | 17 - archive/self-hosting/README.md | 3 - .../self-hosting/archivy/docker-compose.yml | 0 .../self-hosting/bookstack/docker-compose.yml | 46 -- .../self-hosting/calibre/docker-compose.yml | 17 - .../self-hosting/grafana/docker-compose.yml | 15 - .../self-hosting/heimdall/docker-compose.yml | 23 - .../self-hosting/iperf3/docker-compose.yml | 8 - .../mc-enigmatica2-server/docker-compose.yml | 11 - .../self-hosting/pihole/docker-compose.yml | 28 - archive/self-hosting/plex/docker-compose.yml | 17 - .../self-hosting/portainer/docker-compose.yml | 22 - .../self-hosting/traefik/docker-compose.yml | 24 - archive/self-hosting/traefik/traefik.toml | 38 -- .../self-hosting/traefik2/docker-compose.yml | 19 - archive/self-hosting/traefik2/traefik.yml | 6 - .../self-hosting/wireguard/docker-compose.yml | 26 - .../wordpress/nvgm/docker-compose.yml | 42 -- .../wordpress/portfolio/docker-compose.yml | 42 -- archive/silver-hand/README.md | 3 - archive/silver-hand/certmanager.tf | 60 -- archive/silver-hand/cloudflare.tf | 13 - archive/silver-hand/nginx-test.tf | 120 ---- archive/silver-hand/silver-hand.tf | 72 -- archive/silver-hand/traefik.tf | 49 -- archive/wiki/dns-diagram.png | Bin 55047 -> 0 bytes archive/wiki/grafana.png | Bin 216443 -> 0 bytes archive/wiki/home.md | 41 -- archive/wiki/network/dns-diagram.md | 12 - 266 files changed, 9033 deletions(-) delete mode 100644 archive/5etools_on_oracle_cloud/.env delete mode 100644 archive/5etools_on_oracle_cloud/README.md delete mode 100644 archive/5etools_on_oracle_cloud/docker-compose.yml delete mode 100644 archive/5etools_on_oracle_cloud/ingress_rules.PNG delete mode 100644 archive/5etools_on_oracle_cloud/setup.sh delete mode 100644 archive/5etools_on_oracle_cloud/traefik.toml delete mode 100644 archive/PyClipIt/UsefulCommands.md delete mode 100644 archive/PyClipIt/clip.code-workspace delete mode 100755 archive/PyClipIt/main.py delete mode 100644 archive/PyClipIt/preview.py delete mode 100644 archive/PyClipIt/probe.py delete mode 100644 archive/PyClipIt/requirements.txt delete mode 100644 archive/PyClipIt/test.py delete mode 100644 archive/docker_config/arr/.env delete mode 100644 archive/docker_config/arr/docker-compose.yml delete mode 100644 archive/docker_config/calibre-web/.env delete mode 100644 archive/docker_config/calibre-web/docker-compose.yml delete mode 100644 archive/docker_config/cloudflare-ddns/docker-compose.yml delete mode 100644 archive/docker_config/drawio/.env delete mode 100644 archive/docker_config/drawio/docker-compose.yml delete mode 100755 archive/docker_config/git_update.sh delete mode 100644 archive/docker_config/grafana-stack/.env delete mode 100644 archive/docker_config/grafana-stack/.forgetps.json delete mode 100644 archive/docker_config/grafana-stack/docker-compose.yml delete mode 100644 archive/docker_config/grafana-stack/grafana.ini delete mode 100644 archive/docker_config/grafana-stack/influxdb.conf delete mode 100755 archive/docker_config/grafana-stack/scripts/diskstatus.sh delete mode 100755 archive/docker_config/grafana-stack/scripts/forgepc.sh delete mode 100755 archive/docker_config/grafana-stack/scripts/forgetps-to-json.sh delete mode 100644 archive/docker_config/grafana-stack/telegraf.conf delete mode 100644 archive/docker_config/joplin/.env delete mode 100644 archive/docker_config/joplin/docker-compose.yml delete mode 100644 archive/docker_config/landing/.env delete mode 100644 archive/docker_config/landing/docker-compose.yml delete mode 100644 archive/docker_config/landing/docker-php-memlimit.ini delete mode 100644 archive/docker_config/mc-monitor/docker-compose.yml delete mode 100644 archive/docker_config/mc-monitor/telegraf.conf delete mode 100644 archive/docker_config/minecraft/.env delete mode 100644 archive/docker_config/minecraft/e6-056.yml delete mode 100644 archive/docker_config/minecraft/router.yml delete mode 100644 archive/docker_config/minecraft/telegraf.conf delete mode 100644 archive/docker_config/minecraft/vanilla.yml delete mode 100644 archive/docker_config/nvgm/.env delete mode 100644 archive/docker_config/nvgm/docker-compose.yml delete mode 100644 archive/docker_config/peertube/.env delete mode 100644 archive/docker_config/peertube/docker-compose.yml delete mode 100644 archive/docker_config/plex/.env delete mode 100644 archive/docker_config/plex/docker-compose.yml delete mode 100644 archive/docker_config/portainer/.env delete mode 100644 archive/docker_config/portainer/docker-compose.yml delete mode 100644 archive/docker_config/portfolio/.env delete mode 100644 archive/docker_config/portfolio/docker-compose.yml delete mode 100644 archive/docker_config/prometheus/.env delete mode 100644 archive/docker_config/prometheus/docker-compose.yml delete mode 100644 archive/docker_config/prometheus/prometheus.yml delete mode 100644 archive/docker_config/traefik/.env delete mode 100644 archive/docker_config/traefik/acme.json delete mode 100644 archive/docker_config/traefik/authelia/configuration.yml delete mode 100644 archive/docker_config/traefik/docker-compose.yml delete mode 100644 archive/docker_config/traefik/labels.txt delete mode 100644 archive/docker_config/traefik/traefik.toml delete mode 100644 archive/docker_config/traefik/traefik_dynamic.toml delete mode 100644 archive/docker_config/unifi_controller/docker-compose.yml delete mode 100644 archive/docker_config/uptime-kuma/docker-compose.yml delete mode 100644 archive/docker_config/vaultwarden/.env delete mode 100644 archive/docker_config/vaultwarden/docker-compose.yml delete mode 100644 archive/docker_config/wikijs/.env delete mode 100644 archive/docker_config/wikijs/docker-compose.yml delete mode 100644 archive/docker_config/wireguard/config/.donoteditthisfile delete mode 100644 archive/docker_config/wireguard/config/coredns/Corefile delete mode 100644 archive/docker_config/wireguard/config/peer_joey-phone/peer_joey-phone.conf delete mode 100644 archive/docker_config/wireguard/config/peer_joey-phone/peer_joey-phone.png delete mode 100644 archive/docker_config/wireguard/config/peer_joey-phone/privatekey-peer_joey-phone delete mode 100644 archive/docker_config/wireguard/config/peer_joey-phone/publickey-peer_joey-phone delete mode 100644 archive/docker_config/wireguard/config/peer_joey-xps13/peer_joey-xps13.conf delete mode 100644 archive/docker_config/wireguard/config/peer_joey-xps13/peer_joey-xps13.png delete mode 100644 archive/docker_config/wireguard/config/peer_joey-xps13/privatekey-peer_joey-xps13 delete mode 100644 archive/docker_config/wireguard/config/peer_joey-xps13/publickey-peer_joey-xps13 delete mode 100644 archive/docker_config/wireguard/config/peer_maddie-phone/peer_maddie-phone.conf delete mode 100644 archive/docker_config/wireguard/config/peer_maddie-phone/peer_maddie-phone.png delete mode 100644 archive/docker_config/wireguard/config/peer_maddie-phone/privatekey-peer_maddie-phone delete mode 100644 archive/docker_config/wireguard/config/peer_maddie-phone/publickey-peer_maddie-phone delete mode 100644 archive/docker_config/wireguard/config/server/privatekey-server delete mode 100644 archive/docker_config/wireguard/config/server/publickey-server delete mode 100644 archive/docker_config/wireguard/config/templates/peer.conf delete mode 100644 archive/docker_config/wireguard/config/templates/server.conf delete mode 100644 archive/docker_config/wireguard/config/wg0.conf delete mode 100644 archive/docker_config/wireguard/docker-compose.yml delete mode 100644 archive/doradash/API.md delete mode 100644 archive/doradash/README.Docker.md delete mode 100644 archive/doradash/app/main.py delete mode 100644 archive/doradash/app/main_test.py delete mode 100644 archive/doradash/requirements.txt delete mode 100755 archive/doradash/test_deployments.sh delete mode 100755 archive/doradash/test_service_events.sh delete mode 100644 archive/dotfiles/.gitconfig delete mode 100644 archive/dotfiles/.profile_img.webp delete mode 100644 archive/dotfiles/README.md delete mode 100644 archive/dotfiles/config/goxlr/Default - Red.goxlr delete mode 100644 archive/dotfiles/config/goxlr/Default - Teal Blue.goxlr delete mode 100644 archive/dotfiles/config/goxlr/Default - Vaporwave.goxlr delete mode 100644 archive/dotfiles/config/goxlr/Default.goxlr delete mode 100644 archive/dotfiles/config/goxlr/GoXLR.service delete mode 100644 archive/dotfiles/config/goxlr/Joey.goxlr delete mode 100644 archive/dotfiles/config/goxlr/Sleep.goxlr delete mode 100644 archive/dotfiles/config/kzones/layouts.json delete mode 100644 archive/dotfiles/config/tabby/tabby.yaml delete mode 100644 archive/dotfiles/config/vscode/shellinit.sh delete mode 100644 archive/dotfiles/config/vscodium/continue.config.json delete mode 100644 archive/dotfiles/config/vscodium/user.settings.json delete mode 100644 archive/dotfiles/config/wooting/wooting-udev.rules delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/recordEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/service.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/streamEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p120_CBR_15M/streamEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/recordEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/service.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/streamEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/AV1_1440p60_CBR_15M/streamEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/recordEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/service.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/streamEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/H264_Testing/streamEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/recordEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/service.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/service.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/streamEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Record_AV1_1440p60_CBR_8M__Stream_H264_1080p60_CBR_6M/streamEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/recordEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/service.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/streamEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/Testing_High_Refresh_Rate/streamEncoder.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/UHF_240/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/UHF_240/recordEncoder.json delete mode 100644 archive/dotfiles/obs-studio/basic/profiles/UHF_240/recordEncoder.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/UHF_240/service.json delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/UHF_240/streamEncoder.json delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/UHF_240/streamEncoder.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/VHS/basic.ini delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/VHS/recordEncoder.json delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/VHS/recordEncoder.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/profiles/VirtualCam/basic.ini delete mode 100644 archive/dotfiles/obs-studio/basic/scenes/Default.json delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/Default.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/scenes/Fedora.json delete mode 100644 archive/dotfiles/obs-studio/basic/scenes/Fedora.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/Overwatch.json delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/Overwatch.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/Troubleshooting.json delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/Troubleshooting.json.bak delete mode 100644 archive/dotfiles/obs-studio/basic/scenes/Untitled.json delete mode 100644 archive/dotfiles/obs-studio/basic/scenes/Untitled.json.bak delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/VHS.json delete mode 100755 archive/dotfiles/obs-studio/basic/scenes/VHS.json.bak delete mode 100644 archive/dotfiles/obs-studio/global.ini delete mode 100644 archive/dotfiles/servicemenus/video-scripts.desktop delete mode 100755 archive/dotfiles/setup-scripts/fedora-install-docker.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-install-flatpaks.sh delete mode 100755 archive/dotfiles/setup-scripts/fedora-install-multimedia-packages.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-install-obs.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-install-razer.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-install-vscode.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-install-zsh.sh delete mode 100644 archive/dotfiles/setup-scripts/fedora-setup-goxlr.sh delete mode 100755 archive/dotfiles/setup-scripts/install-utility-scripts.sh delete mode 100644 archive/dotfiles/setup-scripts/wooting.sh delete mode 100644 archive/dotfiles/shell/.aliases delete mode 100644 archive/dotfiles/shell/.bashrc delete mode 100644 archive/dotfiles/shell/.shellrc delete mode 100644 archive/dotfiles/shell/.zshrc delete mode 100644 archive/dotfiles/sieve/README.md delete mode 100755 archive/dotfiles/sieve/compose_all.sh delete mode 100755 archive/dotfiles/sieve/important_compose.sh delete mode 100644 archive/dotfiles/sieve/important_domains.txt delete mode 100644 archive/dotfiles/sieve/important_script.txt delete mode 100755 archive/dotfiles/sieve/promotions_compose.sh delete mode 100644 archive/dotfiles/sieve/promotions_domains.txt delete mode 100644 archive/dotfiles/sieve/promotions_script.txt delete mode 100755 archive/dotfiles/sieve/receipts_compose.sh delete mode 100644 archive/dotfiles/sieve/receipts_script.txt delete mode 100644 archive/dotfiles/sieve/receipts_subjects.txt delete mode 100755 archive/dotfiles/sieve/socials_compose.sh delete mode 100644 archive/dotfiles/sieve/socials_domains.txt delete mode 100644 archive/dotfiles/sieve/socials_script.txt delete mode 100755 archive/dotfiles/sieve/subscriptions_compose.sh delete mode 100644 archive/dotfiles/sieve/subscriptions_domains.txt delete mode 100644 archive/dotfiles/sieve/subscriptions_script.txt delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/clip delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/clip-it-and-ship-it delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/convert-to-av1 delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/convert-to-mp4 delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/convert-to-x264 delete mode 100644 archive/dotfiles/utility-scripts/ffmpeg/quick-ffmpeg delete mode 100755 archive/dotfiles/utility-scripts/ffmpeg/send-to-zipline delete mode 100755 archive/dotfiles/utility-scripts/obs-studio/recording-toggle.py delete mode 100644 archive/dotfiles/utility-scripts/qbittorrent/qbt-add-new.sh delete mode 100644 archive/gitea/.env delete mode 100644 archive/gitea/config.yaml delete mode 100644 archive/gitea/docker-compose.yml delete mode 100644 archive/gitea/runner-ubuntu-internal.env delete mode 100644 archive/jafner-dev/.env delete mode 100644 archive/jafner-dev/db.env delete mode 100644 archive/jafner-dev/docker-compose.yml delete mode 100644 archive/jafner-dev/jafner-dev.env delete mode 100644 archive/jellyfin/.env delete mode 100644 archive/jellyfin/docker-compose.yml delete mode 100644 archive/jellyfin/jellyfin.env delete mode 100644 archive/megan-portfolio/.env delete mode 100644 archive/megan-portfolio/docker-compose.yml delete mode 100644 archive/megan-portfolio/megan-portfolio-db.env delete mode 100644 archive/megan-portfolio/megan-portfolio.env delete mode 100644 archive/megan-portfolio/upload.ini delete mode 100644 archive/nginx/docker-compose.yml delete mode 100644 archive/nixos-anywhere/configuration.nix delete mode 100644 archive/nixos-anywhere/disk-config.nix delete mode 100644 archive/nixos-anywhere/flake.lock delete mode 100644 archive/nixos-anywhere/flake.nix delete mode 100644 archive/nixos-anywhere/hardware-configuration.nix delete mode 100644 archive/nixos-anywhere/notes.md delete mode 100644 archive/nvgm/README.md delete mode 100644 archive/nvgm/campaign-and-character-progression.md delete mode 100644 archive/nvgm/campaign-and-character-progression/xp-and-party-loot-by-level.csv delete mode 100644 archive/nvgm/the-three-pillars-of-gming.md delete mode 100644 archive/pamidi/README.md delete mode 100755 archive/pamidi/install_daemon_systemd.sh delete mode 100644 archive/pamidi/pamidi.service delete mode 100755 archive/pamidi/pamidi.sh delete mode 100644 archive/self-hosting/5etools/docker-compose.yml delete mode 100644 archive/self-hosting/README.md delete mode 100644 archive/self-hosting/archivy/docker-compose.yml delete mode 100755 archive/self-hosting/bookstack/docker-compose.yml delete mode 100755 archive/self-hosting/calibre/docker-compose.yml delete mode 100644 archive/self-hosting/grafana/docker-compose.yml delete mode 100644 archive/self-hosting/heimdall/docker-compose.yml delete mode 100644 archive/self-hosting/iperf3/docker-compose.yml delete mode 100644 archive/self-hosting/mc-enigmatica2-server/docker-compose.yml delete mode 100644 archive/self-hosting/pihole/docker-compose.yml delete mode 100755 archive/self-hosting/plex/docker-compose.yml delete mode 100644 archive/self-hosting/portainer/docker-compose.yml delete mode 100644 archive/self-hosting/traefik/docker-compose.yml delete mode 100644 archive/self-hosting/traefik/traefik.toml delete mode 100644 archive/self-hosting/traefik2/docker-compose.yml delete mode 100644 archive/self-hosting/traefik2/traefik.yml delete mode 100644 archive/self-hosting/wireguard/docker-compose.yml delete mode 100755 archive/self-hosting/wordpress/nvgm/docker-compose.yml delete mode 100755 archive/self-hosting/wordpress/portfolio/docker-compose.yml delete mode 100644 archive/silver-hand/README.md delete mode 100644 archive/silver-hand/certmanager.tf delete mode 100644 archive/silver-hand/cloudflare.tf delete mode 100644 archive/silver-hand/nginx-test.tf delete mode 100644 archive/silver-hand/silver-hand.tf delete mode 100644 archive/silver-hand/traefik.tf delete mode 100644 archive/wiki/dns-diagram.png delete mode 100644 archive/wiki/grafana.png delete mode 100644 archive/wiki/home.md delete mode 100644 archive/wiki/network/dns-diagram.md diff --git a/archive/5etools_on_oracle_cloud/.env b/archive/5etools_on_oracle_cloud/.env deleted file mode 100644 index 0ddf842e..00000000 --- a/archive/5etools_on_oracle_cloud/.env +++ /dev/null @@ -1,2 +0,0 @@ -DOMAIN= -EMAIL= \ No newline at end of file diff --git a/archive/5etools_on_oracle_cloud/README.md b/archive/5etools_on_oracle_cloud/README.md deleted file mode 100644 index 9393d6a7..00000000 --- a/archive/5etools_on_oracle_cloud/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Project No Longer Maintained -> There are better ways to do this. -> I recommend looking for general-purpose guides to self-hosting with Docker and Traefik. For 5eTools specifically, I do maintain [5etools-docker](https://github.com/Jafner/5etools-docker). - -This guide will walk you through setting up an Oracle Cloud VM to host a personal instance of 5eTools using your own domain. - -# Before Getting Started - -1. You will need a domain! I used NameCheap to purchase my `.tools` domain for $7 per year. -2. You will need an [Oracle Cloud](https://www.oracle.com/cloud/) account - This will be used to create an Always Free cloud virtual machine, which will host the services we need. You will need to attach a credit card to your account. I used a [Privacy.com](https://privacy.com/) temporary card to ensure I wouldn't be charged accidentally at the end of the 30-day trial. The services used in this guide are under Oracle's Always Free category, so unless you exceed the 10TB monthly traffic alotment, you won't be charged. -3. You will need a [Cloudflare](https://www.cloudflare.com/) account - This will be used to manage the domain name after purchase. You will need to migrate your domain from the registrar you bought the domain from to Cloudflare. -4. An SSH terminal (I use Tabby (formerly Terminus)). This will be used to log into and manage the Oracle Cloud virtual machine. - -# Walkthrough - -## Purchase a domain name from a domain registrar. -I used NameCheap, which offered my `.tools` domain for $7 per year. Some top-level domains (TLDs) can be purchased for as little as $2-3 per year (such as `.xyz`, `.one`, or `.website`). Warning: these are usually 1-year special prices, and the price will increase significantly after the first year. - -## Migrate your domain to Cloudflare. -The Cloudflare docs have a [domain transfer guide](https://developers.cloudflare.com/registrar/domain-transfers/transfer-to-cloudflare), which addresses how to do this. This process may take up to 24 hours. Cloudflare won't like that you are importing the domain without any DNS records, but that's okay. - -## Create your Oracle Cloud virtual machine. -If you've already created your Oracle Cloud account, go to the [Oracle Cloud portal](https://cloud.oracle.com). Then under the "Launch Resources" section, click "Create a VM instance". Most of the default settings are fine. Click "Change Image" and uncheck Oracle Linux, then check Cannonical Ubuntu, then click "Select Image". Under "Add SSH keys", download the private key for the instance by clicking the "Save Private Key" button. Finally, click "Create". You will need to wait a while for the instance to come online. - -## Move your SSH key. -Move your downloaded SSH key to your `.ssh` folder with `mkdir ~/.ssh/` and then `mv ~/Downloads/ssh-key-*.key ~/.ssh/`. If you already have a process for SSH key management, feel free to ignore this. - -## SSH into your VM. -Once your Oracle Cloud VM is provisioned (created), SSH into it. Get its public IP address from the "Instance Access" section of the instance's details page. Then run `ssh -i ~/.ssh/ssh-key-.key ubuntu@`, replacing "" and "" with your key name and instance IP. (Tip: you can use tab to auto-complete the filename of the key). Then enter the command to connect to the instance. - -## Set up the VM with all the software we need. -Now that we're in the terminal, you can just copy-paste commands to run. You can either run the following command (which is just a bunch of commands strung together), or run each command one at a time by following the lettered instructions below: - -`sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get -y install git docker docker-compose && sudo systemctl enable docker && sudo usermod -aG docker $USER && logout` OR: - -### Update the system. -with `sudo apt-get update && sudo apt-get upgrade -y`. - -### Install Git, Docker, and Docker Compose. -with `sudo apt-get -y install git docker docker-compose`. - -### Enable the docker service. -with `sudo systemctl enable docker`. - -### Add your user to the docker group. -with `sudo usermod -aG docker $USER`. - -### Log out. -with `logout`. - -## Configure the VM firewall. -On the "Compute -> Instances -> Instance Details" page, under "Instance Information -> Primary VNIC -> Subnet", click the link to the subnet's configuration page, then click on the default security list. Click "Add Ingress Rules", then "+ Another Ingress Rule" and fill out your ingress rules like this: - -![ingress_rules.png](https://github.com/jafner/cloud_tools/blob/main/ingress_rules.PNG?raw=true) - -This will allow incoming traffic from the internet on ports 80 and 443 (the ports used by HTTP and HTTPS respectively). - -## Configure the Cloudflare DNS records. -After your domain has been transferred to Cloudflare, log into the [Cloudflare dashboard](https://dash.cloudflare.com) and click on your domain. Then click on the DNS button at the top, and click "Add record" with the following information: - - * Type: A - * Name: 5e - * IPv4 Address: - * TTL: Auto - * Proxy status: DNS only - -This will route `5e.your.domain` to . You can change the name to whatever you prefer, or use @ to use the root domain (just `your.domain`) instead. I found that using Cloudflare's proxy interferes with acquiring certificates. - -## Log back into your VM and set up the services. -Clone this repository onto the host with `git clone https://github.com/jafner/cloud_tools.git`, then move into the directory with `cd cloud_tools/`. Edit the file `.env` with your domain (including subdomain) and email. For example: - -``` -DOMAIN=5e.your.domain -EMAIL=youremail@gmail.com -``` - -Make the setup script executable, then run it with `chmod +x setup.sh && ./setup.sh`. \ No newline at end of file diff --git a/archive/5etools_on_oracle_cloud/docker-compose.yml b/archive/5etools_on_oracle_cloud/docker-compose.yml deleted file mode 100644 index c96bcfe6..00000000 --- a/archive/5etools_on_oracle_cloud/docker-compose.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: "3" -services: - traefik: - container_name: traefik - image: traefik:latest - networks: - - web - ports: - - 80:80 - - 443:443 - volumes: - - /var/run/docker.sock:/var/run/docker.sock:ro - - ./traefik.toml:/traefik.toml - - ./acme.json:/acme.json - - 5etools: - container_name: 5etools - image: jafner/5etools-docker - volumes: - - ./htdocs:/usr/local/apache2/htdocs - networks: - - web - labels: - - traefik.http.routers.5etools.rule=Host(`$DOMAIN`) - - traefik.http.routers.5etools.tls.certresolver=lets-encrypt - -networks: - web: - external: true diff --git a/archive/5etools_on_oracle_cloud/ingress_rules.PNG b/archive/5etools_on_oracle_cloud/ingress_rules.PNG deleted file mode 100644 index b6bfb20434d20dfdda5ecdf2e679acd1b50b54f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31984 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 w<{eoH#U7GlK;QarYjOYG 0: - step_marker = True - self.timeline = RangeSliderH( - self.timeline_canvas, - [self.clip_start, self.clip_end], - max_val=max(self.video_duration,1), - step_marker=step_marker, - step_size=step_size, - show_value=False, - bgColor=self.background_color, - Width=self.timeline_width, - Height=self.timeline_height - ) - self.timeline.pack() - #self.preview_canvas.create_text(self.preview_canvas.winfo_width() // 2, self.preview_canvas.winfo_height() // 2, text=f"Loading video...", fill="black", font=("Helvetica", 48)) - - - def timeStr(self, milliseconds: int): # Takes milliseconds int or float and returns a string in the preferred format - h = int(milliseconds/3600000) # Get the hours component - m = int((milliseconds%3600000)/60000) # Get the minutes component - s = int((milliseconds%60000)/1000) # Get the seconds component - ms = int(milliseconds%1000) # Get the milliseconds component - if milliseconds < 60000: - return f"{s}.{ms:03}" - elif milliseconds < 3600000: - return f"{m}:{s:02}.{ms:03}" - else: - return f"{h}:{m:02}:{s:02}.{ms:03}" - - def clip_selector(self): - def updateClipRange(var, index, mode): - clip_end = self.clip_end.get() - nearest_keyframe_start = self.nearest_keyframe(self.clip_start.get(), self.video_keyframes) - # Add a specific check to make sure that the clip end is not changing to be equal to or less than the clip start - if clip_end <= nearest_keyframe_start: - clip_end = nearest_keyframe_start + self.timeline.__dict__['step_size'] - self.clip_start_label.config(text=f"{self.timeStr(nearest_keyframe_start)}") - self.clip_end_label.config(text=f"{self.timeStr(clip_end)}") - self.timeline.forceValues([nearest_keyframe_start, clip_end]) - self.getThumbnail() - if str(self.video_path) == "()": - return False - self.clip_start.trace_add("write", callback=updateClipRange) # This actually triggers on both start and end - - def nearest_keyframe(self, test_pts: int, valid_pts: list): - return(min(valid_pts, key=lambda x:abs(x-float(test_pts)))) - - def browse_video_file(self): - video_path = filedialog.askopenfilename( - initialdir="~/Git/Clip/TestClips/", - title="Select file", - filetypes=(("mp4/mkv files", '*.mp4 *.mkv'), ("all files", "*.*")) - ) - print(f"video path: \"{video_path}\" (type: {type(video_path)})") - if not Path(str(video_path)).is_file(): - return - video_keyframes = get_keyframes_list(video_path) - while video_keyframes == None: - print(f"No keyframes found in {video_path}. Choose a different video file.") - video_path = filedialog.askopenfilename( - initialdir="~/Git/Clip/TestClips/", - title="Select file", - filetypes=(("mp4/mkv files", '*.mp4 *.mkv'), ("all files", "*.*")) - ) - # Once we have a video file, we need to set the Source video, Clip start, Clip end, and Video duration values and redraw the GUI. - self.video_path = Path(video_path) - self.video_duration = get_video_duration(video_path) - self.video_keyframes = video_keyframes - self.clip_start.set(min(self.video_keyframes)) - self.clip_end.set(max(self.video_keyframes)) - self.clip_start_label.config(text=f"{self.timeStr(self.nearest_keyframe(self.clip_start.get(), self.video_keyframes))}") - self.clip_end_label.config(text=f"{self.timeStr(self.clip_end.get())}") - - self.getThumbnail() - - self.video_path_label.config(text=f"Source video: {self.video_path}") - self.video_duration_label.config(text=f"Video duration: {self.timeStr(self.video_duration)}") - self.redrawTimeline() - self.clip_selector() - - def extract_clip(self): - video_path = self.video_path - file_extension = video_path.suffix - clip_start = self.clip_start.get() - clip_end = self.clip_end.get() - - output_path = Path( - filedialog.asksaveasfilename( - initialdir=video_path.parent, - initialfile=str( - f"[Clip] {video_path.stem} ({datetime.timedelta(milliseconds=clip_start)}-{datetime.timedelta(milliseconds=clip_end)}){file_extension}"), - title="Select output file", - defaultextension=file_extension - ) - ) - if output_path == Path("."): - return False - ffmpeg_command = [ - "ffmpeg", - "-y", # The output path prompt asks for confirmation before overwriting - "-hide_banner", - "-i", str(video_path), - "-ss", f"{clip_start}ms", - "-to", f"{clip_end}ms", - "-map", "0", - "-c:v", "copy", - "-c:a", "copy", - str(output_path), - ] - if self.debug_checkvar.get() == 1: - subprocess.run(ffmpeg_command) - else: - subprocess.run(ffmpeg_command, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - print(f"Finished! Saved to {output_path}") - -root = tk.Tk() -app = VideoClipExtractor(root) -root.mainloop() - diff --git a/archive/PyClipIt/preview.py b/archive/PyClipIt/preview.py deleted file mode 100644 index 06e6654d..00000000 --- a/archive/PyClipIt/preview.py +++ /dev/null @@ -1,35 +0,0 @@ -# Version using ffPyPlayer -from pathlib import Path -import tkinter as tk -import time -from ffpyplayer.player import MediaPlayer - -def ffplaySegment(file: Path, start: int, end: int): - print(f"Playing {file} from {start}ms to {end}ms") - file = str(file) # Must be string - seek_to = float(start)/1000 - play_for = float(end - start)/1000 - x = int(1280) - y = int(720) - volume = float(0.2) # Float 0.0 to 1.0 - # Must be dict - ff_opts = { - "paused": False, # Bool - "t": play_for, # Float seconds - "ss": seek_to, # Float seconds - "x": x, - "y": y, - "volume": volume - } - val = '' - player = MediaPlayer(file, ff_opts=ff_opts) - while val != 'eof': - frame, val = player.get_frame() - print(f"frame: (type: {type(frame)})", end=', ') - if val != 'eof' and frame is not None: - img, t = frame - print(f"img: (type: {type(img)})", end=', ') - print(f"t: (type: {type(t)})") - # Use the create_image method of the canvas widget to draw the image to the canvas. - - diff --git a/archive/PyClipIt/probe.py b/archive/PyClipIt/probe.py deleted file mode 100644 index 97838df0..00000000 --- a/archive/PyClipIt/probe.py +++ /dev/null @@ -1,43 +0,0 @@ -import subprocess -from pathlib import Path -import numpy as np -import ffmpeg - -# Get a list of keyframes by pts (milliseconds from start) from a video file. -def get_keyframes_list(video_path): - ffprobe_command = [ - "ffprobe", - "-hide_banner", - "-loglevel", "error", - "-skip_frame", "nokey", - "-select_streams", "v:0", - "-show_entries", "packet=pts,flags", - "-of", "csv=print_section=0", - video_path - ] - - ffprobe_output = subprocess.run(ffprobe_command, capture_output=True, text=True) - keyframes = list(map(int, np.array([line.split(",") for line in list(filter(lambda frame_packet: "K" in frame_packet, ffprobe_output.stdout.splitlines()))])[:,0])) - if len(keyframes) <= 1: - # Pop up a warning if there are no keyframes. - return(None) - return(keyframes) - -def get_keyframe_interval(keyframes_list: list): # Takes a list of ints representing keyframe pts (milliseconds from start) and returns either the keyframe interval in milliseconds, or None if the keyframe intervals are not all the same. - intervals = list(np.diff(keyframes_list)) # List of keyframe intervals in milliseconds. - if np.all(intervals == intervals[0]): - return(intervals[0]) - else: - return(0) - -def get_keyframe_intervals(keyframes_list): - # Return a list of keyframe intervals in milliseconds. - return(list(np.diff(keyframes_list))) - -def keyframe_intervals_are_clean(keyframe_intervals): - # Return whether the keyframe intervals are all the same. - return(np.all(keyframe_intervals == keyframe_intervals[0])) - -# Get the duration of a video file in milliseconds (useful for ffmpeg pts). -def get_video_duration(video_path): - return int(float(ffmpeg.probe(video_path)["format"]["duration"])*1000) \ No newline at end of file diff --git a/archive/PyClipIt/requirements.txt b/archive/PyClipIt/requirements.txt deleted file mode 100644 index 6daab85f..00000000 --- a/archive/PyClipIt/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -av==12.0.0 -ffmpeg-python==0.2.0 -ffpyplayer==4.5.1 -numpy==1.26.4 -pillow==10.3.0 -RangeSlider==2023.7.2 \ No newline at end of file diff --git a/archive/PyClipIt/test.py b/archive/PyClipIt/test.py deleted file mode 100644 index a819f55c..00000000 --- a/archive/PyClipIt/test.py +++ /dev/null @@ -1,21 +0,0 @@ -import av - -with av.open("TestClips/x264Source.mkv") as container: - frame_num = 622 - time_base = container.streams.video[0].time_base - framerate = container.streams.video[0].average_rate - timestamp = frame_num/framerate - rounded_pts = round((frame_num / framerate) / time_base) - print(f"Variables:\n\ - frame_num: {frame_num} (type: {type(frame_num)}\n\ - time_base: {time_base} (type: {type(time_base)}\n\ - timestamp: {timestamp} (type: {type(timestamp)}\n\ - frame_num / framerate: {frame_num / framerate}\n\ - frame_num / time_base: {frame_num / time_base}\n\ - (frame_num / framerate) / time_base: {(frame_num / framerate) / time_base}\n\ - rounded_pts = {rounded_pts}\ - ") - - container.seek(rounded_pts, backward=True, stream=container.streams.video[0]) - frame = next(container.decode(video=0)) - frame.to_image().save("TestClips/Thumbnail3.jpg".format(frame.pts), quality=80) \ No newline at end of file diff --git a/archive/docker_config/arr/.env b/archive/docker_config/arr/.env deleted file mode 100644 index 2f936a85..00000000 --- a/archive/docker_config/arr/.env +++ /dev/null @@ -1,3 +0,0 @@ -DOCKER_DATA=/home/joey/docker_data/arr -DOWNLOAD_DIR=/mnt/torrenting/NZB -INCOMPLETE_DOWNLOAD_DIR=/mnt/torrenting/NZB_incomplete diff --git a/archive/docker_config/arr/docker-compose.yml b/archive/docker_config/arr/docker-compose.yml deleted file mode 100644 index ebca827a..00000000 --- a/archive/docker_config/arr/docker-compose.yml +++ /dev/null @@ -1,82 +0,0 @@ -version: "3" -services: - radarr: - image: linuxserver/radarr - container_name: radarr - networks: - - web - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - volumes: - - /mnt/nas/Video/Movies:/movies - - "${DOCKER_DATA}/radarr_config:/config" - - "${DOWNLOAD_DIR}:/downloads" - labels: - - traefik.http.routers.radarr.rule=Host(`radarr.jafner.net`) - - traefik.http.routers.radarr.tls.certresolver=lets-encrypt - - traefik.http.services.radarr.loadbalancer.server.port=7878 - - traefik.http.routers.radarr.middlewares=lan-only@file - sonarr: - image: linuxserver/sonarr - container_name: sonarr - networks: - - web - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - volumes: - - /mnt/nas/Video/Shows:/shows - - "${DOCKER_DATA}/sonarr_config:/config" - - "${DOWNLOAD_DIR}:/downloads" - labels: - - traefik.http.routers.sonarr.rule=Host(`sonarr.jafner.net`) - - traefik.http.routers.sonarr.tls.certresolver=lets-encrypt - - traefik.http.services.sonarr.loadbalancer.server.port=8989 - - traefik.http.routers.sonarr.middlewares=lan-only@file - - nzbhydra2: - image: linuxserver/nzbhydra2 - container_name: nzbhydra2 - networks: - - web - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - volumes: - - "${DOCKER_DATA}/nzbhydra2_config:/config" - - "${DOWNLOAD_DIR}:/downloads" - labels: - - traefik.http.routers.nzbhydra2.rule=Host(`nzbhydra.jafner.net`) - - traefik.http.routers.nzbhydra2.tls.certresolver=lets-encrypt - - traefik.http.services.nzbhydra2.loadbalancer.server.port=5076 - - traefik.http.routers.nzbhydra2.middlewares=lan-only@file - - sabnzbd: - image: linuxserver/sabnzbd - container_name: sabnzbd - networks: - - web - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - ports: - - 8085:8080 - volumes: - - "${DOCKER_DATA}/sabnzbd_config:/config" - - "${DOWNLOAD_DIR}:/downloads" - - "${INCOMPLETE_DOWNLOAD_DIR}:/incomplete-downloads" - labels: - - traefik.http.routers.sabnzbd.rule=Host(`sabnzbd.jafner.net`) - - traefik.http.routers.sabnzbd.tls.certresolver=lets-encrypt - - traefik.http.services.sabnzbd.loadbalancer.server.port=8080 - - traefik.http.routers.sabnzbd.middlewares=lan-only@file - -networks: - web: - external: true - diff --git a/archive/docker_config/calibre-web/.env b/archive/docker_config/calibre-web/.env deleted file mode 100644 index 27e0058e..00000000 --- a/archive/docker_config/calibre-web/.env +++ /dev/null @@ -1 +0,0 @@ -LIBRARY_DIR=/mnt/nas/Ebooks/Calibre \ No newline at end of file diff --git a/archive/docker_config/calibre-web/docker-compose.yml b/archive/docker_config/calibre-web/docker-compose.yml deleted file mode 100644 index 21b05e70..00000000 --- a/archive/docker_config/calibre-web/docker-compose.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '3' -services: - calibre-web-rpg: - image: linuxserver/calibre-web - container_name: calibre-web-rpg - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - volumes: - - calibre-web-rpg_data:/config - - /mnt/calibre/rpg:/books - labels: - - traefik.http.routers.calibre-rpg.rule=Host(`rpg.jafner.net`) - - traefik.http.routers.calibre-rpg.tls.certresolver=lets-encrypt - networks: - - web - - calibre-web-sff: - image: linuxserver/calibre-web - container_name: calibre-web-sff - environment: - - PUID=1000 - - PGID=1000 - - TZ=America/Los_Angeles - volumes: - - calibre-web-sff_data:/config - - /mnt/calibre/sff:/books - labels: - - traefik.http.routers.calibre.rule=Host(`calibre.jafner.net`) - - traefik.http.routers.calibre.tls.certresolver=lets-encrypt - networks: - - web - -networks: - web: - external: true -volumes: - calibre-web-rpg_data: - calibre-web-sff_data: diff --git a/archive/docker_config/cloudflare-ddns/docker-compose.yml b/archive/docker_config/cloudflare-ddns/docker-compose.yml deleted file mode 100644 index 83e370f1..00000000 --- a/archive/docker_config/cloudflare-ddns/docker-compose.yml +++ /dev/null @@ -1,12 +0,0 @@ -version: "3" -services: - cloudflare-ddns: - image: oznu/cloudflare-ddns - container_name: cloudflare-ddns - restart: unless-stopped - environment: - - API_KEY=***REMOVED*** - - ZONE=jafner.net - - SUBDOMAIN=* - labels: - - traefik.enable=false diff --git a/archive/docker_config/drawio/.env b/archive/docker_config/drawio/.env deleted file mode 100644 index ae26944c..00000000 --- a/archive/docker_config/drawio/.env +++ /dev/null @@ -1 +0,0 @@ -DRAWIO_BASE_URL=https://draw.jafner.net diff --git a/archive/docker_config/drawio/docker-compose.yml b/archive/docker_config/drawio/docker-compose.yml deleted file mode 100644 index e692377d..00000000 --- a/archive/docker_config/drawio/docker-compose.yml +++ /dev/null @@ -1,74 +0,0 @@ -version: '3' -services: - plantuml-server: - image: jgraph/plantuml-server - container_name: drawio_plantuml-server - restart: unless-stopped - expose: - - "8080" - networks: - - drawionet - volumes: - - fonts_volume:/usr/share/fonts/drawio - image-export: - image: jgraph/export-server - container_name: drawio_export-server - restart: unless-stopped - expose: - - "8000" - networks: - - drawionet - volumes: - - fonts_volume:/usr/share/fonts/drawio - environment: - - DRAWIO_SERVER_URL=${DRAWIO_BASE_URL} - drawio: - image: jgraph/drawio - container_name: drawio_drawio - links: - - plantuml-server:plantuml-server - - image-export:image-export - depends_on: - - plantuml-server - - image-export - networks: - - drawionet - - web - environment: - - DRAWIO_SELF_CONTAINED=1 - - PLANTUML_URL=http://plantuml-server:8080/ - - EXPORT_URL=http://image-export:8000/ - - DRAWIO_BASE_URL=${DRAWIO_BASE_URL} - - DRAWIO_CSP_HEADER=${DRAWIO_CSP_HEADER} - - DRAWIO_VIEWER_URL=${DRAWIO_VIEWER_URL} - - DRAWIO_CONFIG=${DRAWIO_CONFIG} - - DRAWIO_GOOGLE_CLIENT_ID=${DRAWIO_GOOGLE_CLIENT_ID} - - DRAWIO_GOOGLE_APP_ID=${DRAWIO_GOOGLE_APP_ID} - - DRAWIO_GOOGLE_CLIENT_SECRET=${DRAWIO_GOOGLE_CLIENT_SECRET} - - DRAWIO_GOOGLE_VIEWER_CLIENT_ID=${DRAWIO_GOOGLE_VIEWER_CLIENT_ID} - - DRAWIO_GOOGLE_VIEWER_APP_ID=${DRAWIO_GOOGLE_VIEWER_APP_ID} - - DRAWIO_GOOGLE_VIEWER_CLIENT_SECRET=${DRAWIO_GOOGLE_VIEWER_CLIENT_SECRET} - - DRAWIO_MSGRAPH_CLIENT_ID=${DRAWIO_MSGRAPH_CLIENT_ID} - - DRAWIO_MSGRAPH_CLIENT_SECRET=${DRAWIO_MSGRAPH_CLIENT_SECRET} - - DRAWIO_GITLAB_ID=${DRAWIO_GITLAB_ID} - - DRAWIO_GITLAB_URL=${DRAWIO_GITLAB_URL} - - DRAWIO_CLOUD_CONVERT_APIKEY=${DRAWIO_CLOUD_CONVERT_APIKEY} - - DRAWIO_CACHE_DOMAIN=${DRAWIO_CACHE_DOMAIN} - - DRAWIO_MEMCACHED_ENDPOINT=${DRAWIO_MEMCACHED_ENDPOINT} - - DRAWIO_PUSHER_MODE=2 - - DRAWIO_IOT_ENDPOINT=${DRAWIO_IOT_ENDPOINT} - - DRAWIO_IOT_CERT_PEM=${DRAWIO_IOT_CERT_PEM} - - DRAWIO_IOT_PRIVATE_KEY=${DRAWIO_IOT_PRIVATE_KEY} - - DRAWIO_IOT_ROOT_CA=${DRAWIO_IOT_ROOT_CA} - - DRAWIO_MXPUSHER_ENDPOINT=${DRAWIO_MXPUSHER_ENDPOINT} - labels: - - traefik.http.routers.drawio.rule=Host(`draw.jafner.net`) - - traefik.http.routers.drawio.tls.certresolver=lets-encrypt - -networks: - drawionet: - web: - external: true - -volumes: - fonts_volume: diff --git a/archive/docker_config/git_update.sh b/archive/docker_config/git_update.sh deleted file mode 100755 index d2cb3a19..00000000 --- a/archive/docker_config/git_update.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cd /home/joey/docker_config/ -git add --all -git commit -am "$(date)" -git push diff --git a/archive/docker_config/grafana-stack/.env b/archive/docker_config/grafana-stack/.env deleted file mode 100644 index e0f43215..00000000 --- a/archive/docker_config/grafana-stack/.env +++ /dev/null @@ -1,2 +0,0 @@ -DOCKER_DATA=/home/joey/docker_data/grafana-stack -MINECRAFT_DIR=/home/joey/docker_data/minecraft diff --git a/archive/docker_config/grafana-stack/.forgetps.json b/archive/docker_config/grafana-stack/.forgetps.json deleted file mode 100644 index fe51488c..00000000 --- a/archive/docker_config/grafana-stack/.forgetps.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/archive/docker_config/grafana-stack/docker-compose.yml b/archive/docker_config/grafana-stack/docker-compose.yml deleted file mode 100644 index 1f4e1c44..00000000 --- a/archive/docker_config/grafana-stack/docker-compose.yml +++ /dev/null @@ -1,63 +0,0 @@ -version: '3' -services: - influxdb: - image: influxdb:latest - container_name: influxdb - restart: unless-stopped - networks: - - monitoring - ports: - - 8086:8086 - - 8089:8089/udp - volumes: - - ./influxdb.conf:/etc/influxdb/influxdb.conf:ro - - "${DOCKER_DATA}/influxdb:/var/lib/influxdb" - environment: - - TZ=America/Los_Angeles - - INFLUXDB_HTTP_ENABLED=true - - INFLUXDB_DB=host - command: -config /etc/influxdb/influxdb.conf - - telegraf: - image: telegraf:latest - container_name: telegraf - restart: unless-stopped - depends_on: - - influxdb - networks: - - monitoring - volumes: - - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro - - ./scripts/.forgetps.json:/.forgetps.json:ro - - /var/run/docker.sock:/var/run/docker.sock:ro - - /sys:/rootfs/sys:ro - - /proc:/rootfs/proc:ro - - /etc:/rootfs/etc:ro - - grafana: - image: mbarmem/grafana-render:latest - container_name: grafana - restart: unless-stopped - depends_on: - - influxdb - - telegraf - networks: - - monitoring - - web - user: "0" - volumes: - - ./grafana:/var/lib/grafana - - ./grafana.ini:/etc/grafana/grafana.ini - environment: - - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource,grafana-worldmap-panel,grafana-piechart-panel - labels: - - traefik.http.routers.grafana.rule=Host(`grafana.jafner.net`) - - traefik.http.routers.grafana.tls.certresolver=lets-encrypt - #- traefik.http.routers.grafana.middlewares=authelia@file - -networks: - monitoring: - external: true - web: - external: true - diff --git a/archive/docker_config/grafana-stack/grafana.ini b/archive/docker_config/grafana-stack/grafana.ini deleted file mode 100644 index 3692f853..00000000 --- a/archive/docker_config/grafana-stack/grafana.ini +++ /dev/null @@ -1,622 +0,0 @@ -##################### Grafana Configuration Example ##################### -# -# Everything has defaults so you only need to uncomment things you want to -# change - -# possible values : production, development -;app_mode = production - -# instance name, defaults to HOSTNAME environment variable value or hostname if HOSTNAME var is empty -;instance_name = ${HOSTNAME} - -#################################### Paths #################################### -[paths] -# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used) -;data = /var/lib/grafana - -# Temporary files in `data` directory older than given duration will be removed -;temp_data_lifetime = 24h - -# Directory where grafana can store logs -;logs = /var/log/grafana - -# Directory where grafana will automatically scan and look for plugins -;plugins = /var/lib/grafana/plugins - -# folder that contains provisioning config files that grafana will apply on startup and while running. -;provisioning = conf/provisioning - -#################################### Server #################################### -[server] -# Protocol (http, https, h2, socket) -;protocol = http - -# The ip address to bind to, empty will bind to all interfaces -;http_addr = - -# The http port to use -;http_port = 3000 - -# The public facing domain name used to access grafana from a browser -;domain = localhost - -# Redirect to correct domain if host header does not match domain -# Prevents DNS rebinding attacks -;enforce_domain = false - -# The full public facing url you use in browser, used for redirects and emails -# If you use reverse proxy and sub path specify full url (with sub path) -;root_url = http://localhost:3000 - -# Serve Grafana from subpath specified in `root_url` setting. By default it is set to `false` for compatibility reasons. -;serve_from_sub_path = false - -# Log web requests -;router_logging = false - -# the path relative working path -;static_root_path = public - -# enable gzip -;enable_gzip = false - -# https certs & key file -;cert_file = -;cert_key = - -# Unix socket path -;socket = - -#################################### Database #################################### -[database] -# You can configure the database connection by specifying type, host, name, user and password -# as separate properties or as on string using the url properties. - -# Either "mysql", "postgres" or "sqlite3", it's your choice -;type = sqlite3 -;host = 127.0.0.1:3306 -;name = grafana -;user = root -# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" -;password = - -# Use either URL or the previous fields to configure the database -# Example: mysql://user:secret@host:port/database -;url = - -# For "postgres" only, either "disable", "require" or "verify-full" -;ssl_mode = disable - -# For "sqlite3" only, path relative to data_path setting -;path = grafana.db - -# Max idle conn setting default is 2 -;max_idle_conn = 2 - -# Max conn setting default is 0 (mean not set) -;max_open_conn = - -# Connection Max Lifetime default is 14400 (means 14400 seconds or 4 hours) -;conn_max_lifetime = 14400 - -# Set to true to log the sql calls and execution times. -;log_queries = - -# For "sqlite3" only. cache mode setting used for connecting to the database. (private, shared) -;cache_mode = private - -#################################### Cache server ############################# -[remote_cache] -# Either "redis", "memcached" or "database" default is "database" -;type = database - -# cache connectionstring options -# database: will use Grafana primary database. -# redis: config like redis server e.g. `addr=127.0.0.1:6379,pool_size=100,db=0,ssl=false`. Only addr is required. ssl may be 'true', 'false', or 'insecure'. -# memcache: 127.0.0.1:11211 -;connstr = - -#################################### Data proxy ########################### -[dataproxy] - -# This enables data proxy logging, default is false -;logging = false - -# How long the data proxy should wait before timing out default is 30 (seconds) -;timeout = 30 - -# If enabled and user is not anonymous, data proxy will add X-Grafana-User header with username into the request, default is false. -;send_user_header = false - -#################################### Analytics #################################### -[analytics] -# Server reporting, sends usage counters to stats.grafana.org every 24 hours. -# No ip addresses are being tracked, only simple counters to track -# running instances, dashboard and error counts. It is very helpful to us. -# Change this option to false to disable reporting. -;reporting_enabled = true - -# Set to false to disable all checks to https://grafana.net -# for new vesions (grafana itself and plugins), check is used -# in some UI views to notify that grafana or plugin update exists -# This option does not cause any auto updates, nor send any information -# only a GET request to http://grafana.com to get latest versions -;check_for_updates = true - -# Google Analytics universal tracking code, only enabled if you specify an id here -;google_analytics_ua_id = - -# Google Tag Manager ID, only enabled if you specify an id here -;google_tag_manager_id = - -#################################### Security #################################### -[security] -# default admin user, created on startup -;admin_user = admin -admin_user = jafner - -# default admin password, can be changed before first start of grafana, or in profile settings -;admin_password = admin -admin_password = joeyyeoj - -# used for signing -;secret_key = ***REMOVED*** - -# disable gravatar profile images -;disable_gravatar = false - -# data source proxy whitelist (ip_or_domain:port separated by spaces) -;data_source_proxy_whitelist = - -# disable protection against brute force login attempts -;disable_brute_force_login_protection = false - -# set to true if you host Grafana behind HTTPS. default is false. -;cookie_secure = false - -# set cookie SameSite attribute. defaults to `lax`. can be set to "lax", "strict" and "none" -;cookie_samesite = lax - -# set to true if you want to allow browsers to render Grafana in a ,