Merge forgotten changes on netbook
Conflicts: atom
This commit is contained in:
commit
4462c6d58f
613
atom
613
atom
@ -1,5 +1,42 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
## Define exit codes
|
||||||
|
# General config errors [10-19]
|
||||||
|
ELOAD=10
|
||||||
|
EINTERVAL=11
|
||||||
|
ENOCFG=19
|
||||||
|
# Source cofig errors [20-29]
|
||||||
|
# Destination config errors [30-49]
|
||||||
|
EFORMAT=30
|
||||||
|
ECHANNEL=31
|
||||||
|
EFMTINVPARM=49
|
||||||
|
|
||||||
|
# config structures
|
||||||
|
declare -A \
|
||||||
|
destinationchannels \
|
||||||
|
destinationcopymime \
|
||||||
|
destinationformat \
|
||||||
|
destinationfrequency \
|
||||||
|
destinationid \
|
||||||
|
destinationpath \
|
||||||
|
destinationquality \
|
||||||
|
destinationrename \
|
||||||
|
destinationrenamepath \
|
||||||
|
destinationskipmime \
|
||||||
|
|| {
|
||||||
|
echo "Check your Bash version. You need >= 4.0" >&2
|
||||||
|
exit $EBASHVERS
|
||||||
|
}
|
||||||
|
|
||||||
|
declare -r \
|
||||||
|
DOCDIR=./doc \
|
||||||
|
SHAREDIR=./share
|
||||||
|
declare -r \
|
||||||
|
exampleconf=$DOCDIR/example.cfg \
|
||||||
|
schema=$SHAREDIR/schema.sql \
|
||||||
|
\
|
||||||
|
oldIFS="$IFS"
|
||||||
|
|
||||||
#parse arguments
|
#parse arguments
|
||||||
OPTERR=0
|
OPTERR=0
|
||||||
while getopts ':c:l:T:F:hD' opt
|
while getopts ':c:l:T:F:hD' opt
|
||||||
@ -38,11 +75,528 @@ do
|
|||||||
done
|
done
|
||||||
|
|
||||||
#parse config
|
#parse config
|
||||||
|
getConfigGeneral() {
|
||||||
|
case $key in
|
||||||
|
'max-load')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
maxload="$value"
|
||||||
|
else
|
||||||
|
echo "Invalid max-load value: $value" >&2
|
||||||
|
exit $ELOAD
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
;;
|
||||||
|
'load-interval')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
loadinterval="$value"
|
||||||
|
else
|
||||||
|
echo "Invalid load-interval value: $value" >&2
|
||||||
|
exit $EINTERVAL
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
;;
|
||||||
|
'temporary-directory')
|
||||||
|
tempdir="$value"
|
||||||
|
;;
|
||||||
|
'database')
|
||||||
|
database="$value"
|
||||||
|
;;
|
||||||
|
debug)
|
||||||
|
#unimplemented
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
getConfigSource() {
|
||||||
|
case "$key" in
|
||||||
|
'path')
|
||||||
|
sourcepath="$value"
|
||||||
|
;;
|
||||||
|
'id3charset')
|
||||||
|
sourceid3charset="$value"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
getConfigDestination() {
|
||||||
|
case "$key" in
|
||||||
|
'path')
|
||||||
|
destinationpath["$destination"]="$value"
|
||||||
|
;;
|
||||||
|
'format')
|
||||||
|
case "$value" in
|
||||||
|
'mp3')
|
||||||
|
destinationformat["$destination"]=mp3
|
||||||
|
;;
|
||||||
|
'vorbis')
|
||||||
|
destinationformat["$destination"]=vorbis
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported destination format: $value" >2&
|
||||||
|
exit $EFORMAT
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
'quality')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if ! [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
echo "Invalid quality value: $value" >&2
|
||||||
|
exit $EQUALITY
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
case "${destinationformat["$destination"]}" in
|
||||||
|
'vorbis')
|
||||||
|
destinationquality["$destination"]="$value"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "$Invalid parameter \"$key\" for format \"${destinationformat["$destination"]}\"" >&2
|
||||||
|
exit $EFMTINVPARM
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
'bitrate')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if ! [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
echo "Invalid bitrate value: $value" >&2
|
||||||
|
exit $EQUALITY
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
case "${destinationformat["$destination"]}" in
|
||||||
|
'mp3')
|
||||||
|
destinationquality["$destination"]="$value"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "$Invalid parameter \"$key\" for format \"${destinationformat["$destination"]}\"" >&2
|
||||||
|
exit $EFMTINVPARM
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
;;
|
||||||
|
'channels')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if ! [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
echo "Invalid channel count: $value" >&2
|
||||||
|
exit $ECHANNEL
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
destinationchannels["$destination"]=$value
|
||||||
|
;;
|
||||||
|
'frequency')
|
||||||
|
expr='^[0-9]*$'
|
||||||
|
if ! [[ $value =~ $expr ]]
|
||||||
|
then
|
||||||
|
echo "Invalid frequency value: $value" >&2
|
||||||
|
exit $ECHANNEL
|
||||||
|
fi
|
||||||
|
unset expr
|
||||||
|
destinationfrequency["$destination"]=$value
|
||||||
|
;;
|
||||||
|
'rename')
|
||||||
|
case "$value" in
|
||||||
|
*/*)
|
||||||
|
destinationrenamepath["$destination"]="${value%/*}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
destinationrename["$destination"]="${value##*/}"
|
||||||
|
;;
|
||||||
|
'skip_mime-type')
|
||||||
|
destinationskipmime[$destination]="${destinationskipmime[$destination]:+${destinationskipmime[$destination]}|}$value"
|
||||||
|
;;
|
||||||
|
'copy_mime-type')
|
||||||
|
destinationcopymime[$destination]="${destinationcopymime[$destination]:+${destinationcopymime[$destination]}|}$value"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
getConfig() {
|
||||||
|
while read key value
|
||||||
|
do
|
||||||
|
case $key in
|
||||||
|
'#'*)
|
||||||
|
#comment
|
||||||
|
;;
|
||||||
|
'')
|
||||||
|
#empty line
|
||||||
|
;;
|
||||||
|
'[general]')
|
||||||
|
context=General
|
||||||
|
;;
|
||||||
|
'[source]')
|
||||||
|
context=Source
|
||||||
|
;;
|
||||||
|
\[*\])
|
||||||
|
context=Destination
|
||||||
|
destination="${key#[}"
|
||||||
|
destination="${destination%]}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
getConfig$context
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < ~/.atom/atom.cfg
|
||||||
|
}
|
||||||
|
|
||||||
#check sanity
|
#check sanity
|
||||||
|
|
||||||
|
openDatabase() {
|
||||||
|
if [ ! -d "$tempdir" ]
|
||||||
|
then
|
||||||
|
mkdir -p "$tempdir"
|
||||||
|
fi
|
||||||
|
mkfifo "$tempdir"/sqlite.{in,out}
|
||||||
|
if [ ! -f "$database" ]
|
||||||
|
then
|
||||||
|
if [ ! -d "${database%/*}" ]
|
||||||
|
then
|
||||||
|
mkdir -p "${database%/*}"
|
||||||
|
fi
|
||||||
|
sqlite3 "$database" < $schema
|
||||||
|
fi
|
||||||
|
sqlite3 "$database" \
|
||||||
|
< "$tempdir/sqlite.in" \
|
||||||
|
> "$tempdir/sqlite.out" &
|
||||||
|
exec 3> "$tempdir"/sqlite.in
|
||||||
|
exec 4< "$tempdir"/sqlite.out
|
||||||
|
}
|
||||||
|
|
||||||
|
closeDatabase() {
|
||||||
|
exec 3>&-
|
||||||
|
exec 4<&-
|
||||||
|
rm "$tempdir"/sqlite.{in,out}
|
||||||
|
}
|
||||||
|
|
||||||
|
Select() {
|
||||||
|
#Select table [col1 [col2 [..]]] < WHERE_key WHERE_operator WHERE_value
|
||||||
|
# [WHERE_key WHERE_operator WHERE_value
|
||||||
|
# […]]
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
col \
|
||||||
|
columns \
|
||||||
|
operator \
|
||||||
|
results \
|
||||||
|
where_statement
|
||||||
|
shift
|
||||||
|
for col
|
||||||
|
do
|
||||||
|
(( ${#columns} )) && columns+=','
|
||||||
|
columns+="$col"
|
||||||
|
done
|
||||||
|
while read key operator value
|
||||||
|
do
|
||||||
|
(( ${#where_statement} )) && where_statement+=( "AND" )
|
||||||
|
where_statement+=( "$key $operator "'"'"${value//\"/\\\"}"'"' )
|
||||||
|
done
|
||||||
|
echo "SELECT IFNULL(" \
|
||||||
|
"(SELECT $columns FROM $table" \
|
||||||
|
"WHERE ${where_statement[@]})" \
|
||||||
|
",'SQL::Select:not found'" \
|
||||||
|
");" >&3
|
||||||
|
read -u 4 results
|
||||||
|
if ! [[ $results == "SQL::Select:not found" ]]
|
||||||
|
then
|
||||||
|
echo "$results"
|
||||||
|
else
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
Insert() {
|
||||||
|
#Insert table [no_id] < key value
|
||||||
|
# [key value
|
||||||
|
# […]]
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
no_id="${2:-0}" \
|
||||||
|
insert_keys \
|
||||||
|
insert_values \
|
||||||
|
results
|
||||||
|
while read key value
|
||||||
|
do
|
||||||
|
(( ${#insert_keys} )) && insert_keys+=","
|
||||||
|
insert_keys+='`'"$key"'`'
|
||||||
|
(( ${#insert_values} )) && insert_values+=","
|
||||||
|
if [[ $value == NULL ]]
|
||||||
|
then
|
||||||
|
insert_values+="NULL"
|
||||||
|
else
|
||||||
|
insert_values+='"'"${value//\"/\\\"}"'"'
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "INSERT INTO $table" \
|
||||||
|
"( $insert_keys )" \
|
||||||
|
"VALUES" \
|
||||||
|
"( $insert_values );" >&3
|
||||||
|
(( no_id )) || {
|
||||||
|
echo 'SELECT LAST_INSERT_ROWID();' >&3
|
||||||
|
read -u 4 results
|
||||||
|
echo "$results"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Update(){
|
||||||
|
#Update table set_key set_value [set_key set_value […]] < where_key where_operator where_value
|
||||||
|
# [where_key where_operator where_value
|
||||||
|
# […]]
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
key \
|
||||||
|
argument \
|
||||||
|
operator \
|
||||||
|
value \
|
||||||
|
set_statement \
|
||||||
|
where_keys \
|
||||||
|
where_values \
|
||||||
|
what \
|
||||||
|
where_statement \
|
||||||
|
results
|
||||||
|
shift
|
||||||
|
what=key
|
||||||
|
for argument
|
||||||
|
do
|
||||||
|
case $what in
|
||||||
|
key)
|
||||||
|
set_statement="${set_statement:+${set_statement},}\`$argument\`"
|
||||||
|
what=value
|
||||||
|
;;
|
||||||
|
value)
|
||||||
|
set_statement="${set_statement}="'"'"${argument//\"/\\\"}"'"'
|
||||||
|
what=key
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
while read key operator value
|
||||||
|
do
|
||||||
|
(( ${#where_statement} )) && where_statement+=( "AND" )
|
||||||
|
if [[ $value == NULL ]]
|
||||||
|
then
|
||||||
|
where_statement+=( "$key is NULL" )
|
||||||
|
else
|
||||||
|
where_statement+=( "$key $operator "'"'"${value//\"/\\\"}"'"' )
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "UPDATE '$table' SET" \
|
||||||
|
"$set_statement" \
|
||||||
|
"WHERE" \
|
||||||
|
"${where_statement[@]}" \
|
||||||
|
";" >&3
|
||||||
|
}
|
||||||
|
InsertIfUnset() {
|
||||||
|
#InsertIfUnset table [no_id] < key value \n key value
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
no_id="${2:-0}" \
|
||||||
|
column \
|
||||||
|
key \
|
||||||
|
keys \
|
||||||
|
results \
|
||||||
|
value \
|
||||||
|
values
|
||||||
|
while read key value
|
||||||
|
do
|
||||||
|
keys+=( "$key" )
|
||||||
|
values+=( "$value" )
|
||||||
|
done
|
||||||
|
if (( no_id ))
|
||||||
|
then
|
||||||
|
column="${keys[0]}"
|
||||||
|
else
|
||||||
|
column='id'
|
||||||
|
fi
|
||||||
|
if ! results=$(
|
||||||
|
Select "$table" "$column" < <(
|
||||||
|
for key in ${!keys[@]}
|
||||||
|
do
|
||||||
|
echo "${keys[$key]}" = "${values[$key]}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
)
|
||||||
|
then
|
||||||
|
results=$(
|
||||||
|
Insert "$table" < <(
|
||||||
|
for key in ${!keys[@]}
|
||||||
|
do
|
||||||
|
echo "${keys[$key]}" "${values[$key]}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
echo "$results"
|
||||||
|
}
|
||||||
|
InsertOrUpdate() {
|
||||||
|
#InsertOrUpdate table set_key set_value [set_key set_value […]] < where_key where_value
|
||||||
|
# [where_key where_value
|
||||||
|
# […]]
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
argument \
|
||||||
|
key \
|
||||||
|
keys \
|
||||||
|
set_keys \
|
||||||
|
set_values \
|
||||||
|
value \
|
||||||
|
values \
|
||||||
|
what \
|
||||||
|
results
|
||||||
|
shift
|
||||||
|
what=key
|
||||||
|
for argument
|
||||||
|
do
|
||||||
|
case $what in
|
||||||
|
key)
|
||||||
|
set_keys+=( "$argument" )
|
||||||
|
what=value
|
||||||
|
;;
|
||||||
|
value)
|
||||||
|
set_values+=( "$argument" )
|
||||||
|
what=key
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
while read key value
|
||||||
|
do
|
||||||
|
keys+=( "$key" )
|
||||||
|
values+=( "$value" )
|
||||||
|
done
|
||||||
|
if results=$(
|
||||||
|
Select "$table" id < <(
|
||||||
|
for key in ${!keys[@]}
|
||||||
|
do
|
||||||
|
echo "${keys[$key]}" = "${values[$key]}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
)
|
||||||
|
then
|
||||||
|
Update "$table" "$@" < <(
|
||||||
|
for key in ${!keys[@]}
|
||||||
|
do
|
||||||
|
echo "${keys[$key]}" = "${values[$key]}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
else
|
||||||
|
results=$(
|
||||||
|
Insert "$table" < <(
|
||||||
|
for key in ${!set_keys[@]}
|
||||||
|
do
|
||||||
|
echo "${set_keys[$key]}" "${set_values[$key]}"
|
||||||
|
done
|
||||||
|
for key in ${!keys[@]}
|
||||||
|
do
|
||||||
|
echo "${keys[$key]}" "${values[$key]}"
|
||||||
|
done
|
||||||
|
)
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
echo "$results"
|
||||||
|
}
|
||||||
|
Delete() {
|
||||||
|
#Delete table < where_key where_operator where_value
|
||||||
|
# [where_key where_operator where_value
|
||||||
|
# […]]
|
||||||
|
local \
|
||||||
|
table="$1" \
|
||||||
|
key \
|
||||||
|
operator \
|
||||||
|
value \
|
||||||
|
where_statement \
|
||||||
|
results
|
||||||
|
while read key operator value
|
||||||
|
do
|
||||||
|
(( ${#where_statement} )) && where_statement+=( "AND" )
|
||||||
|
if [[ $value == NULL ]]
|
||||||
|
then
|
||||||
|
where_statement+=( "$key is NULL" )
|
||||||
|
else
|
||||||
|
where_statement+=( "$key $operator "'"'"${value//\"/\\\"}"'"' )
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
echo "DELETE from $table WHERE ${where_statement[@]};" >&3
|
||||||
|
}
|
||||||
|
|
||||||
|
createDestinations() {
|
||||||
|
for destination in ${!destinationpath[@]}
|
||||||
|
do
|
||||||
|
if ! [ -d "${destinationpath["$destination"]}" ]
|
||||||
|
then
|
||||||
|
if ! mkdir -p "${destinationpath["$destination"]}"
|
||||||
|
then
|
||||||
|
echo "$destination: Could not create ${destinationpath["$destination"]}!"
|
||||||
|
exit $EINVDEST
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
destinationid["$destination"]=$(
|
||||||
|
InsertIfUnset destinations <<<"name $destination"
|
||||||
|
)
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
getFiles() {
|
getFiles() {
|
||||||
:
|
scantime=$(date +%s)
|
||||||
|
# We probably have thousands of files, don't waste time on disk writes
|
||||||
|
echo 'BEGIN TRANSACTION;' >&3
|
||||||
|
while read time size filename
|
||||||
|
do
|
||||||
|
sourcefileid=$(
|
||||||
|
InsertOrUpdate source_files \
|
||||||
|
last_change ${time%.*} \
|
||||||
|
size $size \
|
||||||
|
last_seen $scantime \
|
||||||
|
<<-EOWhere
|
||||||
|
filename $filename
|
||||||
|
EOWhere
|
||||||
|
)
|
||||||
|
case $(( ++count % 4 )) in
|
||||||
|
0) echo -ne '\r|' ;;
|
||||||
|
1) echo -ne '\r/' ;;
|
||||||
|
2) echo -en '\r-' ;;
|
||||||
|
3) echo -ne '\r\\' ;;
|
||||||
|
esac
|
||||||
|
done < <(
|
||||||
|
find "$sourcepath" -type f -printf "%T@ %s %P\n"
|
||||||
|
)
|
||||||
|
echo 'COMMIT;' >&3
|
||||||
|
echo -e "\r$count files found."
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMimes() {
|
||||||
|
Update mime_actions action 1 <<<"action != 1"
|
||||||
|
for destination in ${!destinationskipmime[@]}
|
||||||
|
do
|
||||||
|
IFS='|'
|
||||||
|
for mime_type in ${destinationskipmime["$destination"]}
|
||||||
|
do
|
||||||
|
IFS="$oldIFS"
|
||||||
|
Update mime_type_actions action 0 >/dev/null < <(
|
||||||
|
cat <<-EOWhere
|
||||||
|
destination_id = ${destinationid["$destination"]}
|
||||||
|
mime_text LIKE ${mime_type//*/%}
|
||||||
|
EOWhere
|
||||||
|
)
|
||||||
|
done
|
||||||
|
done
|
||||||
|
for destination in ${!destinationcopymime[@]}
|
||||||
|
do
|
||||||
|
IFS='|'
|
||||||
|
for mime_type in ${destinationcopymime["$destination"]}
|
||||||
|
do
|
||||||
|
IFS="$oldIFS"
|
||||||
|
Update mime_type_actions action 2 >/dev/null < <(
|
||||||
|
cat <<-EOWhere
|
||||||
|
destination_id = ${destinationid["$destination"]}
|
||||||
|
mime_text LIKE ${mime_type//*/%}
|
||||||
|
EOWhere
|
||||||
|
)
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
removeObsoleteFiles() {
|
||||||
|
Delete source_files <<-EOWhere
|
||||||
|
last_seen < $scantime
|
||||||
|
EOWhere
|
||||||
}
|
}
|
||||||
|
|
||||||
getType() {
|
getType() {
|
||||||
@ -127,4 +681,61 @@ transcodeLauncher() {
|
|||||||
|
|
||||||
#UI
|
#UI
|
||||||
|
|
||||||
|
if [ ! -f ~/.atom/atom.cfg ]
|
||||||
|
then
|
||||||
|
if [ ! -d ~/.atom ]
|
||||||
|
then
|
||||||
|
mkdir -p ~/.atom
|
||||||
|
fi
|
||||||
|
sed "s:%HOME%:$HOME:" "$exampleconf" > ~/.atom/atom.cfg
|
||||||
|
cat >&2 <<-EOCfgNotice
|
||||||
|
No configuration file found!
|
||||||
|
An example file has been created as ~/.atom/atom.cfg.
|
||||||
|
You should change it to your likings using you favorite editor.
|
||||||
|
|
||||||
|
Bailing out.
|
||||||
|
EOCfgNotice
|
||||||
|
exit $ENOCFG
|
||||||
|
fi
|
||||||
|
getConfig
|
||||||
|
{
|
||||||
|
cat <<EOF
|
||||||
|
General|Load|$maxload
|
||||||
|
|Load Interval|$loadinterval
|
||||||
|
|Temp Dir|$tempdir
|
||||||
|
|Database|$database
|
||||||
|
|Debug|$debug
|
||||||
|
Source|Path|$sourcepath
|
||||||
|
|ID3 Charset|$sourceid3charset
|
||||||
|
EOF
|
||||||
|
for destination in ${!destinationpath[@]}
|
||||||
|
do
|
||||||
|
cat <<EOF
|
||||||
|
$destination|Path|${destinationpath[$destination]}
|
||||||
|
|Format|${destinationformat[$destination]}
|
||||||
|
|Quality|${destinationquality[$destination]}
|
||||||
|
|Channels|${destinationchannels[$destination]}
|
||||||
|
|Frequency|${destinationfrequency[$destination]}
|
||||||
|
|Path Change|${destinationrenamepath[$destination]}
|
||||||
|
|File Rename|${destinationrename[$destination]}
|
||||||
|
EOF
|
||||||
|
echo "|Skipped mime-type|${destinationskipmime[$destination]//\|/
|
||||||
|
|Skipped mime-type|}"
|
||||||
|
echo "|Copied mime-type|${destinationcopymime[$destination]//\|/
|
||||||
|
|Copied mime-type|}"
|
||||||
|
done
|
||||||
|
}|column -t -s'|' -n
|
||||||
|
|
||||||
|
openDatabase
|
||||||
|
|
||||||
|
createDestinations
|
||||||
|
|
||||||
|
getFiles
|
||||||
|
|
||||||
|
updateMimes
|
||||||
|
|
||||||
|
removeObsoleteFiles
|
||||||
|
|
||||||
|
closeDatabase
|
||||||
|
|
||||||
# vim:set ts=8 sw=8:
|
# vim:set ts=8 sw=8:
|
||||||
|
|||||||
43
doc/example.cfg
Normal file
43
doc/example.cfg
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
[general]
|
||||||
|
max-load 6
|
||||||
|
load-interval 30
|
||||||
|
temporary-directory %HOME%/.atom/tmp
|
||||||
|
database %HOME%/.atom/atom.db
|
||||||
|
debug 0
|
||||||
|
|
||||||
|
[source]
|
||||||
|
path /var/lib/mpd/music
|
||||||
|
id3charset iso-8859-15
|
||||||
|
|
||||||
|
[Ogg]
|
||||||
|
path /mnt/Musique-OggQ2
|
||||||
|
format vorbis
|
||||||
|
quality 1
|
||||||
|
channels 2
|
||||||
|
frequency 44100
|
||||||
|
|
||||||
|
# you should not skip or copy application/octet-stream, they could be something
|
||||||
|
# similar to "Audio file with ID3 version 2.4.0, unsynchronized frames"
|
||||||
|
copy_mime-type image/*
|
||||||
|
copy_mime-type text/*
|
||||||
|
|
||||||
|
[MP3]
|
||||||
|
path /mnt/Musique-mp3.test
|
||||||
|
format mp3
|
||||||
|
bitrate 96
|
||||||
|
|
||||||
|
# rename file, path unchanged
|
||||||
|
rename %{track}--%{artist}-%{title}
|
||||||
|
# change the whole filepath
|
||||||
|
#rename %{genre}/%{albumartist}/%{year}-%{album}/%{track}--%{artist}-%{title}
|
||||||
|
skip_mime-type image/*
|
||||||
|
skip_mime-type text/*
|
||||||
|
|
||||||
|
[asterisk]
|
||||||
|
path /mnt/Musique-asterisk
|
||||||
|
format vorbis
|
||||||
|
channels 1
|
||||||
|
frequency 8000
|
||||||
|
skip_mime-type image/*
|
||||||
|
skip_mime-type text/*
|
||||||
|
|
||||||
71
share/schema.sql
Normal file
71
share/schema.sql
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
BEGIN TRANSACTION;
|
||||||
|
CREATE TABLE source_files (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
filename TEXT UNIQUE NOT NULL,
|
||||||
|
size INTEGER NOT NULL,
|
||||||
|
hash TEXT,
|
||||||
|
mime_type INTEGER,
|
||||||
|
last_change INTEGER NOT NULL DEFAULT (strftime('%s','now')),
|
||||||
|
last_seen INTEGER NOT NULL DEFAULT (strftime('%s','now')),
|
||||||
|
FOREIGN KEY (mime_type) REFERENCES mime_types(id)
|
||||||
|
);
|
||||||
|
CREATE TABLE destinations (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
name TEXT UNIQUE NOT NULL
|
||||||
|
);
|
||||||
|
CREATE TABLE destination_files (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
filename TEXT,
|
||||||
|
last_change INTEGER NOT NULL DEFAULT 0,
|
||||||
|
source_file_id INTEGER,
|
||||||
|
destination_id INTEGER,
|
||||||
|
FOREIGN KEY (source_file_id) REFERENCES source_files(id),
|
||||||
|
FOREIGN KEY (destination_id) REFERENCES destinations(id)
|
||||||
|
);
|
||||||
|
CREATE TABLE mime_types (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
mime_text TEXT UNIQUE NOT NULL
|
||||||
|
);
|
||||||
|
CREATE TABLE mime_actions (
|
||||||
|
id INTEGER PRIMARY KEY,
|
||||||
|
mime_type INTEGER,
|
||||||
|
destination_id INTEGER,
|
||||||
|
action INTEGER DEFAULT 1,
|
||||||
|
FOREIGN KEY (mime_type) REFERENCES mime_types(id)
|
||||||
|
FOREIGN KEY (destination_id) REFERENCES destinations(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE VIEW mime_type_actions AS
|
||||||
|
SELECT
|
||||||
|
mime_types.id,mime_types.mime_text,
|
||||||
|
mime_actions.destination_id,mime_actions.action
|
||||||
|
FROM mime_types INNER JOIN mime_actions
|
||||||
|
ON mime_actions.mime_type = mime_types.id;
|
||||||
|
CREATE TRIGGER update_mime_actions INSTEAD OF UPDATE OF action ON mime_type_actions
|
||||||
|
BEGIN
|
||||||
|
UPDATE mime_actions SET action=new.action WHERE mime_type=old.id;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE TRIGGER create_mime_actions AFTER INSERT ON mime_types
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO mime_actions (mime_type,destination_id)
|
||||||
|
SELECT mime_types.id,destinations.id
|
||||||
|
FROM mime_types INNER JOIN destinations
|
||||||
|
WHERE mime_types.id=new.id;
|
||||||
|
END;
|
||||||
|
|
||||||
|
CREATE INDEX sourcefiles_by_name ON source_files (filename,id);
|
||||||
|
|
||||||
|
CREATE TRIGGER create_destinations AFTER INSERT ON source_files
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO destination_files (source_file_id,destination_id)
|
||||||
|
SELECT source_files.id,destinations.id FROM source_files
|
||||||
|
INNER JOIN destinations
|
||||||
|
WHERE source_files.id=new.id;
|
||||||
|
END;
|
||||||
|
CREATE TRIGGER delete_destinations_files AFTER DELETE ON source_files
|
||||||
|
BEGIN
|
||||||
|
UPDATE destination_files SET source_file_id=NULL WHERE source_file_id=old.id;
|
||||||
|
END;
|
||||||
|
|
||||||
|
COMMIT;
|
||||||
Loading…
x
Reference in New Issue
Block a user