APE2FLAC (А давайте добьем таки этот замечательный скрипт)

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Аватара пользователя
sspphheerraa
Сообщения: 1375
ОС: Gentoo

Re: APE2FLAC

Сообщение sspphheerraa »

Попробовал скрипт Mellon'а, пишет

Код: Выделить всё

.shnsplit: warning: failed to read data from input file using format: [ape]
shnsplit:          + you may not have permission to read file: [KOTO - From the Dawn of Time (1992).ape]
shnsplit:          + arguments may be incorrect for decoder: [mac]
shnsplit:          + verify that the decoder is installed and in your PATH
shnsplit:          + this file may be unsupported, truncated or corrupt
shnsplit: error: cannot continue due to error(s) shown above
kept

попробовал руками декомпреснуть с помощью mac

Код: Выделить всё

-- Monkey's Audio Console Front End (v 3.99-u4-b5-s4) (c) Matthew T. Ashland --
Decompressing...
Segmentation fault

видно тот мак, что сейчас в портежах кривоват


Вопрос. Теги и прочая метадата берутся из самого ape файла или из cue листа?
Sspphheerraa
Спасибо сказали:

Flaming
Сообщения: 2579

Re: APE2FLAC

Сообщение Flaming »

sspphheerraa, у меня всё получилось, после того как я исправил cd $1 на cd "$1".
Видимо, из самого ape-файла берутся. Если есть cue-файл, лучше поставьте пакет cue2tracks, он мне помог.
Спасибо сказали:

Аватара пользователя
sspphheerraa
Сообщения: 1375
ОС: Gentoo

Re: APE2FLAC

Сообщение sspphheerraa »

Flaming писал(а):
14.01.2010 22:58
sspphheerraa, у меня всё получилось, после того как я исправил cd $1 на cd "$1".
Видимо, из самого ape-файла берутся. Если есть cue-файл, лучше поставьте пакет cue2tracks, он мне помог.

в смысле? сегфолт исчез после замены cd $1 на cd "$1"? или что?

зы Скачал бинарничек apeinfo (см. гугль), - показывает информацию об обезьяньем файле (удобно если надо проверить наличие тегов в самом ape файле; если их нет юзаем ffmpeg)

зыы Сейчас вот обнаружил, что amarok читает cue лист с фляком (трек показывается один, но на нем нанесены метки, при проходе их высвечивается соответствующий OSD)
Sspphheerraa
Спасибо сказали:

Аватара пользователя
sspphheerraa
Сообщения: 1375
ОС: Gentoo

Re: APE2FLAC

Сообщение sspphheerraa »

И еще в догонку :)
Пробую тут разжать обезьяну в PCM:

sspphheerraa@localhost $

$ ffmpeg -i 05\ Time\ \(Dance\ Mix\).ape -vn -acodec pcm_s16le 05\ Time\ \(Dance\ Mix\).wav FFmpeg version SVN-r20373, Copyright © 2000-2009 Fabrice Bellard, et al. built on Jan 1 2010 12:14:31 with gcc 4.4.2 configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --mandir=/usr/share/man --enable-static --enable-shared --cc=x86_64-pc-linux-gnu-gcc --disable-debug --disable-ffplay --disable-network --enable-libmp3lame --enable-libvorbis --enable-libtheora --enable-libx264 --enable-libxvid --disable-indev=v4l --disable-indev=jack --enable-x11grab --enable-libfaad --enable-libopenjpeg --enable-libfaac --enable-nonfree --disable-vdpau --disable-vdpau --disable-altivec --disable-mmx --disable-mmx2 --enable-pic --cpu=host --enable-gpl --enable-version3 --enable-postproc --enable-avfilter --enable-avfilter-lavf --disable-stripping --enable-hardcoded-tables libavutil 50. 3. 0 / 50. 3. 0 libavcodec 52.37. 1 / 52.37. 1 libavformat 52.39. 2 / 52.39. 2 libavdevice 52. 2. 0 / 52. 2. 0 libavfilter 1. 4. 1 / 1. 4. 1 libswscale 0. 7. 1 / 0. 7. 1 libpostproc 51. 2. 0 / 51. 2. 0 Input #0, ape, from '05 Time (Dance Mix).ape': Duration: 00:06:01.00, start: 0.000000, bitrate: N/A Stream #0.0: Audio: ape, 44100 Hz, 2 channels, s16 Metadata Track : 05 Year : 1994 Genre : Space Artist : Koto Album : The 12 Mixes Title : Time (Dance Mix) Output #0, wav, to '05 Time (Dance Mix).wav': Stream #0.0: Audio: pcm_s16le, 44100 Hz, 2 channels, s16, 1411 kb/s Stream mapping: Stream #0.0 -> #0.0 Press [q] to stop encoding

