Jump to content
Sign in to follow this  
theG

uTorrent automation jobs

Recommended Posts

theG

Just discovered AutoIt, pretty interesting. But before I start testing out, I would like to know if what I want to do is possible.

I would need to run the script every X minutes to control uTorrent. uTorrent window could be active, inactive or minimized in tray, if that matters.

What I want to do is checking if torrent A has X amount of seeders, then set Maximum Upload Speed to '1' AND label torrent "Seeding: Slowed".

Else: set Maximum Upload Speed to '0' wich is unlimited, and label torrent "Seeding: Full speed".

There are two ways to know how many seeders for each torrent: column, and torrent properties window.

The only way to label a torrent is by right clicking it and choosing a label.

The script would have to check thousands of torrents at once.

Share this post


Link to post
Share on other sites
evilertoaster

t before I start testing out, I would like to know if what I want to do is possible

It is possible.

:)

Share this post


Link to post
Share on other sites
theG

It is possible.

:)

Gooood. I've tried a few things and am about to give up already. Looks like it'd be more complicated to do than I thought.

Share this post


Link to post
Share on other sites
theG

I looked in the Help, and to be honnest I don't really know where to start. There's a lot of stuff in there, and what I want to achieve is more than a simple 'Hello World' script.

Anyone would be kind enough to put me on the right track? I don't really know what functions to look at. Once I know, I'll be able to do the rest myself. Well, I'll try at least :)

A good start would be to know how to get to the torrent properties window. Then I'll be able to get all the infos I need myself, change values, etc..

I thought each torrent would have a different ID # or something like that and then I could get the number of torrents, and check the # of seeders and upload speed set of each one, but using AutoIt Window Info I couldn't find an individual ID for each torrent.. so yeah. I don't know. :-/

Share this post


Link to post
Share on other sites
FreeFry

I think this should work:

#Include <GuiListView.au3>
#include <WinAPI.au3>

Opt("WinTitleMatchMode", 4)

Dim $MaxSeeds = 30 ; Change this value to desired max ammount of seeders before it should limit upload
Dim $ReCheckTime = 5 ; Number of minutes it should wait before rechecking already limited torrents/downloads
Dim $aItems[1024][2] ; You can increase 1024 to any number of max torrents/downloads you want to support/check




; should not be any need to change any of the code below

$iPid = ProcessExists("uTorrent.exe")
If Not $iPid Then Exit 1

; This gets the main window of uTorrent
$hWindow = _ProcessGetWinEx("uTorrent.exe", "", "Torrent")
If Not $hWindow[0] Then Exit 1

; Gets the handle of the list of the torrents/downloads
$hControl = ControlGetHandle($hWindow[1], "", "[CLASSNN:SysListView322]")

; Gets the "Seeds" column
$iColumn = _GetSeedsColumn()
If $iColumn = -1 Then Exit 1

; Continously checks the torrents in the list each 1.5 second
While 1
    _CheckSeeds()
    Sleep(1500)
WEnd

Func _CheckSeeds()
    Local $iItemCount = _GUICtrlListView_GetItemCount($hControl)
    For $i = 0 To $iItemCount-1
        $iSeeds = _GUICtrlListView_GetItemText($hControl, $i, $iColumn)
        $iSeeds = Number(StringLeft($iSeeds, StringInStr($iSeeds, "(")-2))
        If $iSeeds >= $MaxSeeds And (Not $aItems[$i][0] Or ($aItems[$i][0] And TimerDiff($aItems[$i][1]) >= ($ReCheckTime*60*1000))) Then
            $aItems[$i][1] = TimerInit()
            $aItems[$i][0] = True
            _LimitUpload($i)
        ElseIf $iSeeds < $MaxSeeds Then
            $aItems[$i][1] = 0
            $aItems[$i][0] = False
        EndIf
        Sleep(1)
    Next
EndFunc

Func _LimitUpload($iItemIndex)
    If Not Winactive($hWindow[1]) Then WinActivate($hWindow[1])
    Do
        WinActivate($hWindow[1])
        Sleep(250)
    Until WinActive($hWindow[1])
    
    ConsoleWrite("Clicking on item with index: " & $iItemIndex & @LF)
    
    _GUICtrlListView_ClickItem($hControl, $iItemIndex, "right", False, 1, 1)
    
    ControlSend("[ACTIVE]", "", "", "{down 10}{right}{down 4}{right}{down}{enter}")
    
EndFunc

Func _ProcessGetWinEx($ivPid, $svClass = "", $svTitle = "", $svText = "")
   
    $ivPid = ProcessExists($ivPid)
    If Not $ivPid Then Return(SetError(1, 0, 0))
    
    Local $avwArray = WinList()
    Local $avRet[1] = [0]
   
    For $i = 1 To $avwArray[0][0]
        If WinGetProcess($avwArray[$i][1]) = $ivPid Then
            If $svClass = "" Or _WinAPI_GetClassName($avwArray[$i][1]) = $svClass Then
                If ($svTitle = "" Or StringInStr($avwArray[$i][0], $svTitle)) And ($svText = "" Or StringInStr(WinGetText($avwArray[$i][1]), $svText)) Then
                    $avRet[0] += 1
                    ReDim $avRet[$avRet[0]+1]
                    $avRet[$avRet[0]] = $avwArray[$i][1]
                EndIf
            EndIf
        EndIf
    Next
   
    Return $avRet
   
EndFunc

Func _GetSeedsColumn()
    Local $iColumns = _GUICtrlListView_GetColumnCount($hControl)
    For $i = 0 To $iColumns-1
        Local $aColumn = _GUICtrlListView_GetColumn($hControl, $i)
        If $aColumn[5] = "Seeds" Then 
            Return $i
        EndIf
    Next
    Return -1
EndFunc

Note that it requires that you don't click around, etc. when it tries to limit a torrent, because then it will mess up..

Share this post


Link to post
Share on other sites
theG

Wow, greeeat.

There seem to be a problem somewhere.

I've tested out by putting a MsgBox to see where the script exits and it seems to be in the _GetSeedsColumn() function

Did you test it yourself? Was it working?

in $aColumn[5], does the 5 stands for 5th column? If so, I better use a variable to set manually as it can change. That's all I came up with so far :)

Thanks alot

Share this post


Link to post
Share on other sites
FreeFry

Hmm, it should work, all that function does is look through all the columns until it finds one with the text "Seeds", that's to counter possible re-arrangement of the columns..

Yes, I tried it, and it workt just fine for me. :)

The 5 in $aColumn[5] is the "Column header text", returned from the _GUICtrlListView_GetColumn function.

Edited by FreeFry

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×