Автор Тема: Задача 3 - 13.11.2007 - 27.12.2007  (Прочетена 55013 пъти)

zeridon

  • Killmode enabled
  • Administrator
  • Участник
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
Задача 3 - 13.11.2007 - 27.12.2007
« -: Dec 11, 2007, 21:21 »
Сортиране на музика

Понеже сме били много сериозни фенове на дос 4.0 имаме прилино голяма колекция от файлове по 10тина файла в папка. Преди две седмици сте си купили чисто нов огромен диск, инсталирали сте си любимата система и сега искате да си сортирате музиката. Хубавото е че тя е много добре описана с тагове.
Искаме от директорията в която са нашите дублиращи се файлове по 10тина в папка искаме да ги подредим в красива структура

изходна структура на файловете
source/
source/dir1/
source/dir1/file012.mp3

целева структура
dest/
dest/Artist 1/
dest/Artist 1/Good Album/
dest/Artist 1/Good Album/Artist 1 - Very Ugly Song.mp3

Решението на задачата подлежи на тестване със тестов комплект файлове
тестов комплект: http://imbuza.no-ip.org/~zeridon/bashmajstora3/mp3testset.tar.gz
подис: http://imbuza.no-ip.org/~zeridon/bashmajstora3/mp3testset.tar.gz.asc
Референтно решение: http://imbuza.no-ip.org/~zeridon/bashmajstora3/mp3organizer.sh



Активен

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #1 -: Dec 12, 2007, 16:17 »
Писна ми вече - сигурно има бъгчета, ама ...
Изненадааа !!!
Този път не ползвам скриптов език ':p'



сорса



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

romeo_ninov

  • Участник
  • *****
  • Публикации: 2155
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #2 -: Dec 12, 2007, 17:26 »
Цитат
Писна ми вече - сигурно има бъгчета, ама ...
Изненадааа !!!
Този път не ползвам скриптов език :P


сорса
« Последна редакция: Jan 19, 2009, 14:45 от zeridon »
Активен

0x2B|~0x2B

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #3 -: Dec 12, 2007, 17:40 »
Бях забравил да мина към паметта, а не да седя в стека '<img'>
Че с тая рекурсия ... точно за това ще се хванете '<img'>

Хех '<img'> не бях писал на С от толкоз времеее... различно е '<img'>



Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #4 -: Dec 12, 2007, 18:27 »
Ако задачата беше да се създаде файлова система, която да представя музиката така, бих участвал '<img'> Сегашната задача просто не е достатъчно интересна '<img'>
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #5 -: Dec 13, 2007, 01:26 »
Perl rulzzz '<img'>

Perl сорс
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

zeridon

  • Killmode enabled
  • Administrator
  • Участник
  • *****
  • Публикации: 1398
  • Distribution: Debian/Ubuntu
  • Window Manager: console/Gnome
  • BOfH
    • Профил
    • WWW
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #6 -: Dec 13, 2007, 10:45 »
Ами tarator действай. И на мен ще ми е интересно да видя решението.
Активен

Внмимавай имам клещи за кабел
http://www.netsecad.com/
http://theregister.co.uk/odds/bofh/

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #7 -: Dec 13, 2007, 12:56 »
Сигурно ще пропусна, имам едни доволно отвратителни занимания на главата '<img'>
Активен

"Knowledge is power" - France is Bacon

VladSun

  • Moderator
  • Участник
  • *****
  • Публикации: 2166
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #8 -: Dec 13, 2007, 13:56 »
Малки поправки в скрипта на zeridon. Има голям проблем с шпациите в имената на файловете + проверка за ID3 таг:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2. #
  3. # simple script for organizing mp3 file
  4. # made for BASH Maistora contest
  5. #
  6. # author: vvitkov
  7. # version: 0.1
  8. # date: 20.09.2007
  9. # contact: http://www.getoto.net/az/
  10. # license: CC NC-BY-SA v3.0
  11.  
  12. # $1 source dir (default source)
  13. # $2 destination dir (default dest)
  14. # organization pattern dest/srtist/album/artist - song
  15.  
  16. if [ "$1" ]; then
  17.        SOURCE=$1
  18. else
  19.        SOURCE="source"
  20. fi
  21.  
  22. if [ "$2" ]; then
  23.        DEST=$2
  24. else
  25.        DEST="dest"
  26. fi
  27.  
  28. find $SOURCE -type f -print0 | while read -d '' -r FILE;
  29. do
  30.        if [ "`id3 -l "$FILE" | grep 'No ID3 tag'`" ]; then
  31.                echo "No ID3 tag found. Skipping file $FILE";
  32.        else
  33.                ARTIST=`id3 -l "$FILE" | grep Artist | cut -d: -f3 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ $//'`
  34.                ALBUM=`id3 -l "$FILE" | grep Album | cut -d: -f2 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ Y$//'`
  35.                SONG=`id3 -l "$FILE" | grep Title | cut -d: -f2 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ A$//'`
  36.                mkdir -p "$DEST/$ARTIST/$ALBUM"
  37.                FINAL="$DEST/$ARTIST/$ALBUM/$ARTIST - $SONG.mp3"
  38.                #       echo $FINAL
  39.                echo "Moving: $FILE -> $FINAL" >> mp3organizer.log
  40.                mv -iv "$FILE" "$FINAL"
  41.        fi
  42. done
  43.  