ffmpeg умеет читать теги :) (в каком-то из сабжевых скриптов была возможность выбирать чем кодировать mac или ffmpeg, так вот там же была пометка, - что если ffmpeg, то тегов не будет)
Теперь вижу что это не обязательно. Если видим теги в выводе консоли, значит можем их переписать в выходной файл. Может заменить в скрипте mac на ffmpeg? :)
Но с другой стороны, ffmpeg во flac кодирует не с максимальной степенью сжатия (файл получается больше, чем если кодировать штатным flac).
Думаю будет логично использовать следующий алгоритм:
1. Декодируем ape с помощью ffmpeg в wav; если есть теги - переписываем их в текстовый файл (наверно как-то через 'grep' вывода ffmpeg'а).
2. Жмем wav во flac с максимальной компрессией; вставляем теги из текстового файла (если они есть)
3. Режем flac по меткам cue (заполняем теги из 'cue', если они были в 'cue')
Что думаете по этому поводу?
Sspphheerraa
Спасибо сказали:

Draco
Сообщения: 1
ОС: ubuntu 11.04

Re: APE2FLAC

Сообщение Draco »

Mellon писал(а):
18.10.2008 17:03

Код: Выделить всё

#! /bin/bash

# @(#) ape2flac 0.2 18/10/2008 by Mellon
# Refactoring.
#
# now script can convert ape to splited flacs,
# smartly recode russian cuesheets
# embed tags from cuesheet to splited flacs
# delete unnecessary ape file by promt
#
# Usage ape2flac.sh [-d|-p] [-s] [target directory]
#
# -d    force deleteing ape-files
# -p    prompt deleteing ape-files
# -s    convert ape to splited flacs
#
#
# Dependencies:
#
# media-sound/mac
#      Homepage:            [url="http://sourceforge.net/projects/mac-port"]http://sourceforge.net/projects/mac-port[/url]
#      Description:         unix port of Monkey's Audio
#
# app-i18n/enca
#      Homepage:            [url="http://trific.ath.cx/software/enca/"]http://trific.ath.cx/software/enca/[/url]
#      Description:         ENCA detects the character coding of a file and converts it if desired
#
# media-libs/flac
#      Homepage:            [url="http://flac.sourceforge.net"]http://flac.sourceforge.net[/url]
#      Description:         free lossless audio encoder and decoder
#
# media-sound/shntool
#      Homepage:            [url="http://shnutils.freeshell.org/shntool/"]http://shnutils.freeshell.org/shntool/[/url]
#      Description:         shntool is a multi-purpose WAVE data processing and reporting utility
#
# app-cdr/cuetools
#      Homepage:            [url="http://developer.berlios.de/projects/cuetools/"]http://developer.berlios.de/projects/cuetools/[/url]
#      Description:         Utilities to manipulate and convert cue and toc files
#
#
# TODO:
#
# Fix tree building


# @(#) ape2flac 0.1b 23/01/2007 by BaBL
# Checking for mac & flac
# Checking for input directory
#
# @(#) ape2flac 0.1a 14/01/2007 by BaBL
# Fixed a bug identifying filenames with more then one "." symbol
#
# @(#) ape2flac 0.1 26/09/2003 by Peo Karlsson
#
# Recursively convert APE-files to FLAC.
# Directory recursion adapted from the 'tree' script by Jordi Sanfeliu (see below).
#
#
#
# @(#) tree 1.1 30/11/1995 by Jordi Sanfeliu (mikaku@fiwix.org)
#
# Initial version: 1.0 30/11/95
# Next version : 1.1 24/02/97 Now, with symbolic links
#

SPLIT=""
CUE_FILE=""
PROG=`basename $0`
declare -a prog_needed=(mac flac  shnsplit enca cueprint)

# which extension to look for when browsing the tree
MYEXT="ape"

# Process arguments
while [ $# -ne 0 ]; do
    [ "$1" == "-d" ] && DELETE=force
    [ "$1" == "-p" ] && DELETE=prompt
    [ "$1" == "-s" ] && SPLIT=1
    TARGET_DIRECTORY=$1
    shift
done

findcuefile() {
     k="$(find "$(dirname "$TARGET")" -maxdepth 1 -type f -iname "$BASE.ape.cue" -printf "%f\n")"
     [[ "x$k" == "x" ]] && k="$(find "$(dirname "$TARGET")" -maxdepth 1 -type f -iname "$BASE.cue" -printf "%f\n")"
     echo "$k"
}

convert() {
    mac "$TARGET" - -d | flac -V -8 -e -p -o "$BASE.flac" -
}

convertandsplit() {
    shnsplit -i ape -o 'flac flac -V -8 -e -p -o %f -' -t %n "$TARGET" < "$TEMPCUE"
}

recodecue() {
    CHARSET="$(enca -i "$TEMPCUE")"
    if [[ "$CHARSET" == "CP1251" || "$CHARSET" == "KOI8-R" || "$CHARSET" == "UTF-8" ]]; then
    enconv -L ru -x utf8 "$TEMPCUE"
    fi
}

# embed tags into tracks, rename tracks
embedtags() {
    for (( i=1; i <= $(cueprint -d '%N' "$TEMPCUE"); ++i )); do
        NN=$(printf '%02d' $i)
        [ -s "$NN.flac" ] && {
        # prepare track tags, filter out empty tags, embed the rest
        cueprint -n $i -t 'ARRANGER=%A\nCOMPOSER=%C\nGENRE=%G\nMESSAGE=%M\nTRACKNUMBER=%n\nARTIST=%p\nTITLE=%t\nALBUM=%T\n' "$TEMPCUE" |egrep -v '=$' | metaflac --import-tags-from=- $NN.flac
        # rename NN.flac to "NN - TrackTitle.flac"
        mv $NN.flac "$NN - $(cueprint -n $i -t %t "$TEMPCUE").flac"
        }
    done
}

# Delete old file
delold() {
    case "$DELETE" in
        "prompt" )
            echo -ne "\nDelete \"$FILE\"? "
            read -e DELPROMPT
            if [[ "$DELPROMPT" == "y" || "$DELPROMPT" == "Y" ]]; then
                DELETE=force
            fi
    ;;
        "force" )
        rm -f "$TARGET" &> /dev/null
        echo -ne "deleted"
    ;;
        * )
        echo -ne "kept"
    esac
}

