summaryrefslogtreecommitdiffstats
path: root/src/data.c
diff options
context:
space:
mode:
authorLouis Burda <quent.burda@gmail.com>2023-01-28 15:51:20 +0100
committerLouis Burda <quent.burda@gmail.com>2023-01-28 15:51:20 +0100
commit777bd77b64b4ca9c5e38c9cb5971a62684215f2a (patch)
treec327bc60af654956b210a30b9e19526d6cfafee5 /src/data.c
parente883c2678838f60970d7e1008635cda28472cb28 (diff)
downloadtmus-777bd77b64b4ca9c5e38c9cb5971a62684215f2a.tar.gz
tmus-777bd77b64b4ca9c5e38c9cb5971a62684215f2a.zip
If trash tag exists, move tracks there on delete
Diffstat (limited to 'src/data.c')
-rw-r--r--src/data.c75
1 files changed, 62 insertions, 13 deletions
diff --git a/src/data.c b/src/data.c
index b70f80b..11dcb5a 100644
--- a/src/data.c
+++ b/src/data.c
@@ -6,6 +6,7 @@
#include "log.h"
#include <fts.h>
+#include <errno.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
@@ -18,6 +19,8 @@ struct list tracks; /* struct track (link) */
struct list tags; /* struct track (link) */
struct list tags_sel; /* struct tag (link_sel) */
+struct tag *trash_tag;
+
bool playlist_outdated;
static struct tag *tag_alloc(const char *path, const char *fname);
@@ -25,7 +28,6 @@ static void tag_free(struct tag *tag);
static struct track *track_alloc(const char *path, const char *fname);
static void track_free(struct track *t);
-static int track_name_compare(struct link *a, struct link *b);
static void tracks_load(struct tag *tag);
static void tracks_save(struct tag *tag);
@@ -85,17 +87,6 @@ track_free(struct track *t)
free(t);
}
-int
-track_name_compare(struct link *a, struct link *b)
-{
- struct track *ta, *tb;
-
- ta = UPCAST(a, struct track, link);
- tb = UPCAST(b, struct track, link);
-
- return strcmp(ta->name, tb->name);
-}
-
void
tracks_load(struct tag *tag)
{
@@ -379,12 +370,34 @@ playlist_update(void)
}
struct tag *
+tag_create(const char *fname)
+{
+ struct tag *tag;
+ char *path;
+
+ path = aprintf("%s/%s", datadir, fname);
+ if (!make_dir(path)) {
+ free(path);
+ return NULL;
+ }
+ free(path);
+
+ tag = tag_add(fname);
+ if (!tag) {
+ rm_dir(path, false);
+ return NULL;
+ }
+
+ return tag;
+}
+
+struct tag *
tag_add(const char *fname)
{
struct tag *tag;
- /* add to tags list */
tag = tag_alloc(datadir, fname);
+ if (!tag) return NULL;
list_push_back(&tags, &tag->link);
return tag;
@@ -547,6 +560,39 @@ track_rename(struct track *track, const char *name)
}
bool
+track_move(struct track *track, struct tag *tag)
+{
+ struct track *new;
+ char *newpath;
+
+ newpath = aprintf("%s/%s", tag->fpath, track->name);
+ if (path_exists(newpath)) {
+ free(newpath);
+ return false;
+ }
+
+ if (!dup_file(track->fpath, newpath)) {
+ free(newpath);
+ return false;
+ }
+
+ free(newpath);
+
+ new = track_add(tag, track->name);
+ if (!new) return false;
+
+ if (player.track == track)
+ player.track = new;
+
+ if (!track_rm(track, true)) {
+ track_rm(new, true);
+ return false;
+ }
+
+ return true;
+}
+
+bool
acquire_lock(const char *datadir)
{
char *lockpath, *procpath;
@@ -623,6 +669,7 @@ data_load(void)
dir = opendir(datadir);
if (!dir) ERROR(SYSTEM, "opendir %s", datadir);
+ trash_tag = NULL;
while ((ent = readdir(dir))) {
if (!strcmp(ent->d_name, "."))
continue;
@@ -632,6 +679,8 @@ data_load(void)
path = aprintf("%s/%s", datadir, ent->d_name);
if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
tag = tag_add(ent->d_name);
+ if (!strcmp(tag->name, "trash"))
+ trash_tag = tag;
tracks_load(tag);
}
free(path);