:)
« Последна редакция: Nov 18, 2010, 21:07 от VladSun »
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

radoulov

  • Участник
  • *****
  • Публикации: 116
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #9 -: Dec 14, 2007, 13:44 »
C Awk:

Код
GeSHi (Bash):
  1. #!/bin/bash
  2.  
  3. shell="/bin/bash"
  4. source="$1"
  5. dest="$2"
  6. ext="$3"
  7.  
  8. export shell source dest ext
  9.  
  10. id3 -l "${source:=source}"/*/*."${ext:=mp3}"|awk 'NR%4 == 1 {
  11.        fn = substr($0, 1, length-1)
  12.        next
  13. }
  14. NR%4 == 2 {
  15.        sn = $2
  16.        an = $4
  17.        next
  18. }
  19. NR%4 == 3 {
  20.        aln = $2
  21.        nd = sprintf("%s/%s/%s/", dest, an, aln)
  22.        printf "[ -d \"%s\" ]||mkdir -p \"%s\"\n", nd, nd
  23.        printf "mv \"%s\" \"%s%s - %s.%s\"\n", fn, nd, an, sn, e
  24.        next
  25. }' FS="  : |   *|: " dest="${dest:=dest}" e="${ext:=mp3}"|"${shell:=/bin/bash}"
  26.  
  27. exit




<!--EDIT|radoulov|Дек. 14 2007,14:46-->
« Последна редакция: Nov 18, 2010, 21:08 от VladSun »
Активен

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #10 -: Dec 15, 2007, 00:09 »
Кода стана твърде дълъг, все пак ще се опитам да го постна. Използва libid3tag и libspfs от проекта npfs на sourceforge (писан от колега-булгар).

Програмата се пуска:

mp3fs srcdir

Остава в background и чака на порт 1234 (може да се промени с опция -p). Файловата система се монтира:

mount -t 9p 127.0.0.1 /mnt/mp3 -o port=1234

Код
GeSHi (C):
  1. #include <stdarg.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include <sys/stat.h>
  7. #include <sys/types.h>
  8. #include <fcntl.h>
  9. #include <time.h>
  10. #include <errno.h>
  11. #include <dirent.h>
  12. #include <id3tag.h>
  13. #include <spfs.h>
  14.  
  15. Spfile *createfile(Spfile *parent, char *name, u32 mode, void *ops, void *aux);
  16. Spfile *findfile(Spfile *parent, char *name);
  17. Spfile *dirfirst(Spfile *dir);
  18. Spfile *dirnext(Spfile *dir, Spfile *prevchild);
  19. int fileread(Spfilefid *, u64, u32, u8 *, Spreq *);
  20. int fileopenfid(Spfilefid *);
  21. void fileclosefid(Spfilefid *);
  22.  
  23. Spdirops dops = {
  24. .first = dirfirst,
  25. .next = dirnext,
  26. };
  27.  
  28. Spfileops fops = {
  29. .read = fileread,
  30. .openfid = fileopenfid,
  31. .closefid = fileclosefid,
  32. };
  33.  
  34. Spsrv *srv;
  35. Spfile *root;
  36. Spuser *user;
  37. int nextid;
  38.  
  39. void
  40. sysfatal(char *fmt, ...)
  41. {
  42. va_list ap;
  43.  
  44. va_start(ap, fmt);
  45. vfprintf(stderr, fmt, ap);
  46. va_end(ap);
  47. exit(1);
  48. }
  49.  
  50. char *
  51. getid(struct id3_tag *tag, char *id)
  52. {
  53. struct id3_frame *frm;
  54. id3_ucs4_t const *str;
  55. char *ret;
  56.  
  57. frm = id3_tag_findframe(tag, id, 0);
  58. if (!frm)
  59. return NULL;
  60.  
  61. if (strcmp(id, ID3_FRAME_COMMENT) == 0)
  62. str = id3_field_getfullstring(&frm->fields[3]);
  63. else
  64. str = id3_field_getstrings(&frm->fields[1], 0);
  65.  
  66. if (!str)
  67. return NULL;
  68.  
  69. ret = id3_ucs4_utf8duplicate(str);
  70. return ret;
  71. }
  72.  
  73. char *
  74. gettitle(struct id3_tag *tag)
  75. {
  76. return getid(tag, ID3_FRAME_TITLE);
  77. }
  78.  
  79. char *
  80. getartist(struct id3_tag *tag)
  81. {
  82. return getid(tag, ID3_FRAME_ARTIST);
  83. }
  84.  
  85. char *
  86. getalbum(struct id3_tag *tag)
  87. {
  88. return getid(tag, ID3_FRAME_ALBUM);
  89. }
  90.  
  91. int
  92. process(char *fname)
  93. {
  94. char *fn, *artist, *album, *title;
  95. struct stat st;
  96. DIR *d;
  97. struct dirent *de;
  98. struct id3_file *f;
  99. struct id3_tag *t;
  100. Spfile *artdir, *albdir;
  101.  
  102. if (stat(fname, &st) < 0)
  103. sysfatal("cannot stat %s", fname);
  104.  
  105. if (S_ISDIR(st.st_mode)) {
  106. d = opendir(fname);
  107. if (!d)
  108. sysfatal("cannot open directory %s", fname);
  109.  
  110. while ((de = readdir(d)) != NULL) {
  111. if (de->d_name[0] == '.' && (de->d_name[1] == '.' ||
  112. de->d_name[1] == '\0'))
  113. continue;
  114.  
  115. fn = malloc(strlen(fname) + strlen(de->d_name) + 2);
  116. sprintf(fn, "%s/%s", fname, de->d_name);
  117. process(fn);
  118. free(fn);
  119. }
  120. closedir(d);
  121. }
  122.  
  123. if (!S_ISREG(st.st_mode))
  124. return 0;
  125.  
  126. f = id3_file_open(fname, ID3_FILE_MODE_READONLY);
  127. if (!f)
  128. sysfatal("cannot open file %s", fname);
  129.  
  130. t = id3_file_tag(f);
  131. if (!t)
  132. sysfatal("cannot get tag");
  133.  
  134. artist = getartist(t);
  135. album = getalbum(t);
  136. title = gettitle(t);
  137.  
  138. if (!artist)
  139. artist = strdup("Unknown Artist");
  140.  
  141. artdir = findfile(root, artist);
  142. if (!artdir)
  143. artdir = createfile(root, artist, 0555 | Dmdir, &dops, NULL);
  144.  
  145. if (!album)
  146. album = strdup("Unknown Album");
  147.  
  148. albdir = findfile(artdir, album);
  149. if (!albdir)
  150. albdir = createfile(artdir, album, 0555 | Dmdir, &dops, NULL);
  151.  
  152. if (!title) {
  153. title = malloc(64);
  154. snprintf(title, 64, "Track%d", nextid);
  155. }
  156.  
  157. fprintf(stderr, "process %s\n", fname);
  158. createfile(albdir, title, 0444, &fops, strdup(fname));
  159. id3_file_close(f);
  160.  
  161. return 0;
  162. }
  163.  
  164. Spfile *
  165. findfile(Spfile *parent, char *name)
  166. {
  167. Spfile *f;
  168.  
  169. for(f = parent->dirfirst; f != NULL; f = f->next)
  170. if (strcmp(f->name, name) == 0)
  171. return f;
  172.  
  173. return NULL;
  174. }
  175.  
  176. Spfile *
  177. createfile(Spfile *parent, char *name, u32 mode, void *ops, void *aux)
  178. {
  179. Spfile *ret;
  180.  
  181. ret = spfile_alloc(parent, name, mode, nextid++, ops, aux);
  182. if (parent->dirlast) {
  183. parent->dirlast->next = ret;
  184. ret->prev = parent->dirlast;
  185. } else
  186. parent->dirfirst = ret;
  187.  
  188. parent->dirlast = ret;
  189. ret->atime = ret->mtime = time(NULL);
  190. ret->uid = ret->muid = user;
  191. ret->gid = user->dfltgroup;
  192. spfile_incref(ret);
  193. return ret;
  194. }
  195.  
  196. Spfile*
  197. dirfirst(Spfile *dir)
  198. {
  199. spfile_incref(dir->dirfirst);
  200. return dir->dirfirst;
  201. }
  202.  
  203. Spfile*
  204. dirnext(Spfile *dir, Spfile *prevchild)
  205. {
  206. spfile_incref(prevchild->next);
  207. return prevchild->next;
  208. }
  209.  
  210. int
  211. fileread(Spfilefid *fid, u64 offset, u32 count, u8 *data, Spreq *req)
  212. {
  213. int n, fd;
  214.  
  215. fd = (int) fid->aux;
  216. n = pread(fd, data, count, offset);
  217. if (n < 0)
  218. sp_uerror(errno);
  219.  
  220. return n;
  221. }
  222.  
  223. int
  224. fileopenfid(Spfilefid *fid)
  225. {
  226. int fd;
  227. char *fname;
  228. Spfile *f;
  229.  
  230. f = fid->file;
  231. fname = (char *) f->aux;
  232. fd = open(fname, O_RDONLY);
  233. if (fd < 0) {
  234. sp_uerror(errno);
  235. return 0;
  236. }
  237.  
  238. fid->aux = (void *) fd;
  239. return 1;
  240. }
  241.  
  242. void
  243. fileclosefid(Spfilefid *fid)
  244. {
  245. int fd;
  246.  
  247. fd = (int) fid->aux;
  248. close(fd);
  249. }
  250.  
  251. void
  252. usage(void)
  253. {
  254. fprintf(stderr, "mp3fs -d -p port srcdir\n");
  255. exit(1);
  256. }
  257.  
  258. int
  259. main(int argc, char *argv[])
  260. {
  261. int port, ecode, c, debuglevel;
  262. pid_t pid;
  263. char *s, *ename;
  264.  
  265. user = sp_uid2user(geteuid());
  266. root = spfile_alloc(NULL, "", 0555 | Dmdir, 0, &dops, NULL);
  267. root->parent = root;
  268. spfile_incref(root);
  269. root->atime = root->mtime = time(NULL);
  270. root->uid = root->muid = user;
  271. root->gid = user->dfltgroup;
  272. port = 1234;
  273.  
  274. while ((c = getopt(argc, argv, "dp:")) != -1) {
  275. switch (c) {
  276. case 'd':
  277. debuglevel = 1;
  278. break;
  279.  
  280. case 'p':
  281. port = strtol(optarg, &s, 10);
  282. if (*s != '\0')
  283. usage();
  284. break;
  285.  
  286. case 'h':
  287. default:
  288. usage();
  289. }
  290. }
  291.  
  292. if (optind >= argc)
  293. usage();
  294.  
  295. process(argv[optind]);
  296. srv = sp_socksrv_create_tcp(&port);
  297. if (!srv)
  298. goto error;
  299.  
  300. srv->debuglevel = debuglevel;
  301. spfile_init_srv(srv, root);
  302. sp_srv_start(srv);
  303. if (!debuglevel) {
  304. close(0);
  305. open("/dev/null", O_RDONLY);
  306. close(1);
  307. open("/dev/null", O_WRONLY);
  308. close(2);
  309. open("/dev/null", O_WRONLY);
  310.  
  311. pid = fork();
  312. if (pid < 0) {
  313. fprintf(stderr, "cannot fork\n");
  314. return -1;
  315. }
  316.  
  317. if (pid != 0) {
  318. /* parent */
  319. return 0;
  320. }
  321.  
  322. /* child */
  323. setsid();
  324. chdir("/");
  325. }
  326. fprintf(stderr, "start listening\n");
  327. sp_poll_loop();
  328.  
  329. return 0;
  330.  
  331. error:
  332. sp_rerror(&ename, &ecode);
  333. fprintf(stderr, "Error: %s\n", ename);
  334. return -1;
  335. }
