Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: zeridon в Dec 11, 2007, 21:21
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Dec 12, 2007, 16:17
Писна ми вече - сигурно има бъгчета, ама ... Изненадааа !!! Този път не ползвам скриптов език сорса
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: romeo_ninov в Dec 12, 2007, 17:26
Писна ми вече - сигурно има бъгчета, ама ... Изненадааа !!! Този път не ползвам скриптов език :P
сорса ($2)
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Dec 12, 2007, 17:40
Бях забравил да мина към паметта, а не да седя в стека  Че с тая рекурсия ... точно за това ще се хванете  Хех  не бях писал на С от толкоз времеее... различно е 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в Dec 12, 2007, 18:27
Ако задачата беше да се създаде файлова система, която да представя музиката така, бих участвал  Сегашната задача просто не е достатъчно интересна 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Dec 13, 2007, 01:26
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: zeridon в Dec 13, 2007, 10:45
Ами tarator действай. И на мен ще ми е интересно да видя решението.
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: gat3way в Dec 13, 2007, 12:56
Сигурно ще пропусна, имам едни доволно отвратителни занимания на главата 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Dec 13, 2007, 13:56
Малки поправки в скрипта на zeridon. Има голям проблем с шпациите в имената на файловете + проверка за ID3 таг: GeSHi (Bash): #!/bin/bash # # simple script for organizing mp3 file # made for BASH Maistora contest # # author: vvitkov # version: 0.1 # date: 20.09.2007 # contact: http://www.getoto.net/az/ # license: CC NC-BY-SA v3.0 # $1 source dir (default source) # $2 destination dir (default dest) # organization pattern dest/srtist/album/artist - song if [ "$1" ]; then SOURCE=$1 else SOURCE="source" fi if [ "$2" ]; then DEST=$2 else DEST="dest" fi find $SOURCE -type f -print0 | while read -d '' -r FILE; do if [ "`id3 -l "$FILE" | grep 'No ID3 tag'`" ]; then echo "No ID3 tag found. Skipping file $FILE"; else ARTIST=`id3 -l "$FILE" | grep Artist | cut -d: -f3 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ $//'` ALBUM=`id3 -l "$FILE" | grep Album | cut -d: -f2 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ Y$//'` SONG=`id3 -l "$FILE" | grep Title | cut -d: -f2 | cut -c 2-34 | tr -s [:space:] | sed 's/^\ //' | sed 's/\ A$//'` mkdir -p "$DEST/$ARTIST/$ALBUM" FINAL="$DEST/$ARTIST/$ALBUM/$ARTIST - $SONG.mp3" # echo $FINAL echo "Moving: $FILE -> $FINAL" >> mp3organizer.log mv -iv "$FILE" "$FINAL" fi done
:)
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: radoulov в Dec 14, 2007, 13:44
C Awk: GeSHi (Bash): #!/bin/bash shell="/bin/bash" source="$1" dest="$2" ext="$3" export shell source dest ext id3 -l "${source:=source}"/*/*."${ext:=mp3}"|awk 'NR%4 == 1 { fn = substr($0, 1, length-1) next } NR%4 == 2 { sn = $2 an = $4 next } NR%4 == 3 { aln = $2 nd = sprintf("%s/%s/%s/", dest, an, aln) printf "[ -d \"%s\" ]||mkdir -p \"%s\"\n", nd, nd printf "mv \"%s\" \"%s%s - %s.%s\"\n", fn, nd, an, sn, e next }' FS=" : | *|: " dest="${dest:=dest}" e="${ext:=mp3}"|"${shell:=/bin/bash}" exit
<!--EDIT|radoulov|Дек. 14 2007,14:46-->
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в 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): #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <time.h> #include <errno.h> #include <dirent.h> #include <id3tag.h> #include <spfs.h> Spfile *createfile(Spfile *parent, char *name, u32 mode, void *ops, void *aux); Spfile *findfile(Spfile *parent, char *name); Spfile *dirfirst(Spfile *dir); Spfile *dirnext(Spfile *dir, Spfile *prevchild); int fileread(Spfilefid *, u64, u32, u8 *, Spreq *); int fileopenfid(Spfilefid *); void fileclosefid(Spfilefid *); Spdirops dops = { .first = dirfirst, .next = dirnext, }; Spfileops fops = { .read = fileread, .openfid = fileopenfid, .closefid = fileclosefid, }; Spsrv *srv; Spfile *root; Spuser *user; int nextid; void sysfatal(char *fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); exit(1); } char * getid(struct id3_tag *tag, char *id) { struct id3_frame *frm; id3_ucs4_t const *str; char *ret; frm = id3_tag_findframe(tag, id, 0); if (!frm) return NULL; if (strcmp(id, ID3_FRAME_COMMENT) == 0) str = id3_field_getfullstring(&frm->fields[3]); else str = id3_field_getstrings(&frm->fields[1], 0); if (!str) return NULL; ret = id3_ucs4_utf8duplicate(str); return ret; } char * gettitle(struct id3_tag *tag) { return getid(tag, ID3_FRAME_TITLE); } char * getartist(struct id3_tag *tag) { return getid(tag, ID3_FRAME_ARTIST); } char * getalbum(struct id3_tag *tag) { return getid(tag, ID3_FRAME_ALBUM); } int process(char *fname) { char *fn, *artist, *album, *title; struct stat st; DIR *d; struct dirent *de; struct id3_file *f; struct id3_tag *t; Spfile *artdir, *albdir; if (stat(fname, &st) < 0) sysfatal("cannot stat %s", fname); if (S_ISDIR(st.st_mode)) { d = opendir(fname); if (!d) sysfatal("cannot open directory %s", fname); while ((de = readdir(d)) != NULL) { if (de->d_name[0] == '.' && (de->d_name[1] == '.' || de->d_name[1] == '\0')) continue; fn = malloc(strlen(fname) + strlen(de->d_name) + 2); sprintf(fn, "%s/%s", fname, de->d_name); process(fn); free(fn); } closedir(d); } if (!S_ISREG(st.st_mode)) return 0; f = id3_file_open(fname, ID3_FILE_MODE_READONLY); if (!f) sysfatal("cannot open file %s", fname); t = id3_file_tag(f); if (!t) sysfatal("cannot get tag"); artist = getartist(t); album = getalbum(t); title = gettitle(t); if (!artist) artist = strdup("Unknown Artist"); artdir = findfile(root, artist); if (!artdir) artdir = createfile(root, artist, 0555 | Dmdir, &dops, NULL); if (!album) album = strdup("Unknown Album"); albdir = findfile(artdir, album); if (!albdir) albdir = createfile(artdir, album, 0555 | Dmdir, &dops, NULL); if (!title) { title = malloc(64); snprintf(title, 64, "Track%d", nextid); } fprintf(stderr, "process %s\n", fname); createfile(albdir, title, 0444, &fops, strdup(fname)); id3_file_close(f); return 0; } Spfile * findfile(Spfile *parent, char *name) { Spfile *f; for(f = parent->dirfirst; f != NULL; f = f->next) if (strcmp(f->name, name) == 0) return f; return NULL; } Spfile * createfile(Spfile *parent, char *name, u32 mode, void *ops, void *aux) { Spfile *ret; ret = spfile_alloc(parent, name, mode, nextid++, ops, aux); if (parent->dirlast) { parent->dirlast->next = ret; ret->prev = parent->dirlast; } else parent->dirfirst = ret; parent->dirlast = ret; ret->atime = ret->mtime = time(NULL); ret->uid = ret->muid = user; ret->gid = user->dfltgroup; spfile_incref(ret); return ret; } Spfile* dirfirst(Spfile *dir) { spfile_incref(dir->dirfirst); return dir->dirfirst; } Spfile* dirnext(Spfile *dir, Spfile *prevchild) { spfile_incref(prevchild->next); return prevchild->next; } int fileread(Spfilefid *fid, u64 offset, u32 count, u8 *data, Spreq *req) { int n, fd; fd = (int) fid->aux; n = pread(fd, data, count, offset); if (n < 0) sp_uerror(errno); return n; } int fileopenfid(Spfilefid *fid) { int fd; char *fname; Spfile *f; f = fid->file; fname = (char *) f->aux; fd = open(fname, O_RDONLY); if (fd < 0) { sp_uerror(errno); return 0; } fid->aux = (void *) fd; return 1; } void fileclosefid(Spfilefid *fid) { int fd; fd = (int) fid->aux; close(fd); } void usage(void) { fprintf(stderr, "mp3fs -d -p port srcdir\n"); exit(1); } int main(int argc, char *argv[]) { int port, ecode, c, debuglevel; pid_t pid; char *s, *ename; user = sp_uid2user(geteuid()); root = spfile_alloc(NULL, "", 0555 | Dmdir, 0, &dops, NULL); root->parent = root; spfile_incref(root); root->atime = root->mtime = time(NULL); root->uid = root->muid = user; root->gid = user->dfltgroup; port = 1234; while ((c = getopt(argc, argv, "dp:")) != -1) { switch (c) { case 'd': debuglevel = 1; break; case 'p': port = strtol(optarg, &s, 10); if (*s != '\0') usage(); break; case 'h': default: usage(); } } if (optind >= argc) usage(); process(argv[optind]); srv = sp_socksrv_create_tcp(&port); if (!srv) goto error; srv->debuglevel = debuglevel; spfile_init_srv(srv, root); sp_srv_start(srv); if (!debuglevel) { close(0); open("/dev/null", O_RDONLY); close(1); open("/dev/null", O_WRONLY); close(2); open("/dev/null", O_WRONLY); pid = fork(); if (pid < 0) { fprintf(stderr, "cannot fork\n"); return -1; } if (pid != 0) { /* parent */ return 0; } /* child */ setsid(); chdir("/"); } fprintf(stderr, "start listening\n"); sp_poll_loop(); return 0; error: sp_rerror(&ename, &ecode); fprintf(stderr, "Error: %s\n", ename); return -1; }
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в Dec 15, 2007, 00:12
Между другото примерното решение няма да работи правилно ако:
- някое от полетата не е дефинирано - някое по полетата съдържа /
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: gat3way в Dec 15, 2007, 00:51
Случайно да се казваш Лъчезар Йонков  Лигавя се де 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в Dec 15, 2007, 01:12
Как се казвам аз не е много ясно, но колегата написал v9fs, npfs и spfs определено се казва така 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: gat3way в Dec 15, 2007, 01:19
Просто видях че имаш влечение към план9 идеите, пък и ползваш framework-a, а и разработващият тези неща е българин, та предположих 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в Dec 15, 2007, 01:27
Като се има предвид, че около два пълнителя за Калашников ще са достатъчни за да очистят голяма част от потребителите на Plan9, броят на българи, които са му фенове е доста голям  Във fortune файла на Plan9 има поговорка "Never smack a Bulgarian" 
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: radoulov в Dec 16, 2007, 20:15
Още една shell версия: GeSHi (Bash): #!/bin/bash source="$1" dest="$2" export source dest find "${source:=source}" -name '*.mp3' -exec bash -c ' filename="$1" id3 -l "$filename"|while read -r; IFS=: read -r t s ar;IFS=: read -r a al j; do song="${s% Artist}" artist="${ar% }" album="${al% Year}" dst="${dest:=dest}/${artist# }/${album# }" [ -d "$dst" ]||mkdir -p "$dst" mv -v "$filename" "$dst/${artist# } - ${song# }.mp3" done' - {} \;
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: zeridon в Jan 04, 2008, 17:23
И така дойде време да теглим чертата и да видим кой какъв какво и как РавносметкатаИмаме 3-ма участници vladsun, radulov i tarator с общо 5 решения. 3 скриптови и две компилирани. 4 от тях що годе нормални и едно дето ми издуха главата. По идейност смятм че едноличен победител е tarator (аплодисменти, хвърчащи цветя и жени). Кратък разбор по задачкиvladsum - mp3o.cСтилистично добре издържана, добре четима, има си опцийка колко да е шумна. Добра идея е ограничението за дълбочина на рекурсията. Не чак толкова добра идея е да се използва собствено парсене на ID3 информацията защото може да се намира на доста места (дори v1) vladsum - mp3o.plPerl защо ли не съм учуден  Разчита се на външен модул (дано той да се справя добре). С итератора идеята е добра. Няма хендлинг на грешки (освен ако в използваните модули няма свестен). Като цяло изглежда добре и си бачка добре. radulov - mp3awk.shThe power of awk. Кратко сладко, семпло, ефективно. Има умно използване на специални променливи от средата. И единственотко което не мога още да зацепя е страшно странният сепаратор на полета който се ползва (но работи) radulov - mp3bash.shBash Magic  . Интересно попълване на полетата, но полето за артист не се изчита цялото. По стандарт е 30 знака. tarator - mp3fs.cDoctor where is my head!!! Аммм ако може такова нали да не коментирам. Бях останал с впечатлението че се изгъбарка но не би ... организация на музика посредством файлова система. Кодът изглежда подреден, макар че стилът не е от най-четливите. Цялостен е до толкова до колкото библиотеките се оправят с проблемите. Тъй като не съм много запознат със spfs не мога да съм по точно аргументиран. Крайната ситуацияЗа мен лично победител в този кръг е tarator - поздравления. Моля сега всички да си изкажат тяхното мнение. пс: Очаквайте следващия кръг. Само да драсна някакво референтно решение.
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: tarator в Jan 04, 2008, 21:39
Виновник за лошия стил е софтуера на форума, стилът ми не се различава от стандартния на Линукс ядрото.
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Jan 06, 2008, 18:45
Решението на tarator определено ми харесва - заради него се зачетох в този български проект  И аз гласувам за неговото решение  По отношение на забележката за парсването на ID3 тага на zeridon - познай кой сорс съм разглеждал за повече инфо за ID3 тага - id3  В този смисъл, моето С решение работи толкова добре, колкото и решенията с bash/awk ползващи id3 инструмента.
Титла: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: VladSun в Jan 06, 2008, 18:46
Виновник за лошия стил е софтуера на форума, стилът ми не се различава от стандартния на Линукс ядрото. Мдам, всеки път и аз забравям за това. Решението е tabs-to-spaces :)
Титла: Re: Задача 3 - 13.11.2007 - 27.12.2007
Публикувано от: Acho в Jan 17, 2023, 08:14
Аман от простотийки, темата е от 2006 година деа. Само спамове.
|