Projects

They just werk on my machine


Shellscripts

sap - AUR helper
ytlol - youtube player/client
tpbs - PirateBay scraper
lyry - Genius Lyrics fetcher
memer - meme maker using imagemagick
pacmano - pacman package organizer/logger



sap


Shellscript AUR helper
Requires git


Aureate - Similar project written in C

Manual
Usage: sap [arguments] <package>

Arguments:
 sync           Sync package
 search         Search for packages, prints top 250 results for query
 customsync     Sync package after customizing PKBUILD

Examples

Install a package

Install the 'quakespasm' package.

sap sync quakespasm

Look for packages

List AUR results for the query 'quake'.

sap search quake

Install a package and modify its PKGBUILD

Install the 'gzdoom' package after opening its PKGBUILD on the user's default editor ($EDITOR variable or xdg-open if variable is not set), allowing the user to modify the PKGBUILD if necessary, for instance, to remove a broken dependency.

sap customsync gzdoom

TODO
  • "Repo not found" message
  • Option to update packages
  • Keep build dependencies option
  • Handle removal of useless dependencies better
  • Handle PGP keys signatures
  • Handle AUR dependencies
Patch notes

21/7/25 v1.2

  • Fixed problems with the search option

v1.1

  • Added search option
  • Added customsync option for editing PKGBUILD before compiling packages
  • Removed remove option (just use pacman -Rns)
  • Removed bashisms

Install:

curl /projects/sap.txt -o /usr/local/bin/sap
chmod +x /usr/local/bin/sap


ytlol


Shellscript youtube player/client
Requires mpv, yt-dlp, & fzf (for -f)


Advantages over ytfzf:

yt - Similar project written in Bash

Manual
Usage: ytlol [options] <query>

Options:
None    Play top result as audio (default)
 -v     Play as video and save position on quit
 -f     Search & pick result
 -n     Number of pages to query, compliment to -f
 -s     Skip title/link message (not faster)
 -u     Update Invidious instance used for searches
 -e     Disable search query encoding
 -p     Custom player command. If the word 'URL' is included, it will be replaced with the video URL (e.g., -p 'mpv --pause $(yt-dlp --get-thumbnail URL)').
        If 'URL' is not included, the video URL will be appended at the end of the command (e.g., -p 'mpv --fs' or -p xdg-open).

Examples

Listen to the top result

Play the first result for the query 'Oxygène' as audio on mpv.

ytlol oxygène

Watch the top result as video

Watch the first result for the query 'Big Buck Bunny' on mpv, while also saving progress on quit.

ytlol -v big buck bunny

Listen to selected result

Play selected result for the query 'Tchaikovsky' as audio on mpv. The selection is done on fzf.

ytlol -f tchaikovsky

Download first result using yt-dlp

Download the first result for the query 'Drunken Sailor' using yt-dlp.

ytlol -p yt-dlp drunken sailor

Open top result on LibreWolf

Open the top result link for the query 'Luke Smith' on the LibreWolf browser.

ytlol -p librewolf luke smith

Stare at top result's thumbnail

Open the top result's thumbnail on mpv. Capitalized URL is replaced with the top result's link.

ytlol -p 'mpv --pause $(yt-dlp --get-thumbnail URL)' landscape

Download a song with metadata (Experimental)

Use yt-dlp to download a song with its metadata including thumbnail as cover art, uploader as artist, upload date, description, and album tag.

ytlol -p 'filename="$(yt-dlp --get-title URL)"; artist="$(yt-dlp --print "%(uploader)s" URL)"; yt-dlp URL -x --audio-format mp3 -o "$filename.%(ext)s"; curl -L "$(yt-dlp --get-thumbnail URL)" -o thumb.webp; ffmpeg -y -i thumb.webp -vf "crop=710:710:(iw-710)/2:(ih-710)/2" thumb.jpg; lame --ti thumb.jpg --tt "$filename" --ta "$artist" "$filename.mp3" temp.mp3; mv temp.mp3 "$filename.mp3"; rm thumb.jpg thumb.webp' txtsi kiss me

Download a song with even more metadata (Experimental)

Use yt-dlp to download a song with its metadata including thumbnail as cover art, uploader as artist, upload date, description, and album tag.