search () {
    xx=0
    for TARGET in *
        do
            if [ -f "$TARGET" ]; then
                EXT=`echo "$TARGET" | sed -ne 's!^.*\.!!p' | tr '[:upper:]' '[:lower:]'` &> /dev/null
                BASE=`echo "$TARGET" | sed -e 's!\.[^.]*$!!'` &> /dev/null
                if [ "$EXT" = "$MYEXT" ]; then
                    echo -n ".";
                    [[ "x$SPLIT" == "x1" ]] || convert &> /dev/null
                    CUE_FILE="$(findcuefile)"
                    if [[ -n "$CUE_FILE" ]]; then
                        TEMPCUE="/tmp/$PROG.$RANDOM.cue"
                        cp "$CUE_FILE" "$TEMPCUE"
                        recodecue &>/dev/null
                        if [[ "x$SPLIT" == "x1" ]]; then
                            convertandsplit
                            embedtags
                        fi
                        sed s/"\.ape"/"\.flac"/ -i "$TEMPCUE"
                        if echo "${CUE_FILE}" | grep -q "\.ape\.cue"; then
                            cp "$TEMPCUE" "${CUE_FILE//.ape/.flac}"
                        else
                            cp "$TEMPCUE" "${CUE_FILE//.cue/.flac.cue}"
                        fi
                    fi
                    xx=`expr $xx + 1`
                    numfiles=`expr $numfiles + 1`

                    delold
                    rm -f "$TEMPCUE" &> /dev/null
                fi
            else
                if [[ $xx > 0 ]]; then
                    echo " -> [$xx files converted]"
                    xx=0
                fi
            fi

        if [ -d "$TARGET" ]; then
            zz=0
            while [ $zz != $deep ]
            do
                echo -n "| "
                zz=`expr $zz + 1`
            done
            if [ -L "$TARGET" ]; then
                echo "+---$TARGET" `ls -l $TARGET | sed 's/^.*'$TARGET' //'`
            else
                echo "+---$TARGET"
                if cd "$TARGET"; then
                    deep=`expr $deep + 1`
                    search
                    numdirs=`expr $numdirs + 1`
                fi
            fi
        fi
        done
    cd ..
    if [ "$deep" ]; then
        swfi=1
    fi
    deep=`expr $deep - 1`
}

if [ "x$TARGET_DIRECTORY" == "x" ]; then
    cd `pwd`
elif [ -e "$TARGET_DIRECTORY" ]; then
    cd "$TARGET_DIRECTORY"
else
    echo "Path \"$TARGET_DIRECTORY\" not found"
    exit 0
fi

for i in ${prog_needed[@]}
do
    echo -n "Checking for $i..... "
    if which "$i" &> /dev/null; then
        echo "Yes"
    else
        echo "No"
        echo "Programm $i is not installed. Please install $i first"
        exit 0
    fi
done

echo
echo "ape2flac 0.1b"
echo
echo "bash script to convert files compressed by Monkey's Audio into FLAC files."
echo
echo "Converting all files in directory = `pwd` and recurse indefinitely."
echo
swfi=0
deep=0
numdirs=0
numfiles=0
zz=0
xx=0

while [ "$swfi" != 1 ]
do
    search
done
echo
echo "Summary:"
echo
echo "Total directories = $numdirs"
echo "Total files converted = $numfiles"
echo
exit 0


У меня попался в заголовке трека слеш. Заменил его на пробел
Заменить вот это

Код: Выделить всё

mv $NN.flac "$NN - $(cueprint -n $i -t %t "$TEMPCUE").flac"

на вот это

Код: Выделить всё

mv $NN.flac "$NN - $(cueprint -n $i -t %t "$TEMPCUE" | sed -e 's/\// /g').flac"
Спасибо сказали:

Аватара пользователя
sspphheerraa
Сообщения: 1375
ОС: Gentoo

Re: APE2FLAC

Сообщение sspphheerraa »

Как вариант: http://www.worldofgentoo.org/forum/viewtopic.php?f=9&t=9

Режем так:

Код: Выделить всё

$ cuebreakpoints *.cue | shnsplit -o flac -a split-track *.flac

Теги импортируем/заполняем с помощью прекрасной утилитки flack.
Sspphheerraa
Спасибо сказали: