summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-11-22 14:55:34 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-11-22 14:55:34 +0000
commitceed760d73e4ec82c8bd6f9a99a93ce184968b23 (patch)
treee3d398a2d27f1b41f57d41ee54925e6512d7062b
parent57cb76cd8486a7cd4ca7de039dd874c6fe32ce94 (diff)
issue 66 - make paths under the default download dir appear as relative. add a example action script for downloading to local.
-rw-r--r--extra/tpull.sh45
-rw-r--r--src/trg-main-window.c2
-rw-r--r--src/trg-persistent-tree-view.c1
-rw-r--r--src/trg-state-selector.c2
-rw-r--r--src/trg-torrent-model.c73
-rw-r--r--src/trg-torrent-model.h1
6 files changed, 111 insertions, 13 deletions
diff --git a/extra/tpull.sh b/extra/tpull.sh
new file mode 100644
index 0000000..eaa2909
--- /dev/null
+++ b/extra/tpull.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+# This is a really simple script intended to be run as an action
+# from transmission-remote-gtk. It uses rsync to fetch
+# a torrent/torrents to a local directory (or put it somewhere
+# remote and run it using ssh to there).
+
+# It also shows how we can call transmission-remote with
+# connection details to find information about a torrent or
+# manipulate it.
+
+# Example
+# gnome-terminal -e "tpull.sh %{hostname} %{port} %{username}:%{password} %{id}[,] /srv/incoming/"
+
+if [ -z "$5" ]; then
+ echo "usage: <host> <port> <user:pass> <id> <dest>"
+ exit 1
+fi
+
+HOST=$1
+TPORT=$2
+TAUTH=$3
+IDS=$4
+DEST=$5
+
+echo $IDS | sed "s/,/\n/g" | while read id; do
+ DETAILS=$(transmission-remote $HOST:$TPORT -n $TAUTH -t $id -i)
+
+ if [ $? -ne 0 ]; then
+ read
+ exit 1
+ fi
+
+ LOCATION=$(echo "$DETAILS" | egrep '^\s+Location:' | cut -c 13-)
+ NAME=$(echo "$DETAILS" | egrep '^\s+Name:' | cut -c 9-)
+
+ if [ -z "$LOCATION" -o -z "$NAME" ]; then
+ continue
+ fi
+
+ FULLPATH="$LOCATION/$NAME"
+
+ echo "Syncing $FULLPATH ..."
+ rsync -avPs "$HOST:$FULLPATH" "$DEST"
+done
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 2ec589f..076747b 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -1038,7 +1038,7 @@ static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model,
priv->stateSelector);
gchar *dd;
int cmp;
- gtk_tree_model_get(model, iter, TORRENT_COLUMN_DOWNLOADDIR, &dd, -1);
+ gtk_tree_model_get(model, iter, TORRENT_COLUMN_DOWNLOADDIR_SHORT, &dd, -1);
cmp = g_strcmp0(text, dd);
g_free(dd);
g_free(text);
diff --git a/src/trg-persistent-tree-view.c b/src/trg-persistent-tree-view.c
index e3a84c1..9eff200 100644
--- a/src/trg-persistent-tree-view.c
+++ b/src/trg-persistent-tree-view.c
@@ -212,6 +212,7 @@ static void trg_persistent_tree_view_get_property(GObject *object,
switch (property_id) {
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
}
}
diff --git a/src/trg-state-selector.c b/src/trg-state-selector.c
index 74de7a5..41a552f 100644
--- a/src/trg-state-selector.c
+++ b/src/trg-state-selector.c
@@ -306,7 +306,7 @@ void trg_state_selector_update(TrgStateSelector * s) {
if (priv->showDirs) {
gchar *dir;
- gtk_tree_model_get(torrentModel, &torrentIter, TORRENT_COLUMN_DOWNLOADDIR,
+ gtk_tree_model_get(torrentModel, &torrentIter, TORRENT_COLUMN_DOWNLOADDIR_SHORT,
&dir, -1);
result = g_hash_table_lookup(priv->directories, dir);
diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c
index 54a2f0f..0ef89d6 100644
--- a/src/trg-torrent-model.c
+++ b/src/trg-torrent-model.c
@@ -59,9 +59,9 @@ static void trg_torrent_model_dispose(GObject * object)
}
static void
-update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
- GtkTreeIter * iter, JsonObject * t,
- trg_torrent_model_update_stats * stats);
+update_torrent_iter(TrgTorrentModel * model, TrgClient *tc,
+ gint64 rpcv, gint64 serial, GtkTreeIter * iter,
+ JsonObject * t, trg_torrent_model_update_stats * stats);
static void trg_torrent_model_class_init(TrgTorrentModelClass * klass)
{
@@ -174,6 +174,7 @@ static void trg_torrent_model_init(TrgTorrentModel * self)
column_types[TORRENT_COLUMN_UPDATESERIAL] = G_TYPE_INT64;
column_types[TORRENT_COLUMN_FLAGS] = G_TYPE_INT;
column_types[TORRENT_COLUMN_DOWNLOADDIR] = G_TYPE_STRING;
+ column_types[TORRENT_COLUMN_DOWNLOADDIR_SHORT] = G_TYPE_STRING;
column_types[TORRENT_COLUMN_BANDWIDTH_PRIORITY] = G_TYPE_INT64;
column_types[TORRENT_COLUMN_DONE_DATE] = G_TYPE_INT64;
column_types[TORRENT_COLUMN_FROMPEX] = G_TYPE_INT64;
@@ -245,10 +246,51 @@ void trg_torrent_model_remove_all(TrgTorrentModel *model)
gtk_list_store_clear(GTK_LIST_STORE(model));
}
+gchar *shorten_download_dir(TrgClient *tc, const gchar *downloadDir)
+{
+ TrgPrefs *prefs = trg_client_get_prefs(tc);
+ JsonArray *labels = trg_prefs_get_array(prefs, TRG_PREFS_KEY_DESTINATIONS, TRG_PREFS_CONNECTION);
+ gchar *shortDownloadDir = NULL;
+
+ if (labels) {
+ GList *labelsList = json_array_get_elements(labels);
+ if (labelsList) {
+ GList *li;
+ for (li = labelsList; li; li = g_list_next(li)) {
+ JsonObject *labelObj = json_node_get_object((JsonNode*)li->data);
+ const gchar *labelDir = json_object_get_string_member(labelObj, TRG_PREFS_KEY_DESTINATIONS_SUBKEY_DIR);
+ if (!g_strcmp0(downloadDir, labelDir)) {
+ const gchar *labelLabel = json_object_get_string_member(labelObj, TRG_PREFS_SUBKEY_LABEL);
+ shortDownloadDir = g_strdup(labelLabel);
+ break;
+ }
+ }
+ g_list_free(labelsList);
+ }
+ }
+
+ if (shortDownloadDir) {
+ return shortDownloadDir;
+ } else {
+ JsonObject *session = trg_client_get_session(tc);
+ const gchar *defaultDownloadDir = session_get_download_dir(session);
+ if (g_str_has_prefix(downloadDir, defaultDownloadDir)) {
+ int offset = strlen(defaultDownloadDir);
+ if (*(downloadDir+offset) == '/')
+ offset++;
+
+ if (offset+1 < strlen(downloadDir))
+ return g_strdup(downloadDir+offset);
+ }
+ }
+
+ return g_strdup(downloadDir);
+}
+
static void
-update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
- GtkTreeIter * iter, JsonObject * t,
- trg_torrent_model_update_stats * stats)
+update_torrent_iter(TrgTorrentModel * model, TrgClient *tc,
+ gint64 rpcv, gint64 serial, GtkTreeIter * iter,
+ JsonObject * t, trg_torrent_model_update_stats * stats)
{
TrgTorrentModelPrivate *priv = TRG_TORRENT_MODEL_GET_PRIVATE(model);
GtkListStore *ls = GTK_LIST_STORE(model);
@@ -259,6 +301,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
gint64 downRate, upRate, downloaded, uploaded, id, status, lpd;
gchar *firstTrackerHost = NULL;
gchar *peerSources = NULL;
+ gchar *lastDownloadDir = NULL;
downRate = torrent_get_rate_down(t);
stats->downRateTotal += downRate;
@@ -282,7 +325,8 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
gtk_tree_model_get(GTK_TREE_MODEL(model), iter,
TORRENT_COLUMN_FLAGS, &lastFlags,
- TORRENT_COLUMN_JSON, &lastJson, -1);
+ TORRENT_COLUMN_JSON, &lastJson,
+ TORRENT_COLUMN_DOWNLOADDIR, &lastDownloadDir, -1);
json_object_ref(t);
@@ -294,7 +338,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
lpd = peerfrom_get_lpd(pf);
if (newFlags & TORRENT_FLAG_ACTIVE) {
if (lpd >= 0) {
- peerSources = g_strdup_printf("%d / %d / %d / %d / %d / %d / %d",
+ peerSources = g_strdup_printf("%ld / %ld / %ld / %ld / %ld / %ld / %ld",
peerfrom_get_trackers(pf),
peerfrom_get_incoming(pf),
peerfrom_get_ltep(pf),
@@ -303,7 +347,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
lpd,
peerfrom_get_resume(pf));
} else {
- peerSources = g_strdup_printf("%d / %d / %d / %d / %d / N/A / %d",
+ peerSources = g_strdup_printf("%ld / %ld / %ld / %ld / %ld / N/A / %ld",
peerfrom_get_trackers(pf),
peerfrom_get_incoming(pf),
peerfrom_get_ltep(pf),
@@ -418,6 +462,12 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
TORRENT_COLUMN_UPDATESERIAL, serial, -1);
#endif
+ if (!lastDownloadDir || g_strcmp0(downloadDir, lastDownloadDir)) {
+ gchar *shortDownloadDir = shorten_download_dir(tc, downloadDir);
+ gtk_list_store_set(ls, iter, TORRENT_COLUMN_DOWNLOADDIR_SHORT, shortDownloadDir, -1);
+ g_free(shortDownloadDir);
+ }
+
if (lastJson)
json_object_unref(lastJson);
@@ -432,6 +482,7 @@ update_torrent_iter(TrgTorrentModel * model, gint64 rpcv, gint64 serial,
if (peerSources)
g_free(peerSources);
+ g_free(lastDownloadDir);
g_free(statusString);
g_free(statusIcon);
}
@@ -545,7 +596,7 @@ void trg_torrent_model_update(TrgTorrentModel * model, TrgClient * tc,
if (!result) {
gtk_list_store_append(GTK_LIST_STORE(model), &iter);
- update_torrent_iter(model, rpcv, trg_client_get_serial(tc), &iter, t, stats);
+ update_torrent_iter(model, tc, rpcv, trg_client_get_serial(tc), &iter, t, stats);
path = gtk_tree_model_get_path(GTK_TREE_MODEL(model), &iter);
rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(model), path);
@@ -563,7 +614,7 @@ void trg_torrent_model_update(TrgTorrentModel * model, TrgClient * tc,
if (path) {
if (gtk_tree_model_get_iter
(GTK_TREE_MODEL(model), &iter, path)) {
- update_torrent_iter(model, rpcv, trg_client_get_serial(tc), &iter, t,
+ update_torrent_iter(model, tc, rpcv, trg_client_get_serial(tc), &iter, t,
stats);
}
gtk_tree_path_free(path);
diff --git a/src/trg-torrent-model.h b/src/trg-torrent-model.h
index 79a22da..dd03ee9 100644
--- a/src/trg-torrent-model.h
+++ b/src/trg-torrent-model.h
@@ -108,6 +108,7 @@ enum {
TORRENT_COLUMN_UPDATESERIAL,
TORRENT_COLUMN_FLAGS,
TORRENT_COLUMN_DOWNLOADDIR,
+ TORRENT_COLUMN_DOWNLOADDIR_SHORT,
TORRENT_COLUMN_BANDWIDTH_PRIORITY,
TORRENT_COLUMN_DONE_DATE,
TORRENT_COLUMN_FROMPEX,