From ceed760d73e4ec82c8bd6f9a99a93ce184968b23 Mon Sep 17 00:00:00 2001 From: Alan Fitton Date: Tue, 22 Nov 2011 14:55:34 +0000 Subject: issue 66 - make paths under the default download dir appear as relative. add a example action script for downloading to local. --- extra/tpull.sh | 45 ++++++++++++++++++++++++++ src/trg-main-window.c | 2 +- src/trg-persistent-tree-view.c | 1 + src/trg-state-selector.c | 2 +- src/trg-torrent-model.c | 73 +++++++++++++++++++++++++++++++++++------- src/trg-torrent-model.h | 1 + 6 files changed, 111 insertions(+), 13 deletions(-) create mode 100644 extra/tpull.sh 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: " + 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, -- cgit v1.2.3