losvik 26.08.2011 22:50
Coding — Копирование песен из плейлиста в указанную директорию
Слушаю музыку в машине и иногда в мобильном, поэтому часто сижу и отбираю лучшие песняки по коллекции, копируя в новую папку для дальнейшего прожига диска или кидания на флешку. Решил написать скрипт.Дома на компе музыку слушаю в mpd/ncmpc/sonata составляя плейлисты, поэтому список песен уже есть. В конфиге mpd указано, что в плейлистах полные пути.
Прога должна получать путь к плейлисту и путь к указанной папке. Читает плейлист и каждую строчку форматирует нужным образом(добавляет слэши) и передает программе cp, которая копирует файл.
Думал написать на bash, но сходу не разобравшись начал писать на С.
Компилять дефолтно: gcc -o имя имя.с
mironov_orig 27.08.2011 00:34 #
+ 1 -
закрывающие теги в листинге этапять.
Немножко не хватает описания работы скрипта и примеров.
В каком формате плейлисты? Можно кусок посмотреть? И посмотреть кусок вывода программы на нём.
В каком формате плейлисты? Можно кусок посмотреть? И посмотреть кусок вывода программы на нём.
плейлисты в m3u. В них просто списком полные пути к каждой песне. playlist
Выхлопов нет) ничего не выводит, кроме случае ошибок открытия файла плэйлиста, по причине отсутствия или же cp может выругаться по причине недопустимого символа, которые добавляются в условия. Добавил какие встречались.
Выхлопов нет) ничего не выводит, кроме случае ошибок открытия файла плэйлиста, по причине отсутствия или же cp может выругаться по причине недопустимого символа, которые добавляются в условия. Добавил какие встречались.
Почему оказывается? я так и написал дважды. Да, на баше компактнее гораздо, я не спорю) Но твой скрипт все равно не работает)
хм, сорри, работает. не думал что можно обойтись без экранирования. ну круто) На баше я и не писал ничего кроме последовательностей команд, которые скармливал крону.
There is more Unix-nature in one line of shell script than there is in ten thousand lines of C
попробуй питон, я думаю тебе понравится, особенно если знаком с С++. для подобных задач он гораздо...эээм...выразительней.
мой c совсем плох, потому хочу чтобы ты уточнил для меня работу adding_slash. что-то я совсем не понимаю, как же эта функция будет работать, если ты создаёшь char result[len], а потом экранируешь символы, то result же больше по размеру получается, чем переданный len.
Поначалу было так - в функции был цикл считающий недопустимые символы, и char result[len + count]. Потом после нескольких прогонов заметил что это не нужно:
Функция adding_slash с выхлопами:
Кусок результата:
Объяснить пока не могу)
Функция adding_slash с выхлопами:
void
adding_slash(char *s, int len, char *dest)
{
int i, j;
char result[len];
printf("In_len = %d. str:%s", len, s);
for(j = i = 0;
s[i] != '\n';
i++, j++)
{ /* условия для недопустимых символов
те которые встречались у меня в названиях */
if(s[i] == '\''||
s[i] == '(' ||
s[i] == ')' ||
s[i] == '&' ||
s[i] == '\"')
result[j++] = '\\';
if(s[i] == ' ')
{ result[j++] = '\\';
result[j] = ' ';
} result[j] = s[i];
} result[j] = '\0';
printf("Out_len = %d. str:%s\n", len, result);
// результат передаем в pcp
pcp(result, dest);
}
adding_slash(char *s, int len, char *dest)
{
int i, j;
char result[len];
printf("In_len = %d. str:%s", len, s);
for(j = i = 0;
s[i] != '\n';
i++, j++)
{ /* условия для недопустимых символов
те которые встречались у меня в названиях */
if(s[i] == '\''||
s[i] == '(' ||
s[i] == ')' ||
s[i] == '&' ||
s[i] == '\"')
result[j++] = '\\';
if(s[i] == ' ')
{ result[j++] = '\\';
result[j] = ' ';
} result[j] = s[i];
} result[j] = '\0';
printf("Out_len = %d. str:%s\n", len, result);
// результат передаем в pcp
pcp(result, dest);
}
Кусок результата:
:~/Programming/C/source$ ./plst ~/.mpd/playlists/ramonesCover.m3u /tmp
In_len = 95. str:/home/losvik/Музыка/Ramones/1993 - Acid Eaters/01. Journey To The Center Of The Mind.mp3
Out_len = 95. str:/home/losvik/Музыка/Ramones/1993\ -\ Acid\ Eaters/01.\ Journey\ To\ The\ Center\ Of\ The\ Mind.mp3
In_len = 72. str:/home/losvik/Музыка/Ramones/1993 - Acid Eaters/02. Substitute.mp3
Out_len = 72. str:/home/losvik/Музыка/Ramones/1993\ -\ Acid\ Eaters/02.\ Substitute.mp3
In_len = 95. str:/home/losvik/Музыка/Ramones/1993 - Acid Eaters/01. Journey To The Center Of The Mind.mp3
Out_len = 95. str:/home/losvik/Музыка/Ramones/1993\ -\ Acid\ Eaters/01.\ Journey\ To\ The\ Center\ Of\ The\ Mind.mp3
In_len = 72. str:/home/losvik/Музыка/Ramones/1993 - Acid Eaters/02. Substitute.mp3
Out_len = 72. str:/home/losvik/Музыка/Ramones/1993\ -\ Acid\ Eaters/02.\ Substitute.mp3
Объяснить пока не могу)
У вас len в функции не меняется, поэтому то, что вы ее распечатываете никакого смысла не несет.
Как только вы подойдете к пределу в 256 символов - начнуться проблемы.
Использовать не инициализированные переменные - зло.
Как только вы подойдете к пределу в 256 символов - начнуться проблемы.
Использовать не инициализированные переменные - зло.
Самый простой способ исправить этот баг, зарезервировать для выходного буфера память объёмом в 2 раза больше, чем для входного, т.к. это самый плохой случай.
А вообще в пути экранировать симовлом "\" все одиночные кавычки, а затем сам путь в одиночные кавычки заключить.
А вообще в пути экранировать симовлом "\" все одиночные кавычки, а затем сам путь в одиночные кавычки заключить.
Исправил
Плэйлист:
Вывод:
Про ситуацию описанную Daria я так и не понял. Ответьте кто в курсе.
Плэйлист:
/home/losvik/Музыка/The United States Of America - 1968 - The United States Of America/19 - Mouse (The Garden Of Earthly Delights).flac
/home/losvik/Музыка/The United States Of America - 1968 - The United States Of America/05 - I Won't Leave My Wooden Wife For You, Sugar.flac
/home/losvik/Музыка/V.A. - Psychedelic Moods Vol. 2 (Hydro Pyro & Various Psychedelic Groups)/01 Hydro Pyro - The House Of Yesterday (New York City [US] - demo - 1967).mp3
/home/losvik/Музыка/Гражданская Оборона/!Егор и Опизденевшие/2000 - Опизденевшие - Психоделия Tomorrow (2001, Ur-Realist, URCD014)/Опизденевшие - Психоделия Tomorrow [Ur-Realist].flac
/home/losvik/Музыка/Jethro Tull - [non-remastered] Studio Discography/Jethro Tull . 1976 . Too Old To Rock 'N' Roll Too Young To Die! (CDP 32 1111 2)/Jethro Tull . 1976 . Too Old To Rock 'N' Roll Too Young To Die! (CDP 32 1111 2).flac
/home/losvik/Музыка/The United States Of America - 1968 - The United States Of America/05 - I Won't Leave My Wooden Wife For You, Sugar.flac
/home/losvik/Музыка/V.A. - Psychedelic Moods Vol. 2 (Hydro Pyro & Various Psychedelic Groups)/01 Hydro Pyro - The House Of Yesterday (New York City [US] - demo - 1967).mp3
/home/losvik/Музыка/Гражданская Оборона/!Егор и Опизденевшие/2000 - Опизденевшие - Психоделия Tomorrow (2001, Ur-Realist, URCD014)/Опизденевшие - Психоделия Tomorrow [Ur-Realist].flac
/home/losvik/Музыка/Jethro Tull - [non-remastered] Studio Discography/Jethro Tull . 1976 . Too Old To Rock 'N' Roll Too Young To Die! (CDP 32 1111 2)/Jethro Tull . 1976 . Too Old To Rock 'N' Roll Too Young To Die! (CDP 32 1111 2).flac
Вывод:
./plst ~/.mpd/playlists/va.m3u /tmp
inlen = 142 outlen = 162
inlen = 147 outlen = 169
inlen = 178 outlen = 208
inlen = 269 outlen = 285
inlen = 243 outlen = 293
inlen = 142 outlen = 162
inlen = 147 outlen = 169
inlen = 178 outlen = 208
inlen = 269 outlen = 285
inlen = 243 outlen = 293
Про ситуацию описанную Daria я так и не понял. Ответьте кто в курсе.