shtools/zosu/zosu-rater
2020-10-26 11:25:36 +01:00

76 lines
1.9 KiB
Bash
Executable file

#!/bin/sh
if [ $# -lt 2 ]
then
echo "$0 <rate> <file>"
exit 1
fi
RATE="$1"
FILE="$2"
OUTPUTFILE="$(echo "$2" | sed 's/\.osu//g' | cut -d']' -f1) x$RATE].osu"
AUDIO=$(grep "AudioFilename:" "$FILE" | cut -d' ' -f2- | tr -d '\n\r')
AUDIORATED=$(echo $AUDIO | cut -d'.' -f1)-x$RATE".mp3"
echo "" > "$OUTPUTFILE"
output_line () {
printf "%s\r\n" "$1" >> $OUTPUTFILE
}
audioRate () {
ffmpeg -i "$AUDIO" -filter:a "asetrate=$(ffprobe -v error -show_entries stream=sample_rate -of default=noprint_wrappers=1:nokey=1 "$AUDIO")*$RATE" -y "$AUDIORATED"
}
LINES=$(wc -l "$FILE" | cut -d' ' -f1)
FFILE=$(cat "$FILE")
step_skip ()
{
printf "$(echo "$FFILE" | grep -B $LINES "$1" | head -n -1)" >> $OUTPUTFILE
FFILE=$(echo "$FFILE" | grep -A $LINES "$1" | tail -n +2)
}
step_skip "AudioFilename:"
output_line "AudioFilename: $AUDIORATED"
PREVIEW=$(echo "$FFILE" | grep "PreviewTime:" | cut -d' ' -f2 | tr -d '\r\n')
step_skip "PreviewTime:"
output_line "PreviewTime: $(echo "$PREVIEW / $RATE" | bc | cut -d '.' -f1)"
VERSION=$(echo "$FFILE" | grep "Version:" | cut -d':' -f2- | tr -d '\n\r')
step_skip "Version:"
output_line "Version:$VERSION x$RATE"
step_skip "BeatmapID:"
output_line "BeatmapID:0"
step_skip "\[TimingPoints\]"
TIMINGPOINTS=$(echo "$FFILE" | grep -B $LINES "\[HitObjects\]" | head -n -1)
OBJECTS=$(echo "$FFILE" | grep -A $LINES "\[HitObjects\]" | tail -n +2)
output_line "[TimingPoints]"
N=$(echo "$TIMINGPOINTS" | wc -l)
I=0
echo "$TIMINGPOINTS" | awk -F ',' "{ RATE=$RATE"'
if ($7 == 0 || $7 == 1)
{
if ($7 == 1)
{print int($1/RATE)","$2/RATE","$3","$4","$5","$6","$7","$8}
else
{print int($1/RATE)","$2","$3","$4","$5","$6","$7","$8}
}
}' >> "$OUTPUTFILE"
output_line "[HitObjects]"
N=$(echo "$OBJECTS" | wc -l)
echo "$OBJECTS" | awk -F "[,:]" "{RATE=$RATE"'
if ($1)
{print $1","$2","int($3/RATE)","$4","$5","int($6/RATE)":"$7":"$8":"$9":"$10}
}
' >> "$OUTPUTFILE"
audioRate