Compare commits

...
Sign in to create a new pull request.

29 commits

Author SHA1 Message Date
5e6f5c6014 chore(env): repair env commits 2025-06-08 15:41:22 +02:00
fda1a3706b chore: add nas env to gitignore 2025-06-08 15:38:16 +02:00
a76a4c1c68 Revert "feat(nas): add nas.env"
This reverts commit 3824cae23e.
2025-06-08 15:34:16 +02:00
3824cae23e feat(nas): add nas.env 2025-06-08 15:30:54 +02:00
40d9d75228 chore: commit pre beets 2025-06-08 15:19:51 +02:00
1c5a3ba8e8 feat(download): update qobuz stuff 2025-05-24 00:59:06 +02:00
55019903a7 zoxide and abort on error for insta 2025-05-13 11:35:06 +02:00
6a462556a2 feat(homebrew): add Brewfile 2025-04-19 01:04:23 +02:00
74c37f0a2a fix(nas): environment loaded in wrong order / use safari again because of a cookie library bug 2025-04-14 11:38:22 +02:00
5521f3de6c amend(youtube): fix list handling 2025-04-13 20:07:53 +02:00
1e73c34288 feat(youtube): make check_shorts users configurable 2025-04-13 19:55:04 +02:00
3559b1c113 fix(pass): ignore errors from pass 2025-04-13 19:36:21 +02:00
40153d6e10 fix(youtube): use uvx 2025-04-13 19:25:58 +02:00
e602d788b0 fix(insta): add temporary local fix for insta on nas 2025-04-13 19:07:22 +02:00
b9af444e74 feat(install): add uv install 2025-04-13 18:23:53 +02:00
c6cab93f4d feat(brew): add homebrew quirks for truenas 2025-04-13 18:15:02 +02:00
3f0b8e878f feat(path):add custom nvim path on truenas 2025-04-13 17:30:38 +02:00
2b71f2a7cb fix(youtube): change tubearch api status to pending 2025-04-13 16:53:13 +02:00
8eed110642 feat(insta): add echoing of date 2025-04-13 16:52:15 +02:00
df7bec8f90 feat(install): add brew installation and Brewfile install 2025-04-13 03:25:42 +02:00
f2a3df682e fix(git): fix broken git config and author name and email 2025-04-13 02:46:59 +02:00
$GIT_AUTHOR
0f958de2a8 fix(git): move config to .config 2025-04-13 02:37:09 +02:00
650c2b167e alias to edit insta variables 2025-04-13 02:25:56 +02:00
7ea19b30fd amend(environment): add insta skel 2025-04-13 02:16:02 +02:00
e2bce96d76 feature(zsh_functions): instagram downloader 2025-04-13 02:02:11 +02:00
ebe4ef9526 feat: add git graph 2025-04-07 10:20:54 +02:00
f4a52bf623 fix qobuz and use uvx 2025-04-07 02:24:32 +02:00
f201724cbd feature: move mdl into dotfiles 2025-04-07 01:45:13 +02:00
3f0a914c8c feat: add p10k installation 2025-04-06 22:47:34 +02:00
16 changed files with 330 additions and 40 deletions

23
.Brewfile Normal file
View file

@ -0,0 +1,23 @@
brew "cmake"
brew "exiv2"
brew "ffmpeg"
brew "git-filter-repo"
brew "go"
brew "jpeg"
brew "leveldb"
brew "neovim"
brew "nmap"
brew "node"
brew "pass"
brew "podman"
brew "python@3.12"
brew "restic"
brew "samba"
brew "subfinder"
brew "yarn"
brew "yt-dlp"
brew "zoxide"
cask "amethyst"
cask "amorphousdiskmark"
cask "android-platform-tools"
cask "iterm2"

28
.config/git/config Executable file
View file

@ -0,0 +1,28 @@
[color]
diff = auto
status = auto
branch = auto
interactive = auto
ui = true
pager = true
submodule = true
fetch = true
pull = true
[push]
default = simple
[pull]
ff = only
[core]
excludesfile = ~/.gitignore
autocrlf = input
[status]
submoduleSummary = true
[pager]
log = less --chop-long-lines --shift 3
[alias]
graph = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
chronograph = graph --date-order
ff = merge --ff-only
amend = commit --amend --reuse-message=HEAD
[init]
defaultBranch = main

View file

@ -1,3 +1,3 @@
NAS_IP="192.168.84.3" NAS_IP="127.0.0.1"
NAS_USER="janolehuebner" NAS_USER="janolehuebner"
NAS_TOKEN_NAME_IN_STORE="sudo-lana" NAS_TOKEN_NAME_IN_STORE="sudo-lana"

View file

@ -0,0 +1,4 @@
GIT_AUTHOR_NAME=""
GIT_AUTHOR_EMAIL=""
GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME
GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL

View file

@ -0,0 +1,5 @@
insta_share_on_nas="192....../DATA"
insta_path_on_nas="social/insta"
insta_cookiefile=""
insta_mount_point="$HOME/NAS/insta"
insta_default_users=(user_a user_b)

View file

@ -1,6 +1,10 @@
# Add directories to PATH
export PATH="/opt/homebrew/bin:$PATH"
export PATH="$HOME/.local/bin:$PATH" export PATH="$HOME/.local/bin:$PATH"
export PATH="$HOME/Library/Python/3.9/bin:$PATH"
export PATH="$HOME/.cargo/bin:$PATH" export PATH="$HOME/.cargo/bin:$PATH"
export PATH="$HOME/bin:$PATH" export PATH="$HOME/bin:$PATH"
if uname -r | grep -qi "truenas"; then
export PATH="/home/linuxbrew/.linuxbrew/bin:$PATH"
elif [[ "$OSTYPE" == darwin* ]]; then
export PATH="/opt/homebrew/bin:$PATH"
export PATH="$HOME/Library/Python/3.9/bin:$PATH"
fi

View file

@ -1 +1,2 @@
TUBE_TOKEN_NAME_IN_STORE="tube.lan" TUBE_TOKEN_NAME_IN_STORE="tube.lan"
TUBE_DEFAULT_USERS=("a" "b")

1
.gitignore vendored
View file

@ -10,3 +10,4 @@ public/
dev/ dev/
keyfile.keyx keyfile.keyx
*.log *.log
.environment.d/01_nas.env

View file