ytlol -p 'filename="$(yt-dlp --get-title URL)" && yt-dlp --extract-audio --audio-format mp3 --add-metadata --embed-metadata "URL" -x -o "$filename.%(ext)s" && curl -L "$(yt-dlp --get-thumbnail "URL")" -o thumb.webp && ffmpeg -i thumb.webp -vf "crop=710:710:(iw-710)/2:(ih-710)/2" thumb.jpg && ffmpeg -i "$filename.mp3" -i thumb.jpg -map 0 -map 1 -c copy -id3v2_version 3 -metadata:s:v title="Album cover" -metadata:s:v comment="Cover (front)" "temp.mp3" && mv "temp.mp3" "$filename.mp3" && rm thumb.webp thumb.jpg' kmfdm son of a gun

TODO
  • Immediate results (option?)
  • Support other sites
  • Display [LIVE] for ongoing live streams in results
  • Playlist results
  • Add viewcounts and upload dates to results
  • Ueberzug thumbnail and video description previews
  • Optmize fzf query loop
  • Option to wait for title/link message before playing video to avoid echoing it in the middle of the mpv playback output
Patch notes

v1.5.1

  • To avoid problems with curl or other similar problems, -p now expects capitalized URL instead of lowercase 'url'.

v1.5

  • Added -p for custom video players, which also skips the title/link message like -s. If the command doesn't include "url", the result's URL is appended at the end of the command.
  • Added -n to choose amount of pages to query for -f. For example, ytlol -f -p 2 search query will query two pages
  • Added -e to disable search query encoding
  • Added search query encoding as default, this allows searching stuff with special characteres

v1.4

  • Added -s to skip title/link message
  • Complete code and usage revamp. -80 lines and around -2400 chars (Seriously)
  • -f is now an option to enable fzf menu selection instead of fzf menu selection + Video. It can be combined with -v (-fv, -vf, ...) to play selected result as video
  • Removed -a. Use -f without -v instead to play selected result as audio
  • Removed bashisms

v1.3

  • Channel results
  • fzf now uses --exact
  • yt-dlp errors are now sent to limbo aka /dev/null
  • Fixed video title and link getting messed up in the mpv output
  • Only queries 1 page now, but you change that in the code. May add an option for it soon.

v1.2

  • "-u" Option to update default instance variable, use it if the default one is dead
  • New usage guide message
  • Minor fixes

v1.1

  • Changed -fa to -a
  • Changed invidious instance
  • Fixed ignoring $1 when there's no defined option
  • Removed bashisms
  • Removed fzf blank stuff

Install:

curl /projects/ytlol.txt -o /usr/local/bin/ytlol
chmod +x /usr/local/bin/ytlol


tpbs


Shellscript PirateBay scraper
Requires fzf (except for -f)


Manual
Usage: tpbs [options] <query>

Options:
None            Select from top 30 results on fzf
 -f             Feeling lucky, retrives top first result
 -u             Update TPB mirror by looking for a healthy mirror
 -n <number>    Number of pages to query, 30 results/page (e.g., -n 3 = 90 results, 3 pages)

Categories:    Only show results from selected categories
None            All categories
 -a             Audio
 -v             Video>
 -p             Applications/Programs
 -g             Games
 -o             Other

Examples

Select from top results

Select from results for the query "linux mint". (Downloading from the official site is recommended.)

tpbs linux mint

Retrive first result

Get the page for the TempleOS torrent.

tpbs -f templeos

Select from top results from the video category, including results from page 2

Select from the 60 top results for the query "movie" in the video category.

tpbs -n 2 -v movie

TODO
  • Support other sites
  • Options to change order that torrent info (seeders, uploaders, etc.) appears
  • Gradual results option
Patch notes

15/7/25 v1.0 Initial release

Install:

curl /projects/tpbs.txt -o /usr/local/bin/tpbs
chmod +x /usr/local/bin/tpbs


lyry


Shellscript Genius Lyrics fetcher
Requires fzf (for -f)


Manual
Usage: lyry [options] <query>
	
Options:
None            Retrive top first result
 -f             Select from results
 -i             Retrieves song title, album, and link
 -u             Update frontend instance by looking for a healthy instance
 -n <number>    Number of pages to query, 10 results/page (e.g., -n 3 = 30 results, 3 pages)

Examples

Just the lyrics

Get the lyrics for the song "Voodoo People" by The Prodigy.

lyry voodoo people

Data + lyrics

Get the lyrics of, and print information (title, artist, album (in this case a compilation the track was included), and link) about the song "The Trooper" by Iron Maiden.

