diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-08-04 22:29:26 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-08-04 22:29:26 +0200 |
commit | 8e2e95f37a8509c7cbc7b85a61ab7b53f9d7b9d3 (patch) | |
tree | b31ddc98a4af3041e9c94737510adf419e8c5dcc /playlist.c | |
parent | fbbbd7436a347595e925c5ba8b69e8875b5c73bc (diff) |
fixed drag and drop from filemanagers
Diffstat (limited to 'playlist.c')
-rw-r--r-- | playlist.c | 87 |
1 files changed, 87 insertions, 0 deletions
@@ -352,14 +352,91 @@ ps_add_cue (const char *cuename) { playItem_t * ps_insert_file (playItem_t *after, const char *fname) { + if (!fname) { + return NULL; + } + // detect codec + codec_t *codec = NULL; + const char *eol = fname + strlen (fname) - 1; + while (eol > fname && *eol != '.') { + eol--; + } + eol++; + + // match by codec + codec_t *codecs[] = { + &cdumb, &cvorbis, &cflac, &cgme, &cmp3, &csid, NULL + }; + for (int i = 0; codecs[i]; i++) { + if (codecs[i]->getexts && codecs[i]->insert) { + const char **exts = codecs[i]->getexts (); + if (exts) { + for (int e = 0; exts[e]; e++) { + if (!strcasecmp (exts[e], eol)) { + playItem_t *inserted = NULL; + if ((inserted = codecs[i]->insert (after, fname)) != NULL) { + return inserted; + } + } + } + } + } + } + return NULL; } playItem_t * ps_insert_dir (playItem_t *after, const char *dirname) { + struct stat buf; + lstat (dirname, &buf); + if (S_ISLNK(buf.st_mode)) { + return NULL; + } + struct dirent **namelist = NULL; + int n; + + n = scandir (dirname, &namelist, NULL, alphasort); + if (n < 0) + { + if (namelist) + free (namelist); + return NULL; // not a dir or no read access + } + else + { + int i; + for (i = 0; i < n; i++) + { + // no hidden files + if (namelist[i]->d_name[0] != '.') + { + char fullname[1024]; + strcpy (fullname, dirname); + strncat (fullname, "/", 1024); + strncat (fullname, namelist[i]->d_name, 1024); + playItem_t *inserted = ps_insert_dir (after, fullname); + if (!inserted) { + inserted = ps_insert_file (after, fullname); + } + if (inserted) { + after = inserted; + } + } + free (namelist[i]); + } + free (namelist); + } + return after; } int ps_add_file (const char *fname) { + if (ps_insert_file (playlist_tail, fname)) { + return 0; + } + return -1; +// {{{ original ps_add_file +#if 0 if (!fname) { return -1; } @@ -393,10 +470,18 @@ ps_add_file (const char *fname) { } return -1; +#endif +// }}} } int ps_add_dir (const char *dirname) { + if (ps_insert_dir (playlist_tail, dirname)) { + return 0; + } + return -1; +// {{{ original ps_add_dir code +#if 0 struct stat buf; lstat (dirname, &buf); if (S_ISLNK(buf.st_mode)) { @@ -433,6 +518,8 @@ ps_add_dir (const char *dirname) { free (namelist); } return 0; +#endif +// }}} } int |