Compare commits
35 Commits
49eba52599
...
master
Author | SHA1 | Date | |
---|---|---|---|
e1ba233753 | |||
cbb8d1a9e8 | |||
66b4328a30 | |||
9bb3049dd8 | |||
e1295615d7 | |||
4ab77fd309 | |||
6eb456e667 | |||
191784d1f2 | |||
e132462e5c | |||
7768df55a6 | |||
0f439be1f9 | |||
b1a3e5d72e | |||
1a618bb0c1 | |||
45375ccf9a | |||
81af13a1ae | |||
46376f9242 | |||
58fdbe307f | |||
094430c1f7 | |||
48ef0718cc | |||
a2b2ff9441 | |||
82b8648ff6 | |||
766f64c4a6 | |||
a361543acf | |||
2ee3e3c322 | |||
6e60755a15 | |||
7c71b8b614 | |||
3c883b3808 | |||
69642a9041 | |||
76f5fb5053 | |||
46d3cf2484 | |||
f5c30419a8 | |||
6c238989f8 | |||
326b550b2f | |||
3028b35bcd | |||
31c11366c8 |
16
LICENSE
Normal file
16
LICENSE
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
MIT No Attribution
|
||||||
|
|
||||||
|
Copyright 2024 Nicolás Ortega Froysa <nicolas@ortegas.org>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
without restriction, including without limitation the rights to use, copy, modify,
|
||||||
|
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
|
||||||
|
permit persons to whom the Software is furnished to do so.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||||
|
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||||
|
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||||
|
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# My Scripts
|
||||||
|
|
||||||
|
This is a collection of personal scripts I use that others may also find useful.
|
||||||
|
All scripts here are licensed under the MIT No Attribution license, unless
|
||||||
|
otherwise specified (look at the header of the script).
|
@ -1,43 +1,31 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
CACHE_DIR="$HOME/.cache/audio-control"
|
|
||||||
|
|
||||||
[ "$#" -eq 0 ] &&
|
set -euo pipefail
|
||||||
echo "Requires a command. Run with 'help' for a list of commands." &&
|
|
||||||
|
if [ "$#" -eq 0 ]
|
||||||
|
then
|
||||||
|
echo "Requires a command. Run with 'help' for a list of commands."
|
||||||
exit 1
|
exit 1
|
||||||
[ "$#" -gt 1 ] &&
|
fi
|
||||||
echo "Too many arguments. Run with 'help' for a list of commands." &&
|
if [ "$#" -gt 1 ]
|
||||||
|
then
|
||||||
|
echo "Too many arguments. Run with 'help' for a list of commands."
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
[ -d $CACHE_DIR ] ||
|
|
||||||
mkdir -p $CACHE_DIR
|
|
||||||
|
|
||||||
query_outport() {
|
|
||||||
active_port="$(pactl list sinks | grep 'Active Port')"
|
|
||||||
if [[ $active_port == *"speaker"* ]]
|
|
||||||
then
|
|
||||||
echo "SPK" > $CACHE_DIR/port
|
|
||||||
else
|
|
||||||
echo "HDF" > $CACHE_DIR/port
|
|
||||||
fi
|
|
||||||
pactl list sinks | awk '/Mute/ { if ($2 == "no") print "VOL"; else print "MUT"; }' > $CACHE_DIR/vol_status
|
|
||||||
pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' > $CACHE_DIR/vol_level
|
|
||||||
}
|
|
||||||
|
|
||||||
case $1 in
|
case $1 in
|
||||||
"mute")
|
"mute")
|
||||||
pactl set-sink-mute 0 toggle
|
pactl set-sink-mute 0 toggle
|
||||||
pactl list sinks | awk '/Mute/ { if ($2 == "no") print "VOL"; else print "MUT"; }' > $CACHE_DIR/vol_status;;
|
;;
|
||||||
"vol-up")
|
"vol-up")
|
||||||
pactl set-sink-volume 0 +5%
|
pactl set-sink-volume 0 +5%
|
||||||
pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' > $CACHE_DIR/vol_level;;
|
;;
|
||||||
"vol-down")
|
"vol-down")
|
||||||
pactl set-sink-volume 0 -5%
|
pactl set-sink-volume 0 -5%
|
||||||
pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' > $CACHE_DIR/vol_level;;
|
;;
|
||||||
"reset")
|
"reset")
|
||||||
pactl set-sink-volume 0 50%
|
pactl set-sink-volume 0 50%
|
||||||
pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' > $CACHE_DIR/vol_level;;
|
;;
|
||||||
"toggle-port")
|
|
||||||
query_outport;;
|
|
||||||
"help")
|
"help")
|
||||||
echo "USAGE: audio-control <command>
|
echo "USAGE: audio-control <command>
|
||||||
|
|
||||||
@ -47,7 +35,8 @@ Commands:
|
|||||||
vol-down lower the volume
|
vol-down lower the volume
|
||||||
reset reset volume (to round number)
|
reset reset volume (to round number)
|
||||||
toggle-port toggle the output port
|
toggle-port toggle the output port
|
||||||
help show this help information";;
|
help show this help information"
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
echo "Invalid command. Run with 'help' for a list of commands."
|
echo "Invalid command. Run with 'help' for a list of commands."
|
||||||
exit 1;;
|
exit 1;;
|
||||||
|
5
backup
5
backup
@ -1,2 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
rsync -aAXv / --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/usr/local/share/music/*"} $1
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
rsync -aAXv --delete "$1" --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/media/music/*"} "$2"
|
||||||
|
3
clearmem
3
clearmem
@ -1,2 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
sync && echo 1 > /proc/sys/vm/drop_caches
|
sync && echo 1 > /proc/sys/vm/drop_caches
|
||||||
|
118
d6
Executable file
118
d6
Executable file
@ -0,0 +1,118 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# This is free and unencumbered software released into the public domain.
|
||||||
|
#
|
||||||
|
# Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
# distribute this software, either in source code form or as a compiled
|
||||||
|
# binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
# means.
|
||||||
|
#
|
||||||
|
# In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
# of this software dedicate any and all copyright interest in the
|
||||||
|
# software to the public domain. We make this dedication for the benefit
|
||||||
|
# of the public at large and to the detriment of our heirs and
|
||||||
|
# successors. We intend this dedication to be an overt act of
|
||||||
|
# relinquishment in perpetuity of all present and future rights to this
|
||||||
|
# software under copyright law.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
# OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# For more information, please refer to <http://unlicense.org/>
|
||||||
|
|
||||||
|
VERSION="1.0"
|
||||||
|
|
||||||
|
function print_usage() {
|
||||||
|
echo "USAGE: d6 [OPTIONS]"
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_help() {
|
||||||
|
print_usage
|
||||||
|
echo "OPTIONS:
|
||||||
|
-v print program version
|
||||||
|
-h print this help information
|
||||||
|
-n <num> number of words in generated password (default 3)
|
||||||
|
-f <file> custom dictionary file (default
|
||||||
|
~/.local/share/wordlist.txt)
|
||||||
|
-d <delim> delimiter used between words (default \"\", i.e. NONE)
|
||||||
|
-c <case> the case used for the generated words, can be: upper,
|
||||||
|
lower, capital (default \"capital\")"
|
||||||
|
}
|
||||||
|
|
||||||
|
function test_case() {
|
||||||
|
if [ $1 != "lower" ] && [ $1 != "upper" ] && [ $1 != "capital" ]
|
||||||
|
then
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
NUM_WORDS=3
|
||||||
|
WORDLIST="$HOME/.local/share/wordlist.txt"
|
||||||
|
DELIMITER=""
|
||||||
|
CASE="capital"
|
||||||
|
|
||||||
|
while getopts "vhn:f:d:c:" arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
v)
|
||||||
|
echo "d6 v$VERSION"
|
||||||
|
exit 0;;
|
||||||
|
h)
|
||||||
|
print_help
|
||||||
|
exit 0;;
|
||||||
|
n)
|
||||||
|
NUM_WORDS=$OPTARG;;
|
||||||
|
f)
|
||||||
|
WORDLIST="$OPTARG";;
|
||||||
|
d)
|
||||||
|
DELIMITER="$OPTARG";;
|
||||||
|
c)
|
||||||
|
if test_case $OPTARG
|
||||||
|
then
|
||||||
|
CASE="$OPTARG"
|
||||||
|
else
|
||||||
|
echo "'$OPTARG' is an invalid case. Use 'capital', 'lower', or 'upper'."
|
||||||
|
exit 1
|
||||||
|
fi;;
|
||||||
|
?)
|
||||||
|
print_usage
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
WORDS=""
|
||||||
|
|
||||||
|
for i in $(seq 1 $NUM_WORDS)
|
||||||
|
do
|
||||||
|
ROLLS=""
|
||||||
|
for j in {1..5}
|
||||||
|
do
|
||||||
|
ROLLS="$((1 + $RANDOM % 6))$ROLLS"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ $CASE == "upper" ]
|
||||||
|
then
|
||||||
|
WORD="$(awk "/$ROLLS/{ print toupper(\$2) }" $WORDLIST)"
|
||||||
|
elif [ $CASE == "lower" ]
|
||||||
|
then
|
||||||
|
WORD="$(awk "/$ROLLS/{ print tolower(\$2) }" $WORDLIST)"
|
||||||
|
else
|
||||||
|
WORD="$(awk "/$ROLLS/{ print \$2 }" $WORDLIST)"
|
||||||
|
WORD="${WORD^}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $i -eq $NUM_WORDS ]
|
||||||
|
then
|
||||||
|
WORDS="${WORDS}${WORD}"
|
||||||
|
else
|
||||||
|
WORDS="${WORDS}${WORD}${DELIMITER}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "$WORDS"
|
@ -1,2 +1,13 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
install -m 755 $1 $HOME/.local/bin
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_FILE="$1"
|
||||||
|
|
||||||
|
# Remove extension from script
|
||||||
|
if [[ $SCRIPT_FILE == *.* ]]
|
||||||
|
then
|
||||||
|
SCRIPT_FILE=${SCRIPT_FILE%.*}
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -m 755 "$SCRIPT_FILE" "$HOME/.local/bin"
|
||||||
|
5
iplocate
5
iplocate
@ -1,2 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
curl ipinfo.io/$1
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
curl "ipinfo.io/$1"
|
||||||
|
7
launch-sway
Executable file
7
launch-sway
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#export SDL_VIDEODRIVER=wayland
|
||||||
|
export _JAVA_AWT_WM_NONREPARENTING=1
|
||||||
|
export QT_QPA_PLATFORM=wayland
|
||||||
|
export XDG_CURRENT_DESKTOP=sway
|
||||||
|
export XDG_SESSION_DESKTOP=sway
|
||||||
|
exec sway
|
@ -1,22 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
[ "$#" -eq 0 ] &&
|
|
||||||
echo "Requires a command. Run with 'help' for a list of commands." &&
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
"wallet")
|
|
||||||
monero-wallet-cli --daemon-address node.monero.net:13666;;
|
|
||||||
"address")
|
|
||||||
echo "42espNaUqPdJK4vTir4NDfH4gT6brFR4F5KPRADrg5t98LkzHnQfFnUDZZEetp3Zw5K8V4v364tN3TMxfg4eXEN9RpnrNBG";;
|
|
||||||
"mine")
|
|
||||||
xmr-stak-cpu $XDG_CONFIG_HOME/xmr-stak/cpu-config.txt;;
|
|
||||||
"help")
|
|
||||||
echo "USAGE: monero-client [command]
|
|
||||||
Commands:
|
|
||||||
address print out the monero public address
|
|
||||||
mine start the miner
|
|
||||||
wallet open the monero wallet
|
|
||||||
help show this help information";;
|
|
||||||
*)
|
|
||||||
echo "Invalid command '$1'. Please run with the 'help' option.";;
|
|
||||||
esac
|
|
25
play-lofi
25
play-lofi
@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
# Copyright (C) 2020 Ortega Froysa, Nicolás <nicolas@ortegas.org> All rights reserved.
|
# Copyright (C) 2020 Ortega Froysa, Nicolás <nicolas@ortegas.org> All rights reserved.
|
||||||
# Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
|
# Author: Ortega Froysa, Nicolás <nicolas@ortegas.org>
|
||||||
#
|
#
|
||||||
@ -37,16 +37,17 @@ Commands:
|
|||||||
}
|
}
|
||||||
|
|
||||||
new_link() {
|
new_link() {
|
||||||
local results=$(curl -s "https://invidio.us/search?q=lofi+radio" |
|
local results
|
||||||
|
results=$(curl -s "https://invidious.tube/search?q=lofi+radio" |
|
||||||
grep "<p>.*watch" | tr -d "\n" | tr -s " ")
|
grep "<p>.*watch" | tr -d "\n" | tr -s " ")
|
||||||
results=${results//\<p\>\<a href\=\"/\"https:\/\/invidio.us}
|
results=${results//\<p\>\<a href\=\"/\"https:\/\/invidious.tube}
|
||||||
results=${results//\"\>/\" \"}
|
results=${results//\"\>/\" \"}
|
||||||
results=${results//\<\/a\>\<\/p\>/\" þ }
|
results=${results//\<\/a\>\<\/p\>/\" þ }
|
||||||
results=${results::-2} # remove that last separator
|
results=${results::-2} # remove that last separator
|
||||||
|
|
||||||
# NOTE: I chose þ because never in a million years will that
|
# NOTE: I chose þ because never in a million years will that
|
||||||
# character be in the title of a lofi video stream.
|
# character be in the title of a lofi video stream.
|
||||||
IFS="þ" read -r -a streams <<< $results
|
IFS="þ" read -r -a streams <<< "$results"
|
||||||
|
|
||||||
echo "Streams:"
|
echo "Streams:"
|
||||||
local id=1
|
local id=1
|
||||||
@ -60,12 +61,12 @@ new_link() {
|
|||||||
while [ "$opt" -gt "${#streams[@]}" ] || [ "$opt" -lt "1" ]
|
while [ "$opt" -gt "${#streams[@]}" ] || [ "$opt" -lt "1" ]
|
||||||
do
|
do
|
||||||
printf "Selection: "
|
printf "Selection: "
|
||||||
read opt
|
read -r opt
|
||||||
done
|
done
|
||||||
link=${streams[$opt]}
|
link=${streams[$opt]}
|
||||||
link=${link//\" \"*/}
|
link=${link//\" \"*/}
|
||||||
link=${link//*\"/}
|
link=${link//*\"/}
|
||||||
echo $link > $link_file
|
echo "$link" > "$link_file"
|
||||||
}
|
}
|
||||||
|
|
||||||
# argument parsing
|
# argument parsing
|
||||||
@ -85,7 +86,7 @@ elif [ "$#" -eq "2" ]
|
|||||||
then
|
then
|
||||||
if [ "$1" = "set" ]
|
if [ "$1" = "set" ]
|
||||||
then
|
then
|
||||||
echo "$2" > $link_file
|
echo "$2" > "$link_file"
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
echo "Unknown command '$1 $2'. Run 'play-lofi help' for a list of commands."
|
echo "Unknown command '$1 $2'. Run 'play-lofi help' for a list of commands."
|
||||||
@ -104,28 +105,28 @@ then
|
|||||||
while [ "$option" != "y" ] && [ "$option" != "n" ]
|
while [ "$option" != "y" ] && [ "$option" != "n" ]
|
||||||
do
|
do
|
||||||
printf "Would you like to create one? [y/n] "
|
printf "Would you like to create one? [y/n] "
|
||||||
read option
|
read -r option
|
||||||
done
|
done
|
||||||
[ "$option" = "n" ] && exit 1
|
[ "$option" = "n" ] && exit 1
|
||||||
new_link
|
new_link
|
||||||
echo "New link file created."
|
echo "New link file created."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
link=$(cat $link_file)
|
link=$(cat "$link_file")
|
||||||
|
|
||||||
# check if video is available
|
# check if video is available
|
||||||
output=$(curl -s $link | grep "This video is unavailable.")
|
output=$(curl -s "$link" | grep "This video is unavailable.")
|
||||||
if [ -n "$output" ]
|
if [ -n "$output" ]
|
||||||
then
|
then
|
||||||
echo "The stream link '$link' is unavailable."
|
echo "The stream link '$link' is unavailable."
|
||||||
while [ "$option" != "y" ] && [ "$option" != "n" ]
|
while [ "$option" != "y" ] && [ "$option" != "n" ]
|
||||||
do
|
do
|
||||||
printf "Would you like to find a new one? [y/n] "
|
printf "Would you like to find a new one? [y/n] "
|
||||||
read option
|
read -r option
|
||||||
done
|
done
|
||||||
[ "$option" = "n" ] && exit 1
|
[ "$option" = "n" ] && exit 1
|
||||||
new_link
|
new_link
|
||||||
echo "New link saved."
|
echo "New link saved."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mpv --no-video --msg-level=ffmpeg=no $link
|
mpv --no-video --msg-level=ffmpeg=no "$link"
|
||||||
|
8
setbg
8
setbg
@ -1,8 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
[ $# -ne 1 ] &&
|
|
||||||
echo "Requires an image argument." &&
|
|
||||||
exit 1
|
|
||||||
|
|
||||||
cp $1 $HOME/.local/share/wallpaper.jpg
|
|
||||||
xwallpaper --zoom $HOME/.local/share/wallpaper.jpg
|
|
@ -1,2 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
df -h | awk '{ if ($6 == "/") printf "/: " $4; if ($6 == "/home") printf " home: " $4; if ($6 == "/home/music") printf " music: " $4; }' > $HOME/.cache/free-space
|
|
@ -1,9 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# TODO:
|
|
||||||
# - Add options for port
|
|
||||||
# - Automatically get password from `pass`
|
|
||||||
|
|
||||||
PORT=12800
|
|
||||||
|
|
||||||
ssh -N -D $PORT nortega@themusicinnoise.net
|
|
@ -1,10 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
DATE="$(date +"%F %H:%M" )"
|
|
||||||
NETWORK="eth: $(cat /sys/class/net/enp34s0/operstate)"
|
|
||||||
SPACE="$(cat $HOME/.cache/free-space)"
|
|
||||||
vol_status="$(cat $HOME/.cache/audio-control/vol_status)"
|
|
||||||
vol_level="$(cat $HOME/.cache/audio-control/vol_level)%"
|
|
||||||
VOLUME="$vol_status $vol_level"
|
|
||||||
UPDATES="Upd: $(checkupdates -n | wc -l)"
|
|
||||||
xsetroot -name "$VOLUME | $NETWORK | $SPACE | $UPDATES | $DATE"
|
|
107
sync-camera
Executable file
107
sync-camera
Executable file
@ -0,0 +1,107 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
CAMERA_DEVICE=""
|
||||||
|
MOUNT_DIR="/tmp/camera-mount"
|
||||||
|
OUTPUT_DIR=""
|
||||||
|
REMOVE_FILES=0
|
||||||
|
|
||||||
|
function print_usage() {
|
||||||
|
echo "USAGE: ${0##*/} -d <device> -o <dir> [-t <dir>] [-r]"
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]
|
||||||
|
then
|
||||||
|
>&2 echo "No arguments specified!"
|
||||||
|
print_usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while getopts "d:o:t:rh" opt
|
||||||
|
do
|
||||||
|
case "$opt" in
|
||||||
|
'd')
|
||||||
|
CAMERA_DEVICE=${OPTARG}
|
||||||
|
;;
|
||||||
|
'o')
|
||||||
|
OUTPUT_DIR=${OPTARG}
|
||||||
|
;;
|
||||||
|
't')
|
||||||
|
MOUNT_DIR="${OPTARG}"
|
||||||
|
;;
|
||||||
|
'r')
|
||||||
|
REMOVE_FILES=1
|
||||||
|
;;
|
||||||
|
'h')
|
||||||
|
print_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
print_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$CAMERA_DEVICE" ]
|
||||||
|
then
|
||||||
|
echo "Failed to set the camera device."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$OUTPUT_DIR" ]
|
||||||
|
then
|
||||||
|
echo "Failed to set the output directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! mkdir "$MOUNT_DIR"
|
||||||
|
then
|
||||||
|
echo "Unable to create mount directory '$MOUNT_DIR'."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! sudo mount -o "uid=$(id --user),gid=$(id --group)" "$CAMERA_DEVICE" "$MOUNT_DIR"
|
||||||
|
then
|
||||||
|
rmdir "$MOUNT_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
while IFS= read -r -d '' INPUT_FILE
|
||||||
|
do
|
||||||
|
OUTPUT_PATH="$OUTPUT_DIR/${INPUT_FILE##*/}"
|
||||||
|
if ! [ -f "$OUTPUT_PATH" ]
|
||||||
|
then
|
||||||
|
echo "Copying ${INPUT_FILE} to ${OUTPUT_PATH::-4}.jpg ..."
|
||||||
|
cp "$INPUT_FILE" "${OUTPUT_PATH::-4}.jpg"
|
||||||
|
chmod -x "${OUTPUT_PATH::-4}.jpg"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $REMOVE_FILES -eq 1 ]
|
||||||
|
then
|
||||||
|
echo "Removing ${INPUT_FILE} and ${INPUT_FILE::-4}.THM ..."
|
||||||
|
rm -f "$INPUT_FILE" "${INPUT_FILE::-4}.THM"
|
||||||
|
fi
|
||||||
|
done < <(find "$MOUNT_DIR" -type f -name '*.JPG' -print0)
|
||||||
|
|
||||||
|
while IFS= read -r -d '' INPUT_FILE
|
||||||
|
do
|
||||||
|
OUTPUT_PATH="$OUTPUT_DIR/${INPUT_FILE##*/}"
|
||||||
|
if ! [ -f "$OUTPUT_PATH" ]
|
||||||
|
then
|
||||||
|
echo "Copying $INPUT_FILE to ${OUTPUT_PATH} ..."
|
||||||
|
cp "${INPUT_FILE}" "${OUTPUT_PATH}"
|
||||||
|
echo "Converting ${INPUT_FILE} to MP4 at ${OUTPUT_PATH::-4}.mp4 ..."
|
||||||
|
ffmpeg -loglevel fatal -nostdin -i "$OUTPUT_PATH" "${OUTPUT_PATH::-4}.mp4"
|
||||||
|
echo "Removing temporary file $OUTPUT_PATH ..."
|
||||||
|
rm "$OUTPUT_PATH"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $REMOVE_FILES -eq 1 ]
|
||||||
|
then
|
||||||
|
echo "Removing ${INPUT_FILE} and ${INPUT_FILE::-4}.THM ..."
|
||||||
|
rm -f "$INPUT_FILE" "${INPUT_FILE::-4}.THM"
|
||||||
|
fi
|
||||||
|
done < <(find "$MOUNT_DIR" -type f -name '*.MOV' -print0)
|
||||||
|
|
||||||
|
sudo umount "$MOUNT_DIR"
|
||||||
|
rmdir "$MOUNT_DIR"
|
Reference in New Issue
Block a user