WIP: Switch to NixOS #5

Draft
FunctionalHacker wants to merge 1349 commits from nix into main
333 changed files with 3736 additions and 36108 deletions

9
.editorconfig Normal file
View file

@ -0,0 +1,9 @@
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
node_modules/

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "dotdrop"]
path = dotdrop
url = https://github.com/deadc0de6/dotdrop.git

21
LICENSE
View file

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2019 Marko Korhonen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

14
LICENSE.adoc Normal file
View file

@ -0,0 +1,14 @@
== The MIT License (MIT)
Copyright (c) {localyear} Marko Korhonen
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

16
README.adoc Normal file
View file

@ -0,0 +1,16 @@
= FunctionalHacker's dotfiles
My personal dotfiles for my workstations using Nix and NixOS.
== Mirrors
This repository lives at https://git.korhonen.cc/FunctionalHacker/dotfiles[my git server],
but it is also mirrored to:
* https://gitlab.com/FunctionalHacker/dotfiles[GitLab]
* https://github.com/FunctionalHacker/dotfiles[GitHub]
* https://bitbucket.org/FunctionalHacker/dotfiles[Bitbucket]
* https://codeberg.org/FunctionalHacker/dotfiles[codeberg]
If you have any ideas for improvements, questions or anything of this
sort, you can open an issue or a pull request at any of the mirrors.

View file

