25 June 2025

Kodi and Jellyfin Intro Skipper

 I wanted to be able to skip the longer intro sequences like you can on many streaming services. In my search, I found a plugin and addon to accomplish the task.


Installation

  • Add Intro-Skip Plugin to Jellyfin
    • Add the Repository
      • Jellyfin Web Interface -> Hamburger menu -> Dashboard
      • Click on "Catalog" under Plugins
      • Click on the settings wheel at the top
      • Click on the "+"
      • https://intro-skipper.org/manifest.json
    • Install the Addon
      • On the Catalog page scroll down to the Intro-Skipper section and install "Intro Skipper"
      • Restart Jellyfin to finish the installation
  • Add the Jellyskip Addon to Kodi

    Appendix

    Sources


    03 May 2025

    Reverse Proxy for Jellyfin

     As I wanted to be able to access Jellyfin on the go, I needed to put it behind my reverse proxy.


    Jellyfin Changes

    Tell Jellyfin that it is behind a proxy so it will ignore the proxy ip and log the correct ip
    • https://jellyfin.home.arpa:8920
      • hamburger menu -> Networking
        • Add the IP of your reverse proxy to "Known Proxies"
      • Restart Jellyfin


    Reverse Proxy

    • Add the below to your NGINX config:

        location = /jellyfin {
            return 301 $scheme://$http_host/jellyfin/ ;
        }
        location /jellyfin/ {
            auth_basic off;
            proxy_pass https://jellyfin.home.arpa:8920/;
            proxy_buffering off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Forwarded-Port $server_port;
        }
        location /jellyfin/socket {
            # Proxy Jellyfin Websockets traffic
            auth_basic off;
            proxy_pass https://jellyfin.home.arpa:8920/socket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            # proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Protocol $scheme;
            proxy_set_header X-Forwarded-Host $http_host;
            proxy_set_header X-Forwarded-Port $server_port;
        }
    • Restart NGINX


    Appendix

    Sources


    08 March 2025

    Lenovo Yoga 7 2-in-1 14" Touchscreen Laptop Review

     As my child had been getting into video games, we decided to get them a laptop of their own so they wouldn't need to borrow my wife's.

    Here were my list of requirements:

    • Priced less than $700
    • 11-14" Screen
      • IPS or OLED
      • at least 300 nits
      • at least 45% NTSC coverage
    • A recent processor with great integrated graphics
      • AMD Ryzen 7 7840U with Radeon 780M
      • AMD Ryzen 7 8840U with Radeon 780M
      • Intel Core Ultra 7 155U
      • or newer
    • RAM >= 16GB 
    • Storage >= 512GB 
    • USB C charging
    • WiFi 7/6E with 2x2 antennas
    • Backlit keyboard (optional)
    • USB C charging on both sides (optional)


    Best Buy had a sale for the Lenovo Yoga 2-in-1 14" Touchscreen Laptop (83DK000AUS / 12IAHP9), which we bought as it met most of my criteria.

    • Price: $600
    • 14" Screen 300 nits 45% NTSC coverage (~60% sRGB)
    • AMD Ryzen 7 8840U with Radeon 780M
    • RAM: 16GB
    • Storage: 1TB
    • USB C charging
    • WiFi 6E with 2x2 antennas
    • Backlit keyboard
    • USB C only on a single side :-(
    • Left ports:
      • 2 x USB C (one USB4 40Gbps)
      • 1 x HDMI 2.1
      • 1 x 3.5mm headphone/microphone combo jack
    • Right ports:
      • 1 x USB A
      • 1 x microSD
    • 3.55 lbs
    • Charger is a 65W brick style with 3 pin power cord


    Compared to my wife's Lenovo Yoga 2-in-1 16" Touchscreen Laptop (82QG0001US / 16IAP7) which we bought in 2022:

    • Price: $600
    • 16" Screen 400 nits 72% NTSC coverage (100% sRGB)
    • Intel Core i5-1240P
    • RAM: 8GB
    • Storage: 256GB
    • USB C charging
    • WiFi 6E with 2x2 antennas
    • Backlit keyboard
    • USB C only on a single side :-(
    • Left ports:
      • 2 x USB C (thunderbolt)
      • 1 x USB A
      • 1 x HDMI 2.0
      • 1 x SD card reader
    • Right ports:
      • 1 x USB A
      • 1 x 3.5mm headphone/microphone combo jack
    • 4.37 lbs
    • Charger is a 65W wall-wort style with 2 folding pins


    My thoughts:

    • The laptop feels sturdy and premium
    • While the screen is not for color accurate work, or as good as my wife's, it looks plenty good to my eyes when not looking side-by-side
    • The memory and storage should be sufficient for many years to come
    • GPU should be about 2x more performant than my wife's, which should be plenty to play the types of games that my child likes
    • The included 65W charger works well. Unfortunately, the laptop charges extremely slowly on our existing 45W chargers.


    Child acceptance factor, in general they like it except:

    • it is too heavy (would prefer a ligher 11")
    • sometimes when starting screen share on Zoom, Zoom will stop responding


    Appendix

    Sources:

    Other Reviews:

    12 February 2025

    Ensuring USB DVD order

    As my USB dvd drives were being detected into a seemingly random order, I wanted to be able to control what device each was being assigned.


    Adding udev rules

    • Find serials to add
      • sudo udevadm info /dev/sr0 | grep ID_SERIAL_SHORT
      • sudo udevadm info /dev/sr1 | grep ID_SERIAL_SHORT
      • sudo udevadm info /dev/sr2 | grep ID_SERIAL_SHORT
    • Create /etc/udev/rules.d/99-dvd.rules
    ACTION="add", KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="first drive serial", SYMLINK+="dvd0"

    ACTION="add", KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="second drive serial", SYMLINK+="dvd1"

    ACTION="add", KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="third drive serial", SYMLINK+="dvd2"

    • Reboot or force rerunning the rules
      • sudo udevadm control --reload
      • sudo udevadm trigger
    • However, this did not work
    • Edit /etc/udev/rules.d/99-dvd.rules and remove the ACTION
    KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="first drive serial", SYMLINK+="dvd0"

    KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="second drive serial", SYMLINK+="dvd1"

    KERNEL="sr[0-9]", ENV{ID_SERIAL_SHORT}="third drive serial", SYMLINK+="dvd2"

    • Reboot or force rerunning the rules
      • sudo udevadm control --reload
      • sudo udevadm trigger


    Outcome

    Success, it now creates the /dev/dvd* in a consistent order. Unfortunately, Handbrake still tries to use the /dev/sr* labels.


    Appendix

    Sources


    14 January 2025

    Recursively Mount ZFS datasets

    In order to simplify mounting and unmounting my encrypted volumes, I wanted some scripts.


    Recursively Mount

    #!/usr/bin/env sh
    dataset=$1

    zfs load-key "${dataset}"
    zfs list -rH -o name "${dataset}"  | xargs -L 1 zfs mount


    Unmount and unload key

    #!/usr/bin/env sh
    dataset=$1

    zfs unmount "${dataset}"
    zfs unload-key "${dataset}"


    Usage

    # mount example
    sh mount.sh storage/encrypted
    Passphrase:

    # unmount example
    sh unmount.sh storage/encrypted


    Appendix

    Sources


    31 December 2024

    ASUS ROG Charger Dock

    In order to simplify connecting my chromebook to my tv, I wanted a small dock. As Best Buy has been running sales on the ASUS ROG Charger Dock for $30, I decided to snag it.


    Pros

    • Price when on sale
    • Size (about the size of a deck of cards cut in half, but twice as thick)
    • 65 Watt charging capability
    • Ports:
      • USB-C to laptop
      • USB-A
      • HDMI
    • Comes with a braided USB-C cable
    • Charges chromebook and outputs to tv with a single laptop connection


    Cons

    • Limited ports (no ethernet or downstream USB-C)
    • HDMI 2.0 limits output to 4K 60Hz


    Other Thoughts

    • USB-C cord was packaged with sharp bends that may lead to longevity issues


    Firmware

    Mine came with firmware B41 and I updated it to B59 (version 1.4.1)


    Appendix

    Links:


    23 December 2024

    Replacing drives in ZFS take two

    As it had been ~3 years since the last storage upgrade and there was only about 20% free space remaining, I wanted to take advantage of Black Friday prices. From WD.com, I grabbed 2 x 16TB Red Pro drives with a 5 year warranty.


    Verify the drives

    • smartctl short tests
      • smartctl -t short /dev/sdX
      • smartctl -t short /dev/sdY
    • check smartctl test status after ~5 minutes
      • smartctl -a /dev/sdX
      • smartctl -a /dev/sdY
    • badblocks
      • Does 4 iterations of a write followed by a read. For my 16TB drives, each step took ~24 hours for a total of around 8 days.
      • nohup badblocks -wsv -b 4096 /dev/sdX >16TB_serial_1.log 2>&1 &
      • nohup badblocks -wsv -b 4096 /dev/sdY >16TB_serial_2.log 2>&1 &
      • The logs will continue to grow as it runs. Mine got to 5.3MiB each for my 16TB drives after ~8 days
    • Create script to check status of verification
      • echo "" > newline.log
      • echo "cat 16TB_serial_1.log newline.log 16TB_serial_2.log newline.log" > status.sh
      • sh status.sh


    Add the drives to the mirror

    • Attach the drives
      • zpool attach [POOLNAME] [EXISTING_DRIVE] [NEW_DRIVE_1]
      • zpool attach [POOLNAME] [EXISTING_DRIVE] [NEW_DRIVE_2]
    • Resilver both drives at once
      • resolves: (awaiting resilver) on [NEW_DRIVE_2]
      • zpool resilver [POOLNAME]
    • Check on resilver
      • zpool status [POOLNAME]
      • resilver in progress since Wed Dec 18 17:37:48 2024
      • I had 4.35TiB to resilver with an estimated runtime of around 7 hours, it ~7 hours and 45 minutes


    Remove the old drives

    I am planning on waiting at least 11 days to ensure the new drives are functioning as expected, but this is the step to remove them.

    • zpool detach [POOLNAME] [DISKNAME]


    Expand the storage

    • zpool set autoexpand=on storage
    • reboot
    • zpool online -e storage [NEW_DRIVE_1]


    Appendix

    Sources