Автоматизируем операции с торрент-клиентом Transmission, очередь файлов

30.04.2013
Допустим Вы подсели на какой то сериал.
Это очень плохо, возможно Вам лучше обратиться к психотерапевту ;)
Но пока Вы этого не сделали, если у Вас не мега быстрый интернет, то вероятно Вы догадаетесь качать не весь сезон сразу, а по серии (скачал, посмотрел, скачал еще).
Со мной приключилась такая беда, еще и скорость раздачи меньше 50кб/сек, но так как мне стало лень клацать по настройкам торрента, добавляя серии по одной (одна серия качается не менее нескольких часов), я посмотрел на возможности автоматизировать этот процесс.
Так как гугл помог найти готовый класс TransmissionRPC, вопрос автоматизации оказался менее трудоемким, чем написать этот пост.
Класс можно взять по адресу http://code.google.com/p/php-transmission-class/source/browse/trunk/class/TransmissionRPC.class.php?r=14
А мои игры с ним на гитхабе https://github.com/Hukuta/transmission/blob/master/index.php

Теперь расскажу что получилось.
У нас есть торрент клиент с встроенным веб-клиентом.
transmission
Включаем его и открываем мой скрипт в браузере,
там должен сразу появиться список добавленных торрентов.

Выбираем наш сериал, проверяем очередь файлов. Если порядок неправильный - нужно дописывать скрипт, менять порядок под конкретный случай. Скрипт не универсальный, главное идея.
<?php
/**
 * Скрипт управляет Transmission для загрузки файлов по очереди.
 * Инструкция:
 * Запустить Transmission, в настройках включить веб-клиент.
 * Открыть в браузере этот скрипт, выбрать нужный торрент.
 * Обновлять страницу (автоматически, плагином браузера) с интервалом на свое усмотрение (например 5 мин)
 *
 * Автор: phpdreamer
 * Дата: 30.04.2013
 */


//http://code.google.com/p/php-transmission-class/source/browse/trunk/class/TransmissionRPC.class.php?r=14
require 'TransmissionRPC.php';

header('Content-type: text/html; charset=utf-8');

error_reporting(E_ALL);

class Transmission extends TransmissionRPC
{
    public function request($method, $arguments)
    {   //сделали метод публичным
        return parent::request($method, $arguments);
    }
}

$t = new Transmission();

if (!isset($_GET['t']))
{
    $torrents = $t->get();
    if (!isset($torrents->arguments->torrents))
        die('Не получили список торрентов');

    //выводим список
    foreach ($torrents->arguments->torrents as $item)
        echo '<div><strong>', $item->id,
        '</strong> <a href="?t=', $item->id, '">', $item->name, '</a></div>';
}
else
{
    //id торрента
    $id = (int) $_GET['t']; //строго должен быть числовым

    //все файлы
    $files = $t->get(array($id), array("files"))->arguments->torrents[0]->files;
    //файлы, отмеченные для скачивания
    $wanted = $t->get(array($id), array("wanted"))->arguments->torrents[0]->wanted;

    //порядок закачки
    $queue = array();
    //флаг: уже все работает, ничего трогать не будем
    $works = false;

    foreach ($files as $i => $file)
    {
        echo $i, '. ';
        if (!isset($file->bytesCompleted))
            $file->bytesCompleted = 0;

        if (!$file->bytesCompleted or $file->bytesCompleted < $file->length)
        {
            echo 'Не докачан: ';
            $queue[] = $file->name;
            if (isset($wanted[$i]))
            {
                $works = true;
                echo ' <b>- качаем его -</b> ';
            }
        }
        else
            echo 'Докачан: ';
        echo $file->name, '<br>';
    }

    //Отсортируем по названию файлов
    sort($queue);


    //Все бы хорошо, но только файл Season 2/S2E10_new.m4v вылез вперед из-за _new в названии, поэтому мы
    //поставим костыль-условие:
    //пока не загрузиться 'Game of Thrones/Season 2/S2E9.m4v', игнорируем 'Game of Thrones/Season 2/S2E10_new.m4v'
    foreach ($queue as $f_id => $file)
        if ($file == 'Game of Thrones/Season 2/S2E10_new.m4v')
            foreach ($queue as $file2)
                if ($file2 == 'Game of Thrones/Season 2/S2E9.m4v')
                    unset($queue[$f_id]);

    echo '<br><h4>Порядок загрузки:</h4>';
    foreach ($queue as $name)
        echo '<div>', $name, '</div>';
    echo '<br>';

    //очередь не пуста, тогда берем первый файл и ставим на закачку
    if (!$works && count($queue))
    {
        $name = array_shift($queue);
        echo '<br>Ставим в очередь ', $name, '<br>';
        foreach ($files as $i => $file)
            if ($file->name == $name)
                break;
        $t->request("torrent-set", array("ids" => array($id), 'files-wanted' => array($i)));

        //на всякий случай запускаем торрент
        $t->request("torrent-start", array("ids" => array($id)));
    }
}
 