@ -1,16 +0,0 @@
# ReekyMarko's dotfiles
![screenshot of my setup](https://i.imgur.com/lz1Q4Zz.png?raw=true")
My personal dotfiles for my workstations, mostly for easy access for myself
but feel free to steal them for yourself!
I'm using [dotdrop](https://github.com/deadc0de6/dotdrop) to manage and ease deployment of my dotfiles.
## Mirrors
This repository lives at [ReekyNET Git](https://git.reekynet.com/ReekyMarko/dotfiles), but it is also mirrored to:
- [GitLab](https://gitlab.com/ReekyMarko/dotfiles)
- [GitHub](https://github.com/ReekyMarko/dotfiles)
- [Bitbucket](https://bitbucket.org/ReekyMarko/dotfiles)
- [codeberg](https://codeberg.org/ReekyMarko/dotfiles)
If you have any ideas for improvements, questions or anything of this sort, you can open an issue or a pull request in either ReekyNET Git (registrations open for anyone), or any of the mirrors.

View file

@ -1,248 +0,0 @@
actions:
vim-plug: nvim +PlugInstall +qall
zplug: zplug install
waybar: systemctl --user restart waybar
mako: systemctl --user restart mako
config:
backup: true
banner: true
create: true
dotpath: home
ignoreempty: false
keepdot: true
link_dotfile_default: nolink
link_on_import: nolink
longkey: false
showdiff: false
workdir: ~/.config/dotdrop
dotfiles:
d_systemd:
dst: ~/.config/systemd/user
src: .config/systemd/user
d_mpv:
dst: ~/.config/mpv
src: .config/mpv
d_nvim_config:
actions:
- vim-plug
dst: ~/.config/nvim/conf.d
src: .config/nvim/conf.d
d_scripts:
dst: ~/Scripts
src: Scripts
d_sway:
dst: ~/.config/sway
src: .config/sway
d_ticons:
dst: ~/.local/share/TelegramDesktop/tdata/ticons
src: .local/share/TelegramDesktop/tdata/ticons
d_waybar:
actions:
- waybar
dst: ~/.config/waybar
src: .config/waybar
f_abcde.conf:
dst: ~/.abcde.conf
src: .abcde.conf
f_alacritty.yml:
dst: ~/.config/alacritty/alacritty.yml
src: .config/alacritty/alacritty.yml
f_authorized_keys:
dst: ~/.ssh/authorized_keys
src: .ssh/authorized_keys
f_beets_config:
dst: ~/.config/beets/config.yaml
src: .config/beets/config.yaml
f_beets_whitelist:
dst: ~/.config/beets/whitelist
src: .config/beets/whitelist
f_bspwmrc:
dst: ~/.config/bspwm/bspwmrc
src: .config/bspwm/bspwmrc
f_coc-settings.json:
dst: ~/.config/nvim/coc-settings.json
src: .config/nvim/coc-settings.json
f_gitconfig:
dst: ~/.gitconfig
src: .gitconfig
f_init.vim:
dst: ~/.config/nvim/init.vim
src: .config/nvim/init.vim
f_libra_config:
dst: ~/.config/libra/config.toml
src: .config/libra/config.toml
f_mailcap:
dst: ~/.mailcap
src: .mailcap
f_makepkg.conf:
dst: ~/.config/pacman/makepkg.conf
src: .config/pacman/makepkg.conf
f_mako_config:
dst: ~/.config/mako/config
src: .config/mako/config
actions:
- mako
f_mimeo_associations.txt:
dst: ~/.config/mimeo/associations.txt
src: .config/mimeo/associations.txt
f_mpd.conf:
dst: ~/.config/mpd/mpd.conf
src: .config/mpd/mpd.conf
f_mpdris2.conf:
dst: ~/.config/mpDris2/mpDris2.conf
src: .config/mpDris2/mpDris2.conf
f_mpdscribble.conf:
dst: ~/.mpdscribble/mpdscribble.conf
src: .mpdscribble/mpdscribble.conf
f_ncmpcpp_bindings:
dst: ~/.config/ncmpcpp/bindings
src: .config/ncmpcpp/bindings
f_ranger.conf:
dst: ~/.config/ranger/rc.conf
src: .config/ranger/rc.conf
f_ranger_commands.py:
dst: ~/.config/ranger/commands.py
src: .config/ranger/commands.py
f_redshift.conf:
dst: ~/.config/redshift/redshift.conf
src: .config/redshift/redshift.conf
f_rofi-pass.conf:
dst: ~/.config/rofi-pass/config
src: .config/rofi-pass/config
f_rtv.cfg:
dst: ~/.config/rtv/rtv.cfg
src: .config/rtv/rtv.cfg
f_ssh.conf:
dst: ~/.ssh/config
src: .ssh/config
f_steam-native.desktop:
dst: ~/.local/share/applications/steam-native.desktop
src: .local/share/applications/steam-native.desktop
f_tdesktop_lang.strings:
dst: ~/.config/telegram-desktop/lang.strings
src: .config/telegram-desktop/lang.strings
f_tmux.conf:
dst: ~/.tmux.conf
src: .tmux.conf
f_yay_config.json:
dst: ~/.config/yay/config.json
src: .config/yay/config.json
f_youtube-dl_config:
dst: ~/.config/youtube-dl/config
src: .config/youtube-dl/config
f_youtube-viewer.conf:
dst: ~/.config/youtube-viewer/youtube-viewer.conf
src: .config/youtube-viewer/youtube-viewer.conf
f_zathurarc:
dst: ~/.config/zathura/zathurarc
src: .config/zathura/zathurarc
f_zprofile:
dst: ~/.zprofile
src: .zprofile
f_zshrc:
dst: ~/.zshrc
src: .zshrc
d_rofi:
src: .config/rofi
dst: ~/.config/rofi
d_zsh:
src: .config/zsh
dst: ~/.config/zsh
f_fonts.conf:
src: .config/fontconfig/fonts.conf
dst: ~/.config/fontconfig/fonts.conf
f_ignore:
src: .ignore
dst: ~/.ignore
f_nvimpager_init.vim:
src: .config/nvimpager/init.vim
dst: ~/.config/nvimpager/init.vim
f_ncmpcpp.conf:
src: .config/ncmpcpp/config
dst: ~/.config/ncmpcpp/config
d_efistub:
src: .EFISTUB
dst: ~/.EFISTUB
f_hushlogin:
src: .hushlogin
dst: ~/.hushlogin
profiles:
Base:
dotfiles:
- d_systemd
Media:
dotfiles:
- f_beets_config
- f_beets_whitelist
- f_abcde.conf
- d_mpv
- f_youtube-dl_config
- f_mpd.conf
- f_ncmpcpp_bindings
- f_ncmpcpp.conf
- f_libra_config
- f_mpdscribble.conf
- f_mpdris2.conf
- f_youtube-viewer.conf
Sway:
dotfiles:
- d_sway
- d_waybar
- d_rofi
- f_mako_config
- f_redshift.conf
- f_rofi-pass.conf
- f_zathurarc
- f_mimeo_associations.txt
- f_tdesktop_lang.strings
- f_fonts.conf
Pacman:
dotfiles:
- f_yay_config.json
- f_makepkg.conf
Mirkwood:
dotfiles:
- d_efistub
include:
- Base
- Terminal
- Media
- Sway
- Pacman
ReekyRaspberry:
include:
- Terminal
Rivendell:
include:
- Terminal
- Media
- Pacman
Terminal:
dotfiles:
- f_nvimpager_init.vim
- f_hushlogin
- f_ignore
- f_ranger_commands.py
- f_rtv.cfg
- f_mailcap
- d_zsh
- f_zshrc
- f_tmux.conf
- f_gitconfig
- f_ranger.conf
- f_ssh.conf
- f_authorized_keys
- d_scripts
- d_nvim_config
- f_init.vim
- f_coc-settings.json
- f_gitconfig
- f_alacritty.yml
AnittaPC:
include:
- Terminal
- Pacman
TakamakiPC:
include:
- Terminal
- Pacman

View file

@ -1,170 +0,0 @@
config:
backup: true
banner: true
create: true
dotpath: root
ignoreempty: false
keepdot: true
link_dotfile_default: nolink
link_on_import: nolink
longkey: false
showdiff: false
workdir: ~/.config/sdotdrop
dotfiles:
f_60-uinput-permissions.rules:
dst: /etc/udev/rules.d/60-uinput-permissions.rules
src: etc/udev/rules.d/60-uinput-permissions.rules
d_bin:
dst: /usr/local/bin
src: usr/local/bin
f_99-sysctl.conf:
dst: /etc/sysctl.d/99-sysctl.conf
src: etc/sysctl.d/99-sysctl.conf
f_adb.service:
dst: /etc/systemd/system/adb.service
src: etc/systemd/system/adb.service
f_clamd.conf:
dst: /etc/clamav/clamd.conf
src: etc/clamav/clamd.conf
f_cryptissue:
dst: /etc/cryptissue
src: etc/cryptissue
f_detected.sh:
dst: /etc/clamav/detected.sh
src: etc/clamav/detected.sh
f_environment:
dst: /etc/environment
src: etc/environment
f_freetype2.sh:
dst: /etc/profile.d/freetype2.sh
src: etc/profile.d/freetype2.sh
f_iwd@.service:
dst: /etc/systemd/system/iwd@.service
src: etc/systemd/system/iwd@.service
f_loader.conf:
dst: /boot/loader/loader.conf
src: boot/loader/loader.conf
f_fonts.conf:
dst: /etc/fonts/local.conf
src: etc/fonts/local.conf
f_locale.conf:
dst: /etc/locale.conf
src: etc/locale.conf
f_locale.gen:
dst: /etc/locale.gen
src: etc/locale.gen
f_logind.conf:
dst: /etc/systemd/logind.conf
src: etc/systemd/logind.conf
f_bluetooth.conf:
dst: /etc/bluetooth/main.conf
src: etc/bluetooth/main.conf
f_pacman.conf:
dst: /etc/pacman.conf
src: etc/pacman.conf
f_pacserve.service.conf:
dst: /etc/pacserve/pacserve.service.conf
src: etc/pacserve/pacserve.service.conf
f_sshd_config:
dst: /etc/ssh/sshd_config
src: etc/ssh/sshd_config
f_timesyncd.conf:
dst: /etc/systemd/timesyncd.conf
src: etc/systemd/timesyncd.conf
f_welcomemessage.conf:
dst: /etc/welcomemessage.conf
src: etc/welcomemessage.conf
f_getty.conf:
src: etc/systemd/system/getty@tty1.service.d/override.conf
dst: /etc/systemd/system/getty@tty1.service.d/override.conf
f_99-conbee-usb-serial.rules:
src: etc/udev/rules.d/99-conbee-usb-serial.rules
dst: /etc/udev/rules.d/99-conbee-usb-serial.rules
f_99-lowbat.rules:
src: etc/udev/rules.d/99-lowbat.rules
dst: /etc/udev/rules.d/99-lowbat.rules
f_sleep.conf:
src: etc/systemd/sleep.conf
dst: /etc/systemd/sleep.conf
f_fstab:
src: etc/fstab
dst: /etc/fstab
f_ignore:
src: .ignore
dst: /.ignore
f_pacman-dl.service:
src: etc/systemd/system/pacman-dl.service
dst: /etc/systemd/system/pacman-dl.service
f_pacman-dl.timer:
src: etc/systemd/system/pacman-dl.timer
dst: /etc/systemd/system/pacman-dl.timer
f_zsh.hook:
src: etc/pacman.d/hooks/zsh.hook
dst: /etc/pacman.d/hooks/zsh.hook
f_nightly-reboot.service:
src: etc/systemd/system/nightly-reboot.service
dst: /etc/systemd/system/nightly-reboot.service
f_nightly-reboot.timer:
src: etc/systemd/system/nightly-reboot.timer
dst: /etc/systemd/system/nightly-reboot.timer
f_mkinitcpio.conf:
src: etc/mkinitcpio.conf
dst: /etc/mkinitcpio.conf
f_vconsole.conf:
src: etc/vconsole.conf
dst: /etc/vconsole.conf
f_20-quiet-printk.conf:
src: etc/sysctl.d/20-quiet-printk.conf
dst: /etc/sysctl.d/20-quiet-printk.conf
profiles:
Locale:
dotfiles:
- f_locale.conf
- f_locale.gen
Pacman:
dotfiles:
- f_pacman.conf
- f_pacserve.service.conf
- f_pacman-dl.service
- f_pacman-dl.timer
Mirkwood:
dotfiles:
- f_getty.conf
- f_environment
- f_cryptissue
- f_welcomemessage.conf
- d_bin
- f_adb.service
- f_bluetooth.conf
- f_iwd@.service
- f_loader.conf
- f_sshd_config
- f_logind.conf
- f_60-uinput-permissions.rules
- f_freetype2.sh
- f_fonts.conf
- f_timesyncd.conf
- f_99-sysctl.conf
- f_99-lowbat.rules
- f_ignore
- f_zsh.hook
- f_mkinitcpio.conf
- f_vconsole.conf
- f_20-quiet-printk.conf
include:
- Locale
- Pacman
Rivendell:
include:
- Locale
- Pacman
dotfiles:
- f_getty.conf
- f_vconsole.conf
- f_mkinitcpio.conf
- f_bluetooth.conf
- f_60-uinput-permissions.rules
- f_timesyncd.conf
- f_sshd_config
- f_nightly-reboot.service
- f_nightly-reboot.timer

View file

@ -1,52 +0,0 @@
#!/bin/bash
# to run this, execute
# bash <(curl -sL git.reekynet.com/ReekyMarko/dotfiles/raw/branch/master/deploy.sh)
# Run this to install my dotfiles on a fresh Arch Linux installation.
# This should work on any Arch Linux install with an internet connection
# and sudo rights
# When asked a hostname, make sure it's already in the dotrop config,
# otherwise dotdrop won't install anything
export DOTREPO="$HOME/Git/dotfiles"
export HOSTNAME="$(hostnamectl | head -n 1 | sed 's/ //g' | cut -d':' -f2-)"
export DISTRO="$(lsb_release -ds | sed 's/"//g')"
if [ "$DISTRO" -ne "Arch Linux" ]; then
print "Not running on Arch Linux"
print "Other distros not supported, exiting..."
exit 1
fi
read -p "Hostname [$HOSTNAME]: " -i $HOSTNAME NEWHOSTNAME
if [ "$HOSTNAME -ne $NEWHOSTNAME" ]; then
sudo hostnamectl set-hostname $NEWHOSTNAME
fi
HOSTNAME=$NEWHOSTNAME
# install yay
if ! [ -x "$(command -v yay)" ]; then
read -p "Install yay? [Y/n] " -i "y" IYAY
if [ "$(tr '[:upper:]' ':lower:' $IYAY)" -eq "y" ]; then
print "Installing yay"
fi
sudo pacman -Syu --needed --noconfirm git wget base-devel
cd
wget https://aur.archlinux.org/cgit/aur.git/snapshot/yay.tar.gz
tar xfv yay.tar.gz
cd yay
makepkg -si --noconfirm
cd ..
rm -r yay*
fi
mkdir ~/Git
git clone https://git.reekynet.com/ReekyMarko/dotfiles.git $DOTREPO
cd ~/Git/dotfiles
git submodule init
git submodule update
$DOTREPO/dotdrop.sh --cfg=$DOTREPO/config-home.yaml install
chsh -s /bin/zsh
zsh -c "source ~/.zshrc; sdotdrop install"

2
docker/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*/.env
*/DISABLED

View file

@ -0,0 +1,78 @@
[volumes]
redis = {}
media = {}
custom_templates = {}
geoip = {}
backups = {}
[services.redis]
image = "redis:alpine"
container_name = "authentik-redis"
networks = ["authentik"]
restart = "unless-stopped"
volumes = ["redis:/data"]
[services.redis.healthcheck]
test = ["CMD-SHELL", "redis-cli ping | grep PONG"]
start_period = "20s"
interval = "30s"
retries = 5
timeout = "3s"
[services.server]
image = "ghcr.io/goauthentik/server"
container_name = "authentik"
restart = "unless-stopped"
command = "server"
volumes = [
"media:/media",
"custom_templates:/templates",
"geoip:/geoip",
]
env_file = [".env"]
networks = ["authentik", "postgres", "proxy"]
[services.worker]
image = "ghcr.io/goauthentik/server"
container_name = "authentik-worker"
restart = "unless-stopped"
command = "worker"
user = "root"
volumes = [
"backups:/backups",
"custom_templates:/templates",
"geoip:/geoip",
"media:/media",
"/var/run/docker.sock:/var/run/docker.sock",
]
env_file = [".env"]
networks = ["authentik", "postgres"]
[services.geoipupdate]
image = "maxmindinc/geoipupdate"
container_name = "authentik-geoipupdate"
restart = "unless-stopped"
networks = ["authentik"]
volumes = ["geoip:/usr/share/GeoIP"]
env_file = [".env"]
[services.geoipupdate.environment]
GEOIPUPDATE_EDITION_IDS = "GeoLite2-City"
GEOIPUPDATE_FREQUENCY = "8"
[services.whoami-test]
image = "traefik/whoami"
container_name = "whoami-test"
restart = "unless-stopped"
security_opt = ["no-new-privileges:true"]
networks = ["proxy"]
environment = ["TZ"]
[networks.authentik]
external = true
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -0,0 +1,37 @@
[volumes.caddy_data]
external = true
[volumes.caddy_config]
external = true
[volumes.caddy_wkd]
external = true
[volumes.homeautomation_hass]
external = true
[services.backup]
image = "offen/docker-volume-backup:v2"
container_name = "volume-backup"
restart = "unless-stopped"
environment = [
"AWS_ENDPOINT",
"AWS_S3_BUCKET_NAME",
"AWS_ACCESS_KEY_ID",
"AWS_SECRET_ACCESS_KEY",
"GPG_PASSPHRASE",
"EMAIL_SMTP_HOST",
"EMAIL_SMTP_PASSWORD",
"EMAIL_SMTP_USERNAME",
"EMAIL_SMTP_PORT",
"BACKUP_COMPRESSION=zst",
"BACKUP_RETENTION_DAYS=7",
]
volumes = [
"/var/run/docker.sock:/var/run/docker.sock:ro",
"/etc/localtime:/etc/localtime:ro",
"caddy_data:/backup/caddy_data:ro",
"caddy_config:/backup/caddy_config:ro",
"caddy_wkd:/backup/caddy_wkd:ro",
"homeautomation_hass:/backup/homeautomation_hass:ro",
]

218
docker/caddy/Caddyfile Normal file
View file

@ -0,0 +1,218 @@
{
order umami first
}
(common_site_settings) {
encode zstd gzip
tls {
dns cloudflare {$CLOUDFLARE_API_TOKEN}
resolvers 1.1.1.1
}
header {
Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
}
}
korhonen.cc, *.korhonen.cc {
import common_site_settings
@static {
file
path *.ico *.css *.js *.gif *.webp *.avif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.pdf *.webmanifest
}
@homepage-www-redir host www.korhonen.cc
handle @homepage-www-redir {
redir https://korhonen.cc
}
@homepage host korhonen.cc
handle @homepage {
# Redirect finnish WIP
# @redirFinnish {
# header Accept-Language *fi-FI*
# not path *.js *.css *.png *.jpg *.jpeg *.svg
# not path /en* /fi*
# }
# redir @redirFinnish /fi{uri}
#
# uri strip_prefix /en
header @static Cache-Control max-age=5184000
root * /var/www/korhonen.cc
file_server
}
@wkd host openpgpkey.korhonen.cc
handle @wkd {
root * /var/www/wkd
file_server browse
header Access-Control-Allow-Origin "*"
}
@index host index.korhonen.cc
handle @index {
umami {
event_endpoint "https://umami.korhonen.cc/api/send"
website_uuid "9fe4f5c0-8e63-4479-a58d-d399cdbc0a3a"
client_ip_header X-Real-IP
device_detection
allowed_extensions "" .tar.zst .json .html
}
root * /var/www/index.korhonen.cc
file_server browse
}
@home-assistant host home.korhonen.cc
handle @home-assistant {
reverse_proxy home-assistant:8123
}
@authentik host sso.korhonen.cc
handle @authentik {
reverse_proxy authentik:9000
}
@forgejo host git.korhonen.cc
handle @forgejo {
rewrite /user/login /user/oauth2/authentik
reverse_proxy forgejo:3000
}
@woodpecker host ci.korhonen.cc
handle @woodpecker {
reverse_proxy woodpecker:8000
}
@searx host search.korhonen.cc
handle @searx {
reverse_proxy searx:8080
}
@freshrss host rss.korhonen.cc
handle @freshrss {
reverse_proxy freshrss
}
@jellyfin host jellyfin.korhonen.cc
handle @jellyfin {
reverse_proxy jellyfin:8096
}
@pihole host pihole.korhonen.cc
handle @pihole {
reverse_proxy pihole
}
@umami host umami.korhonen.cc
handle @umami {
reverse_proxy umami:3000
}
@nextcloud host cloud.korhonen.cc
handle @nextcloud {
# Redirect login page to Authentik
redir /login /apps/sociallogin/custom_oidc/korhonen-sso 301
# .htaccess / data / config / ... shouldn't be accessible from outside
@forbidden {
path /.htaccess
path /data/*
path /config/*
path /db_structure
path /.xml
path /README
path /3rdparty/*
path /lib/*
path /templates/*
path /occ
path /console.php
}
handle @forbidden {
respond 404
}
redir /.well-known/carddav /remote.php/dav 301
redir /.well-known/caldav /remote.php/dav 301
root * /var/www/nextcloud
php_fastcgi nextcloud:9000 {
root /var/www/html
# Tells nextcloud to remove /index.php from URLs in links
env front_controller_active true
}
file_server
}
@tvheadend host tvheadend.korhonen.cc
handle @tvheadend {
reverse_proxy tvheadend:9981
}
@collabora host collabora.korhonen.cc
handle @collabora {
reverse_proxy collabora:9980
}
@grafana host grafana.korhonen.cc
handle @grafana {
reverse_proxy grafana:3000
}
@drop host drop.korhonen.cc
handle @drop {
reverse_proxy drop:3000
}
@ipvX host ipv6.korhonen.cc ipv4.korhonen.cc
handle @ipvX {
respond {remote_host}
}
@ott host ott.korhonen.cc
handle @ott {
reverse_proxy opentogethertube:8080
}
handle {
respond "404 Not Found" 404
}
handle_errors {
@homepage_404 {
expression {http.error.status_code} == 404
host korhonen.cc
}
handle @homepage_404 {
root * /var/www/korhonen.cc
rewrite * /404.html
file_server
}
respond "{err.status_code} {err.status_text}"
}
}
korhonen.social, *.korhonen.social {
import common_site_settings
@firefish-www-redir host www.korhonen.social
handle @firefish-www-redir {
redir https://korhonen.social
}
@firefish host korhonen.social
handle @firefish {
reverse_proxy firefish:3000
}
handle {
respond "404 Not Found" 404
}
handle_errors {
respond "{err.status_code} {err.status_text}"
}
}

View file

@ -0,0 +1,29 @@
[volumes]
data = {}
config = {}
wkd = {}
korhonen_cc = {}
[volumes.nextcloud_config]
external = true
[services.caddy]
image = "git.korhonen.cc/functionalhacker/caddy"
container_name = "caddy"
restart = "unless-stopped"
ports = ["80:80", "443:443/tcp", "443:443/udp"]
networks = ["proxy"]
volumes = [
"./Caddyfile:/etc/caddy/Caddyfile",
"data:/data",
"config:/config",
"wkd:/var/www/wkd",
"korhonen_cc:/var/www/korhonen.cc",
"nextcloud_config:/var/www/nextcloud",
"/var/www/index.korhonen.cc:/var/www/index.korhonen.cc",
]
environment = ["CLOUDFLARE_EMAIL", "CLOUDFLARE_API_TOKEN", "ACME_AGREE=true"]
cap_add = ["NET_ADMIN"]
[networks.proxy]
external = true

View file

@ -0,0 +1,8 @@
[services.cloudflare-ddns]
image = "timothyjmiller/cloudflare-ddns"
container_name = "cloudflare-ddns"
security_opt = ["no-new-privileges:true"]
network_mode = "host"
environment = ["PUID=1000", "PGID=1000"]
volumes = ["/mnt/Storage/docker/ddns/config.json:/config.json"]
restart = "unless-stopped"

View file

@ -0,0 +1,9 @@
[services.drop]
image = "lscr.io/linuxserver/pairdrop"
container_name = "drop"
restart = "unless-stopped"
networks = ["proxy"]
environment = ["TZ=Europe/Helsinki", "IPV6_LOCALIZE=4"]
[networks.proxy]
external = true

View file

@ -0,0 +1,41 @@
[volumes]
files = {}
config = {}
redis = {}
db = {}
[services.firefish]
image = "registry.firefish.dev/firefish/firefish"
container_name = "firefish"
restart = "unless-stopped"
depends_on = ["redis"]
ports = ["3084:3000"]
networks = ["firefish", "proxy"]
environment = { NODE_ENV = "production" }
volumes = ["files:/firefish/files", "config:/firefish/.config:ro"]
[services.redis]
image = "redis"
container_name = "redis-firefish"
restart = "unless-stopped"
networks = ["firefish"]
volumes = ["redis:/data"]
[services.db]
image = "groonga/pgroonga:3.1.8-alpine-16-slim"
container_name = "firefish-db"
restart = "unless-stopped"
networks = ["firefish"]
volumes = ["db:/var/lib/postgresql/data"]
[services.db.healthcheck]
test = "pg_isready --user=\"firefish\" --dbname=\"firefish\""
interval = "5s"
timeout = "5s"
retries = 5
[networks.firefish]
internal = true
[networks.proxy]
external = true

View file

@ -0,0 +1,32 @@
[volumes]
data = {}
runner = {}
[services.forgejo]
image = "git.korhonen.cc/functionalhacker/forgejo-asciidoc"
container_name = "forgejo"
environment = ["TZ=Europe/Helsinki", "USER_UID=1000", "USER_GID=1000"]
restart = "unless-stopped"
networks = ["postgres", "proxy"]
ports = ["2882:22"]
volumes = ["data:/data", "/etc/localtime:/etc/localtime:ro"]
[services.runner]
image = "code.forgejo.org/forgejo/runner:3.5.0"
container_name = "forgejo-runner"
user = "root:root"
volumes = [
"runner:/data",
"./runner.yaml:/data/config.yaml",
"/var/run/docker.sock:/var/run/docker.sock",
"/etc/localtime:/etc/localtime:ro",
]
environment = ["SOCKFILE=/var/run/docker.sock"]
restart = "unless-stopped"
command = "forgejo-runner daemon -c /data/config.yaml"
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -0,0 +1,34 @@
log:
level: info
runner:
file: .runner
capacity: 2
env_file: .env
timeout: 3h
insecure: false
fetch_timeout: 5s
fetch_interval: 2s
labels:
- 'docker:docker://git.korhonen.cc/functionalhacker/ubuntu-act:22.04'
cache:
enabled: true
dir: ''
host: ''
port: 0
external_server: ''
container:
network: ''
enable_ipv6: false
privileged: false
options:
workdir_parent:
valid_volumes:
- 'caddy_korhonen_cc'
docker_host: ''
force_pull: false
host:
workdir_parent:

View file

@ -1,31 +0,0 @@
version: '2'
services:
freepbx:
container_name: freepbx
image: tiredofit/freepbx
ports:
- 8012:80
- 5060:5060
- 5160:5160
- 18000-18100:18000-18100/udp
#### Flash Operator Panel
- 4445:4445
volumes:
- /docker/freepbx/certs:/certs
- /docker/freepbx/data:/data
- /docker/freepbx/logs:/var/log
- /docker/freepbx/www:/var/www/html
- /docker/freepbx/db:/var/lib/mysql
environment:
- RTP_START=18000
- RTP_FINISH=18100
- DB_EMBEDDED=TRUE
restart: always
### These final lines are for Fail2ban. If you don't want, comment and also add ENABLE_FAIL2BAN=FALSE to your environment
cap_add:
- NET_ADMIN
privileged: true

1
docker/freshrss/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.env

View file

@ -0,0 +1,19 @@
[volumes]
config = {}
[services.freshrss]
image = "linuxserver/freshrss"
container_name = "freshrss"
restart = "unless-stopped"
networks = ["freshrss", "postgres", "proxy"]
environment = ["PUID=1000", "PGID=985", "TZ=Europe/Helsinki"]
volumes = ["config:/config", "/etc/localtime:/etc/localtime:ro"]
[networks.freshrss]
external = false
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -1,41 +0,0 @@
version: '2'
networks:
gitea:
external: false
services:
gitea:
container_name: gitea
image: gitea/gitea:latest
environment:
- USER_UID=1000
- USER_GID=1000
- DB_TYPE=mysql
- DB_HOST=db:3306
- DB_NAME=gitea
- DB_USER=gitea
- DB_PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- /docker/gitea/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- '3000:3000'
- '222:22'
depends_on:
- db
mariadb:
container_name: mariadb-gitea
image: mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ports:
- '3308:3306'
volumes:
- /docker/gitea/mariadb:/var/lib/mysql

View file

@ -0,0 +1,20 @@
[volumes]
config = {}
data = {}
[services.headscale]
image = "headscale/headscale:0"
container_name = "headscale"
volumes = ["config:/etc/headscale", "data:/var/lib/headscale"]
ports = ["3478:3478/udp"]
command = "headscale serve"
restart = "unless-stopped"
networks = ["postgres"]
[services.headscale-ui]
image = "ghcr.io/gurucomputing/headscale-ui"
container_name = "headscale-ui"
restart = "unless-stopped"
[networks.postgres]
external = true

View file

@ -0,0 +1,111 @@
[volumes]
hass = {}
mosquitto = {}
piper_english = {}
whisper_english = {}
openwakeword_english = {}
[services.home-assistant]
container_name = "home-assistant"
image = "homeassistant/home-assistant"
restart = "unless-stopped"
environment = ["TZ=Europe/Helsinki"]
devices = ["/dev/ttyACM0"]
volumes = ["hass:/config", "/etc/localtime:/etc/localtime:ro"]
networks = ["homeautomation", "postgres", "proxy"]
ports = ["8123:8123", "8300:8300"]
extra_hosts = ["host.docker.internal:host-gateway"]
[services.mosquitto]
container_name = "mosquitto"
image = "eclipse-mosquitto"
restart = "unless-stopped"
environment = ["TZ=Europe/Helsinki"]
networks = ["homeautomation"]
ports = ["1883:1883", "8866:8866"]
volumes = ["mosquitto:/mosquitto", "/etc/localtime:/etc/localtime:ro"]
[services.piper_english]
container_name = "piper_english"
image = "rhasspy/wyoming-piper"
restart = "unless-stopped"
environment = ["TZ=Europe/Helsinki"]
ports = ["10200:10200"]
networks = ["homeautomation"]
command = ["--voice", "en_US-hfc_male-medium"]
volumes = ["piper_english:/data", "/etc/localtime:/etc/localtime:ro"]
[services.whisper_english]
container_name = "whisper_english"
image = "rhasspy/wyoming-whisper"
restart = "unless-stopped"
environment = ["TZ=Europe/Helsinki"]
ports = ["10300:10300"]
networks = ["homeautomation"]
depends_on = ["home-assistant"]
command = ["--model", "tiny-int8", "--language", "en"]
volumes = ["whisper_english:/data", "/etc/localtime:/etc/localtime:ro"]
[services.openwakeword_english]
container_name = "openwakeword_english"
image = "rhasspy/wyoming-openwakeword"
restart = "unless-stopped"
environment = ["TZ=Europe/Helsinki"]
networks = ["homeautomation"]
command = ["--preload-model", "ok_nabu"]
depends_on = ["home-assistant"]
volumes = ["openwakeword_english:/data", "/etc/localtime:/etc/localtime:ro"]
[services.microphone]
build = "https://github.com/rhasspy/wyoming-mic-external.git"
image = "rhasspy/wyoming-mic-external"
container_name = "microphone"
restart = "unless-stopped"
devices = ["/dev/snd:/dev/snd"]
ports = ["10600:10600"]
group_add = ["audio"]
networks = ["homeautomation"]
command = ["--device", "plughw:CARD=USB,DEV=0", "--debug"]
volumes = ["/etc/localtime:/etc/localtime:ro"]
[services.speaker]
build = "https://github.com/rhasspy/wyoming-snd-external.git"
image = "rhasspy/wyoming-snd-external"
container_name = "speaker"
restart = "unless-stopped"
devices = ["/dev/snd:/dev/snd"]
ports = ["10601:10601"]
group_add = ["audio"]
networks = ["homeautomation"]
command = ["--device", "iec958:CARD=USB,DEV=0", "--debug"]
volumes = ["/etc/localtime:/etc/localtime:ro"]
[services.satellite]
build = "https://github.com/rhasspy/wyoming-satellite.git"
image = "rhasspy/wyoming-satellite"
container_name = "satellite"
restart = "unless-stopped"
ports = ["10700:10700"]
networks = ["homeautomation"]
depends_on = ["speaker", "microphone", "whisper_english"]
command = [
"--name",
"ha-server-satellite",
"--mic-uri",
"tcp://microphone:10600",
"--snd-uri",
"tcp://speaker:10601",
"--wake-uri",
"tcp://openwakeword_english:10400",
"--debug",
]
volumes = ["/etc/localtime:/etc/localtime:ro"]
[networks.homeautomation]
external = false
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -1,72 +0,0 @@
version: '3'
services:
home-assistant:
environment:
TZ: 'Europe/Helsinki'
container_name: home-assistant
restart: always
image: homeassistant/home-assistant
volumes:
- /docker/homeautomation/home-assistant:/config
network_mode: host
depends_on:
- deconz
- mosquitto
deconz:
container_name: deconz
image: marthoc/deconz
restart: always
environment:
DECONZ_WEB_PORT: 8083
DECONZ_WS_PORT: 8084
DECONZ_VNC_PORT: 5901
DECONZ_VNC_MODE: 1
DECONZ_VNC_PASSWORD: '${DECONZ_VNC_PASSWORD}'
DEBUG_OTAU: 1
network_mode: host
volumes:
- /etc/localtime:/etc/localtime:ro
- /docker/homeautomation/deconz:/root/.local/share/dresden-elektronik/deCONZ
devices:
- /dev/ttyACM0
node-red:
container_name: node-red
image: nodered/node-red
restart: always
environment:
TZ: 'Europe/Helsinki'
ports:
- '1880:1880'
volumes:
- /docker/homeautomation/node-red:/data
depends_on:
- home-assistant
portainer:
container_name: portainer
image: portainer/portainer
restart: always
ports:
- '9000:9000'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /docker/homeautomation/portainer:/data
mosquitto:
container_name: mosquitto
image: eclipse-mosquitto
restart: always
network_mode: host
volumes:
- /docker/homeautomation/mosquitto:/mosquitto
mariadb:
container_name: mariadb-hass
image: mariadb
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
volumes:
- /docker/homeautomation/mariadb:/var/lib/mysql

View file

@ -1,8 +0,0 @@
#!/bin/bash
cat <<ENV > .env
MYSQL_ROOT_PASSWORD=$(pass reekynet/docker-home-automation | rg 'MYSQL_ROOT_PASSWORD' | cut -d' ' -f2-)
HA_MYSQL_PASSWORD="$(pass reekynet/docker-home-automation | rg 'HA_MYSQL_PASSWORD' | cut -d' ' -f2-)
DECONZ_VNC_PASSWORD=$(pass reekynet/docker-home-automation | rg 'DECONZ_VNC_PASSWORD' | cut -d' ' -f2-)
ENV
docker-compose up -d

View file

@ -0,0 +1,34 @@
[volumes]
config = {}
cache = {}
[volumes.media]
external = true
[volumes.nextcloud_data]
external = true
[services.jellyfin]
image = "jellyfin/jellyfin"
container_name = "jellyfin"
environment = ["TZ=Europe/Helsinki"]
ports = ["8096:8096"]
networks = ["proxy", "authentik"]
restart = "unless-stopped"
volumes = [
"config:/config",
"cache:/cache",
"media:/media",
"nextcloud_data:/nextcloud_data",
"/etc/localtime:/etc/localtime:ro",
]
devices = [
"/dev/dri/renderD128:/dev/dri/renderD128",
"/dev/dri/card1:/dev/dri/card0",
]
[networks.proxy]
external = true
[networks.authentik]
external = true

View file

@ -1,12 +0,0 @@
version: '3'
services:
jellyfin:
image: jellyfin/jellyfin
container_name: jellyfin
user: 1001:985
network_mode: 'host'
restart: always
volumes:
- /docker/jellyfin/config:/config
- /docker/jellyfin/cache:/cache
- /mnt/Storage/Media:/media

View file

@ -0,0 +1,10 @@
[volumes]
config = {}
[services.mumble]
container_name = "mumble"
image = "phlak/mumble"
environment = ["TZ=Europe/Helsinki"]
network_mode = "host"
volumes = ["config:/etc/mumble", "/etc/localtime:/etc/localtime:ro"]
restart = "unless-stopped"

View file

@ -0,0 +1,20 @@
[volumes]
config = {}
assets = {}
[services.netbootxyz]
image = "lscr.io/linuxserver/netbootxyz"
container_name = "netbootxyz"
restart = "unless-stopped"
environment = [
"PUID=1000",
"PGID=1000",
"TZ=Etc/UTC",
"MENU_VERSION=1.9.9",
"PORT_RANGE=30000:30010",
"SUBFOLDER=/",
"NGINX_PORT=80",
"WEB_APP_PORT=3000",
]
ports = ["3000:3000", "69:69/udp", "8081:80"]
volumes = ["config:/config", "assets:/assets"]

1
docker/nextcloud/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.env

View file

@ -0,0 +1,84 @@
[volumes.nextcloud_config]
external = true
[volumes.nextcloud_data]
external = true
[services.nextcloud]
image = "nextcloud:fpm-alpine"
container_name = "nextcloud"
restart = "unless-stopped"
networks = ["nextcloud", "postgres", "proxy"]
volumes = [
"nextcloud_config:/var/www/html",
"nextcloud_data:/var/www/html/data",
"/etc/localtime:/etc/localtime:ro",
]
environment = [
"REDIS_HOST=redis",
"REDIS_HOST_PASSWORD=123",
"TRUSTED_PROXIES=caddy",
"NEXTCLOUD_TRUSTED_DOMAINS=cloud.korhonen.cc",
"OVERWRITEHOST=cloud.korhonen.cc",
"OVERWRITEPROTOCOL=https",
]
depends_on = ["redis"]
[services.nextcloud.labels]
"ofelia.enabled" = true
"ofelia.job-exec.nextcloud.schedule" = "0 */5 * * * *"
"ofelia.job-exec.nextcloud.command" = "php /var/www/html/cron.php"
"ofelia.job-exec.nextcloud.user" = "www-data"
"ofelia.smtp-host" = "${SMTP_HOST}"
"ofelia.smtp-port" = "${SMTP_PORT}"
"ofelia.smtp-user" = "${SMTP_USER}"
"ofelia.smtp-password" = "${SMTP_PASSWORD}"
"ofelia.email-to" = "${EMAIL_TO}"
"ofelia.email-from" = "${EMAIL_FROM}"
"ofelia.mail-only-on-error" = true
[services.redis]
image = "redis:alpine"
container_name = "redis-nextcloud"
networks = ["nextcloud"]
restart = "unless-stopped"
command = "redis-server --requirepass 123"
[services.coturn]
image = "instrumentisto/coturn"
container_name = "coturn"
restart = "unless-stopped"
env_file = ".env"
ports = ["3478:3478/tcp", "3478:3478/udp", "49160-49200:49160-49200/udp"]
networks = ["nextcloud"]
command = [
"-n",
"--log-file=stdout",
"--min-port=49160",
"--max-port=49200",
"--realm=cloud.korhonen.cc",
"--use-auth-secret",
"--static-auth-secret=${STATIC_AUTH_SECRET}",
]
[services.collabora]
image = "collabora/code"
container_name = "collabora"
restart = "unless-stopped"
env_file = ".env"
environment = [
"username=${COLLABORA_USERNAME}",
"password=${COLLABORA_PASSWORD}",
"domain=cloud.korhonen.cc",
'extra_params=--o:ssl.enable=false --o:ssl.termination=true',
]
networks = ["proxy"]
[networks.nextcloud]
external = false
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -0,0 +1,9 @@
[services.ofelia]
image = "mcuadros/ofelia"
container_name = "ofelia"
restart = "unless-stopped"
volumes = [
"/etc/localtime:/etc/localtime:ro",
"/var/run/docker.sock:/var/run/docker.sock:ro",
]
command = "daemon --docker"

View file

@ -0,0 +1,38 @@
[services.opentogethertube]
image = "dyc3/opentogethertube"
container_name = "opentogethertube"
restart = "unless-stopped"
environment = [
"PORT=8080",
"REDIS_HOST=redis",
"REDIS_PORT=6379",
"FFPROBE_PATH=/usr/bin/ffprobe",
"DB_MODE=postgres",
"POSTGRES_USER=opentogethertube",
"POSTGRES_DB=opentogethertube",
"POSTGRES_HOST=postgres",
"POSTGRES_PASSWORD",
"DOCKER=1",
"OTT_HOSTNAME=ott.korhonen.cc",
"YOUTUBE_API_KEY",
"OPENTOGETHERTUBE_API_KEY",
"SESSION_SECRET",
]
ports = ["8080:8080", "3002:3002"]
networks = ["default", "postgres", "proxy"]
depends_on = ["redis"]
volumes = ["./production.toml:/app/env/production.toml"]
[services.redis]
container_name = "redis-opentogethertube"
image = "redis:alpine"
restart = "unless-stopped"
[services.redis.healthcheck]
test = "redis-cli ping"
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -0,0 +1,5 @@
log = { level = "info" }
[room]
enable_create_temporary = false
enable_create_permanent = false

View file

@ -0,0 +1,23 @@
[volumes]
config = {}
dnsmasq = {}
[services.pihole]
container_name = "pihole"
image = "pihole/pihole"
ports = ["53:53/tcp", "53:53/udp", "67:67/udp", "8069:80/tcp"]
networks = ["proxy"]
volumes = [
"config:/etc/pihole/",
"dnsmasq:/etc/dnsmasq.d/",
]
dns = ["127.0.0.1", "1.1.1.1"]
cap_add = ["NET_ADMIN"]
restart = "unless-stopped"
[services.pihole.environment]
TZ = "Europe/Helsinki"
WEBPASSWORD = "${WEBPASSWORD}"
[networks.proxy]
external = true

View file

@ -0,0 +1,17 @@
[volumes]
data = {}
[services.postgres]
container_name = "postgres"
image = "postgres:16"
environment = ["TZ=Europe/Helsinki"]
ports = ["127.0.0.1:5432:5432"]
networks = ["postgres"]
volumes = [
"data:/var/lib/postgresql/data",
"/etc/localtime:/etc/localtime:ro",
]
restart = "unless-stopped"
[networks.postgres]
external = true

View file

@ -0,0 +1,37 @@
[volumes]
config = {}
[services.searx]
container_name = "searx"
image = "searxng/searxng"
restart = "unless-stopped"
networks = ["searx", "proxy"]
volumes = [
"config:/etc/searxng",
#"/docker/searx/logo.png:/usr/local/searxng/searx/static/themes/simple/img/searxng.png:ro"
]
environment = ["SEARXNG_BASE_URL=https://search.korhonen.cc/"]
cap_drop = ["ALL"]
cap_add = ["CHOWN", "SETGID", "SETUID", "DAC_OVERRIDE"]
[services.searx.logging]
driver = "json-file"
[services.searx.logging.options]
max-size = "1m"
max-file = "1"
[services.redis]
container_name = "redis-searx"
image = "redis:alpine"
command = "redis-server --save \"\" --appendonly \"no\""
networks = ["searx"]
tmpfs = ["/var/lib/redis"]
cap_drop = ["ALL"]
cap_add = ["SETGID", "SETUID", "DAC_OVERRIDE"]
[networks.searx.ipam]
driver = "default"
[networks.proxy]
external = true

View file

@ -0,0 +1,27 @@
[services.grafana]
image = "grafana/grafana"
container_name = "grafana"
volumes = ["grafana:/var/lib/grafana"]
networks = ["stats", "proxy"]
user = "1000:984"
env_file = [".env"]
environment = [
"GF_AUTH_GENERIC_OAUTH_CLIENT_ID",
"GF_AUTH_GENERIC_OAUTH_CLIENT_SECRET",
"GF_AUTH_GENERIC_OAUTH_ENABLED=true",
"GF_AUTH_GENERIC_OAUTH_NAME=authentik",
"GF_AUTH_GENERIC_OAUTH_SCOPES=openid profile email",
"GF_AUTH_GENERIC_OAUTH_AUTH_URL=https://sso.korhonen.cc/application/o/authorize/",
"GF_AUTH_GENERIC_OAUTH_TOKEN_URL=https://sso.korhonen.cc/application/o/token/",
"GF_AUTH_GENERIC_OAUTH_API_URL=https://sso.korhonen.cc/application/o/userinfo/",
"GF_AUTH_SIGNOUT_REDIRECT_URL=https://sso.korhonen.cc/application/o/grafana/end-session/",
"GF_AUTH_OAUTH_AUTO_LOGIN=true",
"GF_SERVER_ROOT_URL=https://grafana.korhonen.cc",
"GF_AUTH_GENERIC_OAUTH_ROLE_ATTRIBUTE_PATH=contains(groups[*], 'Administrators') && 'Admin' || 'Viewer'",
]
[networks.stats]
external = false
[networks.proxy]
external = true

View file

@ -0,0 +1,9 @@
[services]
[services.tftp]
container_name = "tftp"
image = "pghalliday/tftp"
environment = ["TZ=Europe/Helsinki"]
restart = "unless-stopped"
ports = ["69:69/udp"]
volumes = ["/etc/localtime:/etc/localtime:ro", "/docker/tftp:/var/tftpboot"]

View file

@ -0,0 +1,21 @@
[volumes]
config = {}
picons = {}
[services.tvheadend]
image = "linuxserver/tvheadend"
container_name = "tvheadend"
environment = ["TZ=Europe/Helsinki", "PUID=1000", "PGID=985"]
volumes = [
"config:/config",
"picons:/picons",
"/mnt/Storage/Media/PVR:/recordings",
"/etc/localtime:/etc/localtime:ro",
]
ports = ["9981:9981", "9982:9982"]
devices = ["/dev/dvb:/dev/dvb"]
restart = "unless-stopped"
networks = ["proxy"]
[networks.proxy]
external = true

View file

@ -0,0 +1,20 @@
[services.umami]
image = "ghcr.io/umami-software/umami:postgresql-latest"
container_name = "umami"
restart = "unless-stopped"
networks = ["postgres", "proxy"]
env_file = ".env"
[services.umami.environment]
DATABASE_URL = "postgresql://umami:${POSTGRES_PASS}@postgres:5432/umami"
HASH_SALT = "${HASH_SALT}"
[services.umami.logging.options]
max-size = "10m"
max-file = "10"
[networks.postgres]
external = true
[networks.proxy]
external = true

View file

@ -0,0 +1,19 @@
[services.watchtower]
image = "containrrr/watchtower"
container_name = "watchtower"
restart = "unless-stopped"
environment = [
"WATCHTOWER_CLEANUP=true",
"WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@korhonen.cc",
"WATCHTOWER_NOTIFICATION_EMAIL_TO=admin@korhonen.cc",
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.migadu.com",
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587",
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER}",
"WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD}",
"WATCHTOWER_NOTIFICATION_EMAIL_DELAY=30",
"WATCHTOWER_NOTIFICATIONS=email",
]
volumes = [
"/var/run/docker.sock:/var/run/docker.sock",
"/etc/localtime:/etc/localtime:ro",
]

@ -1 +0,0 @@
Subproject commit 2d64e2ee59281e358253fadb04432a040f9392ee

82
flake.lock generated Normal file
View file

@ -0,0 +1,82 @@
{
"nodes": {
"firefox-gnome-theme": {
"flake": false,
"locked": {
"lastModified": 1730674701,
"narHash": "sha256-lf9MQs8+NUvQd8b5t+7c4kLqUQixGO9WwWcLa1XYuiQ=",
"owner": "rafaelmardojai",
"repo": "firefox-gnome-theme",
"rev": "823756d8ddd21cfd3a24a87dad402e490e0eb5ee",
"type": "github"
},
"original": {
"owner": "rafaelmardojai",
"repo": "firefox-gnome-theme",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1726989464,
"narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-24.05",
"repo": "home-manager",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1730883749,
"narHash": "sha256-mwrFF0vElHJP8X3pFCByJR365Q2463ATp2qGIrDUdlE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "dba414932936fde69f0606b4f1d87c5bc0003ede",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nur": {
"locked": {
"lastModified": 1731008709,
"narHash": "sha256-RBUutTfh/bcvWHzjnqybjB50evgMYGngOG1Iosxbs0E=",
"owner": "nix-community",
"repo": "NUR",
"rev": "dc5cb7606d6359297287945f6908ddf9d60e20f3",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "NUR",
"type": "github"
}
},
"root": {
"inputs": {
"firefox-gnome-theme": "firefox-gnome-theme",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"nur": "nur"
}
}
},
"root": "root",
"version": 7
}

44
flake.nix Normal file
View file

@ -0,0 +1,44 @@
{
description = "FunctionalHacker's NixOS config";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
nur.url = "github:nix-community/NUR";
home-manager = {
url = "github:nix-community/home-manager/release-24.05";
inputs.nixpkgs.follows = "nixpkgs";
};
firefox-gnome-theme = {
url = "github:rafaelmardojai/firefox-gnome-theme";
flake = false;
};
};
outputs = { nixpkgs, home-manager, nur, ... } @inputs:
let
configureNixSystem = hostname: nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
# Common settings for all hosts
({ pkgs, ... }: import ./nixos_common.nix
{ inherit inputs; inherit pkgs; })
# Host specific configuration
./hosts/${hostname}/configuration.nix
# home-manager
home-manager.nixosModules.home-manager
({ ... }: import ./home-manager.nix { inherit inputs; })
];
};
in
{
nixosConfigurations = {
Mirkwood = configureNixSystem "Mirkwood";
Shire = configureNixSystem "Shire";
};
};
}

19
gpg.nix Normal file
View file

@ -0,0 +1,19 @@
{ pkgs, ... }:
{
programs = {
ssh.startAgent = false;
gnupg.agent = {
enable = true;
enableSSHSupport = true;
enableExtraSocket = true;
};
};
services = {
pcscd.enable = true;
udev.packages = [
pkgs.yubikey-personalization
];
};
}

14
home-manager.nix Normal file
View file

@ -0,0 +1,14 @@
{ inputs, ... }:
{
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
extraSpecialArgs = { inherit inputs; };
backupFileExtension = "hm-backup";
users = {
functionalhacker = import ./users/functionalhacker/home.nix;
som = import ./users/som/home.nix;
};
};
}

View file

@ -1,12 +0,0 @@
#!/bin/bash
# vim:ft=sh
sudo efibootmgr \
--disk /dev/sda \
--part 1 \
--create \
--quiet \
--remove-dups \
--label "Arch Linux" \
--loader /vmlinuz-linux \
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'

View file

@ -1,12 +0,0 @@
#!/bin/bash
# vim:ft=sh
sudo efibootmgr \
--disk /dev/sda \
--part 1 \
--create \
--quiet \
--remove-dups \
--label "Arch Linux CK" \
--loader /vmlinuz-linux-ck-zen \
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'

View file

@ -1,12 +0,0 @@
#!/bin/bash
# vim:ft=sh
sudo efibootmgr \
--disk /dev/sda \
--part 1 \
--create \
--quiet \
--remove-dups \
--label "Arch Linux LTS" \
--loader /vmlinuz-linux-lts \
--unicode 'cryptdevice=UUID=19fa8fab-c5fe-454a-9a17-b7185ce975ea:cryptroot:allow-discards root=/dev/mapper/cryptroot rootflags=subvol=root resume=/dev/mapper/cryptroot resume_offset=7345408 rw quiet loglevel=3 vga=current vt.global_cursor_default=0 processor.max_cstate=5 rcu_nocbs=0-11 initrd=/amd-ucode.img initrd=/initramfs-linux.img amdgpu.noretry=0'

View file

@ -1,14 +0,0 @@
#!/bin/bash
# remove old entries
for bootentry in $(efibootmgr | head -n 3 | tail -n 1 | cut -d' ' -f2- | sed 's/,/\n/g'); do
sudo efibootmgr -qBb $bootentry
done
# add all entries back
for bootscript in *.efi; do
./$bootscript
done
# set bootorder
sudo efibootmgr --bootorder 0000,0001,0002

View file

@ -1,21 +0,0 @@
! Snazzy - Converted from https://github.com/sindresorhus/iterm2-snazzy
! using https://github.com/richo/itermcolors2xdefaults
URxvt*background: #1e1f28
URxvt*foreground: #ebece6
URxvt*cursorColor: #e4e4e4
URxvt*color0: #000
URxvt*color1: #fb4245
URxvt*color2: #50fa7b
URxvt*color3: #f0fa8b
URxvt*color4: #49b9fe
URxvt*color5: #fb4cb3
URxvt*color6: #8be9fd
URxvt*color7: #ededec
URxvt*color8: #555555
URxvt*color9: #fb4245
URxvt*color10: #50fa7b
URxvt*color11: #f0fa8b
URxvt*color12: #49b9fe
URxvt*color13: #fb4cb3
URxvt*color14: #8be9fd
URxvt*color15: #ededec

View file

@ -1,89 +0,0 @@
# -----------------$HOME/.abcde.conf----------------- #
#
# A sample configuration file to convert music cds to
# FLAC using abcde version 2.7.2
#
# http://andrews-corner.org/linux/abcde/index.html
# -------------------------------------------------- #
# Encode tracks immediately after reading. Saves disk space, gives
# better reading of 'scratchy' disks and better troubleshooting of
# encoding process but slows the operation of abcde quite a bit:
LOWDISK=y
# Specify the method to use to retrieve the track information,
# the alternative is to specify 'musicbrainz':
CDDBMETHOD=cddb
# Make a local cache of cddb entries and then volunteer to use
# these entries when and if they match the cd:
CDDBCOPYLOCAL="y"
CDDBLOCALDIR="$HOME/.cddb"
CDDBLOCALRECURSIVE="y"
CDDBUSELOCAL="y"
# Specify the encoder to use for FLAC. In this case
# flac is the only choice.
FLACENCODERSYNTAX=flac
# Specify the path to the selected encoder. In most cases the encoder
# should be in your $PATH as I illustrate below, otherwise you will
# need to specify the full path. For example: /usr/bin/flac
FLAC=flac
# Specify your required encoding options here. Multiple options can
# be selected as '--best --another-option' etc.
# Overall bitrate is about 880 kbs/s with level 8.
FLACOPTS='-s -e -V -8'
# Output type for FLAC.
OUTPUTTYPE="flac"
# The cd ripping program to use. There are a few choices here: cdda2wav,
# dagrab, cddafs (Mac OS X only) and flac. New to abcde 2.7 is 'libcdio'.
CDROMREADERSYNTAX=cdparanoia
# Give the location of the ripping program and pass any extra options,
# if using libcdio set 'CD_PARANOIA=cd-paranoia'.
CDPARANOIA=cdparanoia
CDPARANOIAOPTS="--never-skip=40"
# Give the location of the CD identification program:
CDDISCID=cd-discid
# Give the base location here for the encoded music files.
OUTPUTDIR="$HOME/Documents/Rip"
# The default actions that abcde will take.
ACTIONS=cddb,playlist,read,encode,tag,move,clean
# Decide here how you want the tracks labelled for a standard 'single-artist',
# multi-track encode and also for a multi-track, 'various-artist' encode:
OUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${TRACKNUM}.${TRACKFILE}'
VAOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${TRACKNUM}.${ARTISTFILE}-${TRACKFILE}'
# Decide here how you want the tracks labelled for a standard 'single-artist',
# single-track encode and also for a single-track 'various-artist' encode.
# (Create a single-track encode with 'abcde -1' from the commandline.)
ONETRACKOUTPUTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}'
VAONETRACKOUTPUTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}'
# Create playlists for single and various-artist encodes. I would suggest
# commenting these out for single-track encoding.
PLAYLISTFORMAT='${OUTPUT}/${ARTISTFILE}-${ALBUMFILE}/${ALBUMFILE}.m3u'
VAPLAYLISTFORMAT='${OUTPUT}/Various-${ALBUMFILE}/${ALBUMFILE}.m3u'
# This function takes out dots preceding the album name, and removes a grab
# bag of illegal characters. It allows spaces, if you do not wish spaces add
# in -e 's/ /_/g' after the first sed command.
mungefilename ()
{
echo "$@" | sed -e 's/^\.*//' | tr -d ":><|*/\"'?[:cntrl:]"
}
# What extra options?
MAXPROCS=2 # Run a few encoders simultaneously
PADTRACKS=y # Makes tracks 01 02 not 1 2
EXTRAVERBOSE=2 # Useful for debugging
COMMENT='abcde version 2.7.2' # Place a comment...
EJECTCD=y # Please eject cd when finished :-)

File diff suppressed because it is too large Load diff

View file

@ -1,199 +0,0 @@
window:
dimensions:
columns: 0
lines: 0
padding:
x: 30
y: 20
dynamic_padding: false
decorations: full
scrolling:
history: 10000
multiplier: 3
auto_scroll: false
tabspaces: 8
font:
normal:
family: Hack Nerd Font Mono
size: 12.0
offset:
x: 0
y: 0
glyph_offset:
x: 0
y: 0
use_thin_strokes: true
# Colors (One Dark)
colors:
# Default colors
primary:
background: '0x282c34'
foreground: '0xabb2bf'
# Cursor colors
cursor:
text: '0x282c34'
cursor: '0xabb2bf'
# Normal colors
normal:
black: '0x282c34'
red: '0xe06c75'
green: '0x98c379'
yellow: '0xe5c07b'
blue: '0x61afef'
magenta: '0xc678dd'
cyan: '0x56b6c2'
white: '0xabb2bf'
# Bright colors
bright:
black: '0x3e4452'
red: '0xbe5046'
green: '0x98c379'
yellow: '0xd19a66'
blue: '0x61afef'
magenta: '0xc678dd'
cyan: '0x56b6c2'
white: '0x5c6370'
visual_bell:
animation: EaseOutExpo
duration: 0
color: '#ffffff'
background_opacity: 1.0
mouse_bindings:
- { mouse: Middle, action: PasteSelection }
mouse:
double_click: { threshold: 300 }
triple_click: { threshold: 300 }
hide_when_typing: false
url:
modifiers: None
selection:
semantic_escape_chars: ',│`|:"'' ()[]{}<>'
save_to_clipboard: false
dynamic_title: true
cursor:
style: Block
unfocused_hollow: true
live_config_reload: true
enable_experimental_conpty_backend: true
alt_send_esc: true
key_bindings:
- { key: Paste, action: Paste }
- { key: Copy, action: Copy }
- { key: L, mods: Control, action: ClearLogNotice }
- { key: L, mods: Control, chars: "\x0c" }
- { key: Home, chars: "\x1bOH", mode: AppCursor }
- { key: Home, chars: "\x1b[H", mode: ~AppCursor }
- { key: End, chars: "\x1bOF", mode: AppCursor }
- { key: End, chars: "\x1b[F", mode: ~AppCursor }
- { key: PageUp, mods: Shift, action: ScrollPageUp, mode: ~Alt }
- { key: PageUp, mods: Shift, chars: "\x1b[5;2~", mode: Alt }
- { key: PageUp, mods: Control, chars: "\x1b[5;5~" }
- { key: PageUp, chars: "\x1b[5~" }
- { key: PageDown, mods: Shift, action: ScrollPageDown, mode: ~Alt }
- { key: PageDown, mods: Shift, chars: "\x1b[6;2~", mode: Alt }
- { key: PageDown, mods: Control, chars: "\x1b[6;5~" }
- { key: PageDown, chars: "\x1b[6~" }
- { key: Tab, mods: Shift, chars: "\x1b[Z" }
- { key: Back, chars: "\x7f" }
- { key: Back, mods: Alt, chars: "\x1b\x7f" }
- { key: Insert, chars: "\x1b[2~" }
- { key: Delete, chars: "\x1b[3~" }
- { key: Left, mods: Shift, chars: "\x1b[1;2D" }
- { key: Left, mods: Control, chars: "\x1b[1;5D" }
- { key: Left, mods: Alt, chars: "\x1b[1;3D" }
- { key: Left, chars: "\x1b[D", mode: ~AppCursor }
- { key: Left, chars: "\x1bOD", mode: AppCursor }
- { key: Right, mods: Shift, chars: "\x1b[1;2C" }
- { key: Right, mods: Control, chars: "\x1b[1;5C" }
- { key: Right, mods: Alt, chars: "\x1b[1;3C" }
- { key: Right, chars: "\x1b[C", mode: ~AppCursor }
- { key: Right, chars: "\x1bOC", mode: AppCursor }
- { key: Up, mods: Shift, chars: "\x1b[1;2A" }
- { key: Up, mods: Control, chars: "\x1b[1;5A" }
- { key: Up, mods: Alt, chars: "\x1b[1;3A" }
- { key: Up, chars: "\x1b[A", mode: ~AppCursor }
- { key: Up, chars: "\x1bOA", mode: AppCursor }
- { key: Down, mods: Shift, chars: "\x1b[1;2B" }
- { key: Down, mods: Control, chars: "\x1b[1;5B" }
- { key: Down, mods: Alt, chars: "\x1b[1;3B" }
- { key: Down, chars: "\x1b[B", mode: ~AppCursor }
- { key: Down, chars: "\x1bOB", mode: AppCursor }
- { key: F1, chars: "\x1bOP" }
- { key: F2, chars: "\x1bOQ" }
- { key: F3, chars: "\x1bOR" }
- { key: F4, chars: "\x1bOS" }
- { key: F5, chars: "\x1b[15~" }
- { key: F6, chars: "\x1b[17~" }
- { key: F7, chars: "\x1b[18~" }
- { key: F8, chars: "\x1b[19~" }
- { key: F9, chars: "\x1b[20~" }
- { key: F10, chars: "\x1b[21~" }
- { key: F11, chars: "\x1b[23~" }
- { key: F12, chars: "\x1b[24~" }
- { key: F1, mods: Shift, chars: "\x1b[1;2P" }
- { key: F2, mods: Shift, chars: "\x1b[1;2Q" }
- { key: F3, mods: Shift, chars: "\x1b[1;2R" }
- { key: F4, mods: Shift, chars: "\x1b[1;2S" }
- { key: F5, mods: Shift, chars: "\x1b[15;2~" }
- { key: F6, mods: Shift, chars: "\x1b[17;2~" }
- { key: F7, mods: Shift, chars: "\x1b[18;2~" }
- { key: F8, mods: Shift, chars: "\x1b[19;2~" }
- { key: F9, mods: Shift, chars: "\x1b[20;2~" }
- { key: F10, mods: Shift, chars: "\x1b[21;2~" }
- { key: F11, mods: Shift, chars: "\x1b[23;2~" }
- { key: F12, mods: Shift, chars: "\x1b[24;2~" }
- { key: F1, mods: Control, chars: "\x1b[1;5P" }
- { key: F2, mods: Control, chars: "\x1b[1;5Q" }
- { key: F3, mods: Control, chars: "\x1b[1;5R" }
- { key: F4, mods: Control, chars: "\x1b[1;5S" }
- { key: F5, mods: Control, chars: "\x1b[15;5~" }
- { key: F6, mods: Control, chars: "\x1b[17;5~" }
- { key: F7, mods: Control, chars: "\x1b[18;5~" }
- { key: F8, mods: Control, chars: "\x1b[19;5~" }
- { key: F9, mods: Control, chars: "\x1b[20;5~" }
- { key: F10, mods: Control, chars: "\x1b[21;5~" }
- { key: F11, mods: Control, chars: "\x1b[23;5~" }
- { key: F12, mods: Control, chars: "\x1b[24;5~" }
- { key: F1, mods: Alt, chars: "\x1b[1;6P" }
- { key: F2, mods: Alt, chars: "\x1b[1;6Q" }
- { key: F3, mods: Alt, chars: "\x1b[1;6R" }
- { key: F4, mods: Alt, chars: "\x1b[1;6S" }
- { key: F5, mods: Alt, chars: "\x1b[15;6~" }
- { key: F6, mods: Alt, chars: "\x1b[17;6~" }
- { key: F7, mods: Alt, chars: "\x1b[18;6~" }
- { key: F8, mods: Alt, chars: "\x1b[19;6~" }
- { key: F9, mods: Alt, chars: "\x1b[20;6~" }
- { key: F10, mods: Alt, chars: "\x1b[21;6~" }
- { key: F11, mods: Alt, chars: "\x1b[23;6~" }
- { key: F12, mods: Alt, chars: "\x1b[24;6~" }
- { key: F1, mods: Super, chars: "\x1b[1;3P" }
- { key: F2, mods: Super, chars: "\x1b[1;3Q" }
- { key: F3, mods: Super, chars: "\x1b[1;3R" }
- { key: F4, mods: Super, chars: "\x1b[1;3S" }
- { key: F5, mods: Super, chars: "\x1b[15;3~" }
- { key: F6, mods: Super, chars: "\x1b[17;3~" }
- { key: F7, mods: Super, chars: "\x1b[18;3~" }
- { key: F8, mods: Super, chars: "\x1b[19;3~" }
- { key: F9, mods: Super, chars: "\x1b[20;3~" }
- { key: F10, mods: Super, chars: "\x1b[21;3~" }
- { key: F11, mods: Super, chars: "\x1b[23;3~" }
- { key: F12, mods: Super, chars: "\x1b[24;3~" }
- { key: NumpadEnter, chars: "\n" }

View file

@ -1,9 +0,0 @@
continue
file-allocation=falloc
log-level=warn
max-connection-per-server=4
max-concurrent-downloads=3
max-overall-download-limit=0
min-split-size=5M
enable-http-pipelining=true
rpc-secret="{{@@ env['PASS_ARIA2'] @@}}"

View file

@ -1,45 +0,0 @@
directory: ~/Music
library: ~/Music/beets.db
plugins:
- acousticbrainz
- check
- edit
- fetchart
- follow
- fuzzy
- info
- lastgenre
- lyrics
- mbcollection
- mpdupdate
- play
- replaygain
- thumbnails
- web
import:
copy: no
move: yes
link: no
lastgenre:
whitelist: ~/.config/beets/whitelist
lyrics:
fallback: ''
play:
command: mpv
mpd:
host: localhost
port: 6600
follow:
email: reekymarko@reekynet.com
password: "{{@@ env['PASS_MUSPY'] @@}}"
userid: w8njp08ude90mfzsgumjhqinnirj4g
auto: yes
replaygain:
backend: gstreamer
auto: yes
musicbrainz:
user: ReekyMarko
pass: "{{@@ env['PASS_MUSICBRAINZ'] @@}}"
mbcollection:
auto: "yes"
collection: "a4955b5c-db7f-4e27-9887-f77f820bad34"

View file

@ -1,37 +0,0 @@
avantgarde
experimental music
lofi
blues
classical
comedy
comedy music
comedy rock
humor
parody music
standup
country
country rap
country rock
rockabilly
easy listening
electronic
drum and bass
hardcore
house
techno
uk garage
dubstep
rap
folk
hip hop
countryrap
rap rock
jazz
pop
rhythm and blues
rock
hard rock
alternative rock
heavy metal
punk rock
reggae

View file

@ -1,75 +0,0 @@
#! /bin/sh
# set screen timeout
xset s 300 120
xset dpms 422
# screen locker
xss-lock -n ~/Scripts/dim-screen.sh -- evenbetterlockscreen -l &
# lock screen
evenbetterlockscreen -l &
# set wallpaper
wal -R
# Start hotkey daemon
sxhkd &
bspc monitor -d web term chat mail music 6 7
bspc config border_width 0
bspc config window_gap 37
bspc config split_ratio 0.52
bspc config borderless_monocle true
bspc config gapless_monocle true
bspc rule -a TelegramDesktop desktop=^3
bspc rule -a Franz desktop=^3
bspc rule -a Thunderbird desktop=^4
bspc rule -a Zathura state=tiled
bspc rule -a Nightly:Navigator state=tiled
bspc rule -a kdeconnect-indicator state=tiled
bspc rule -a libreoffice state=tiled
bspc rule -a Screenkey manage=off
bspc config super mod4
bspc config pointer_action1 move
bspc config pointer_action2 none
bspc config pointer_action3 resize_corner
bspc config click_to_focus true
# set pywal colors
. "${HOME}/.cache/wal/colors.sh"
bspc config normal_border_color "$color1"
bspc config active_border_color "$color2"
bspc config focused_border_color "$color15"
bspc config presel_feedback_color "$color1"
# set cursor style
xsetroot -cursor_name left_ptr
# startup applications
joplin-desktop &
compton -f --config ~/.config/compton/config &
redshift &
/usr/lib/xfce4/notifyd/xfce4-notifyd &
telegram-desktop &
setxkbmap eu &
/usr/lib/kdeconnectd &
kdeconnect-indicator &
udiskie --tray &
xfce4-clipman &
/usr/bin/gnome-keyring-daemon --start --components=secrets &
~/Scripts/polybar.sh &
/usr/lib/mate-polkit/polkit-mate-authentication-agent-1 &
blueberry-tray &
nm-applet &
thunderbird &
mpDris2 &
# hide mouse cursor
unclutter -idle 1 &

View file

@ -1,53 +0,0 @@
backend = "glx";
glx-no-stencil = true;
glx-copy-from-front = false;
glx-swap-method = 1;
inactive-opacity-override = true;
# Fix tearing
vsync = "opengl-swc";
unredir-if-possible = false;
paint-on-overlay = true;
# Shadow
shadow = true; # Enabled client-side shadows on windows.
no-dock-shadow = true; # Avoid drawing shadows on dock/panel windows.
no-dnd-shadow = true; # Don't draw shadows on DND windows.
shadow-radius = 10; # The blur radius for shadows. (default 12)
shadow-offset-x = -15; # The left offset for shadows. (default -15)
shadow-offset-y = -15; # The top offset for shadows. (default -15)
shadow-opacity = 0.5;
menu-opacity = 1;
shadow-exclude = [
"class_g = 'slop'",
"n:e:Notification",
"class_g ?= 'Xfce4-notifyd'",
#"class_g ?= 'Xfce4-power-manager'"
];
opacity-rule = [
"50:class_g = 'Bspwm' && class_i = 'presel_feedback'",
"99:class_g = 'slop'"
];
# The shadow exclude options are helpful if you have shadows enabled. Due to the way compton draws its shadows, certain applications will have visual glitches
# (most applications are fine, only apps that do weird things with xshapes or argb are affected).
# This list includes all the affected apps I found in my testing. The "! name~=''" part excludes shadows on any "Unknown" windows, this prevents a visual glitch with the XFWM alt tab switcher.
# Fading
fading = true; # Fade windows during opacity changes.
fade-delta = 4; # The time between steps in a fade in milliseconds. (default 10).
fade-in-step = 0.03; # Opacity change between steps while fading in. (default 0.028).
fade-out-step = 0.03; # Opacity change between steps while fading out. (default 0.03).
no-fading-openclose = false; # Fade windows in/out when opening/closing
detect-client-opacity = true; # This prevents opacity being ignored for some apps. For example without this enabled my xfce4-notifyd is 100% opacity no matter what.
#Window type settings
wintypes:
{
tooltip = { fade = true; shadow = false; };
menu = { shadow = false; };
dropdown_menu = { shadow = false; };
popup_menu = { shadow = false; };
};

View file

@ -1,6 +0,0 @@
languages:
markdown:
lint-command: 'yarn --cwd ~/.bin/node run markdownlint -s'
lint-stdin: true
lint-formats:
- '%f: %l: %m'

View file

@ -1,3 +0,0 @@
_JAVA_AWT_WM_NONREPARENTING=1
_JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
JAVA_FONTS=/usr/share/fonts/TTF

View file

@ -1,8 +0,0 @@
flash-opacity: 0.8
default-opacity: 1
time: 300
simple: false
ntimepoints: 10
flash-on-focus: true
flash-fullscreen: true
flash-lone-windows: 'always'

View file

@ -1,26 +0,0 @@
<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
<alias>
<family>sans-serif</family>
<prefer>
<family>Overpass</family>
</prefer>
</alias>
<alias>
<family>serif</family>
<prefer>
<family>Overpass</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Hack Nerd Font Mono</family>
</prefer>
</alias>
</fontconfig>

View file

@ -1,3 +0,0 @@
VteTerminal, vte-terminal {
padding: 40px;
}

View file

@ -1,266 +0,0 @@
# ~/.config/i3/config
client.focused #3F8AC2 #096BAA #00BAA7 #00DA8E
client.focused_inactive #333333 #5F676A #ffffff #484e50
client.unfocused #333333 #424242 #888888 #292d2e
client.urgent #C10004 #900000 #ffffff #900000
# GAPS
gaps inner 20
set $mode_gaps Gaps: (o) outer, (i) inner
set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global)
set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global)
bindsym $mod+Shift+g mode "$mode_gaps"
# Modes for controlling gaps
mode "$mode_gaps" {
bindsym o mode "$mode_gaps_outer"
bindsym i mode "$mode_gaps_inner"
bindsym Return mode "default"
bindsym Escape mode "default"
}
mode "$mode_gaps_inner" {
bindsym plus gaps inner current plus 5
bindsym minus gaps inner current minus 5
bindsym 0 gaps inner current set 0
bindsym Shift+plus gaps inner all plus 5
bindsym Shift+minus gaps inner all minus 5
bindsym Shift+0 gaps inner all set 0
bindsym Return mode "default"
bindsym Escape mode "default"
}
mode "$mode_gaps_outer" {
bindsym plus gaps outer current plus 5
bindsym minus gaps outer current minus 5
bindsym 0 gaps outer current set 0
bindsym Shift+plus gaps outer all plus 5
bindsym Shift+minus gaps outer all minus 5
bindsym Shift+0 gaps outer all set 0
bindsym Return mode "default"
bindsym Escape mode "default"
}
set $mod mod4
set $term termite
bindsym $mod+d exec --no-startup-id rofi -show-icons -show drun -config /home/reekymarko/.config/rofi/config
bindsym $mod+p exec --no-startup-id rofi-pass --last-used
bindsym $mod+Shift+p exec --no-startup-id rofi-pass --bmarks --last-used
font pango:System San Francisco Display 11
new_window 1pixel
hide_edge_borders vertical
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Return exec --no-startup-id $term
# kill focused window
bindsym $mod+Shift+q kill
# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+y split h
# split in vertical orientation
bindsym $mod+x split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
focus_follows_mouse no
# focus the child container
#bindsym $mod+d focus child
# open with clipboard contents
bindsym $mod+v exec --no-startup-id mpv --ytdl-format="bestvideo[ext=mp4][height<=?1080]+bestaudio[ext=m4a]" $(xclip -o)
bindym $mod+Shift+b exec --no-startup-id firefox-nightly $(xclip -o)
#workspace names
set $workspace1 "1: Start "
set $workspace2 "2"
set $workspace3 "3"
set $workspace4 "4"
set $workspace5 "5"
set $workspace6 "6"
set $workspace7 "7"
set $workspace8 "8: Mail "
set $workspace9 "9: Messaging "
set $workspace10 "10: Music "
# switch to workspace
bindsym $mod+1 workspace $workspace1
bindsym $mod+2 workspace $workspace2
bindsym $mod+3 workspace $workspace3
bindsym $mod+4 workspace $workspace4
bindsym $mod+5 workspace $workspace5
bindsym $mod+6 workspace $workspace6
bindsym $mod+7 workspace $workspace7
bindsym $mod+8 workspace $workspace8
bindsym $mod+9 workspace $workspace9
bindsym $mod+0 workspace $workspace10
# classes
for_window [class="TelegramDesktop"] move to workspace $workspace9
for_window [class="Thunderbird"] move to workspace $workspace8
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $workspace1
bindsym $mod+Shift+2 move container to workspace $workspace2
bindsym $mod+Shift+3 move container to workspace $workspace3
bindsym $mod+Shift+4 move container to workspace $workspace4
bindsym $mod+Shift+5 move container to workspace $workspace5
bindsym $mod+Shift+6 move container to workspace $workspace6
bindsym $mod+Shift+7 move container to workspace $workspace7
bindsym $mod+Shift+8 move container to workspace $workspace8
bindsym $mod+Shift+9 move container to workspace $workspace9
bindsym $mod+Shift+0 move container to workspace $workspace10
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec --no-startup-id i3-msg exit
# resize window (you can also use the mouse for that)
mode "resize" {
# These bindings trigger as soon as you enter the resize mode
# Pressing left will shrink the windows width.
# Pressing right will grow the windows width.
# Pressing up will shrink the windows height.
# Pressing down will grow the windows height.
bindsym j resize shrink width 10 px or 10 ppt
bindsym k resize grow height 10 px or 10 ppt
bindsym l resize shrink height 10 px or 10 ppt
bindsym semicolon resize grow width 10 px or 10 ppt
# same bindings, but for the arrow keys
bindsym Left resize shrink width 10 px or 10 ppt
bindsym Down resize grow height 10 px or 10 ppt
bindsym Up resize shrink height 10 px or 10 ppt
bindsym Right resize grow width 10 px or 10 ppt
# back to normal: Enter or Escape
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
set $bg-color #263238
set $inactive-bg-color #263238
set $text-color #f3f4f5
set $inactive-text-color #676E7D
set $urgent-bg-color #E53935
# window colors
# border background text indicator
client.focused $bg-color $bg-color $text-color #00ff00
client.unfocused $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
client.focused_inactive $inactive-bg-color $inactive-bg-color $inactive-text-color #00ff00
client.urgent $urgent-bg-color $urgent-bg-color $text-color #00ff00
# pulseaudio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse sset Master 5%+ # increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D pulse sset Master 5%- # decrease sound volume
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse set Master 1+ toggle # mute sound
# sreen brightness controls
bindsym XF86MonBrightnessUp exec --no-startup-id light -A 5 # increase screen brightness
bindsym XF86MonBrightnessDown exec --no-startup-id light -U 5 # decrease screen brightness
# screenshot and screencast
bindsym Print exec --no-startup-id "maim -u -s -l -c 0.157,0.333,0.466,0.4 | xclip -selection clipboard -t image/png && canberra-gtk-play -i camera-shutter"
bindsym $mod+Print exec --no-startup-id ~/scripts/record-screen.sh
# mpd controls
bindsym XF86AudioNext exec --no-startup-id mpc next
bindsym XF86AudioPrev exec --no-startup-id mpc prev
bindsym XF86AudioPlay exec --no-startup-id mpc toggle
bindsym XF86AudioStop exec --no-startup-id mpc clear
# connect bluetooth headset
bindsym $mod+c exec --no-startup-id bluetoothctl connect 17:08:01:0D:09:33
# connect bluetooth speaker
bindsym $mod+Shift+c exec --no-startup-id bluetoothctl connect 27:59:BE:CE:45:42
# lock screen
bindsym Control+Shift+l exec --no-startup-id evenbetterlockscreen -l
# open browser
bindsym $mod+b exec --no-startup-id firefox-nightly
{%@@ if profile == "ReekyPC" @@%}
# desktop only
exec_always --no-startup-id ~/scripts/desktop_screenlayout.sh
{%@@ endif @@%}
# autostart applications
exec_always --no-startup-id ~/Scripts/polybar.sh
exec --no-startup-id redshift
exec --no-startup-id unclutter
exec --no-startup-id nm-applet
exec --no-startup-id compton -f --config ~/.config/compton/compton.conf
exec --no-startup-id LANG=en_DK.UTF-8 telegram-desktop
exec --no-startup-id setxkbmap eu
exec --no-startup-id blueberry-tray
exec --no-startup-id mpDris2
exec --no-startup-id /usr/lib/kdeconnectd
exec --no-startup-id kdeconnect-indicator
exec --no-startup-id /usr/lib/xfce4/notifyd/xfce4-notifyd
exec --no-startup-id udiskie --tray
exec --no-startup-id pamac-tray
exec --no-startup-id xfce4-clipman
exec --no-startup-id thunderbird
exec --no-startup-id /usr/bin/gnome-keyring-daemon --start --components=secrets
exec --no-startup-id evenbetterlockscreen -w
exec --no-startup-id evenbetterlockscreen -l

View file

@ -1,132 +0,0 @@
# ~/.config/i3/config
set $mod mod4
set $term alacritty
bindsym $mod+d exec --no-startup-id rofi -show-icons -show drun -config /home/reekymarko/.config/rofi/config
font pango:System San Francisco Display 11
new_window 1pixel
hide_edge_borders vertical
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
# start a terminal
bindsym $mod+Return exec --no-startup-id $term
# kill focused window
bindsym $mod+w kill
# change focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# alternatively, you can use the cursor keys:
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# move focused window
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# alternatively, you can use the cursor keys:
bindsym $mod+Shift+Left move left
bindsym $mod+Shift+Down move down
bindsym $mod+Shift+Up move up
bindsym $mod+Shift+Right move right
# split in horizontal orientation
bindsym $mod+y split h
# split in vertical orientation
bindsym $mod+x split v
# enter fullscreen mode for the focused container
bindsym $mod+f fullscreen toggle
# change container layout (stacked, tabbed, toggle split)
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# toggle tiling / floating
bindsym $mod+Shift+space floating toggle
# change focus between tiling / floating windows
bindsym $mod+space focus mode_toggle
# focus the parent container
bindsym $mod+a focus parent
focus_follows_mouse no
# focus the child container
#bindsym $mod+d focus child
# open with clipboard contents
bindsym $mod+v exec --no-startup-id mpv --ytdl-format="bestvideo[ext=mp4][height<=?1080]+bestaudio[ext=m4a]" $(xclip -o)
bindym $mod+Shift+b exec --no-startup-id firefox-nightly $(xclip -o)
#workspace names
set $workspace1 "1: Start "
set $workspace2 "2"
set $workspace3 "3"
set $workspace4 "4"
set $workspace5 "5"
set $workspace6 "6"
set $workspace7 "7"
set $workspace8 "8: Mail "
set $workspace9 "9: Messaging "
set $workspace10 "10: Music "
# switch to workspace
bindsym $mod+1 workspace $workspace1
bindsym $mod+2 workspace $workspace2
bindsym $mod+3 workspace $workspace3
bindsym $mod+4 workspace $workspace4
bindsym $mod+5 workspace $workspace5
bindsym $mod+6 workspace $workspace6
bindsym $mod+7 workspace $workspace7
bindsym $mod+8 workspace $workspace8
bindsym $mod+9 workspace $workspace9
bindsym $mod+0 workspace $workspace10
# move focused container to workspace
bindsym $mod+Shift+1 move container to workspace $workspace1
bindsym $mod+Shift+2 move container to workspace $workspace2
bindsym $mod+Shift+3 move container to workspace $workspace3
bindsym $mod+Shift+4 move container to workspace $workspace4
bindsym $mod+Shift+5 move container to workspace $workspace5
bindsym $mod+Shift+6 move container to workspace $workspace6
bindsym $mod+Shift+7 move container to workspace $workspace7
bindsym $mod+Shift+8 move container to workspace $workspace8
bindsym $mod+Shift+9 move container to workspace $workspace9
bindsym $mod+Shift+0 move container to workspace $workspace10
# restart i3 inplace (preserves your layout/session, can be used to upgrade i3)
bindsym $mod+Shift+r restart
# exit i3 (logs you out of your X session)
bindsym $mod+Shift+e exec --no-startup-id i3-msg exit
# pulseaudio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id amixer -D pulse sset Master 5%+ # increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id amixer -D pulse sset Master 5%- # decrease sound volume
bindsym XF86AudioMute exec --no-startup-id amixer -D pulse set Master 1+ toggle # mute sound
# open browser
bindsym $mod+b exec --no-startup-id firefox-nightly
# window rules
for_window [class="Steam"] move to workspace $workspace2
# autostart applications
exec --no-startup-id setxkbmap eu
exec --no-startup-id steam-native
exec --no-startup-id kodi

View file

@ -1,28 +0,0 @@
[calendars]
[[birthdays]]
path = ~/.calendars/contact_birthdays
type = calendar
color = light green
readonly = True
[[school]]
path = ~/.calendars/school
type = calendar
color = light green
[[personal]]
path = ~/.calendars/personal
type = calendar
color = light green
[[card_local]]
path = ~/.contacts/*
type = discover
[locale]
timeformat = %H:%M
dateformat = %Y-%m-%d
longdateformat = %Y-%m-%d
datetimeformat = %Y-%m-%d %H:%M
longdatetimeformat = %Y-%m-%d %H:%M

View file

@ -1,28 +0,0 @@
# example configuration file for khard version >= 0.11.0
# place it under $HOME/.config/khard/khard.conf
[addressbooks]
[[contacts]]
path = ~/.contacts
[general]
debug = no
default_action = list
editor = vim
merge_editor = vimdiff
[contact table]
# display names by first or last name: first_name / last_name
display = first_name
# group by address book: yes / no
group_by_addressbook = no
# reverse table ordering: yes / no
reverse = no
# append nicknames to name column: yes / no
show_nicknames = no
# show uid table column: yes / no
show_uids = yes
# sort by first or last name: first_name / last_name
sort = last_name
# localize dates: yes / no
localize_dates = yes

View file

@ -1,2 +0,0 @@
MPDAddress = "127.0.0.1:6600"
ListenbrainzToken = "{{@@ env['PASS_LISTENBRAINZ'] @@}}"

View file

@ -1,6 +0,0 @@
background-color=#282828
text-color=#EBDBB2
border-color=#D65D0E
icons=1
default-timeout=5000
max-visible=6

View file

@ -1,47 +0,0 @@
mpvq %U
^https?://invidio.us/.*
mpvq %U
^https?://(m.)?(www.)?youtube.com/watch\?.*v=
mpvq %U
^https?://(www.)?youtube.com/playlist\?.*list=
mpvq %U
^https?://(www.)?youtu.be/
mpvq %U
^https?://(www.)?(m.)?twitch.tv/
mpvq %U
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:mp4|mkv|webm|avi|3gp|gif|gifv)
mpvq %U
^https?://www.facebook.com/.*/videos/
mpvq %U
^https?://gfycat.com/.*
mpvq %U
^https?://vimeo.com/.*
mpvq %U
^https?://v.redd.it/.*
imgurviewer %U
^https?://(www.)?imgur.com/a/
imgurviewer %U
^https?://(www.)?imgur.com/gallery/
imageviewer %U
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:jpg|jpeg|png|svg)
zathura %U
^https?://(?:[a-z0-9\-]+\.)+[a-z]{2,6}(?:/[^/#?]+)+\.(?:pdf)
alacritty -e rtv "%U"
^https?://(www.)?reddit.com.*
alacritty -e rtv "%U"
^https?://redd.it.*

View file

@ -1,7 +0,0 @@
[Connection]
host = localhost
port = 6600
password = {{@@ env['PASS_MPD'] @@}}
[Bling]
notify = False

View file

@ -1,25 +0,0 @@
music_directory "~/Music"
playlist_directory "~/Music/Playlists"
db_file "~/.mpd/database"
log_file "~/.mpd/log"
pid_file "~/.mpd/pid"
state_file "~/.mpd/state"
sticker_file "~/.mpd/sticker.sql"
replaygain "track"
default_permissions "read"
password "{{@@ env['PASS_MPD'] @@}}@read,add,control"
password "{{@@ env['PASS_MPD_ADMIN'] @@}}@read,add,control,admin"
audio_output {
type "fifo"
name "Visualizer"
path "/tmp/mpd.fifo"
format "44100:16:2"
}
audio_output {
type "pulse"
name "MPD PulseAudio"
}

View file

@ -1,21 +0,0 @@
Alt+LEFT add video-pan-x -0.1
Alt+h add video-pan-x -0.1
Alt+DOWN add video-pan-y +0.1
Alt+j add video-pan-y +0.1
Alt+UP add video-pan-y -0.1
Alt+k add video-pan-y -0.1
Alt+RIGHT add video-pan-x +0.1
Alt+l add video-pan-x +0.1
# control pulseaudio volume
9 add ao-volume -2
0 add ao-volume +2
/ add ao-volume -2
* add ao-volume +2
m cycle ao-mute
VOLUME_DOWN add ao-volume -2
VOLUME_UP add ao-volume +2
MUTE cycle ao-mute

View file

@ -1,112 +0,0 @@
#############
# Video #
#############
# Hardware decoding
vo=gpu
hwdec=vaapi
hwdec-codecs=all
{%@@ if profile == "Mirkwood" @@%}
gpu-context=wayland
{%@@ elif profile == "Rivendell" @@%}
ao=alsa
{%@@ endif @@%}
#############
# Audio #
#############
pulse-buffer=50 # using a large buffer causes seeking issues
audio-pitch-correction=yes # automatically insert scaletempo when playing with higher speed
#############
# Plugins/misc #
#############
# Mpris plugin
script=/usr/lib/mpv/mpris.so
# Start ipc server
input-ipc-server=/tmp/mpvsocket
# set youtube-dl max res to 1080
ytdl-format=bestvideo[height<=1080]+bestaudio/best[height<=1080]
# continue watching
save-position-on-quit
#############
# Languages #
#############
slang=eng,en,enUS,en-US,fi,fiFI,fi-FI # automatically select these subtitles (decreasing priority)
alang=eng,en,enUS,en-US,fi,fiFI,fi-FI # automatically select these audio tracks (decreasing priority)
ytdl-raw-options=sub-lang="en,eng,enUS,en-US,fi,fiFI,fi-FI"
#############
# Subtitles #
#############
no-sub # subtitles off on startup
demuxer-mkv-subtitle-preroll # try to correctly show embedded subs when seeking
sub-auto=fuzzy # external subs don't have to match the file name exactly to autoload
sub-file-paths=ass:srt:sub:subs:subtitles # search for external subs in the listed subdirectories
embeddedfonts=yes # use embedded fonts for SSA/ASS subs
sub-ass-force-style=Kerning=yes # allows you to override style parameters of ASS scripts
# the following options only apply to subtitles without own styling (i.e. not ASS but e.g. SRT)
sub-font="Overpass"
sub-font-size=45
sub-color="#FFFFFFFF"
sub-border-color="#FF262626"
sub-border-size=3.2
sub-shadow-offset=1
sub-shadow-color="#33000000"
sub-spacing=0.5
# OSD customizations
osd-font="Overpass"
osd-font-size=30
osd-color="#ffffffff" # ARGB format
osd-border-color="#ff151515" # ARGB format
osd-bar-align-y=0 # progress bar y alignment (-1 top, 0 centered, 1 bottom)
osd-border-size=2 # size for osd text and progress bar
osd-shadow-offset=1 # pixel width for osd text and progress bar
osd-bar-w=60 # width of " " "
osd-shadow-color="#11000000"
osd-fractions
# Protocol specific configuration
[protocol.https]
cache=yes
user-agent='Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0'
[protocol.http]
cache=yes
user-agent='Mozilla/5.0 (X11; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0'
# Some settings for gifs
[extension.gif]
cache=no
no-pause
loop-file=yes
[extension.gifv]
cache=no
no-pause
loop-file=yes
# Profiles for different qualities
[360p]
ytdl-format="bestvideo[height<=360]+bestaudio/best[height<=360]"
[480p]
ytdl-format="bestvideo[height<=480]+bestaudio/best[height<=480]"
[720p]
ytdl-format="bestvideo[height<=720]+bestaudio/best[height<=720]"
[4k]
ytdl-format="bestvideo[height<=2160]+bestaudio/best[height<=2160]"
[best]
ytdl-format="bestvideo+bestaudio"
# Vulkan hwdec profile
[vulkan]
gpu-api=vulkan
gpu-context=waylandvk
hwdec=vaapi-copy

View file

@ -1 +0,0 @@
hidetimeout=2000

View file

@ -1,30 +0,0 @@
-- default keybinding: b
-- add the following to your input.conf to change the default keybinding:
-- keyname script_binding auto_load_subs
local utils = require 'mp.utils'
function display_error()
mp.msg.warn("Subtitle download failed: ")
mp.osd_message("Subtitle download failed")
end
function load_sub_fn()
path = mp.get_property("path")
srt_path = string.gsub(path, "%.%w+$", ".srt")
t = { args = { "subliminal", "download", "-s", "-f", "-l", "en", path } }
mp.osd_message("Searching subtitle")
res = utils.subprocess(t)
if res.error == nil then
if mp.commandv("sub_add", srt_path) then
mp.msg.warn("Subtitle download succeeded")
mp.osd_message("Subtitle '" .. srt_path .. "' download succeeded")
else
display_error()
end
else
display_error()
end
end
mp.add_key_binding("b", "auto_load_subs", load_sub_fn)

View file

@ -1,367 +0,0 @@
local assdraw = require 'mp.assdraw'
local W = 0
local H = 0
-- 2D array of size W*H that's addressed via gField[x][y]. Each entry is a
-- table, with the following fields:
-- is_mine: true or false
-- area_mines: mine count in the 3x3 surrounding area
-- is_covered: true or false, for visibility
-- flag: flag put by user, one of FLAG_*
local gField = nil
local FLAG_NONE = "" -- not flagged
local FLAG_MINE = "" -- "⚐" -- flagged as containing mine
local FLAG_MAYBE_MINE = "!" -- flagged as maybe containing mine
local FLAG_MAYBE_SAFE = "?" -- flagged as maybe empty
local STATUS_PLAYING = "playing"
local STATUS_WON = "won"
local STATUS_LOST = "lost"
local gStatus = nil
local gMines = 0
local gX = 0
local gY = 0
local gNeedRefresh = false
local gHidden = true
local gTransparent = false
local PRESETS = {
-- taken from kmines
{ name = "easy", w = 9, h = 9, mines = 10 },
{ name = "medium", w = 16, h = 16, mines = 40 },
{ name = "hard", w = 30, h = 16, mines = 99 },
}
local gCurrentPreset = 2
function init_field()
local preset = PRESETS[gCurrentPreset]
gStatus = STATUS_PLAYING
gField = {}
W = preset.w
H = preset.h
gMines = math.min(preset.mines, W * H - 1)
gX = 1
gY = 1
for x = 1, W do
gField[x] = {}
for y = 1, H do
gField[x][y] = {
is_mine = false,
area_mines = 0,
is_covered = true,
flag = FLAG_NONE,
}
end
end
-- place mines using the dumbfuck algorithm
local place_mines = gMines
while place_mines > 0 do
local x = math.random(1, W)
local y = math.random(1, H)
if not gField[x][y].is_mine then
gField[x][y].is_mine = true
place_mines = place_mines - 1
end
end
-- pick a random start position (also using dumbfuck algorithm)
for i = 1, 1000000 do
local x = math.random(1, W)
local y = math.random(1, H)
if not gField[x][y].is_mine then
gX = x
gY = y
break
end
end
-- compute proximities after mines have been placed
for y = 1, H do
for x = 1, W do
local tile = gField[x][y]
for a_x = -1, 1 do
for a_y = -1, 1 do
local t_x = x + a_x
local t_y = y + a_y
if t_x >= 1 and t_x <= W and t_y >= 1 and t_y <= H and
gField[t_x][t_y].is_mine
then
tile.area_mines = tile.area_mines + 1
end
end
end
end
end
uncover()
check_status()
gNeedRefresh = true
end
function uncover_at(x, y)
if x < 1 or x > W or y < 1 or y > H then
return
end
local tile = gField[x][y]
if not tile.is_covered then
return
end
tile.is_covered = false
if tile.is_mine then
return -- lost anyway
end
-- uncover mines as far as it goes
-- apparently, the standard thing to do is recursively uncovering all
-- tiles which have 0 neightbours - tiles with 1 or more neighbours are
-- uncovered, but not recursively
if tile.area_mines == 0 then
for a_x = -1, 1 do
for a_y = -1, 1 do
uncover_at(x + a_x, y + a_y)
end
end
end
gNeedRefresh = true
end
function check_status()
if gStatus ~= STATUS_PLAYING then
return
end
local won = true
local lost = false
for y = 1, H do
for x = 1, W do
local tile = gField[x][y]
won = won and (tile.is_mine == tile.is_covered)
lost = lost or (tile.is_mine and not tile.is_covered)
end
end
if lost then
gStatus = STATUS_LOST
gNeedRefresh = true
elseif won then
gStatus = STATUS_WON
gNeedRefresh = true
end
end
function uncover()
if gStatus ~= STATUS_PLAYING and not gField[gX][gY].is_covered then
init_field()
render()
return
end
uncover_at(gX, gY)
check_status()
render()
end
function flag()
local tile = gField[gX][gY]
local cycle = {FLAG_NONE, FLAG_MINE, FLAG_MAYBE_MINE, FLAG_MAYBE_SAFE}
for i = 1, #cycle do
if tile.flag == cycle[i] then
tile.flag = cycle[(i - 1 + 1) % #cycle + 1]
break
end
end
if not tile.is_covered then
tile.flag = FLAG_NONE
end
force_render()
end
function move(x, y)
gX = math.min(math.max(gX + x, 1), W)
gY = math.min(math.max(gY + y, 1), H)
force_render()
end
function force_render()
gNeedRefresh = true
render()
end
function render()
if not gNeedRefresh then
return
end
if gHidden then
mp.set_osd_ass(1280, 720, "")
return
end
local canvas_w = 1280
local canvas_h = 720
local dw, dh, da = mp.get_osd_size()
if dw ~= nil and dw > 0 and dh > 0 then
canvas_w = dw / dh * canvas_h
end
local tile_wh = 32
local o_x = canvas_w / 2 - tile_wh * W / 2
local o_y = canvas_h / 2 - tile_wh * (H + 2) / 2 + tile_wh
local ass = assdraw.ass_new()
local transp = nil
if gTransparent then
transp = "{\\1a&HA0&\\3a&HA0&}"
end
-- some shitty background
ass:new_event()
ass:append("{\\1c&Ha3a3a3&\\1a&H30&}")
if transp then
ass:append(transp)
end
ass:pos(o_x - tile_wh, o_y - tile_wh)
ass:draw_start()
ass:rect_cw(0, 0, (W + 2) * tile_wh, (H + 2) * tile_wh)
-- grid
local function grid_line(x0, y0, x1, y1)
ass:new_event()
ass:append("{\\bord0.5}")
if transp then
ass:append(transp)
end
ass:pos(x0, y0)
ass:draw_start()
ass:coord(0, 0)
ass:line_to(x1 - x0, y1 - y0)
end
for x = 0, W do
local p_x = x * tile_wh + o_x
grid_line(p_x, o_y, p_x, o_y + tile_wh * H)
end
for y = 0, H do
local p_y = y * tile_wh + o_y
grid_line(o_x, p_y, o_x + tile_wh * W, p_y)
end
local function draw_sym(x, y, sym, c)
ass:new_event()
ass:pos(x, y)
ass:append("{\\an5\\fs25\\bord0\\1c&H" .. c .. "&\\b1}" .. sym)
end
for x = 1, W do
for y = 1, H do
local tile = gField[x][y]
local p_x = (x - 1) * tile_wh + tile_wh / 2 + o_x
local p_y = (y - 1) * tile_wh + tile_wh / 2 + o_y
local wh = tile_wh - 4
local sym = nil
if tile.is_covered then
ass:new_event()
if transp then
ass:append(transp)
end
ass:pos(p_x, p_y)
ass:draw_start()
ass:round_rect_cw(-wh / 2, -wh / 2, wh / 2, wh / 2, 5)
ass:draw_stop()
elseif tile.is_mine then
draw_sym(p_x, p_y, "💣", "0000FF")
elseif tile.area_mines > 0 then
draw_sym(p_x, p_y, tile.area_mines, "000000")
end
if tile.flag ~= FLAG_NONE then
draw_sym(p_x, p_y, tile.flag, "FF0000")
end
if x == gX and y == gY then
local wh = tile_wh - 12
ass:new_event()
ass:append("{\\1a&HFF&}")
ass:pos(p_x, p_y)
ass:draw_start()
ass:rect_cw(-wh / 2, -wh / 2, wh / 2, wh / 2)
ass:draw_stop()
end
end
end
local banner = nil
if gStatus == STATUS_WON then
banner = "You may have won, but actually you just wasted time."
elseif gStatus == STATUS_LOST then
banner = "You lost (and wasted time)."
end
if banner then
ass:new_event()
ass:pos(o_x + tile_wh * W / 2, o_y - tile_wh - 10)
ass:append("{\\fs40\\b1\\an2}" .. banner)
end
mp.set_osd_ass(canvas_w, canvas_h, ass.text)
end
mp.observe_property("osd-width", "native", force_render)
mp.observe_property("osd-height", "native", force_render)
init_field()
force_render()
function toggle_transp()
gTransparent = not gTransparent
force_render()
end
function cycle_preset()
gCurrentPreset = (gCurrentPreset + 1 - 1) % #PRESETS + 1
init_field()
render()
end
function toggle_show()
if gHidden then
gHidden = false
local REP = {repeatable = true}
mp.add_forced_key_binding("left", "mines-left", function() move(-1, 0) end, REP)
mp.add_forced_key_binding("right", "mines-right", function() move(1, 0) end, REP)
mp.add_forced_key_binding("up", "mines-up", function() move(0, -1) end, REP)
mp.add_forced_key_binding("down", "mines-down", function() move(0, 1) end, REP)
mp.add_forced_key_binding("space", "mines-uncover", uncover)
mp.add_forced_key_binding("b", "mines-flag", flag)
mp.add_forced_key_binding("t", "mines-transp", toggle_transp)
mp.add_forced_key_binding("w", "mines-preset", cycle_preset)
else
gHidden = true
mp.remove_key_binding("mines-left")
mp.remove_key_binding("mines-right")
mp.remove_key_binding("mines-up")
mp.remove_key_binding("mines-down")
mp.remove_key_binding("mines-uncover")
mp.remove_key_binding("mines-flag")
mp.remove_key_binding("mines-transp")
mp.remove_key_binding("mines-preset")
end
force_render()
end
mp.add_forced_key_binding("ctrl+x", "mines-show", toggle_show)

View file

@ -1,43 +0,0 @@
-- Toggle redshift when viewing videos with mpv
if os.execute("pgrep -x redshift >/dev/null") ~= 0
then
return
end
-- Consider that redshift is enabled when starting
rs_enabled = true
function rs_toggle()
os.execute("pkill -x -USR1 redshift")
end
function rs_disable()
if rs_enabled
then
rs_toggle()
rs_enabled = false
mp.msg.log("info", "Disabling redshift")
end
end
function rs_enable()
if not rs_enabled
then
rs_toggle()
rs_enabled = true
mp.msg.log("info", "Reenabling redshift")
end
end
function rs_handler()
if mp.get_property("video") ~= "no"
then
rs_disable()
else
rs_enable()
end
end
mp.register_event("file-loaded", rs_handler)
mp.register_event("shutdown", rs_enable)

View file

@ -1,145 +0,0 @@
local msg = require "mp.msg"
local utils = require "mp.utils"
local options = require "mp.options"
local cut_pos = nil
local copy_audio = true
local o = {
target_dir = "~",
vcodec = "rawvideo",
acodec = "pcm_s16le",
prevf = "",
vf = "format=yuv444p16$hqvf,scale=in_color_matrix=$matrix,format=bgr24",
hqvf = "",
postvf = "",
opts = "",
ext = "avi",
command_template = [[
ffmpeg -v warning -y -stats
-ss $shift -i "$in" -t $duration
-c:v $vcodec -c:a $acodec $audio
-vf $prevf$vf$postvf $opts "$out.$ext"
]],
}
options.read_options(o)
function timestamp(duration)
local hours = duration / 3600
local minutes = duration % 3600 / 60
local seconds = duration % 60
return string.format("%02d:%02d:%02.03f", hours, minutes, seconds)
end
function osd(str)
return mp.osd_message(str, 3)
end
function get_homedir()
-- It would be better to do platform detection instead of fallback but
-- it's not that easy in Lua.
return os.getenv("HOME") or os.getenv("USERPROFILE") or ""
end
function log(str)
local logpath = utils.join_path(
o.target_dir:gsub("~", get_homedir()),
"mpv_slicing.log")
f = io.open(logpath, "a")
f:write(string.format("# %s\n%s\n",
os.date("%Y-%m-%d %H:%M:%S"),
str))
f:close()
end
function escape(str)
-- FIXME(Kagami): This escaping is NOT enough, see e.g.
-- https://stackoverflow.com/a/31413730
-- Consider using `utils.subprocess` instead.
return str:gsub("\\", "\\\\"):gsub('"', '\\"')
end
function trim(str)
return str:gsub("^%s+", ""):gsub("%s+$", "")
end
function get_csp()
local csp = mp.get_property("colormatrix")
if csp == "bt.601" then return "bt601"
elseif csp == "bt.709" then return "bt709"
elseif csp == "smpte-240m" then return "smpte240m"
else
local err = "Unknown colorspace: " .. csp
osd(err)
error(err)
end
end
function get_outname(shift, endpos)
local name = mp.get_property("filename")
local dotidx = name:reverse():find(".", 1, true)
if dotidx then name = name:sub(1, -dotidx-1) end
name = name:gsub(" ", "_")
name = name:gsub(":", "-")
name = name .. string.format(".%s-%s", timestamp(shift), timestamp(endpos))
return name
end
function cut(shift, endpos)
local cmd = trim(o.command_template:gsub("%s+", " "))
local inpath = escape(utils.join_path(
utils.getcwd(),
mp.get_property("stream-path")))
local outpath = escape(utils.join_path(
o.target_dir:gsub("~", get_homedir()),
get_outname(shift, endpos)))
cmd = cmd:gsub("$shift", shift)
cmd = cmd:gsub("$duration", endpos - shift)
cmd = cmd:gsub("$vcodec", o.vcodec)
cmd = cmd:gsub("$acodec", o.acodec)
cmd = cmd:gsub("$audio", copy_audio and "" or "-an")
cmd = cmd:gsub("$prevf", o.prevf)
cmd = cmd:gsub("$vf", o.vf)
cmd = cmd:gsub("$hqvf", o.hqvf)
cmd = cmd:gsub("$postvf", o.postvf)
cmd = cmd:gsub("$matrix", get_csp())
cmd = cmd:gsub("$opts", o.opts)
-- Beware that input/out filename may contain replacing patterns.
cmd = cmd:gsub("$ext", o.ext)
cmd = cmd:gsub("$out", outpath)
cmd = cmd:gsub("$in", inpath, 1)
msg.info(cmd)
log(cmd)
os.execute(cmd)
end
function toggle_mark()
local pos = mp.get_property_number("time-pos")
if cut_pos then
local shift, endpos = cut_pos, pos
if shift > endpos then
shift, endpos = endpos, shift
end
if shift == endpos then
osd("Cut fragment is empty")
else
cut_pos = nil
osd(string.format("Cut fragment: %s - %s",
timestamp(shift),
timestamp(endpos)))
cut(shift, endpos)
end
else
cut_pos = pos
osd(string.format("Marked %s as start position", timestamp(pos)))
end
end
function toggle_audio()
copy_audio = not copy_audio
osd("Audio capturing is " .. (copy_audio and "enabled" or "disabled"))
end
mp.add_key_binding("c", "slicing_mark", toggle_mark)
mp.add_key_binding("a", "slicing_audio", toggle_audio)

View file

@ -1,99 +0,0 @@
SPACE repeatable playlist-next
alt+SPACE repeatable playlist-prev
UP ignore
DOWN ignore
LEFT repeatable playlist-prev
RIGHT repeatable playlist-next
# simple reminder of default bindings
#1 add contrast -1
#2 add contrast 1
#3 add brightness -1
#4 add brightness 1
#5 add gamma -1
#6 add gamma 1
#7 add saturation -1
#8 add saturation 1
# mouse-centric bindings
MBTN_RIGHT script-binding image_viewer/drag-to-pan
MBTN_LEFT script-binding image_viewer/pan-follows-cursor
WHEEL_UP script-message cursor-centric-zoom 0.1
WHEEL_DOWN script-message cursor-centric-zoom -0.1
# panning with the keyboard:
# pan-image takes the following arguments
# pan-image AXIS AMOUNT ZOOM_INVARIANT IMAGE_CONSTRAINED
# ^ ^ ^
# x or y | |
# | |
# if yes, will pan by the same if yes, stops panning if the image
# amount regardless of zoom would go outside of the window
ctrl+down repeatable script-message pan-image y -0.1 yes yes
ctrl+up repeatable script-message pan-image y +0.1 yes yes
ctrl+right repeatable script-message pan-image x -0.1 yes yes
ctrl+left repeatable script-message pan-image x +0.1 yes yes
# now with more precision
alt+down repeatable script-message pan-image y -0.01 yes yes
alt+up repeatable script-message pan-image y +0.01 yes yes
alt+right repeatable script-message pan-image x -0.01 yes yes
alt+left repeatable script-message pan-image x +0.01 yes yes
# replace at will with h,j,k,l if you prefer vim-style bindings
# on a trackpad you may want to use these
#WHEEL_UP repeatable script-message pan-image y -0.02 yes yes
#WHEEL_DOWN repeatable script-message pan-image y +0.02 yes yes
#WHEEL_LEFT repeatable script-message pan-image x -0.02 yes yes
#WHEEL_RIGHT repeatable script-message pan-image x +0.02 yes yes
# align the border of the image to the border of the window
# align-border takes the following arguments:
# align-border ALIGN_X ALIGN_Y
# any value for ALIGN_* is accepted, -1 and 1 map to the border of the window
ctrl+shift+right script-message align-border -1 ""
ctrl+shift+left script-message align-border 1 ""
ctrl+shift+down script-message align-border "" -1
ctrl+shift+up script-message align-border "" 1
# reset the image
ctrl+0 no-osd set video-pan-x 0; no-osd set video-pan-y 0; no-osd set video-zoom 0
+ add video-zoom 0.5
- add video-zoom -0.5; script-message reset-pan-if-visible
= no-osd set video-zoom 0; script-message reset-pan-if-visible
# sxiv compatibility
w no-osd set video-unscaled yes; keypress =
e no-osd set video-unscaled no; keypress =
h no-osd vf toggle hflip; show-text "Horizontal flip"
v no-osd vf toggle vflip; show-text "Vertical flip"
r script-message rotate-video 90; show-text "Clockwise rotation"
R script-message rotate-video -90; show-text "Counter-clockwise rotation"
alt+r no-osd set video-rotate 0; show-text "Reset rotation"
d script-message ruler
# Toggling between pixel-exact reproduction and interpolation
a cycle-values scale nearest ewa_lanczossharp
# Toggle color management on or off
c cycle icc-profile-auto
# Screenshot of the window output
S screenshot window
# Toggle aspect ratio information on and off
A cycle-values video-aspect "-1" "no"
p script-message force-print-filename
# ADVANCED: you can define bindings that belong to a "section" (named "image-viewer" here) like so:
#alt+SPACE {image-viewer} repeatable playlist-prev
#SPACE {image-viewer} repeatable playlist-next
# to load them conditionally with a command. See scripts-opts/image_viewer.conf for how you can do this

View file

@ -1,46 +0,0 @@
## IMAGE
# classic opengl-hq parameter, change at will
scale=spline36
cscale=spline36
dscale=mitchell
dither-depth=auto
correct-downscaling
sigmoid-upscaling
# debanding seems rarely useful with images
#deband
## MISC
mute=yes
# the osc is mostly useful for videos
osc=no
# don't try to autoload subtitles or audio files
sub-auto=no
audio-file-auto=no
# get rid of the useless V: 00:00:00 / 00:00:00 line
term-status-msg=
# replace mpv with mvi in the window title
title="${?media-title:${media-title}}${!media-title:No file} - mvi"
# don't slideshow by default
image-display-duration=inf
# loop files in case of webms or gifs
loop-file=inf
# and loop the whole playlist
loop-playlist=inf
# you need this if you plan to use drag-to-pan or pan-follows-cursor with MOUSE_LEFT
window-dragging=no
#according to haasn, aspect ratio info for PNG and JPG is "universally bust"
[extension.png]
video-aspect=no
[extension.jpg]
video-aspect=no
[extension.jpeg]
profile=extension.jpg
[silent]
msg-level=all=no

View file

@ -1,78 +0,0 @@
## MISC
# size of the margins with pan-follows-cursor
pan_follows_cursor_margin=50
# whether pan-follows-cursor should pan when the entire image is visible
pan_follows_cursor_move_if_full_view=no
## STATUS LINE
# whether to show a status line
status_line_enabled=yes
# its position, possible values: (bottom|top)_(left|right)
status_line_position=bottom_left
# its font size
status_line_size=36
# the text to be expanded
# see property expansion: https://mpv.io/manual/master/#property-expansion
# \N can be used for line breaks
# you can also use ass tags, see here: http://docs.aegisub.org/3.2/ASS_Tags/
status_line=${filename} [${playlist-pos-1}/${playlist-count}]
## MINIMAP
# whether to show a minimap
minimap_enabled=yes
# the position of the center of the minimap, in percentage of the window (x, y)
minimap_center=92,92
# the scale of the minimap (i.e. the view rectangle is scale / 100 times the size of the window)
minimap_scale=12
# the cutoff size of the minimap (i.e. the image rectangle is clipped if it falls outside of the this zone)
minimap_max_size=16,16
# opacity of the "image" (from 00=opaque to FF=transparent)
minimap_image_opacity=88
# color of the "image" (#BBGGRR where each component rages from 00 to FF)
minimap_image_color=BBBBBB
# opacity of the "view"
minimap_view_opacity=BB
minimap_view_color=222222
# whether the view should be drawn above the image
minimap_view_above_image=yes
# whether to show the minimap if the current image is fully visible
minimap_hide_when_full_image_in_view=yes
## RULER
# whether to show the length of the lines between the two points
ruler_show_distance=yes
# whether to show the coordinates of the two points
ruler_show_coordinates=yes
# the coordinate space of the text shown. Can be "image", "window", "both"
ruler_coordinates_space=image
# can be "degrees", "radians", "both", or "no"
ruler_show_angles=degrees
ruler_line_width=2
ruler_dots_radius=3
ruler_font_size=36
# ranges from 00 (black) to FF (white)
ruler_line_color=33
# bindings used to set points. The binding to trigger ruler mode can also be used. Comma-separated list
ruler_confirm_bindings=MBTN_LEFT,ENTER
# bindings used to set points. The binding to trigger ruler mode can also be used. Comma-separated list
ruler_exit_bindings=ESC
# if yes, the first point will be immediately set at the cursor position when calling 'ruler'
ruler_set_first_point_on_begin=no
# if yes, the ruler overlay will be immediately cleared when setting the second point
ruler_clear_on_second_point_set=no
## HOOKS
# commands to execute when a file detected as an image (1 frame, no audio) is loaded or unloaded
# an image was loaded, and the previous file was not an image (or there was no previous file)
command_on_first_image_loaded=
# an image was loaded (regardless of what the previous file was)
command_on_image_loaded=
# a non-image was loaded, and the previous file was an image
command_on_non_image_loaded=
# the purpose of these "hooks" is to let you change bindings, profiles, reset properties...
# see https://mpv.io/manual/master/#list-of-input-commands for general command information
# note that there is no such thing as "unloading a profile", to emulate this you must create an opposite profile and load that
# example possible values:
#command_on_first_image_loaded=apply-profile image; enable-section image-viewer; script-message enable-status-line
#command_on_image_loaded=no-osd set video-pan-x 0; script-message align-border "" -1
#command_on_non_image_loaded=disable-section image-viewer; no-osd set video-pan-x 0; no-osd set video-pan-y 0; no-osd set video-zoom 0; script-message disable-status-line

View file

@ -1,953 +0,0 @@
local opts = {
pan_follows_cursor_margin = 50,
pan_follows_cursor_move_if_full_view = false,
status_line_enabled = false,
status_line_position = "bottom_left",
status_line_size = 36,
status_line = "${filename} [${playlist-pos-1}/${playlist-count}]",
minimap_enabled = true,
minimap_center = "92,92",
minimap_scale = 12,
minimap_max_size = "16,16",
minimap_image_opacity = "88",
minimap_image_color = "BBBBBB",
minimap_view_opacity = "BB",
minimap_view_color = "222222",
minimap_view_above_image = true,
minimap_hide_when_full_image_in_view = true,
ruler_show_distance=true,
ruler_show_coordinates=true,
ruler_coordinates_space="both",
ruler_show_angles="degrees",
ruler_line_width=2,
ruler_dots_radius=3,
ruler_font_size=36,
ruler_line_color="33",
ruler_confirm_bindings="MBTN_LEFT,ENTER",
ruler_exit_bindings="ESC",
ruler_set_first_point_on_begin=false,
ruler_clear_on_second_point_set=false,
command_on_first_image_loaded="",
command_on_image_loaded="",
command_on_non_image_loaded="",
}
(require 'mp.options').read_options(opts)
function split(input)
local ret = {}
for str in string.gmatch(input, "([^,]+)") do
ret[#ret + 1] = str
end
return ret
end
function str_to_num(array)
local ret = {}
for _, v in ipairs(array) do
ret[#ret + 1] = tonumber(v)
end
return ret
end
opts.minimap_center=str_to_num(split(opts.minimap_center))
opts.minimap_max_size=str_to_num(split(opts.minimap_max_size))
opts.ruler_confirm_bindings=split(opts.ruler_confirm_bindings)
opts.ruler_exit_bindings=split(opts.ruler_exit_bindings)
function clamp(value, low, high)
if value <= low then
return low
elseif value >= high then
return high
else
return value
end
end
local msg = require 'mp.msg'
local assdraw = require 'mp.assdraw'
local ass = { -- shared ass state
status_line = "",
minimap = "",
ruler = "",
}
local cleanup = nil -- function set up by drag-to-pan/pan-follows cursor and must be called to clean lingering state
local mouse_move_callbacks = {} -- functions that are called when mouse_move is triggered
function add_mouse_move_callback(key, func)
if #mouse_move_callbacks == 0 then
mp.add_forced_key_binding("mouse_move", "image-viewer-internal", function()
for _, func in pairs(mouse_move_callbacks) do
func()
end
end)
end
mouse_move_callbacks[key] = func
end
function remove_mouse_move_callback(key)
mouse_move_callbacks[key] = nil
for _,_ in pairs(mouse_move_callbacks) do
return
end
mp.remove_key_binding("image-viewer-internal")
end
video_dimensions_stale = true
function get_video_dimensions()
-- this function is very much ripped from video/out/aspect.c in mpv's source
if not video_dimensions_stale then return _video_dimensions end
local video_params = mp.get_property_native("video-out-params")
if not video_params then
_video_dimensions = nil
return nil
end
if not _timestamp then _timestamp = 0 end
_timestamp = _timestamp + 1
_video_dimensions = {
timestamp = _timestamp,
top_left = {x = 0, y = 0},
bottom_right = {x = 0, y = 0},
size = {w = 0, h = 0},
ratios = {w = 0, h = 0}, -- by how much the original video got scaled
}
local keep_aspect = mp.get_property_bool("keepaspect")
local w = video_params["w"]
local h = video_params["h"]
local dw = video_params["dw"]
local dh = video_params["dh"]
if mp.get_property_number("video-rotate") % 180 == 90 then
w, h = h,w
dw, dh = dh, dw
end
local window_w, window_h = mp.get_osd_size()
if keep_aspect then
local unscaled = mp.get_property_native("video-unscaled")
local panscan = mp.get_property_number("panscan")
local fwidth = window_w
local fheight = math.floor(window_w / dw * dh)
if fheight > window_h or fheight < h then
local tmpw = math.floor(window_h / dh * dw)
if tmpw <= window_w then
fheight = window_h
fwidth = tmpw
end
end
local vo_panscan_area = window_h - fheight
local f_w = fwidth / fheight
local f_h = 1
if vo_panscan_area == 0 then
vo_panscan_area = window_h - fwidth
f_w = 1
f_h = fheight / fwidth
end
if unscaled or unscaled == "downscale-big" then
vo_panscan_area = 0
if unscaled or (dw <= window_w and dh <= window_h) then
fwidth = dw
fheight = dh
end
end
local scaled_width = fwidth + math.floor(vo_panscan_area * panscan * f_w)
local scaled_height = fheight + math.floor(vo_panscan_area * panscan * f_h)
local split_scaling = function (dst_size, scaled_src_size, zoom, align, pan)
scaled_src_size = math.floor(scaled_src_size * 2 ^ zoom)
align = (align + 1) / 2
local dst_start = math.floor((dst_size - scaled_src_size) * align + pan * scaled_src_size)
if dst_start < 0 then
--account for C int cast truncating as opposed to flooring
dst_start = dst_start + 1
end
local dst_end = dst_start + scaled_src_size;
if dst_start >= dst_end then
dst_start = 0
dst_end = 1
end
return dst_start, dst_end
end
local zoom = mp.get_property_number("video-zoom")
local align_x = mp.get_property_number("video-align-x")
local pan_x = mp.get_property_number("video-pan-x")
_video_dimensions.top_left.x, _video_dimensions.bottom_right.x = split_scaling(window_w, scaled_width, zoom, align_x, pan_x)
local align_y = mp.get_property_number("video-align-y")
local pan_y = mp.get_property_number("video-pan-y")
_video_dimensions.top_left.y, _video_dimensions.bottom_right.y = split_scaling(window_h, scaled_height, zoom, align_y, pan_y)
else
_video_dimensions.top_left.x = 0
_video_dimensions.bottom_right.x = window_w
_video_dimensions.top_left.y = 0
_video_dimensions.bottom_right.y = window_h
end
_video_dimensions.size.w = _video_dimensions.bottom_right.x - _video_dimensions.top_left.x
_video_dimensions.size.h = _video_dimensions.bottom_right.y - _video_dimensions.top_left.y
_video_dimensions.ratios.w = _video_dimensions.size.w / w
_video_dimensions.ratios.h = _video_dimensions.size.h / h
video_dimensions_stale = false
return _video_dimensions
end
for _, p in ipairs({
"keepaspect",
"video-out-params",
"video-unscaled",
"panscan",
"video-zoom",
"video-align-x",
"video-pan-x",
"video-align-y",
"video-pan-y",
"osd-width",
"osd-height",
}) do
mp.observe_property(p, "native", function() video_dimensions_stale = true end)
end
function drag_to_pan_handler(table)
if cleanup then
cleanup()
cleanup = nil
end
if table["event"] == "down" then
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local mouse_pos_origin, video_pan_origin = {}, {}
local moved = false
mouse_pos_origin.x, mouse_pos_origin.y = mp.get_mouse_pos()
video_pan_origin.x = mp.get_property("video-pan-x")
video_pan_origin.y = mp.get_property("video-pan-y")
local idle = function()
if moved then
local mX, mY = mp.get_mouse_pos()
local pX = video_pan_origin.x + (mX - mouse_pos_origin.x) / video_dimensions.size.w
local pY = video_pan_origin.y + (mY - mouse_pos_origin.y) / video_dimensions.size.h
mp.command("no-osd set video-pan-x " .. clamp(pX, -3, 3) .. "; no-osd set video-pan-y " .. clamp(pY, -3, 3))
moved = false
end
end
mp.register_idle(idle)
add_mouse_move_callback("drag-to-pan", function() moved = true end)
cleanup = function()
remove_mouse_move_callback("drag-to-pan")
mp.unregister_idle(idle)
end
end
end
function pan_follows_cursor_handler(table)
if cleanup then
cleanup()
cleanup = nil
end
if table["event"] == "down" then
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local window_w, window_h = mp.get_osd_size()
local moved = true
local idle = function()
if moved then
local mX, mY = mp.get_mouse_pos()
local x = math.min(1, math.max(- 2 * mX / window_w + 1, -1))
local y = math.min(1, math.max(- 2 * mY / window_h + 1, -1))
local command = ""
local margin, move_full = opts.pan_follows_cursor_margin, opts.pan_follows_cursor_move_if_full_view
if (not move_full and window_w < video_dimensions.size.w) then
command = command .. "no-osd set video-pan-x " .. clamp(x * (video_dimensions.size.w - window_w + 2 * margin) / (2 * video_dimensions.size.w), -3, 3) .. ";"
elseif mp.get_property_number("video-pan-x") ~= 0 then
command = command .. "no-osd set video-pan-x " .. "0;"
end
if (not move_full and window_h < video_dimensions.size.h) then
command = command .. "no-osd set video-pan-y " .. clamp(y * (video_dimensions.size.h - window_h + 2 * margin) / (2 * video_dimensions.size.h), -3, 3) .. ";"
elseif mp.get_property_number("video-pan-y") ~= 0 then
command = command .. "no-osd set video-pan-y " .. "0;"
end
if command ~= "" then
mp.command(command)
end
moved = false
end
end
mp.register_idle(idle)
add_mouse_move_callback("pan-follows-cursor", function() moved = true end)
cleanup = function()
remove_mouse_move_callback("pan-follows-cursor")
mp.unregister_idle(idle)
end
end
end
function cursor_centric_zoom_handler(amt)
local zoom_inc = tonumber(amt)
if not zoom_inc or zoom_inc == 0 then return end
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local mouse_pos_origin, video_pan_origin = {}, {}
mouse_pos_origin.x, mouse_pos_origin.y = mp.get_mouse_pos()
video_pan_origin.x = mp.get_property("video-pan-x")
video_pan_origin.y = mp.get_property("video-pan-y")
local zoom_origin = mp.get_property("video-zoom")
-- how far the cursor is form the middle of the video (in percentage)
local rx = (video_dimensions.top_left.x + video_dimensions.size.w / 2 - mouse_pos_origin.x) / (video_dimensions.size.w / 2)
local ry = (video_dimensions.top_left.y + video_dimensions.size.h / 2 - mouse_pos_origin.y) / (video_dimensions.size.h / 2)
-- the size in pixels of the (in|de)crement
local diffHeight = (2 ^ zoom_inc - 1) * video_dimensions.size.h
local diffWidth = (2 ^ zoom_inc - 1) * video_dimensions.size.w
local newPanX = (video_pan_origin.x * video_dimensions.size.w + rx * diffWidth / 2) / (video_dimensions.size.w + diffWidth)
local newPanY = (video_pan_origin.y * video_dimensions.size.h + ry * diffHeight / 2) / (video_dimensions.size.h + diffHeight)
mp.command("no-osd set video-zoom " .. zoom_origin + zoom_inc .. "; no-osd set video-pan-x " .. clamp(newPanX, -3, 3) .. "; no-osd set video-pan-y " .. clamp(newPanY, -3, 3))
end
function align_border(x, y)
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local window_w, window_h = mp.get_osd_size()
local x, y = tonumber(x), tonumber(y)
local command = ""
if x then
command = command .. "no-osd set video-pan-x " .. clamp(x * (video_dimensions.size.w - window_w) / (2 * video_dimensions.size.w), -3, 3) .. ";"
end
if y then
command = command .. "no-osd set video-pan-y " .. clamp(y * (video_dimensions.size.h - window_h) / (2 * video_dimensions.size.h), -3, 3) .. ";"
end
if command ~= "" then
mp.command(command)
end
end
function pan_image(axis, amount, zoom_invariant, image_constrained)
amount = tonumber(amount)
if not amount or amount == 0 or axis ~= "x" and axis ~= "y" then return end
if zoom_invariant == "yes" then
amount = amount / 2 ^ mp.get_property_number("video-zoom")
end
local prop = "video-pan-" .. axis
local old_pan = mp.get_property_number(prop)
if image_constrained == "yes" then
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local measure = axis == "x" and "w" or "h"
local window = {}
window.w, window.h = mp.get_osd_size()
local pixels_moved = amount * video_dimensions.size[measure]
-- should somehow refactor this
if pixels_moved > 0 then
if window[measure] > video_dimensions.size[measure] then
if video_dimensions.bottom_right[axis] >= window[measure] then return end
if video_dimensions.bottom_right[axis] + pixels_moved > window[measure] then
amount = (window[measure] - video_dimensions.bottom_right[axis]) / video_dimensions.size[measure]
end
else
if video_dimensions.top_left[axis] >= 0 then return end
if video_dimensions.top_left[axis] + pixels_moved > 0 then
amount = (0 - video_dimensions.top_left[axis]) / video_dimensions.size[measure]
end
end
else
if window[measure] > video_dimensions.size[measure] then
if video_dimensions.top_left[axis] <= 0 then return end
if video_dimensions.top_left[axis] + pixels_moved < 0 then
amount = (0 - video_dimensions.top_left[axis]) / video_dimensions.size[measure]
end
else
if video_dimensions.bottom_right[axis] <= window[measure] then return end
if video_dimensions.bottom_right[axis] + pixels_moved < window[measure] then
amount = (window[measure] - video_dimensions.bottom_right[axis]) / video_dimensions.size[measure]
end
end
end
end
mp.set_property_number(prop, old_pan + amount)
end
function rotate_video(amt)
local rot = mp.get_property_number("video-rotate")
rot = (rot + amt) % 360
mp.set_property_number("video-rotate", rot)
end
function reset_pan_if_visible()
local video_dimensions = get_video_dimensions()
if not video_dimensions then return end
local window_w, window_h = mp.get_osd_size()
local command = ""
if (window_w >= video_dimensions.size.w) then
command = command .. "no-osd set video-pan-x 0" .. ";"
end
if (window_h >= video_dimensions.size.h) then
command = command .. "no-osd set video-pan-y 0" .. ";"
end
if command ~= "" then
mp.command(command)
end
end
function force_print_filename()
mp.set_property("msg-level", "cplayer=info")
mp.commandv("print-text", mp.get_property("path"))
mp.set_property("msg-level", "all=no")
end
function draw_ass()
local ww, wh = mp.get_osd_size()
local merge = function(a, b)
return b ~= "" and (a .. "\n" .. b) or a
end
mp.set_osd_ass(ww, wh, merge(merge(ass.status_line, ass.minimap), ass.ruler))
end
local status_line_enabled = false
local status_line_stale = true
function mark_status_line_stale()
status_line_stale = true
end
function refresh_status_line()
if not status_line_stale then return end
status_line_stale = false
local path = mp.get_property("path")
if path == nil or path == "" then
ass.status_line = ""
draw_ass()
return
end
local expanded = mp.command_native({ "expand-text", opts.status_line })
if not expanded then
msg.warn("Error expanding status line")
ass.status_line = ""
draw_ass()
return
end
local w,h = mp.get_osd_size()
local an, x, y
local margin = 10
if opts.status_line_position == "top_left" then
x = margin
y = margin
an = 7
elseif opts.status_line_position == "top_right" then
x = w-margin
y = margin
an = 9
elseif opts.status_line_position == "bottom_right" then
x = w-margin
y = h-margin
an = 3
else
x = margin
y = h-margin
an = 1
end
local a = assdraw:ass_new()
a:new_event()
a:an(an)
a:pos(x,y)
a:append("{\\fs".. opts.status_line_size.. "}{\\bord1.0}")
a:append(expanded)
ass.status_line = a.text
draw_ass()
end
function enable_status_line()
if status_line_enabled then return end
status_line_enabled = true
local start = 0
while true do
local s, e, cap = string.find(opts.status_line, "%${[?!]?([%l%d-/]*)", start)
if not s then break end
mp.observe_property(cap, nil, mark_status_line_stale)
start = e
end
mp.observe_property("path", nil, mark_status_line_stale)
mp.observe_property("osd-width", nil, mark_status_line_stale)
mp.observe_property("osd-height", nil, mark_status_line_stale)
mp.register_idle(refresh_status_line)
mark_status_line_stale()
end
function disable_status_line()
if not status_line_enabled then return end
status_line_enabled = false
mp.unobserve_property(mark_status_line_stale)
mp.unregister_idle(refresh_status_line)
ass.status_line = ""
draw_ass()
end
if opts.status_line_enabled then
enable_status_line()
end
if opts.command_on_image_loaded ~= "" or opts.command_on_non_image_loaded ~= "" then
local was_image = false
local frame_count = nil
local audio_tracks = nil
local out_params_ready = nil
local path = nil
function state_changed()
function set_image(is_image)
if is_image and not was_image and opts.command_on_first_image_loaded ~= "" then
mp.command(opts.command_on_first_image_loaded)
end
if is_image and opts.command_on_image_loaded ~= "" then
mp.command(opts.command_on_image_loaded)
end
if not is_image and was_image and opts.command_on_non_image_loaded ~= "" then
mp.command(opts.command_on_non_image_loaded)
end
was_image = is_image
end
-- only do things when state is consistent
if path ~= nil and audio_tracks ~= nil then
if frame_count == nil and audio_tracks > 0 then
set_image(false)
elseif out_params_ready and frame_count ~= nil then
-- png have 0 frames, jpg 1 ¯\_(ツ)_/¯
set_image((frame_count == 0 or frame_count == 1) and audio_tracks == 0)
end
end
end
mp.observe_property("video-out-params/par", "number", function(_, val)
out_params_ready = (val ~= nil and val > 0)
state_changed()
end)
mp.observe_property("estimated-frame-count", "number", function(_, val)
frame_count = val
state_changed()
end)
mp.observe_property("path", "string", function(_, val)
if not val or val == "" then
path = nil
else
path = val
end
state_changed()
end)
mp.register_event("tracks-changed", function()
audio_tracks = 0
local tracks = 0
for _, track in ipairs(mp.get_property_native("track-list")) do
tracks = tracks + 1
if track.type == "audio" then
audio_tracks = audio_tracks + 1
end
end
if tracks == 0 then
audio_tracks = nil
end
state_changed()
end)
end
function refresh_minimap()
local dim = get_video_dimensions()
if not dim then
ass.minimap = ""
draw_ass()
return
end
if _minimap_old_timestamp and dim.timestamp == _minimap_old_timestamp then return end
_minimap_old_timestamp = dim.timestamp
local ww, wh = mp.get_osd_size()
if opts.minimap_hide_when_full_image_in_view then
if dim.top_left.x >= 0 and
dim.top_left.y >= 0 and
dim.bottom_right.x <= ww and
dim.bottom_right.y <= wh
then
ass.minimap = ""
draw_ass()
return
end
end
local center = {
x=opts.minimap_center[1]/100*ww,
y=opts.minimap_center[2]/100*wh
}
local cutoff = {
x=opts.minimap_max_size[1]/100*ww/2,
y=opts.minimap_max_size[2]/100*wh/2
}
local a = assdraw.ass_new()
local draw = function(x, y, w, h, opacity, color)
a:new_event()
a:pos(center.x, center.y)
a:append("{\\bord0}")
a:append("{\\shad0}")
a:append("{\\c&" .. color .. "&}")
a:append("{\\2a&HFF}")
a:append("{\\3a&HFF}")
a:append("{\\4a&HFF}")
a:append("{\\1a&H" .. opacity .. "}")
w=w/2
h=h/2
a:draw_start()
local rounded = {true,true,true,true} -- tl, tr, br, bl
local x0,y0,x1,y1 = x-w, y-h, x+w, y+h
if x0 < -cutoff.x then
x0 = -cutoff.x
rounded[4] = false
rounded[1] = false
end
if y0 < -cutoff.y then
y0 = -cutoff.y
rounded[1] = false
rounded[2] = false
end
if x1 > cutoff.x then
x1 = cutoff.x
rounded[2] = false
rounded[3] = false
end
if y1 > cutoff.y then
y1 = cutoff.y
rounded[3] = false
rounded[4] = false
end
local r = 3
local c = 0.551915024494 * r
if rounded[0] then
a:move_to(x0 + r, y0)
else
a:move_to(x0,y0)
end
if rounded[1] then
a:line_to(x1 - r, y0)
a:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r)
else
a:line_to(x1, y0)
end
if rounded[2] then
a:line_to(x1, y1 - r)
a:bezier_curve(x1, y1 - r + c, x1 - r + c, y1, x1 - r, y1)
else
a:line_to(x1, y1)
end
if rounded[3] then
a:line_to(x0 + r, y1)
a:bezier_curve(x0 + r - c, y1, x0, y1 - r + c, x0, y1 - r)
else
a:line_to(x0, y1)
end
if rounded[4] then
a:line_to(x0, y0 + r)
a:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0)
else
a:line_to(x0, y0)
end
a:draw_stop()
end
local image = function()
draw((dim.top_left.x + dim.size.w/2 - ww/2) / opts.minimap_scale,
(dim.top_left.y + dim.size.h/2 - wh/2) / opts.minimap_scale,
dim.size.w / opts.minimap_scale,
dim.size.h / opts.minimap_scale,
opts.minimap_image_opacity,
opts.minimap_image_color)
end
local view = function()
draw(0,
0,
ww / opts.minimap_scale,
wh / opts.minimap_scale,
opts.minimap_view_opacity,
opts.minimap_view_color)
end
if opts.minimap_view_above_image then
image()
view()
else
view()
image()
end
ass.minimap = a.text
draw_ass()
end
local minimap_enabled = false
function enable_minimap()
if minimap_enabled then return end
minimap_enabled = true
mp.register_idle(refresh_minimap)
end
function disable_minimap()
if not minimap_enabled then return end
minimap_enabled = false
ass.minimap = a.text
draw_ass()
mp.unregister_idle(refresh_minimap)
end
if opts.minimap_enabled then
enable_minimap()
end
local ruler_state = 0 -- {0,1,2,3} = {inactive,setting first point,setting second point,done}
local ruler_first_point = nil -- in video space coordinates
local ruler_second_point = nil -- in video space coordinates
function cursor_video_space()
local dim = get_video_dimensions()
if not dim then return nil end
local mx, my = mp.get_mouse_pos()
local ret = {}
ret.x = (mx - dim.top_left.x) / dim.ratios.w
ret.y = (my - dim.top_left.y) / dim.ratios.h
return ret
end
function video_space_to_screen(point)
local dim = get_video_dimensions()
if not dim then return nil end
local ret = {}
ret.x = point.x * dim.ratios.w + dim.top_left.x
ret.y = point.y * dim.ratios.h + dim.top_left.y
return ret
end
function refresh_ruler()
local dim = get_video_dimensions()
if not dim then
ass.ruler = ""
draw_ass()
return
end
local line_start = {}
local line_end = {}
if ruler_second_point then
line_start.image = ruler_first_point
line_start.screen = video_space_to_screen(ruler_first_point)
line_end.image = ruler_second_point
line_end.screen = video_space_to_screen(ruler_second_point)
elseif ruler_first_point then
line_start.image = ruler_first_point
line_start.screen = video_space_to_screen(ruler_first_point)
line_end.image = cursor_video_space()
line_end.screen = {}
line_end.screen.x, line_end.screen.y = mp.get_mouse_pos()
else
local mx, my = mp.get_mouse_pos()
line_start.image = cursor_video_space()
line_start.screen = {}
line_start.screen.x, line_start.screen.y = mp.get_mouse_pos()
line_end = line_start
end
local distinct = (math.abs(line_start.screen.x - line_end.screen.x) >= 1
or math.abs(line_start.screen.y - line_end.screen.y) >= 1)
local a = assdraw:ass_new()
local draw_setup = function(bord)
a:new_event()
a:pos(0,0)
a:append("{\\bord" .. bord .. "}")
a:append("{\\shad0}")
local r = opts.ruler_line_color
a:append("{\\3c&H".. r .. r .. r .. "&}")
a:append("{\\1a&HFF}")
a:append("{\\2a&HFF}")
a:append("{\\3a&H00}")
a:append("{\\4a&HFF}")
a:draw_start()
end
local dot = function(pos, size)
draw_setup(size)
a:move_to(pos.x, pos.y-0.5)
a:line_to(pos.x, pos.y+0.5)
end
local line = function(from, to, size)
draw_setup(size)
a:move_to(from.x, from.y)
a:line_to(to.x, to.y)
end
if distinct then
dot(line_start.screen, opts.ruler_dots_radius)
line(line_start.screen, line_end.screen, opts.ruler_line_width)
dot(line_end.screen, opts.ruler_dots_radius)
else
dot(line_start.screen, opts.ruler_dots_radius)
end
local line_info = function()
if not opts.ruler_show_distance then return end
a:new_event()
a:append("{\\fs36}{\\bord1}")
a:pos((line_start.screen.x + line_end.screen.x) / 2, (line_start.screen.y + line_end.screen.y) / 2)
local an = 1
if line_start.image.x < line_end.image.x then an = an + 2 end
if line_start.image.y < line_end.image.y then an = an + 6 end
a:an(an)
local image = math.sqrt(math.pow(line_start.image.x - line_end.image.x, 2) + math.pow(line_start.image.y - line_end.image.y, 2))
local screen = math.sqrt(math.pow(line_start.screen.x - line_end.screen.x, 2) + math.pow(line_start.screen.y - line_end.screen.y, 2))
if opts.ruler_coordinates_space == "both" then
a:append(string.format("image: %.1f\\Nscreen: %.1f", image, screen))
elseif opts.ruler_coordinates_space == "image" then
a:append(string.format("%.1f", image))
elseif opts.ruler_coordinates_space == "window" then
a:append(string.format("%.1f", screen))
end
end
local dot_info = function(pos, opposite)
if not opts.ruler_show_coordinates then return end
a:new_event()
a:append("{\\fs" .. opts.ruler_font_size .."}{\\bord1}")
a:pos(pos.screen.x, pos.screen.y)
local an
if distinct then
an = 1
if line_start.image.x > line_end.image.x then an = an + 2 end
if line_start.image.y < line_end.image.y then an = an + 6 end
else
an = 7
end
if opposite then
an = 9 + 1 - an
end
a:an(an)
if opts.ruler_coordinates_space == "both" then
a:append(string.format("image: %.1f, %.1f\\Nscreen: %i, %i",
pos.image.x, pos.image.y, pos.screen.x, pos.screen.y))
elseif opts.ruler_coordinates_space == "image" then
a:append(string.format("%.1f, %.1f", pos.image.x, pos.image.y))
elseif opts.ruler_coordinates_space == "window" then
a:append(string.format("%i, %i", pos.screen.x, pos.screen.y))
end
end
dot_info(line_start, true)
if distinct then
line_info()
dot_info(line_end, false)
end
if distinct and opts.ruler_show_angles ~= "no" then
local dist = 50
local pos_from_angle = function(mult, angle)
return {
x = line_start.screen.x + mult * dist * math.cos(angle),
y = line_start.screen.y + mult * dist * math.sin(angle)
}
end
local extended = {x=line_start.screen.x, y=line_start.screen.y}
if line_end.screen.x > line_start.screen.x then
extended.x = extended.x + dist
else
extended.x = extended.x - dist
end
line(line_start.screen, extended, math.max(0, opts.ruler_line_width-0.5))
local angle = math.atan(math.abs(line_start.image.y - line_end.image.y) / math.abs(line_start.image.x - line_end.image.x))
local fix_angle
local an
if line_end.image.y < line_start.image.y and line_end.image.x > line_start.image.x then
-- upper-right
an = 4
fix_angle = function(angle) return - angle end
elseif line_end.image.y < line_start.image.y then
-- upper-left
an = 6
fix_angle = function(angle) return math.pi + angle end
elseif line_end.image.x < line_start.image.x then
-- bottom-left
an = 6
fix_angle = function(angle) return math.pi - angle end
else
-- bottom-right
an = 4
fix_angle = function(angle) return angle end
end
-- should implement this https://math.stackexchange.com/questions/873224/calculate-control-points-of-cubic-bezier-curve-approximating-a-part-of-a-circle
local cp1 = pos_from_angle(1, fix_angle(angle*1/4))
local cp2 = pos_from_angle(1, fix_angle(angle*3/4))
local p2 = pos_from_angle(1, fix_angle(angle))
a:bezier_curve(cp1.x, cp1.y, cp2.x, cp2.y, p2.x, p2.y)
a:new_event()
a:append("{\\fs" .. opts.ruler_font_size .."}{\\bord1}")
local text_pos = pos_from_angle(1.1, fix_angle(angle*2/3)) -- you'd think /2 would make more sense, but *2/3 looks better
a:pos(text_pos.x, text_pos.y)
a:an(an)
if opts.ruler_show_angles == "both" then
a:append(string.format("%.2f\\N%.1f°", angle, angle / math.pi * 180))
elseif opts.ruler_show_angles == "degrees" then
a:append(string.format("%.1f°", angle / math.pi * 180))
elseif opts.ruler_show_angles == "radians" then
a:append(string.format("%.2f", angle))
end
end
ass.ruler = a.text
draw_ass()
end
function ruler_next()
if ruler_state == 0 then
mp.register_idle(refresh_ruler)
add_mouse_move_callback("ruler", function() end) -- only used to get an idle event on mouse move
for _,key in ipairs(opts.ruler_confirm_bindings) do
mp.add_forced_key_binding(key, "ruler-next-" .. key, ruler_next)
end
for _,key in ipairs(opts.ruler_exit_bindings) do
mp.add_forced_key_binding(key, "ruler-stop-" .. key, ruler_stop)
end
ruler_state = 1
if opts.ruler_set_first_point_on_begin then
ruler_next()
end
elseif ruler_state == 1 then
ruler_first_point = cursor_video_space()
ruler_state = 2
elseif ruler_state == 2 then
ruler_state = 3
ruler_second_point = cursor_video_space()
if opts.ruler_clear_on_second_point_set then
ruler_next()
end
else
ruler_stop()
end
end
function ruler_stop()
if ruler_state == 0 then return end
mp.unregister_idle(refresh_ruler)
for _,key in ipairs(opts.ruler_confirm_bindings) do
mp.remove_key_binding("ruler-next-" .. key)
end
for _,key in ipairs(opts.ruler_exit_bindings) do
mp.remove_key_binding("ruler-stop-" .. key)
end
remove_mouse_move_callback("ruler")
ruler_state = 0
ruler_first_point = nil
ruler_second_point = nil
ass.ruler = ""
draw_ass()
end
mp.add_key_binding(nil, "drag-to-pan", drag_to_pan_handler, {complex = true})
mp.add_key_binding(nil, "pan-follows-cursor", pan_follows_cursor_handler, {complex = true})
mp.add_key_binding(nil, "cursor-centric-zoom", cursor_centric_zoom_handler)
mp.add_key_binding(nil, "align-border", align_border)
mp.add_key_binding(nil, "pan-image", pan_image)
mp.add_key_binding(nil, "rotate-video", rotate_video)
mp.add_key_binding(nil, "reset-pan-if-visible", reset_pan_if_visible)
mp.add_key_binding(nil, "force-print-filename", force_print_filename)
mp.add_key_binding(nil, "ruler", ruler_next)
mp.add_key_binding(nil, "enable-status-line", enable_status_line)
mp.add_key_binding(nil, "disable-status-line", disable_status_line)
mp.add_key_binding(nil, "toggle-status-line", function() if status_line_enabled then disable_status_line() else enable_status_line() end end)
mp.add_key_binding(nil, "enable-minimap", enable_minimap)
mp.add_key_binding(nil, "disable-minimap", disable_minimap)
mp.add_key_binding(nil, "toggle-minimap", function() if minimap_enabled then disable_minimap() else enable_minimap() end end)

View file

@ -1,551 +0,0 @@
##############################################################
## This is the example bindings file. Copy it to ##
## ~/.ncmpcpp/bindings or $XDG_CONFIG_HOME/ncmpcpp/bindings ##
## and set up your preferences ##
##############################################################
##
##### General rules #####
##
## 1) Because each action has runtime checks whether it's
## ok to run it, a few actions can be bound to one key.
## Actions will be bound in order given in configuration
## file. When a key is pressed, first action in order
## will test itself whether it's possible to run it. If
## test succeeds, action is executed and other actions
## bound to this key are ignored. If it doesn't, next
## action in order tests itself etc.
##
## 2) It's possible to bind more that one action at once
## to a key. It can be done using the following syntax:
##
## def_key "key"
## action1
## action2
## ...
##
## This creates a chain of actions. When such chain is
## executed, each action in chain is run until the end of
## chain is reached or one of its actions fails to execute
## due to its requirements not being met. If multiple actions
## and/or chains are bound to the same key, they will be
## consecutively run until one of them gets fully executed.
##
## 3) When ncmpcpp starts, bindings configuration file is
## parsed and then ncmpcpp provides "missing pieces"
## of default keybindings. If you want to disable some
## bindings, there is a special action called 'dummy'
## for that purpose. Eg. if you want to disable ability
## to crop playlists, you need to put the following
## into configuration file:
##
## def_key "C"
## dummy
##
## After that ncmpcpp will not bind any default action
## to this key.
##
## 4) To let you write simple macros, the following special
## actions are provided:
##
## - push_character "character" - pushes given special
## character into input queue, so it will be immediately
## picked by ncmpcpp upon next call to readKey function.
## Accepted values: mouse, up, down, page_up, page_down,
## home, end, space, enter, insert, delete, left, right,
## tab, ctrl-a, ctrl-b, ..., ctrl-z, ctrl-[, ctrl-\\,
## ctrl-], ctrl-^, ctrl-_, f1, f2, ..., f12, backspace.
## In addition, most of these names can be prefixed with
## alt-/ctrl-/shift- to be recognized with the appropriate
## modifier key(s).
##
## - push_characters "string" - pushes given string into
## input queue.
##
## - require_runnable "action" - checks whether given action
## is runnable and fails if it isn't. This is especially
## useful when mixed with previous two functions. Consider
## the following macro definition:
##
## def_key "key"
## push_characters "custom_filter"
## apply_filter
##
## If apply_filter can't be currently run, we end up with
## sequence of characters in input queue which will be
## treated just as we typed them. This may lead to unexpected
## results (in this case 'c' will most likely clear current
## playlist, 'u' will trigger database update, 's' will stop
## playback etc.). To prevent such thing from happening, we
## need to change above definition to this one:
##
## def_key "key"
## require_runnable "apply_filter"
## push_characters "custom_filter"
## apply_filter
##
## Here, first we test whether apply_filter can be actually run
## before we stuff characters into input queue, so if condition
## is not met, whole chain is aborted and we're fine.
##
## - require_screen "screen" - checks whether given screen is
## currently active. accepted values: browser, clock, help,
## media_library, outputs, playlist, playlist_editor,
## search_engine, tag_editor, visualizer, last_fm, lyrics,
## selected_items_adder, server_info, song_info,
## sort_playlist_dialog, tiny_tag_editor.
##
## - run_external_command "command" - runs given command using
## system() function.
##
## 5) In addition to binding to a key, you can also bind actions
## or chains of actions to a command. If it comes to commands,
## syntax is very similar to defining keys. Here goes example
## definition of a command:
##
## def_command "quit" [deferred]
## stop
## quit
##
## If you execute the above command (which can be done by
## invoking action execute_command, typing 'quit' and pressing
## enter), ncmpcpp will stop the player and then quit. Note the
## presence of word 'deferred' enclosed in square brackets. It
## tells ncmpcpp to wait for confirmation (ie. pressing enter)
## after you typed quit. Instead of 'deferred', 'immediate'
## could be used. Then ncmpcpp will not wait for confirmation
## (enter) and will execute the command the moment it sees it.
##
## Note: while command chains are executed, internal environment
## update (which includes current window refresh and mpd status
## update) is not performed for performance reasons. However, it
## may be desirable to do so in some situration. Therefore it's
## possible to invoke by hand by performing 'update enviroment'
## action.
##
## Note: There is a difference between:
##
## def_key "key"
## action1
##
## def_key "key"
## action2
##
## and
##
## def_key "key"
## action1
## action2
##
## First one binds two single actions to the same key whilst
## second one defines a chain of actions. The behavior of
## these two is different and is described in (1) and (2).
##
## Note: Function def_key accepts non-ascii characters.
##
##### List of unbound actions #####
##
## The following actions are not bound to any key/command:
##
## - set_volume
##
#
#def_key "mouse"
# mouse_event
#
#def_key "h"
# previous_column
def_key "j"
scroll_down
def_key "k"
scroll_up
#def_key "l"
# next_column
#def_key "up"
# scroll_up
#
#def_key "shift-up"
# select_item
# scroll_up
#
#def_key "down"
# scroll_down
#
#def_key "shift-down"
# select_item
# scroll_down
#
#def_key "["
# scroll_up_album
#
#def_key "]"
# scroll_down_album
#
#def_key "{"
# scroll_up_artist
#
#def_key "}"
# scroll_down_artist
#
#def_key "page_up"
# page_up
#
#def_key "page_down"
# page_down
#
#def_key "home"
# move_home
#
#def_key "end"
# move_end
#
#def_key "insert"
# select_item
#
#def_key "enter"
# enter_directory
#
#def_key "enter"
# toggle_output
#
#def_key "enter"
# run_action
#
#def_key "enter"
# play_item
#
#def_key "space"
# add_item_to_playlist
#
#def_key "space"
# toggle_lyrics_update_on_song_change
#
#def_key "space"
# toggle_visualization_type
#
#def_key "delete"
# delete_playlist_items
#
#def_key "delete"
# delete_browser_items
#
#def_key "delete"
# delete_stored_playlist
#
#def_key "right"
# next_column
#
#def_key "right"
# slave_screen
#
#def_key "right"
# volume_up
#
#def_key "+"
# volume_up
#
#def_key "left"
# previous_column
#
#def_key "left"
# master_screen
#
#def_key "left"
# volume_down
#
#def_key "-"
# volume_down
#
#def_key ":"
# execute_command
#
#def_key "tab"
# next_screen
#
#def_key "shift-tab"
# previous_screen
#
#def_key "f1"
# show_help
#
#def_key "1"
# show_playlist
#
#def_key "2"
# show_browser
#
#def_key "2"
# change_browse_mode
#
#def_key "3"
# show_search_engine
#
#def_key "3"
# reset_search_engine
#
#def_key "4"
# show_media_library
#
#def_key "4"
# toggle_media_library_columns_mode
#
#def_key "5"
# show_playlist_editor
#
#def_key "6"
# show_tag_editor
#
#def_key "7"
# show_outputs
#
#def_key "8"
# show_visualizer
#
#def_key "="
# show_clock
#
#def_key "@"
# show_server_info
#
#def_key "s"
# stop
#
#def_key "p"
# pause
#
#def_key ">"
# next
#
#def_key "<"
# previous
#
#def_key "ctrl-h"
# jump_to_parent_directory
#
#def_key "ctrl-h"
# replay_song
#
#def_key "backspace"
# jump_to_parent_directory
#
#def_key "backspace"
# replay_song
#
#def_key "f"
# seek_forward
#
#def_key "b"
# seek_backward
#
#def_key "r"
# toggle_repeat
#
#def_key "z"
# toggle_random
#
#def_key "y"
# save_tag_changes
#
#def_key "y"
# start_searching
#
#def_key "y"
# toggle_single
#
#def_key "R"
# toggle_consume
#
#def_key "Y"
# toggle_replay_gain_mode
#
#def_key "T"
# toggle_add_mode
#
#def_key "|"
# toggle_mouse
#
#def_key "#"
# toggle_bitrate_visibility
#
#def_key "Z"
# shuffle
#
#def_key "x"
# toggle_crossfade
#
#def_key "X"
# set_crossfade
#
#def_key "u"
# update_database
#
#def_key "ctrl-s"
# sort_playlist
#
#def_key "ctrl-s"
# toggle_browser_sort_mode
#
#def_key "ctrl-s"
# toggle_media_library_sort_mode
#
#def_key "ctrl-r"
# reverse_playlist
#
#def_key "ctrl-f"
# apply_filter
#
#def_key "ctrl-_"
# select_found_items
#
#def_key "/"
# find
#
#def_key "/"
# find_item_forward
#
#def_key "?"
# find
#
#def_key "?"
# find_item_backward
#
#def_key "."
# next_found_item
#
#def_key ","
# previous_found_item
#
#def_key "w"
# toggle_find_mode
#
#def_key "e"
# edit_song
#
#def_key "e"
# edit_library_tag
#
#def_key "e"
# edit_library_album
#
#def_key "e"
# edit_directory_name
#
#def_key "e"
# edit_playlist_name
#
#def_key "e"
# edit_lyrics
#
#def_key "i"
# show_song_info
#
#def_key "I"
# show_artist_info
#
#def_key "g"
# jump_to_position_in_song
#
#def_key "l"
# show_lyrics
#
#def_key "ctrl-v"
# select_range
#
#def_key "v"
# reverse_selection
#
#def_key "V"
# remove_selection
#
#def_key "B"
# select_album
#
#def_key "a"
# add_selected_items
#
#def_key "c"
# clear_playlist
#
#def_key "c"
# clear_main_playlist
#
#def_key "C"
# crop_playlist
#
#def_key "C"
# crop_main_playlist
#
#def_key "m"
# move_sort_order_up
#
#def_key "m"
# move_selected_items_up
#
#def_key "n"
# move_sort_order_down
#
#def_key "n"
# move_selected_items_down
#
#def_key "M"
# move_selected_items_to
#
#def_key "A"
# add
#
#def_key "S"
# save_playlist
#
#def_key "o"
# jump_to_playing_song
#
#def_key "G"
# jump_to_browser
#
#def_key "G"
# jump_to_playlist_editor
#
#def_key "~"
# jump_to_media_library
#
#def_key "E"
# jump_to_tag_editor
#
#def_key "U"
# toggle_playing_song_centering
#
#def_key "P"
# toggle_display_mode
#
#def_key "\\"
# toggle_interface
#
#def_key "!"
# toggle_separators_between_albums
#
#def_key "L"
# toggle_lyrics_fetcher
#
#def_key "F"
# fetch_lyrics_in_background
#
#def_key "alt-l"
# toggle_fetching_lyrics_in_background
#
#def_key "ctrl-l"
# toggle_screen_lock
#
#def_key "`"
# toggle_library_tag_type
#
#def_key "`"
# refetch_lyrics
#
#def_key "`"
# add_random_items
#
#def_key "ctrl-p"
# set_selected_items_priority
#
#def_key "q"
# quit
#

View file

@ -1,157 +0,0 @@
##### directories ######
ncmpcpp_directory = ~/.ncmpcpp
lyrics_directory = ~/.lyrics
##### MPD settings #####
mpd_host = {{@@ env['PASS_MPD_ADMIN'] @@}}@localhost
mpd_port = 6600
mpd_connection_timeout = 5
mpd_music_dir = ~/Music
mpd_crossfade_time = 2
##### visualizer #####
visualizer_fifo_path = /tmp/mpd.fifo
visualizer_output_name = Visualizer
visualizer_in_stereo = yes
visualizer_sync_interval = 30
# spectrum,wave,wave_filled,ellipse.
visualizer_type = wave_filled
visualizer_look = ●▮
visualizer_color = 41, 83, 119, 155, 185, 215, 209, 203, 197, 161
##### delays #####
# Time of inactivity (in seconds) after playlist highlighting will be disabled
## (0 = always on).
playlist_disable_highlight_delay = 5
message_delay_time = 5
##### song format #####
# %l - length
# %f - filename
# %D - directory
# %a - artist
# %A - album artist
# %t - title
# %b - album
# %y - date
# %n - track number (01/12 -> 01)
# %N - full track info (01/12 -> 01/12)
# %g - genre
# %c - composer
# %p - performer
# %d - disc
# %C - comment
# %P - priority
# $R - begin right alignment
song_list_format = {%a - }{%t}|{$8%f$9}$R{$3(%l)$9}
song_status_format = {{%a{ "%b"{ (%y)}} - }{%t}}|{%f}
song_library_format = {%n - }{%t}|{%f}
alternative_header_first_line_format = $b$1$aqqu$/a$9 {%t}|{%f} $1$atqq$/a$9$/b
alternative_header_second_line_format = {{$4$b%a$/b$9}{ - $7%b$9}{ ($4%y$9)}}|{%D}
current_item_prefix = $(yellow)$r
current_item_suffix = $/r$(end)
current_item_inactive_column_prefix = $(white)$r
current_item_inactive_column_suffix = $/r$(end)
now_playing_prefix = $b
now_playing_suffix = $/b
browser_playlist_prefix = "$2playlist$9 "
selected_item_prefix = $6
selected_item_suffix = $9
modified_item_prefix = $3> $9
song_window_title_format = {%a - }{%t}|{%f}
browser_sort_mode = name
browser_sort_format = {%a - }{%t}|{%f} {(%l)}
##### columns #####
song_columns_list_format = (20)[]{a} (6f)[green]{NE} (50)[white]{t|f:Title} (20)[cyan]{b} (7f)[magenta]{l}
##### misc #####
execute_on_song_change = ""
execute_on_player_state_change = ""
playlist_show_mpd_host = no
playlist_show_remaining_time = no
playlist_shorten_total_times = no
playlist_separate_albums = no
playlist_display_mode = columns
browser_display_mode = classic
search_engine_display_mode = classic
playlist_editor_display_mode = classic
discard_colors_if_item_is_selected = yes
show_duplicate_tags = yes
incremental_seeking = yes
seek_time = 1
volume_change_step = 2
autocenter_mode = no
centered_cursor = no
progressbar_look = =>
default_place_to_search_in = database
user_interface = alternative
data_fetching_delay = yes
media_library_primary_tag = album_artist
media_library_albums_split_by_date = yes
default_find_mode = wrapped
default_tag_editor_pattern = %n - %t
header_visibility = yes
statusbar_visibility = yes
titles_visibility = yes
header_text_scrolling = yes
cyclic_scrolling = no
lines_scrolled = 2
lastfm_preferred_language = en
screen_switcher_mode = playlist, browser
startup_screen = playlist
startup_slave_screen = ""
startup_slave_screen_focus = no
locked_screen_width_part = 50
ask_for_locked_screen_width_part = yes
jump_to_now_playing_song_at_start = yes
ask_before_clearing_playlists = yes
clock_display_seconds = no
display_volume_level = yes
display_bitrate = no
display_remaining_time = no
regular_expressions = perl
ignore_leading_the = no
ignore_diacritics = no
block_search_constraints_change_if_items_found = yes
mouse_support = yes
mouse_list_scroll_whole_page = yes
empty_tag_marker = <empty>
tags_separator = " | "
tag_editor_extended_numeration = no
media_library_sort_by_mtime = no
enable_window_title = yes
search_engine_default_search_mode = 1
external_editor = nvim
use_console_editor = yes
##### lyrics #####
#lyrics_fetchers = embedded
follow_now_playing_lyrics = yes
fetch_lyrics_for_current_song_in_background = no
store_lyrics_in_song_dir = no
##### files #####
generate_win32_compatible_filenames = yes
allow_for_physical_item_deletion = no
space_add_mode = add_remove
show_hidden_files_in_local_browser = no
##### colors #####
colors_enabled = yes
empty_tag_color = cyan
header_window_color = red
volume_color = default
state_line_color = default
state_flags_color = default:b
main_window_color = yellow
color1 = white
color2 = green
progressbar_color = black:b
progressbar_elapsed_color = green:b
statusbar_color = default
statusbar_time_color = default:b
player_state_color = default:b
alternative_ui_separator_color = black:b
window_border_color = green
active_window_border = red

View file

@ -1,14 +0,0 @@
# vim: filetype=muttrc
set my_email = "admin@reekynet.com"
set from = $my_email
set sendmail = "/usr/bin/msmtp -a $my_email"
set realname = "ReekyNET Admin"
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
set mbox_type = Maildir
set folder = "~/.mail/$my_email"
set mbox = "+INBOX"
set record = "+INBOX"
set postponed = "+Drafts"
set spoolfile = "+INBOX"
mailboxes = +INBOX

View file

@ -1,14 +0,0 @@
# vim: filetype=muttrc
set my_email = "marko.korhonen@metropolia.fi"
set from = $my_email
set sendmail = "/usr/bin/msmtp -a $my_email"
set realname = "Marko Korhonen"
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
set mbox_type = Maildir
set folder = "~/.mail/$my_email"
set mbox = "+INBOX"
set record = "+INBOX"
set postponed = "+Drafts"
set spoolfile = "+INBOX"
mailboxes = +INBOX

View file

@ -1,14 +0,0 @@
# vim: filetype=muttrc
set my_email = "marko.korhonen@reekynet.com"
set from = $my_email
set sendmail = "/usr/bin/msmtp -a $my_email"
set realname = "Marko Korhonen"
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
set mbox_type = Maildir
set folder = "~/.mail/$my_email"
set mbox = "+INBOX"
set record = "+INBOX"
set postponed = "+Drafts"
set spoolfile = "+INBOX"
mailboxes = +INBOX

View file

@ -1,15 +0,0 @@
# vim: filetype=muttrc
# Incoming mail from maildir
set my_email = "reekymarko@reekynet.com"
set from = $my_email
set sendmail = "/usr/bin/msmtp -a $my_email"
set realname = "Marko Korhonen"
set status_format = "-%r-Mutt: $my_email %f [Msgs:%?M?%M/?%m%?n? New:%n?%?o? Old:%o?%?d? Del:%d?%?F? Flag:%F?%?t? Tag:%t?%?p? Post:%p?%?b? Inc:%b?%?l? %l?]---(%s/%S)-%>-(%P)---"
set mbox_type = Maildir
set folder = ~/.mail/$my_email
set mbox = +INBOX
set record = +Sent
set postponed = +Drafts
set spoolfile = +INBOX
mailboxes = +INBOX

View file

@ -1 +0,0 @@
color normal default default

View file

@ -1,15 +0,0 @@
# vim: filetype=muttrc
set sendmail = "/usr/bin/msmtp"
set mbox_type = Maildir
set folder = ~/.mail
set spoolfile = +Personal/INBOX
source ~/.config/neomutt/appearance
source ~/.config/neomutt/sidebar
source ~/.config/neomutt/accounts/reekymarko@reekynet.com
macro index <f2> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/reekymarko@reekynet.com<enter><change-folder>!<enter>'
macro index <f3> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/marko.korhonen@reekynet.com<enter><change-folder>!<enter>'
macro index <f4> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/admin@reekynet.com<enter><change-folder>!<enter>'
macro index <f5> '<sync-mailbox><enter-command>source ~/.config/neomutt/accounts/marko.korhonen@metropolia.fi<enter><change-folder>!<enter>'

View file

@ -1,5 +0,0 @@
# vim: filetype=muttrc
set sidebar_visible = yes
set sidebar_indent_string = ' '
sidebar_whitelist '~/.mail/<>/INBOX'

View file

@ -1,28 +0,0 @@
[dmenu]
fn = -*-SF-Pro-Display-Regular-*-*-*-10-*-*-*-*-*-*-*
dmenu_command = /usr/bin/rofi
l = 10
# # Note that dmenu_command can contain arguments as well like `rofi -width 30`
# # Rofi and dmenu are set to case insensitive by default `-i`
# l = number of lines to display, defaults to number of total network options
# fn = font string
# nb = normal background (name, #RGB, or #RRGGBB)
# nf = normal foreground
# sb = selected background
# sf = selected foreground
# b = (just set to empty value and menu will appear at the bottom
# m = number of monitor to display on
# p = Custom Prompt for the networks menu
# pinentry = Pinentry command
# rofi_highlight = <True or False> # (Default: False) use rofi highlighting instead of '**'
# # override normal foreground and background colors (dmenu) or use the
# # -password option (rofi) to obscure passphrase entry
# [dmenu_passphrase]
# nf = #222222
# nb = #222222
# rofi_obscure = True
[editor]
terminal = termite
gui_if_available = True

View file

@ -0,0 +1,16 @@
= FunctionalHacker's NeoVim configuration
This is my personal NeoVim configuration I use for all text editing in my free
time and at my day job. I mostly code in Java, TypeScript and ReactJS, with
a bit of Rust and Python once in a blue moon.
The configuration is quite minimal but still fully featured. Some highlights
include
* LSP support with neovim's built in LSP client
** LSP servers are easily installed and auto-configured with Mason
* Treesitter
** Code folding
** Code highlighting
** Text objects
* Lazy plugin manager for fast startup times

Some files were not shown because too many files have changed in this diff Show more