« Последна редакция: Nov 18, 2010, 21:09 от VladSun »
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #11 -: Dec 15, 2007, 00:12 »
Между другото примерното решение няма да работи правилно ако:

- някое от полетата не е дефинирано
- някое по полетата съдържа /
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #12 -: Dec 15, 2007, 00:51 »
Случайно да се казваш Лъчезар Йонков '<img'>

Лигавя се де '<img'>
Активен

"Knowledge is power" - France is Bacon

tarator

  • Участник
  • *****
  • Публикации: 849
    • Профил
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #13 -: Dec 15, 2007, 01:12 »
Как се казвам аз не е много ясно, но колегата написал v9fs, npfs и spfs определено се казва така '<img'>
Активен

A gentleman is one who is never rude unintentionally. - Noel Coward

gat3way

  • Участник
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Задача 3 - 13.11.2007 - 27.12.2007
« Отговор #14 -: Dec 15, 2007, 01:19 »
Просто видях че имаш влечение към план9 идеите, пък и ползваш framework-a, а и разработващият тези неща е българин, та предположих '<img'>
Активен

"Knowledge is power" - France is Bacon

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
Мандрива 2007 сървъри за ъпдейт
Настройка на програми
enemam 3 7099 Последна публикация Nov 02, 2006, 18:42
от Nik123
Проблем с видеото на Мандрива 2007
Настройка на програми
eka 9 8286 Последна публикация Jan 09, 2007, 04:45
от Nik123
Мандрива 2007
Настройка на хардуер
angelfire 1 6604 Последна публикация Jan 08, 2007, 15:16
от nfsto
Xgl проблем мандрива 2007
Настройка на хардуер
komara_mnt 9 8747 Последна публикация Feb 07, 2007, 12:38
от TheNightmare
Халф-Лайв-ЦС под Мандрива 2007
Общ форум
popaay 31 5464 Последна публикация Oct 05, 2007, 23:50
от Nik123