@ -1,15 +1,8 @@
export PATH="$PATH:$HOME/.local/bin:$HOME/bin" # Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# ── 2. Load .env files from ~/.environment.d/ ─────────────────── # confirmations, etc.) must go above this block; everything else may go below.
# Automatically export all variables defined while sourcing .env files if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
setopt allexport source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
for file in ~/.environment.d/*.env(.N); do fi
source "$file"
done
unset file
unsetopt allexport
# ── 3. Source ~/.zshrc (if this is a login shell sourcing a profile file) ─
# In Zsh, this is unnecessary in most setups unless you separate login/init logic.
[[ -r ~/.zshrc ]] && source ~/.zshrc [[ -r ~/.zshrc ]] && source ~/.zshrc

111
.zsh_functions/download.zsh Normal file
View file

@ -0,0 +1,111 @@
if ! typeset -f ytr >/dev/null; then
export PATH="$PATH:$HOME/.local/bin:$HOME/bin"
# ── 2. Load .env files from ~/.environment.d/ ───────────────────
# Automatically export all variables defined while sourcing .env files
setopt allexport
for file in ~/.environment.d/*.env(.N); do
source "$file"
done
unset file
unsetopt allexport
# Load a function that allows us to import other function definitions from
# the ZSH_FUNC_PATH without providing their exact location
source "$DOTFILES_DIR/.zsh_functions/autosource.sh"
# Load the rest of the zsh configs in ~/.zshrc.d/
setopt allexport
for file in ~/.zshrc.d/*.zsh(.N); do
source "$file"
done
source ~/.zsh_functions/youtube.zsh
fi
mdl () {
cwd=$(pwd)
share_on_nas="$NAS_IP/media"
path_on_nas="Music/__INBOX"
jelly_wait=150
check_smb_mount() {
mount | grep -q "$mount_point"
}
mount_point="$HOME/NAS/Music"
if [ ! -d "$mount_point" ]; then
echo "Creating mount point directory..."
mkdir -p "$mount_point"
fi
if ! check_smb_mount; then
echo "Mounting SMB share..."
/sbin/mount_smbfs "smb://janolehuebner:$(pass sudo-lana)@$share_on_nas" "$mount_point"
fi
if ! check_smb_mount; then
echo "Failed to mount SMB share. Exiting."
exit 1
fi
# Move to target directory
cd "$mount_point/$path_on_nas"
echo "SMB share mounted successfully."
if [[ "$*" == *"tidal.com"* ]]; then
echo "TIDAL DETECTED"
uvx tidal-dl -l $*
else
echo "Using qobuz-dl via uvx at: $(which uvx)"
echo "QOBUZ URL: $*"
uvx qobuz-dl dl $*
fi
echo "Unmounting SMB share..."
sleep 1
/sbin/umount -f "$mount_point"
cd $cwd
#if declare -f jelly_rescan > /dev/null; then
# echo "Waiting $jelly_wait secs before triggering automatic library scan..."
# sleep $jelly_wait
# jelly_rescan
# echo "done"
#fi
}
d () {
local url="${1:-$(pbpaste)}"
local used_clipboard=0
if [[ -z "$url" ]]; then
echo "No URL provided and clipboard is empty."
return 1
fi
# Check if URL came from clipboard
if [[ -z "$1" ]]; then
echo "started via clipboard"
used_clipboard=1
fi
case "$url" in
(*youtube*|*youtu.be*)
echo "Detected YouTube URL: $url"
ytr "$url"
;;
(*qobuz*)
echo "Detected Qobuz URL: $url"
mdl "$url"
if [[ $used_clipboard -eq 1 ]]; then
osascript -e "display dialog \"Done with Qobuz: $url\" buttons {\"OK\"}"
fi
;;
(*)
echo "Unknown URL: $url"
;;
esac
}

76
.zsh_functions/insta.zsh Normal file
View file

@ -0,0 +1,76 @@
insta () {
local cwd=$(pwd)
check_smb_mount () {
/sbin/mount | grep -q "$insta_mount_point"
}
local stories_only=false
local user_list=()
while [[ $# -gt 0 ]]
do
case "$1" in
--cron)
local random_wait=$((RANDOM % 1800))
echo "--------------------------------------------"
echo "Waiting for $((random_wait / 60)) minutes..."
sleep $random_wait
stories_only=true
;;
--stories)
stories_only=true
;;
*)
user_list+=("$1")
;;
esac
shift
done
echo "-----$(date)------"
local is_local_nas=false
if [[ "$NAS_IP" == "127.0.0.1" || "$NAS_IP" == "localhost" ]]; then
is_local_nas=true
fi
if [ ! -d "$insta_mount_point" ]; then
echo "Creating mount point directory..."
mkdir -p "$insta_mount_point"
fi
if ! $is_local_nas; then
if ! check_smb_mount; then
echo "Mounting SMB share..."
/sbin/mount_smbfs "smb://janolehuebner:$(pass sudo-lana 2>/dev/null)@$insta_share_on_nas" "$insta_mount_point"
fi
if ! check_smb_mount; then
echo "Failed to mount SMB share. Exiting."
return 1
fi
fi
cd "$insta_mount_point/$insta_path_on_nas" || return 1
if [[ ${#user_list[@]} -eq 0 ]]; then
user_list=("${insta_default_users[@]}")
fi
#local cmd=(uvx --with browser_cookie3 instaloader -b Firefox -B '/Users/janolehuebner/Library/Application Support/zen/Profiles/frbi8zqc.insta/cookies.sqlite' "${user_list[@]}" --fast-update --abort-on=302,400,401,429)
local cmd=(uvx --with browser_cookie3 instaloader -b Safari "${user_list[@]}" --fast-update --abort-on=302,400,401,429)
if $stories_only; then
cmd+=(--stories --no-profile-pic --no-posts)
else
cmd+=(--stories --reels)
fi
"${cmd[@]}"
if ! $is_local_nas; then
echo "Unmounting SMB share..."
sleep 3
/sbin/umount -f "$insta_mount_point"
fi
cd "$cwd"
}

View file

@ -0,0 +1,6 @@
jelly_rescan(){
JELLYFIN_URL="http://$NAS_IP:8096"
API_KEY="$(pass jelly)"
LIBRARY_ID="8a05b0252259a1dbd62df97522638439"
curl -X POST -H "X-Emby-Token: $API_KEY" "$JELLYFIN_URL/Items/$LIBRARY_ID/Refresh?Recursive=true"
}

View file

@ -29,7 +29,7 @@ ytr () {
return 1 return 1
fi fi
local token="$(pass $TUBE_TOKEN_NAME_IN_STORE)" local token="$(pass $TUBE_TOKEN_NAME_IN_STORE 2>/dev/null)"
local json_data=$(jq -n --arg youtube_id "$youtube_id" '{ local json_data=$(jq -n --arg youtube_id "$youtube_id" '{
data: [ data: [
{ {
@ -58,7 +58,7 @@ yts() {
fi fi
# Set the token and URL # Set the token and URL
local token="$(pass $TUBE_TOKEN_NAME_IN_STORE)" local token="$(pass $TUBE_TOKEN_NAME_IN_STORE 2>/dev/null)"
# Initialize an empty array to store video data # Initialize an empty array to store video data
local video_data="[]" local video_data="[]"
@ -66,8 +66,8 @@ yts() {
# Get the video IDs from yt-dlp and loop through each one # Get the video IDs from yt-dlp and loop through each one
while read -r youtube_id; do while read -r youtube_id; do
# Add each video ID to the array of data (accumulating in $video_data) # Add each video ID to the array of data (accumulating in $video_data)
video_data=$(echo "$video_data" | jq --arg youtube_id "$youtube_id" '. + [{youtube_id: $youtube_id, status: "priority"}]') video_data=$(echo "$video_data" | jq --arg youtube_id "$youtube_id" '. + [{youtube_id: $youtube_id, status: "pending"}]')
done < <(yt-dlp "https://www.youtube.com/@$1/shorts" --flat-playlist --print "%(id)s") done < <(uvx yt-dlp "https://www.youtube.com/@$1/shorts" --flat-playlist --print "%(id)s")
# Check if video_data is still an empty array (meaning no videos were found) # Check if video_data is still an empty array (meaning no videos were found)
if [[ "$video_data" == "[]" ]]; then if [[ "$video_data" == "[]" ]]; then
@ -90,13 +90,7 @@ yts() {
# #
check_shorts() { check_shorts() {
# List of channels to check (you can hardcode them or pass them as arguments) channels=("${TUBE_DEFAULT_USERS[@]}")
channels=(
"DarkBlondii"
"littlesiha"
"lenaindica"
)
# Loop through each channel and call yts # Loop through each channel and call yts
for channel in "${channels[@]}"; do for channel in "${channels[@]}"; do
echo "Checking shorts for channel: $channel" echo "Checking shorts for channel: $channel"

24
.zshrc
View file

@ -1,9 +1,15 @@
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc. export PATH="$PATH:$HOME/.local/bin:$HOME/bin"
# Initialization code that may require console input (password prompts, [y/n] # ── 2. Load .env files from ~/.environment.d/ ───────────────────
# confirmations, etc.) must go above this block; everything else may go below. # Automatically export all variables defined while sourcing .env files
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then setopt allexport
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" for file in ~/.environment.d/*.env(.N); do
fi source "$file"
done
unset file
unsetopt allexport
# Load a function that allows us to import other function definitions from # Load a function that allows us to import other function definitions from
# the ZSH_FUNC_PATH without providing their exact location # the ZSH_FUNC_PATH without providing their exact location
@ -18,11 +24,13 @@ done
unset file unset file
unsetopt allexport unsetopt allexport
autosource insta
autosource youtube autosource youtube
autosource milan autosource milan
autosource nas autosource nas
autosource fuck autosource fuck
autosource download
autosource jellyfin
test -e "${HOME}/.iterm2_shell_integration.zsh" && source "${HOME}/.iterm2_shell_integration.zsh" eval "$(zoxide init --cmd cd zsh)"

View file

@ -1,12 +1,9 @@
# Aliases # Aliases
alias d="$HOME/dev/bin/mdl"
alias vim="nvim" alias vim="nvim"
alias vi="nvim" alias vi="nvim"
alias nano="nvim" alias nano="nvim"
alias tg="terragrunt" alias tg="terragrunt"
alias tf="tofu" alias tf="tofu"
alias terraform="tofu" alias terraform="tofu"
alias pip="pip3"
alias python="python3"
alias cookies="open $HOME/Library/Containers/com.apple.Safari/Data/Library/Cookies/"
alias dotfiles="git --work-tree=$HOME --git-dir=$HOME/.dotgit " alias dotfiles="git --work-tree=$HOME --git-dir=$HOME/.dotgit "
alias instaloader="uvx --with browser_cookie3 instaloader"

View file

@ -19,4 +19,43 @@ install_dotfiles () {
dotfiles_install_error="yes" dotfiles_install_error="yes"
fi fi
fi fi
if [[ ! -d ~/.oh-my-zsh ]]; then
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended --keep-zshrc
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git $HOME/.oh-my-zsh/themes/powerlevel10k
fi
# Path to Brewfile
BREWFILE="$HOME/.Brewfile"
if ! command -v brew &>/dev/null; then
echo "Homebrew not found. Installing..."
if uname -r | grep -qi "truenas"; then
mkdir $HOME/linuxbrew
sudo ln -s $HOME/linuxbrew /home/linuxbrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
#----uv
command -v uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
#
if [[ "$OSTYPE" == "darwin"* ]]; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
if [[ -f "$BREWFILE" ]]; then
echo "Installing from Brewfile: $BREWFILE"
brew bundle --file="$BREWFILE"
else
echo "No Brewfile found at $BREWFILE"
fi
fi
fi
} }