• 6 Posts
  • 44 Comments
Joined 1 year ago
cake
Cake day: March 28th, 2025

help-circle

  • Thanks for your feedback.

    You just need an Immich API key, and run it from any machine from where you can reach your Immich instance. It does everything using the Immich API, so only a key with the proper permissions is needed. (I’ll add what the minimum required permissions are in the README.)

    Also, if you want to do it for many users, you don’t need them to run it on individual machines/accounts. You can create multiple config files, each with that user’s key, and pass it to the script via the --config flag.

    If running it for multiple users is a thing that people are interested in, I can add a way to supply an array of options in the config file, each belonging to one user.





  • Good work, but this can be done in a more efficient way by utilizing the qBittorrent API in more places. Also, you may wanna utilize gluetun’s VPN_PORT_FORWARDING_UP_COMMAND for calling the script.

    Here’s my script. I used bash since the gluetun container doesn’t have Python in it.

    Code
    #!/bin/sh
    
    # Adapted from https://github.com/claabs/qbittorrent-port-forward-file/blob/master/main.sh
    
    # set -e
    
    qbt_username="${QBT_USERNAME}"
    qbt_password="${QBT_PASSWORD}"
    qbt_addr="${QBT_ADDR:-http://localhost:8085/}"
    
    if [ -z ${qbt_username} ]; then
        echo "You need to provide a username by the QBT_USERNAME env variable"
        exit 1
    fi
    
    if [ -z ${qbt_password} ]; then
        echo "You need to provide a password by the QBT_PASSWORD env variable"
        exit 1
    fi
    
    port_number="$1"
    if [ -z "$port_number" ]; then
        port_number=$(cat /tmp/gluetun/forwarded_port)
    fi
    
    if [ -z "$port_number" ]; then
        echo "Could not figure out which port to set."
        exit 1
    fi
    
    wait_time=1
    tries=0
    while [ $tries -lt 10 ]; do
        wget --save-cookies=/tmp/cookies.txt --keep-session-cookies --header="Referer: $qbt_addr" --header="Content-Type: application/x-www-form-urlencoded" \
          --post-data="username=$qbt_username&password=$qbt_password" --output-document /dev/null --quiet "$qbt_addr/api/v2/auth/login"
    
        listen_port=$(wget --load-cookies=/tmp/cookies.txt --output-document - --quiet "$qbt_addr/api/v2/app/preferences" | grep -Eo '"listen_port":[0-9]+' | awk -F: '{print $2}')
    
        if [ ! "$listen_port" ]; then
            [ $wait_time -eq 1 ] && second_word="second" || second_word="seconds"
            echo "Could not get current listen port, trying again after $wait_time $second_word..."
            sleep $wait_time
            [ $wait_time -lt 32 ] && wait_time=$(( wait_time*2 )) # Set a max wait time of 32 secs
            tries=$(( tries+1 ))
            continue
        fi
    
        if [ "$port_number" = "$listen_port" ]; then
            echo "Port already set to $port_number, exiting..."
            exit 0
        fi
    
        echo "Updating port to $port_number"
    
        wget --load-cookies=/tmp/cookies.txt --header="Content-Type: application/x-www-form-urlencoded" --post-data='json={"listen_port": "'$port_number'"}' \
          --output-document /dev/null --quiet "$qbt_addr/api/v2/app/setPreferences"
    
        echo "Successfully updated port"
        exit 0
    done
    
    echo "Failed after 10 attempts!"
    exit 2
    

    For the auto-exit stuff, you may wanna check out docker’s healthcheck functionality.

    Not trying to put you down or anything here, it’s great to learn to do things by yourself. Just giving you some pointers.




  • SinTan1729@programming.devtoTechnology@lemmy.worldCloudfare outage post mortem
    link
    fedilink
    English
    arrow-up
    7
    arrow-down
    1
    ·
    edit-2
    5 months ago

    I hope you’re joking. If anything, Rust makes error handling easier by returning them as values using the Result monad. As someone else pointed out, they literally used unwrap in their code, which basically means “panic if this ever returns error”. You don’t do this unless it’s impossible to handle the error inside the program, or if panicking is the behavior you want due to e.g. security reasons.

    Even as an absolute amateur, whenever I post any Rust to the public, the first thing I do is get rid of unwrap as much as possible, unless I intentionally want the application to crash. Even then, I use expect instead of unwrap to have some logging. This is definitely the work of some underpaid intern.

    Also, Python is sloooowwww.


  • SinTan1729@programming.devtoProgramming@programming.devUsing Vim is Amazing
    link
    fedilink
    English
    arrow-up
    7
    arrow-down
    1
    ·
    edit-2
    6 months ago

    Welcome to the club. Don’t worry too much about setting it up perfectly in your first attempt. You’re gonna rewrite your whole config every year-ish anyway. (Or is that just me? 😥) Also, try Neovim. It’ll be a drop-in replacement for your current config. But Lua is just a superior language compared to Vimscript, so you’ll have a much better performance in the future. You also get all the sweet LSP and treesitter features.













  • It’s like everything else, you need to actually do it to get better at it. The more you want and try to get better, the harder it’ll feel. The best way is to just enjoy doing it. But it’s easier said than done.

    For me personally, since it’s not my job, I don’t feel any pressure programming, and it’s kind of a stress reliever. I’m not very good at it anyway, but the improvements I’ve made were due to the fact that I didn’t feel any pressure in learning new things, and was able to do things at my own preferred pace. As an example, for the last few days I’ve been learning about the internal working of SQLite. It’s pretty complex, but I don’t feel like I need to know and remember everything, so it’s easier for me to actually get through it. (Btw, if anyone reading this has experience working with SQLite, let me know, I’d like to discuss some stuff. It’s about optimizing some queries, so you don’t need to know about the SQLite codebase, just a rough idea of how it works, and some experience with Rusqlite. Fwiw, happy to add you as a contributor in my project if any performance improvements come out of it.)

    But it’s a different story when it comes to learning stuff for my actual work. Even though the rewards are bigger, the process feels much worse. (Hating on Deligne-Serre representations right now. :( They’re beautiful objects, but the pressure to learn is just too much.)

    So, if you’re like me, try not to take it too seriously, and it’ll be easier to learn.