lyry -i the trooper

Just lyrics, but select results

Get the lyrics of a selected song out of the results of the query "Sabaton".

lyry -f sabaton

Data, lyrics, select results, including results from page 2

Get the lyrics and info of a selected song out of the first 20 results of the query "The Cure".

lyry -fi -n 2 the cure

TODO
  • Search query encoding
  • Gradual results option
Patch notes

16/8/25 v1.2

  • Fixed scrapping on instances with newer versions of the Genius frontend

30/7/25 v1.1.2

  • Fixed POSIX incompatibilities (tested on a OpenBSD 7.7 VM via QEMU)
  • Minor fixes

22/7/25 v1.1.1

  • Minor fixes

21/7/25 v1.1

  • "-u" option to update frontend instance

15/7/25 v1.0 Initial release

Install:

curl /projects/lyry.txt -o /usr/local/bin/lyry
chmod +x /usr/local/bin/lyry


memer


Shellscript meme maker using imagemagick
Requires imagemagick and impact font installed


Manual
Usage: memer [options] input_image top_text bottom_text output_image

Options:
 --auto-resize  Automatically resize text to fit image width.
 --auto-break   Automatically break long lines of text to fit image width.
 -f   <size>    Font size for the text.
 -ft  <size>    Font size for top text.
 -fb  <size>    Font size for bottom text.
 -s   <size>    Stroke width for the text.
 -st  <size>    Stroke width for top text.
 -sb  <size>    Stroke width for bottom text.
 -fc  <color>   Fill color for the text.
 -fct <color>   Fill color for the top text.
 -fcb <color>   Fill color for the bottom text.
 -sc  <color>   Outline color for the text.
 -sct <color>   Outline color for top text.
 -scb <color>   Outline color for bottom t

Arguments:
 input_image    Path to input image.
 top_text       Text to be placed at the top of the image.
 bottom_text    Text to be placed at the bottom of the image.
 output_image   Path to output image. Defaults to "output.jpg" if not provided.

Examples

Normal meme

Make a meme with regular colors.

memer --auto-resize image.png "TOP TEXT" "BOTTOM TEXT"

Greentext meme

Make a meme with meme arrows on top and regular text on the bottom.

memer --auto-resize -fct green image.png ">muh top text" "BOTTOM TEXT"

TODO
  • Shadows option
    • Maybe colors for the shadows
Patch notes

v1.2

  • "output_image" argument for output filename
  • "-ft" option for top font size
  • "-fb" option for bottom font size
  • "-st" option for top stroke width
  • "-sb" option for bottom stroke width
  • "-fct" option for top fill color
  • "-fcb" option for bottom fill color
  • "-sct" option for top outline color
  • "-scb" option for bottom outline color
  • Minor fixes

v1.1

  • "--auto-resize" option to automatically resize text to fit image width
  • "--auto-break" option to automatically break long lines of text to fit image width
  • "-f" option for font size
  • "-s" option for stroke width
  • "-fc" option for fill color
  • "-sc" option for outline color
  • Changed prompt format

Install:

curl /projects/memer.txt -o /usr/local/bin/memer
chmod +x /usr/local/bin/memer
mkdir /usr/share/fonts/impact
curl /projects/impact.ttf -o /usr/share/fonts/impact/impact.ttf


pacmano


Shellscript pacman package organizer/logger


Manual
Usage: pacmano <option>
	
Options:
 save           Saves a list of your current packages to .cache/pacmano
 return         Compare your current list to an older one and remove newly installed packages
 customreturn   Same as above but you can edit the package removal list
 list           Prints out the list of lists

Examples

Make checkpoint

Save list of packages currently installed to ~/.cache/pacmano. Just like muh vidyagaem checkpoints amirite.

pacmano save

Check available "saves"

List previously saved "checkpoints" at ~/.cache/pacmano.

pacmano list

Use checkpoint

Save current state and return to determined checkpoint.

pacmano return ~/.cache/pacmano/753

Modify and use checkpoint

Same as above, but while also editing selected checkpoint with default editor, ($EDITOR variable or xdg-open if variable is not set) allowing users to erase programs they don't want to remove from the deletion list.

pacmano customreturn ~/.cache/pacmano/825

Patch notes

v1.1

  • Added customreturn option for editing the package removal list

Install:

curl /projects/pacmano.txt -o /usr/local/bin/pacmano
chmod +x /usr/local/bin/pacmano