summaryrefslogtreecommitdiff
path: root/playlist.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-08-04 22:29:26 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-08-04 22:29:26 +0200
commit8e2e95f37a8509c7cbc7b85a61ab7b53f9d7b9d3 (patch)
treeb31ddc98a4af3041e9c94737510adf419e8c5dcc /playlist.c
parentfbbbd7436a347595e925c5ba8b69e8875b5c73bc (diff)
fixed drag and drop from filemanagers
Diffstat (limited to 'playlist.c')
-rw-r--r--playlist.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/playlist.c b/playlist.c
index 0cb2c21e..5f55f807 100644
--- a/playlist.c
+++ b/playlist.c
@@ -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