purebasic.info

PureBasic forum
Текущее время: Пт дек 13, 2019 11:21 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: База раздач RuTracker
СообщениеДобавлено: Чт янв 17, 2019 9:12 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6567
Благодарил (а): 32 раз.
Поблагодарили: 222 раз.
Пункты репутации: 59
На самом RuTracker есть база раздач собранная поисковым ботом. Там представлены доступные раздачи rutracker.org, с оформлением, метаданными, списками файлов и магнитными ссылками.
Данная база может использоваться в случае недоступности рутрекера или других непредвиденных случаях.
Её можно скачать с Яндекс диска в архиве весит 2.64 Гига, если распаковать то 19.5 Гигов файла .xml/
Такой файл для редактирования не смог у меня открыть ни один редактор. Даже Word и Notepad++ отказались. Просмотреть содержимое удалось через F3 вьюером Total Commander. Сами понимаете, работать с таким фалом не очень удобно.
В общем, перегнал я этот xml в базу SQLite кодом на коленке, оставил только 3 поля имя, ссылка и URL картинки. Построчно парсил, как текст, ибо разбираться в структуре xml было лень. Код работал 4 часа, это почти 5 Гигов текста в час, или если интересно было обработано 330,432,424 строки!. Получилось всего в итоге 505 Мб базы данных SQLite.
Что вышло:
Изображение
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #ListTrack
  #Image_1
  #StrFind
  #ButFind
  #ButLoad
  #ButClear
EndEnumeration
;}
;{ Images
Enumeration
  #Image_Image_1
EndEnumeration
;}
UseSQLiteDatabase()
InitNetwork()
UseJPEGImageDecoder()
DatabaseFile$ = "rutrackbase1.trk"
If OpenDatabase(0, DatabaseFile$, "", "")
  CreateDirectory(GetPathPart(ProgramFilename()) + "BaseImg")
  Else
    MessageRequester("Ошибка",DatabaseFile$ + " - файл базы данных не найден !")
    End
 EndIf
 Structure Rezult
   name.s
   hach.s
   image.s
 EndStructure
 Dim Rezult.Rezult(0)
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 517, 128, 1000, 400, "rutracker", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
   
      ListViewGadget(#ListTrack, 5, 15, 705, 315)
      ImageGadget(#Image_1, 715, 15, 260, 315, 0, #PB_Image_Border)
      StringGadget(#StrFind, 10, 350, 480, 30, "")
      ButtonGadget(#ButFind, 510, 350, 130, 30, "Поиск")
      ButtonGadget(#ButLoad, 715, 345, 115, 35, "Загрузить")
      ButtonGadget(#ButClear, 860, 345, 115, 35, "Очистить")
   
  EndIf
EndProcedure
 
OpenWindow_Window_0()
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #ListTrack
        state = GetGadgetState(#ListTrack)
        ; Пытаемся грузить фото выбранной раздачи
        Filename$ = GetPathPart(ProgramFilename()) + "BaseImg/" + GetFilePart(Rezult(state)\image)
        If  FileSize(Filename$)>0 ; если уже есть такое
          If LoadImage(0,Filename$)
                    ResizeImage(0,260,315)
                    SetGadgetState(#Image_1,ImageID(0))
                  Else
                    DeleteFile(Filename$)
                    MessageRequester("Ошибка изображения","Изображение не найдено")
          EndIf  
        Else                      ; Грузим по ссылке
              If Len(Rezult(state)\image)>5
                If ReceiveHTTPFile(Rezult(state)\image, Filename$)
                  If LoadImage(0,Filename$)
                    ResizeImage(0,260,315)
                    SetGadgetState(#Image_1,ImageID(0))
                    Else         ; Если вместо изображения загрузило мусор
                      MessageRequester("Ошибка изображения","Изображение не найдено")
                      SetGadgetState(#Image_1,0)
                  EndIf  
                Else            ; Если ссылка умерла
                  MessageRequester("Ошибка изображения","Изображение не найдено")
                  SetGadgetState(#Image_1,0)
                EndIf
              Else    ; если нет ссылки на изображение
                MessageRequester("Ошибка изображения","Изображение не найдено")
                SetGadgetState(#Image_1,0)
              EndIf        
        EndIf
     ElseIf EventGadget = #ButFind
        ;"Select * FROM rutrack WHERE  name LIKE '%vb6%' OR name LIKE '%purebasic%'" ; пример множественного выбора
        textSearsh$ = GetGadgetText(#StrFind)
         
         If DatabaseQuery(0, "Select * FROM rutrack WHERE  name LIKE '%"+textSearsh$+"%'"); Запрос на кириллице чувствителен к регистру!
           i =0
           Dim Rezult(i)
           While NextDatabaseRow(0)
           Rezult(i)\name  = GetDatabaseString(0, 0)
           Rezult(i)\hach  = "magnet:?xt=urn:btih:" +  GetDatabaseString(0, 1) ; формируем магнет ссылку из хеша раздачи
           Rezult(i)\image = GetDatabaseString(0, 2)
           AddGadgetItem (#ListTrack, -1,Rezult(i)\name)
           i+1
           ReDim Rezult(i)
         Wend
     
         FinishDatabaseQuery(0)
      EndIf
       
    ElseIf EventGadget = #ButLoad
      If Len(Rezult(state)\hach)>40
        RunProgram(Rezult(state)\hach)
      EndIf
     
    ElseIf EventGadget = #ButClear
        ClearGadgetItems(#ListTrack)
        FreeArray(Rezult())
        SetGadgetState(#Image_1,0)
        SetGadgetText(#StrFind,"")
        If DeleteDirectory(GetPathPart(ProgramFilename()) + "BaseImg","*.*" )
           CreateDirectory(GetPathPart(ProgramFilename()) + "BaseImg")
        EndIf
       
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        CloseDatabase(0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
 



Для полноценной работы нужен установленный uTorrent или аналог, главное чтобы в система ассоциировала магнет ссылки с торрент клиентом. В uTorrent это есть точно.
И второй момент, при поиске запрос на русском регистрозависимый, вроде как это особенность БД, это надо учитывать. Надо было при перегонке файла в БД всё заранее перевести названия раздач в нижний регистр, но не догадался, а теперь лень переделывать. Если на латинице, то проблем нет, можно искать всё маленькими буквами.
В общем если кому идея интересная, то можете развивать.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB