Skip to content

Instantly share code, notes, and snippets.

View rileyjshaw's full-sized avatar
💭
Riley is typing…

Riley Shaw rileyjshaw

💭
Riley is typing…
View GitHub Profile
@rileyjshaw
rileyjshaw / format-openswim.sh
Last active April 19, 2024 21:53
Run this from a local folder containing whatever you want to go on the Shokz OpenSwim
#!/bin/bash
# Shokz OpenSwim headphones (formerly AfterShokz Xtrainerz) have a bug where
# tracks are not played in alphabetical or track order. They are played in the
# order that they were copied to the device. Read more about the issue here:
#
# - https://en.help.shokz.com/s/article/How-to-list-the-track-order-on-OpenSwim-formerly-Xtrainerz-OPENSWIM1408
# - https://en.help.shokz.com/s/get-article?urlName=how-to-list-tracks-order-EN
#
# After extensive testing, it seems that specifying transmission order alone is
.container
- for i in 1..3
.shaker
ul.group
- for j in 1..14
li.line
@rileyjshaw
rileyjshaw / convert.sh
Last active March 22, 2024 11:01
Download all issues of Emigre Magazine from Letterform Archive’s Online Archive
# Move the results into their own folder, drag that parent folder into imageOptim, `cd` into it, then:
for d in Issue\ */; do
cd "$d"
convert -compress jpeg -quality 33 -resize 2388x2388\> *.jpg "../${d%/}.pdf"
cd ..
done
@rileyjshaw
rileyjshaw / ffmpeg-slit-scan.sh
Created March 5, 2024 02:57
Create an ultra-wide photograph out of a slow dolly shot video. FFMPEG is amazing!
#!/bin/bash
# Default values
start_time=0
rtl_flag=false
output_file="output.png"
downscaling_factor=1
aspect_ratio="16:9"
# Parse arguments
@rileyjshaw
rileyjshaw / convert_to_mp3.sh
Created November 17, 2023 20:11
Convert a folder of .flac albums to 192kbps MP3s to save space on my OpenSwim headphones
#!/bin/bash
# Define the source and target directories.
SOURCE_DIR="./originals"
TARGET_DIR="./processed"
# Ensure ffmpeg is installed.
if ! command -v ffmpeg &> /dev/null
then
echo "ffmpeg could not be found, please install it."
@rileyjshaw
rileyjshaw / concat-with-titles.sh
Last active October 30, 2023 13:37
I have a folder with every Fabriclive set split into individual files. This creates a merged track for each set, with the title spoken at the start of the track.
#!bin/bash
for d in */; do
cd "$d"
title=$(echo "$d" | sed 's/\./ /' | sed 's/ \[.*//g')
echo "$title" | sed 's/FABRICLIVE/Fabric lyve/' | sed -r 's/\(([0-9]+)\)/in \1/g' | sed -r 's/ 0+([1-9][0-9]*)/ \1/g' | say -v Serena -o "00. Title.aiff"
ffmpeg -i "00. Title.aiff" -acodec libmp3lame -ab 192000 -ar 44100 -ac 2 "00. Title.mp3"
command ls -1 *.mp3 | sed s/\'/\'\\\\\'\'/g | awk '$0="file \047"$0"\047"' >> tracklist.txt
ffmpeg -f concat -safe 0 -i tracklist.txt -c copy "../../Merged with titles/$title.mp3"
rm "00. Title.aiff"
rm "00. Title.mp3"
@rileyjshaw
rileyjshaw / heic-convert.sh
Created May 30, 2023 03:15
Adding this to remind myself that the `mogrify` command exists
# heic-convert() {
# local ext
# ext="${1:-jpg}"
# for img in *.heic; do
# convert "$img" "${img%.heic}.$ext"
# done
# }
# Instead of ^this^, do this:
mogrify -format jpg *.heic
@rileyjshaw
rileyjshaw / prattle.sh
Created March 29, 2023 23:26
Multiple shell `say` instances at once
curl https://raw.githubusercontent.com/dariusk/corpora/master/data/technology/new_technologies.json | jq '.technologies[]' | while read technology; do say -v zarvox "$technology" & done
@rileyjshaw
rileyjshaw / move-component.js
Created March 10, 2023 03:58
A quick script to organize loose React components
/**
* Moves a React component into its own folder in <src>/components/, adds an index.js for
* cleaner imports, and updates the import path in other files.
*
* Based loosely on the structure shown in https://www.joshwcomeau.com/react/file-structure.
*
*
* Usage
* =====
*
@rileyjshaw
rileyjshaw / DndProviderWrapper.jsx
Created March 10, 2023 00:59
A small wrapper around React DnD’s provider that switches to a touch backend as soon as a touch event is detected.
// This is a small wrapper around React DnD’s provider that switches to a touch
// backend as soon as a touch event is detected.
import { useEffect, useState } from 'react';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
const TOUCH_EVENTS = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];
function DndProviderWrapper({ children }) {
const [dndProps, setDndProps] = useState({ backend: HTML5Backend });