0. Не докачан: Game of Thrones/Season 2/S2E10_new.m4v
1. Докачан: Game of Thrones/Season 1/S1E1.m4v
2. Докачан: Game of Thrones/Season 1/S1E8.m4v
3. Докачан: Game of Thrones/Season 1/S1E7.m4v
4. Докачан: Game of Thrones/Season 1/S1E3.m4v
5. Докачан: Game of Thrones/Season 1/S1E9.m4v
6. Докачан: Game of Thrones/Season 1/S1E4.m4v
7. Не докачан: Game of Thrones/Season 2/S2E7.m4v
8. Докачан: Game of Thrones/Season 1/S1E2.m4v
9. Не докачан: Game of Thrones/Season 2/S2E9.m4v
10. Не докачан: Game of Thrones/Season 2/S2E5.m4v
11. Докачан: Game of Thrones/Season 1/S1E5.m4v
12. Не докачан: Game of Thrones/Season 2/S2E6.m4v
13. Докачан: Game of Thrones/Season 2/S2E2.m4v
14. Не докачан: Game of Thrones/Season 2/S2E8.m4v
15. Не докачан: Game of Thrones/Season 3/S3E2.m4v
16. Докачан: Game of Thrones/Season 2/S2E3.m4v
17. Докачан: Game of Thrones/Season 2/S2E1.m4v
18. Докачан: Game of Thrones/Season 1/S1E10.m4v
19. Докачан: Game of Thrones/Season 1/S1E6.m4v
20. Не докачан: Game of Thrones/Season 3/S3E1.m4v
21. Не докачан: Game of Thrones/Season 2/S2E4.m4v
22. Не докачан: Game of Thrones/Season 3/S3E4.m4v
23. Не докачан: Game of Thrones/Season 3/S3E3.m4v

Порядок загрузки:
Game of Thrones/Season 2/S2E4.m4v
Game of Thrones/Season 2/S2E5.m4v
Game of Thrones/Season 2/S2E6.m4v
Game of Thrones/Season 2/S2E7.m4v
Game of Thrones/Season 2/S2E8.m4v
Game of Thrones/Season 2/S2E9.m4v
Game of Thrones/Season 3/S3E1.m4v
Game of Thrones/Season 3/S3E2.m4v
Game of Thrones/Season 3/S3E3.m4v
Game of Thrones/Season 3/S3E4.m4v

Ставим в очередь Game of Thrones/Season 2/S2E4.m4v
Дальше остается обновлять страницу (конечно же автоматически, плагином браузера) с интервалом на свое усмотрение (например 5 мин) или запускать скрипт кроном.
Надеюсь кому-то еще это полезно.
0. Не докачан: Game of Thrones/Season 2/S2E10_new.m4v
1. Докачан: Game of Thrones/Season 1/S1E1.m4v
2. Докачан: Game of Thrones/Season 1/S1E8.m4v
3. Докачан: Game of Thrones/Season 1/S1E7.m4v
4. Докачан: Game of Thrones/Season 1/S1E3.m4v
5. Докачан: Game of Thrones/Season 1/S1E9.m4v
6. Докачан: Game of Thrones/Season 1/S1E4.m4v
7. Не докачан: Game of Thrones/Season 2/S2E7.m4v
8. Докачан: Game of Thrones/Season 1/S1E2.m4v
9. Не докачан: Game of Thrones/Season 2/S2E9.m4v
10. Не докачан: Game of Thrones/Season 2/S2E5.m4v
11. Докачан: Game of Thrones/Season 1/S1E5.m4v
12. Не докачан: Game of Thrones/Season 2/S2E6.m4v
13. Докачан: Game of Thrones/Season 2/S2E2.m4v
14. Не докачан: Game of Thrones/Season 2/S2E8.m4v
15. Не докачан: Game of Thrones/Season 3/S3E2.m4v
16. Докачан: Game of Thrones/Season 2/S2E3.m4v
17. Докачан: Game of Thrones/Season 2/S2E1.m4v
18. Докачан: Game of Thrones/Season 1/S1E10.m4v
19. Докачан: Game of Thrones/Season 1/S1E6.m4v
20. Не докачан: Game of Thrones/Season 3/S3E1.m4v
21. Не докачан: - качаем его - Game of Thrones/Season 2/S2E4.m4v
22. Не докачан: Game of Thrones/Season 3/S3E4.m4v
23. Не докачан: Game of Thrones/Season 3/S3E3.m4v

Порядок загрузки:
Game of Thrones/Season 2/S2E4.m4v
Game of Thrones/Season 2/S2E5.m4v
Game of Thrones/Season 2/S2E6.m4v
Game of Thrones/Season 2/S2E7.m4v
Game of Thrones/Season 2/S2E8.m4v
Game of Thrones/Season 2/S2E9.m4v
Game of Thrones/Season 3/S3E1.m4v
Game of Thrones/Season 3/S3E2.m4v
Game of Thrones/Season 3/S3E3.m4v
Game of Thrones/Season 3/S3E4.m4v

2 оценки
Комментарии
burn:
приветствую...
когда онлайн в аське обычно бываете?...
phpdreamer:
обычно никогда. пишите на email

Оставить комментарий