-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSearchModel.py
138 lines (109 loc) · 3.63 KB
/
SearchModel.py
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
from PySide.QtCore import QAbstractListModel, Slot, Property, Signal, QThread
from piratebay.internet import search_main
class LoadThread(QThread):
def __init__(self, term, pageNumber, parent=None):
QThread.__init__(self, parent)
self._term = term
self._pageNumber = pageNumber
self._torrents = None
def run(self):
self._torrents = None
self._page = None
try:
self._page = search_main(self._term, self._pageNumber)
except:
print "ERROR: falha ao buscar por %s." % self._term
return
self._torrents = []
for row in self._page.all():
self._torrents.append(row)
def data(self):
return (self._page, self._torrents)
class SearchModel(QAbstractListModel):
#Role Name
NAME = 1
SEEDERS = 2
LEECHERS = 3
USER = 4
SIZE = 5
URL = 10
TITLE = 100
SUBTITLE = 101
def __init__(self, term=None):
QAbstractListModel.__init__(self)
self._page = None
self._term = term
self._torrents = []
self._isLoading = False
self._thread = None
self.refresh()
self.setRoleNames({self.NAME : 'ITEM_NAME',
self.SEEDERS : 'ITEM_SEEDERS',
self.LEECHERS : 'ITEM_LEECHERS',
self.USER : 'ITEM_USER',
self.SIZE : 'ITEM_SIZE',
self.URL : 'ITEM_URL',
self.TITLE : 'title',
self.SUBTITLE : 'subtitle'})
@Slot(str)
def search(self, term):
self._term = term
self.refresh()
@Slot(result=int)
def numPages(self):
if not self._page:
return 0
return self._page.get_number_of_pages()
@Slot(int)
def goToPage(self, page):
self.refresh(page)
def refresh(self, page=0):
if not self._term or self._thread:
return
self._setLoading(True)
self._thread = LoadThread(self._term, page, self)
self._thread.finished.connect(self._dataLoaded)
self._thread.start()
def _dataLoaded(self):
(page, results) = self._thread.data()
if not results:
self._setLoading(False)
self._thread = None
return
self.modelAboutToBeReset.emit()
self._page = page
self._torrents = results
self.modelReset.emit()
self._setLoading(False)
self._thread = None
def rowCount(self, index):
return len(self._torrents)
def data(self, index, role):
if index.row() > len(self._torrents):
return ''
t = self._torrents[index.row()]
if role == SearchModel.NAME:
return t.name
elif role == SearchModel.SEEDERS:
return t.seeders
elif role == SearchModel.LEECHERS:
return t.leechers
elif role == SearchModel.USER:
return t.user
elif role == SearchModel.SIZE:
return t.size_of
elif role == SearchModel.URL:
return t.magnet_url
elif role == SearchModel.TITLE:
return t.name
elif role == SearchModel.SUBTITLE:
return "Size %s ULead by %s SE/LE %s/%s" % (t.size_of, t.user, t.seeders, t.leechers)
else:
return ''
def _setLoading(self, flag):
self._isLoading = flag
self._loadingChanged.emit()
def _isLoading(self):
return self._isLoading
_loadingChanged = Signal()
isLoading = Property(bool, _isLoading, notify=_loadingChanged)