Видео ролики бесплатно онлайн

Смотреть красивое видео

Официальный сайт detisavve 24/7/365

Смотреть видео бесплатно

losvik 26.08.2011 22:50

CodingКопирование песен из плейлиста в указанную директорию

Слушаю музыку в машине и иногда в мобильном, поэтому часто сижу и отбираю лучшие песняки по коллекции, копируя в новую папку для дальнейшего прожига диска или кидания на флешку. Решил написать скрипт.
Дома на компе музыку слушаю в mpd/ncmpc/sonata составляя плейлисты, поэтому список песен уже есть. В конфиге mpd указано, что в плейлистах полные пути.
Прога должна получать путь к плейлисту и путь к указанной папке. Читает плейлист и каждую строчку форматирует нужным образом(добавляет слэши) и передает программе cp, которая копирует файл.
Думал написать на bash, но сходу не разобравшись начал писать на С.
Компилять дефолтно: gcc -o имя имя.с
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/* Принимает два аргумента - путь к плейлисту 
и путь к новой папке. Копирует песни указанные
в плейлисте в новую папку */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>

void help(char *);
void adding_slash(char *, char *);
int pcp( char *, char *);

void help(char *prog_name)
{
printf("Usage:\n \t<%s> <playlist_name> <path_to>\n",prog_name);
}

int main(int argc, char **argv)
{
if(argc != 3){help(argv[0]); return 1;}
char *plst_name = argv[1];//playlist name
char *dest_path = argv[2];//destination path
FILE *plst_fp = fopen(plst_name, "r");
char buf[PATH_MAX];
if(!plst_fp){
perror("Error in open playlist");
return 1;
}
// каждую строку плейлиста передаем в adding_slash
while(fgets(buf, sizeof(buf), plst_fp)){
adding_slash(buf, dest_path);
}
if(fclose(plst_fp)){
perror("Error in fclose");
return 1;
} return 0;
}
/* добавление слэшей перед недопустимыми символами в пути */
void
adding_slash(char *s, char *dest)
{
int i, j;
int len = strlen(s);
char result[len];
//printf("\ninlen = %d", len);
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(" outlen = %d", strlen(result));
// результат передаем в pcp
pcp(result, dest);
}
/* playlist cp */
int pcp(char *fname, char *dest)
{
const char *cp = "cp";
char cmd[strlen(cp) + strlen(fname) + strlen(dest)];
sprintf(cmd,"%s %s %s", cp, fname, dest);
FILE *pf = popen(cmd, "r");
if(!pf)
{ fprintf(stderr, "Could not open pipe.");
exit(1);
}
if(pclose(pf) == -1)
{ fprintf(stderr, "Error in close pipe.");
exit(1);
}
}
</path_to></playlist_name></limits.h></stdlib.h></string.h></stdio.h>



Тэги: c
+ 2 -
Похожие Поделиться

mironov_orig 27.08.2011 00:34 #
+ 1 -
закрывающие теги в листинге этапять.
losvik 27.08.2011 00:38 #
+ 2 -
ну так не я их поставил
nymiiin 27.08.2011 01:40 #
+ 0 -
а кто?
losvik 27.08.2011 01:48 #
+ 0 -
очевидно, что движок думает что и прочие это теги.
losvik 27.08.2011 01:49 #
+ 0 -
* stdio и прочие
mealsforall 27.08.2011 02:48 #
+ 0 -
Немножко не хватает описания работы скрипта и примеров.

В каком формате плейлисты? Можно кусок посмотреть? И посмотреть кусок вывода программы на нём.
losvik 27.08.2011 13:54 #
+ 0 -
плейлисты в m3u. В них просто списком полные пути к каждой песне. playlist
Выхлопов нет) ничего не выводит, кроме случае ошибок открытия файла плэйлиста, по причине отсутствия или же cp может выругаться по причине недопустимого символа, которые добавляются в условия. Добавил какие встречались.
mealsforall 28.08.2011 04:51 #
+ 1 -
Оказывается, m3u состоит полностью из полных путей к файлам, никаких лишних строчек или ещё чего-нибудь.

На баше можно переписать так:

1
2
3
4
5
6
7
8
#!/bin/bash

IFS=$'\n'

for file in $(cat $1)
do 
  cp "$file" $2
done
losvik 28.08.2011 12:38 #
+ 0 -
Почему оказывается? я так и написал дважды. Да, на баше компактнее гораздо, я не спорю) Но твой скрипт все равно не работает)
losvik 28.08.2011 13:39 #
+ 0 -
хм, сорри, работает. не думал что можно обойтись без экранирования. ну круто) На баше я и не писал ничего кроме последовательностей команд, которые скармливал крону.
enot 29.08.2011 12:27 #
+ 0 -
There is more Unix-nature in one line of shell script than there is in ten thousand lines of C
losvik 29.08.2011 13:49 #
+ 0 -
не, не мой случай. Написал на чём мог)
enot 29.08.2011 16:01 #
+ 1 -
попробуй питон, я думаю тебе понравится, особенно если знаком с С++. для подобных задач он гораздо...эээм...выразительней.
uscr 27.08.2011 13:00 #
+ 3 -
[offtop]
1
Думал написать на bash, но сходу не разобравшись начал писать на С

Даже не знаю, смешно это или грустно :)
Daria 27.08.2011 19:06 #
+ 0 -
мой c совсем плох, потому хочу чтобы ты уточнил для меня работу adding_slash. что-то я совсем не понимаю, как же эта функция будет работать, если ты создаёшь char result[len], а потом экранируешь символы, то result же больше по размеру получается, чем переданный len.
losvik 27.08.2011 22:16 #
+ 0 -
Поначалу было так - в функции был цикл считающий недопустимые символы, и char result[len + count]. Потом после нескольких прогонов заметил что это не нужно:
Функция 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);
}

Кусок результата:
:~/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

Объяснить пока не могу)
digiwhite 27.08.2011 22:20 #
+ 1 -
У вас len в функции не меняется, поэтому то, что вы ее распечатываете никакого смысла не несет.

Как только вы подойдете к пределу в 256 символов - начнуться проблемы.

Использовать не инициализированные переменные - зло.
losvik 27.08.2011 22:44 #
+ 1 -
да, как то не заметил) ок, как-нибудь исправлю.
kstep 02.09.2011 01:24 #
+ 0 -
Самый простой способ исправить этот баг, зарезервировать для выходного буфера память объёмом в 2 раза больше, чем для входного, т.к. это самый плохой случай.

А вообще в пути экранировать симовлом "\" все одиночные кавычки, а затем сам путь в одиночные кавычки заключить.
losvik 02.09.2011 16:20 #
+ 0 -
Исправил
Плэйлист:
/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

Вывод:
./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

Про ситуацию описанную Daria я так и не понял. Ответьте кто в курсе.
knicefire 28.08.2011 01:58 #
+ 0 -
ваша статья подкинула мне идею расширения функционала моего скриптика с похожим функционалом... спасибо! :)

Смотреть онлайн бесплатно

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн