Spring cleanup

This commit is contained in:
Ruud committed 2014-03-29 23:44:14 +01:00
1 parent 83c5d701b3
commit 99e77e409a
98 files changed
+469 -489

No files matched your search

+1
View File
@@ -5,6 +5,7 @@ from couchpotato import get_db, CPLog
from couchpotato.core.event import addEvent, fireEvent, fireEventAsync
from couchpotato.core.helpers.encoding import toUnicode
from couchpotato.core.plugins.base import Plugin
import six
log = CPLog(__name__)
@@ -1,5 +1,6 @@
from .main import Library
def autoload():
return Library()
@@ -1,5 +1,6 @@
from .main import Matcher
def autoload():
return Matcher()
+3 -5
View File
@@ -222,7 +222,6 @@ class MediaPlugin(MediaBase):
del filter_by['media_status']
del filter_by['release_status']
# Filter by combining ids
for x in filter_by:
media_ids = [n for n in media_ids if n in filter_by[x]]
@@ -281,7 +280,7 @@ class MediaPlugin(MediaBase):
for media_type in fireEvent('media.types', merge = True):
def tempList(*args, **kwargs):
return self.listView(types = media_type, *args, **kwargs)
return self.listView(types = media_type, **kwargs)
addApiView('%s.list' % media_type, tempList)
def availableChars(self, types = None, status = None, release_status = None):
@@ -350,7 +349,7 @@ class MediaPlugin(MediaBase):
for media_type in fireEvent('media.types', merge = True):
def tempChar(*args, **kwargs):
return self.charView(types = media_type, *args, **kwargs)
return self.charView(types = media_type, **kwargs)
addApiView('%s.available_chars' % media_type, tempChar)
def delete(self, media_id, delete_from = None):
@@ -382,9 +381,8 @@ class MediaPlugin(MediaBase):
if release.get('status') == 'done':
db.delete(release)
total_deleted += 1
new_media_status = 'active'
if total_releases == total_deleted:
if total_releases == total_deleted and media['status'] != 'active':
db.delete(media)
deleted = True
elif new_media_status:
@@ -18,7 +18,7 @@ class Base(NZBProvider):
'search': 'https://www.binsearch.info/index.php?%s',
}
http_time_between_calls = 4 # Seconds
http_time_between_calls = 4 # Seconds
def _search(self, media, quality, results):
@@ -28,7 +28,7 @@ class Base(NZBProvider):
try:
html = BeautifulSoup(data)
main_table = html.find('table', attrs = {'id':'r2'})
main_table = html.find('table', attrs = {'id': 'r2'})
if not main_table:
return
@@ -36,11 +36,11 @@ class Base(NZBProvider):
items = main_table.find_all('tr')
for row in items:
title = row.find('span', attrs = {'class':'s'})
title = row.find('span', attrs = {'class': 's'})
if not title: continue
nzb_id = row.find('input', attrs = {'type':'checkbox'})['name']
nzb_id = row.find('input', attrs = {'type': 'checkbox'})['name']
info = row.find('span', attrs = {'class':'d'})
size_match = re.search('size:.(?P<size>[0-9\.]+.[GMB]+)', info.text)
@@ -18,7 +18,7 @@ class Base(NZBProvider, RSS):
'search': 'https://www.nzbclub.com/nzbfeeds.aspx?%s',
}
http_time_between_calls = 4 #seconds
http_time_between_calls = 4 # seconds
def _search(self, media, quality, results):
@@ -55,7 +55,7 @@ class Base(NZBProvider, RSS):
def getMoreInfo(self, item):
full_description = self.getCache('nzbclub.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description)
nfo_pre = html.find('pre', attrs = {'class':'nfo'})
nfo_pre = html.find('pre', attrs = {'class': 'nfo'})
description = toUnicode(nfo_pre.text) if nfo_pre else ''
item['description'] = description
@@ -91,7 +91,7 @@ class Base(NZBProvider, RSS):
nfo_url = re.search('href=\"(?P<nfo>.+)\" ', item['description']).group('nfo')
full_description = self.getCache('nzbindex.%s' % item['id'], url = nfo_url, cache_timeout = 25920000)
html = BeautifulSoup(full_description)
item['description'] = toUnicode(html.find('pre', attrs = {'id':'nfo0'}).text)
item['description'] = toUnicode(html.find('pre', attrs = {'id': 'nfo0'}).text)
except:
pass
@@ -20,7 +20,7 @@ class Base(NZBProvider, RSS):
'detail_url': 'https://omgwtfnzbs.org/details.php?id=%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
cat_ids = [
([15], ['dvdrip']),
@@ -21,7 +21,7 @@ class Base(TorrentProvider):
}
# Searches for movies only - BiT-HDTV's subcategory and resolution search filters appear to be broken
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _search(self, media, quality, results):
@@ -40,7 +40,7 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
result_table = html.find('table', attrs = {'width' : '750', 'class' : ''})
result_table = html.find('table', attrs = {'width': '750', 'class': ''})
if result_table is None:
return
@@ -74,7 +74,7 @@ class Base(TorrentProvider):
def getMoreInfo(self, item):
full_description = self.getCache('bithdtv.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description)
nfo_pre = html.find('table', attrs = {'class':'detail'})
nfo_pre = html.find('table', attrs = {'class': 'detail'})
description = toUnicode(nfo_pre.text) if nfo_pre else ''
item['description'] = description
@@ -20,7 +20,7 @@ class Base(TorrentProvider):
'baseurl': 'https://www.bitsoup.me/%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _searchOnTitle(self, title, movie, quality, results):
@@ -30,7 +30,7 @@ class Base(TorrentProvider):
})
url = "%s&%s" % (self.urls['search'], arguments)
url = self.urls['search'] % self.buildUrl(media, quality)
url = self.urls['search'] % self.buildUrl(movie, quality)
data = self.getHTMLData(url)
if data:
@@ -74,7 +74,6 @@ class Base(TorrentProvider):
except:
log.error('Failed getting results from %s: %s', (self.getName(), traceback.format_exc()))
def getLoginParams(self):
return {
'username': self.conf('username'),
@@ -82,7 +81,6 @@ class Base(TorrentProvider):
'ssl': 'yes',
}
def loginSuccess(self, output):
return 'logout.php' in output.lower()
@@ -19,7 +19,7 @@ class Base(TorrentProvider):
'api': 'https://hdbits.org/api/torrents'
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _post_query(self, **params):
@@ -56,7 +56,7 @@ class Base(TorrentProvider):
'name': result['name'],
'url': self.urls['download'] % (result['id'], self.conf('passkey')),
'detail_url': self.urls['detail'] % result['id'],
'size': tryInt(result['size'])/1024/1024,
'size': tryInt(result['size']) / 1024 / 1024,
'seeders': tryInt(result['seeders']),
'leechers': tryInt(result['leechers'])
})
@@ -23,9 +23,9 @@ class Base(TorrentProvider):
}
cat_ids = [
(['41'], ['720p', '1080p', 'brrip']),
(['19'], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']),
(['20'], ['dvdr'])
(['41'], ['720p', '1080p', 'brrip']),
(['19'], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']),
(['20'], ['dvdr'])
]
cat_backup_id = 200
@@ -79,7 +79,7 @@ class Base(TorrentProvider):
return confirmed + trusted + vip + moderated
id = re.search('id=(?P<id>\d+)&', link).group('id')
url = self.urls['download'] % (download)
url = self.urls['download'] % download
fileSize = self.parseSize(result.select('td.rowhead')[5].text)
results.append({
@@ -113,7 +113,7 @@ class Base(TorrentProvider):
try:
full_description = self.getHTMLData(item['detail_url'])
html = BeautifulSoup(full_description)
nfo_pre = html.find('td', attrs = {'class':'main'}).findAll('table')[1]
nfo_pre = html.find('td', attrs = {'class': 'main'}).findAll('table')[1]
description = toUnicode(nfo_pre.text) if nfo_pre else ''
except:
log.error('Failed getting more info for %s', item['name'])
@@ -21,7 +21,7 @@ class Base(TorrentProvider):
'search': 'https://www.iptorrents.com/torrents/?l%d=1%s&q=%s&qf=ti&p=%d',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
cat_backup_id = None
def buildUrl(self, title, media, quality):
@@ -53,14 +53,14 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
page_nav = html.find('span', attrs = {'class' : 'page_nav'})
page_nav = html.find('span', attrs = {'class': 'page_nav'})
if page_nav:
next_link = page_nav.find("a", text = "Next")
if next_link:
final_page_link = next_link.previous_sibling.previous_sibling
pages = int(final_page_link.string)
result_table = html.find('table', attrs = {'class' : 'torrents'})
result_table = html.find('table', attrs = {'class': 'torrents'})
if not result_table or 'nothing found!' in data.lower():
return
@@ -80,8 +80,8 @@ class Base(TorrentProvider):
torrent_download_url = self.urls['base_url'] + (result.find_all('td')[3].find('a'))['href'].replace(' ', '.')
torrent_details_url = self.urls['base_url'] + torrent['href']
torrent_size = self.parseSize(result.find_all('td')[5].string)
torrent_seeders = tryInt(result.find('td', attrs = {'class' : 'ac t_seeders'}).string)
torrent_leechers = tryInt(result.find('td', attrs = {'class' : 'ac t_leechers'}).string)
torrent_seeders = tryInt(result.find('td', attrs = {'class': 'ac t_seeders'}).string)
torrent_leechers = tryInt(result.find('td', attrs = {'class': 'ac t_leechers'}).string)
results.append({
'id': torrent_id,
@@ -26,7 +26,7 @@ class Base(TorrentMagnetProvider):
(['dvd'], ['dvdr']),
]
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
cat_backup_id = None
proxy_list = [
@@ -18,12 +18,12 @@ log = CPLog(__name__)
class Base(TorrentProvider):
urls = {
'domain': 'https://tls.passthepopcorn.me',
'detail': 'https://tls.passthepopcorn.me/torrents.php?torrentid=%s',
'torrent': 'https://tls.passthepopcorn.me/torrents.php',
'login': 'https://tls.passthepopcorn.me/ajax.php?action=login',
'login_check': 'https://tls.passthepopcorn.me/ajax.php?action=login',
'search': 'https://tls.passthepopcorn.me/search/%s/0/7/%d'
'domain': 'https://tls.passthepopcorn.me',
'detail': 'https://tls.passthepopcorn.me/torrents.php?torrentid=%s',
'torrent': 'https://tls.passthepopcorn.me/torrents.php',
'login': 'https://tls.passthepopcorn.me/ajax.php?action=login',
'login_check': 'https://tls.passthepopcorn.me/ajax.php?action=login',
'search': 'https://tls.passthepopcorn.me/search/%s/0/7/%d'
}
http_time_between_calls = 2
@@ -136,23 +136,23 @@ class Base(TorrentProvider):
def htmlToUnicode(self, text):
def fixup(m):
text = m.group(0)
if text[:2] == "&#":
txt = m.group(0)
if txt[:2] == "&#":
# character reference
try:
if text[:3] == "&#x":
return unichr(int(text[3:-1], 16))
if txt[:3] == "&#x":
return unichr(int(txt[3:-1], 16))
else:
return unichr(int(text[2:-1]))
return unichr(int(txt[2:-1]))
except ValueError:
pass
else:
# named entity
try:
text = unichr(htmlentitydefs.name2codepoint[text[1:-1]])
txt = unichr(htmlentitydefs.name2codepoint[txt[1:-1]])
except KeyError:
pass
return text # leave as is
return txt # leave as is
return re.sub("&#?\w+;", fixup, six.u('%s') % text)
def unicodeToASCII(self, text):
@@ -164,11 +164,11 @@ class Base(TorrentProvider):
def getLoginParams(self):
return {
'username': self.conf('username'),
'password': self.conf('password'),
'passkey': self.conf('passkey'),
'keeplogged': '1',
'login': 'Login'
'username': self.conf('username'),
'password': self.conf('password'),
'passkey': self.conf('passkey'),
'keeplogged': '1',
'login': 'Login'
}
def loginSuccess(self, output):
@@ -34,7 +34,7 @@ class Base(TorrentMagnetProvider):
query = self.buildUrl(media)
params = tryUrlencode({
'page':'torrents',
'page': 'torrents',
'search': query,
'active': 1,
})
@@ -22,7 +22,7 @@ class Base(TorrentProvider):
'download': 'https://www.sceneaccess.eu/%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _search(self, media, quality, results):
@@ -33,16 +33,16 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
resultsTable = html.find('table', attrs = {'id' : 'torrents-table'})
resultsTable = html.find('table', attrs = {'id': 'torrents-table'})
if resultsTable is None:
return
entries = resultsTable.find_all('tr', attrs = {'class' : 'tt_row'})
entries = resultsTable.find_all('tr', attrs = {'class': 'tt_row'})
for result in entries:
link = result.find('td', attrs = {'class' : 'ttr_name'}).find('a')
url = result.find('td', attrs = {'class' : 'td_dl'}).find('a')
leechers = result.find('td', attrs = {'class' : 'ttr_leechers'}).find('a')
link = result.find('td', attrs = {'class': 'ttr_name'}).find('a')
url = result.find('td', attrs = {'class': 'td_dl'}).find('a')
leechers = result.find('td', attrs = {'class': 'ttr_leechers'}).find('a')
torrent_id = link['href'].replace('details?id=', '')
results.append({
@@ -50,8 +50,8 @@ class Base(TorrentProvider):
'name': link['title'],
'url': self.urls['download'] % url['href'],
'detail_url': self.urls['detail'] % torrent_id,
'size': self.parseSize(result.find('td', attrs = {'class' : 'ttr_size'}).contents[0]),
'seeders': tryInt(result.find('td', attrs = {'class' : 'ttr_seeders'}).find('a').string),
'size': self.parseSize(result.find('td', attrs = {'class': 'ttr_size'}).contents[0]),
'seeders': tryInt(result.find('td', attrs = {'class': 'ttr_seeders'}).find('a').string),
'leechers': tryInt(leechers.string) if leechers else 0,
'get_more_info': self.getMoreInfo,
})
@@ -62,7 +62,7 @@ class Base(TorrentProvider):
def getMoreInfo(self, item):
full_description = self.getCache('sceneaccess.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description)
nfo_pre = html.find('div', attrs = {'id':'details_table'})
nfo_pre = html.find('div', attrs = {'id': 'details_table'})
description = toUnicode(nfo_pre.text) if nfo_pre else ''
item['description'] = description
@@ -108,7 +108,7 @@ class Base(TorrentMagnetProvider):
def getMoreInfo(self, item):
full_description = self.getCache('tpb.%s' % item['id'], item['detail_url'], cache_timeout = 25920000)
html = BeautifulSoup(full_description)
nfo_pre = html.find('div', attrs = {'class':'nfo'})
nfo_pre = html.find('div', attrs = {'class': 'nfo'})
description = toUnicode(nfo_pre.text) if nfo_pre else ''
item['description'] = description
@@ -31,7 +31,7 @@ class Base(TorrentProvider):
([20], ['dvdr']),
]
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
cat_backup_id = None
def _searchOnTitle(self, title, movie, quality, results):
@@ -43,7 +43,7 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
result_table = html.find('table', attrs = {'border' : '1'})
result_table = html.find('table', attrs = {'border': '1'})
if not result_table:
return
@@ -52,7 +52,7 @@ class Base(TorrentProvider):
for result in entries[1:]:
cells = result.find_all('td')
link = cells[1].find('a', attrs = {'class' : 'index'})
link = cells[1].find('a', attrs = {'class': 'index'})
full_id = link['href'].replace('details.php?id=', '')
torrent_id = full_id[:6]
@@ -16,7 +16,7 @@ class Base(TorrentProvider):
'download': 'http://www.td.af/download.php/%s/%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _search(self, media, quality, results):
@@ -21,7 +21,7 @@ class Base(TorrentProvider):
'download': 'http://www.torrentleech.org%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
cat_backup_id = None
def _search(self, media, quality, results):
@@ -34,7 +34,7 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
result_table = html.find('table', attrs = {'id' : 'torrenttable'})
result_table = html.find('table', attrs = {'id': 'torrenttable'})
if not result_table:
return
@@ -42,9 +42,9 @@ class Base(TorrentProvider):
for result in entries[1:]:
link = result.find('td', attrs = {'class' : 'name'}).find('a')
url = result.find('td', attrs = {'class' : 'quickdownload'}).find('a')
details = result.find('td', attrs = {'class' : 'name'}).find('a')
link = result.find('td', attrs = {'class': 'name'}).find('a')
url = result.find('td', attrs = {'class': 'quickdownload'}).find('a')
details = result.find('td', attrs = {'class': 'name'}).find('a')
results.append({
'id': link['href'].replace('/torrent/', ''),
@@ -52,8 +52,8 @@ class Base(TorrentProvider):
'url': self.urls['download'] % url['href'],
'detail_url': self.urls['download'] % details['href'],
'size': self.parseSize(result.find_all('td')[4].string),
'seeders': tryInt(result.find('td', attrs = {'class' : 'seeders'}).string),
'leechers': tryInt(result.find('td', attrs = {'class' : 'leechers'}).string),
'seeders': tryInt(result.find('td', attrs = {'class': 'seeders'}).string),
'leechers': tryInt(result.find('td', attrs = {'class': 'leechers'}).string),
})
except:
@@ -21,7 +21,7 @@ class Base(TorrentProvider):
'download': 'https://torrentshack.net/%s',
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # Seconds
def _search(self, media, quality, results):
@@ -32,16 +32,16 @@ class Base(TorrentProvider):
html = BeautifulSoup(data)
try:
result_table = html.find('table', attrs = {'id' : 'torrent_table'})
result_table = html.find('table', attrs = {'id': 'torrent_table'})
if not result_table:
return
entries = result_table.find_all('tr', attrs = {'class' : 'torrent'})
entries = result_table.find_all('tr', attrs = {'class': 'torrent'})
for result in entries:
link = result.find('span', attrs = {'class' : 'torrent_name_link'}).parent
url = result.find('td', attrs = {'class' : 'torrent_td'}).find('a')
link = result.find('span', attrs = {'class': 'torrent_name_link'}).parent
url = result.find('td', attrs = {'class': 'torrent_td'}).find('a')
results.append({
'id': link['href'].replace('torrents.php?torrentid=', ''),
@@ -16,7 +16,7 @@ class Base(TorrentProvider):
'detail': '%s/api/movie.json?id=%s'
}
http_time_between_calls = 1 #seconds
http_time_between_calls = 1 # seconds
proxy_list = [
'http://yify.unlocktorrent.com',
@@ -6,12 +6,11 @@
top: 0;
text-align: right;
height: 100%;
border-bottom: 4px solid transparent;
transition: all .4s cubic-bezier(0.9,0,0.1,1);
position: absolute;
z-index: 20;
border: 1px solid transparent;
border-width: 0 0 4px;
border: 0 solid transparent;
border-bottom-width: 4px;
}
.search_form:hover {
border-color: #047792;
@@ -22,19 +21,19 @@
right: 44px;
}
}
.search_form.focused,
.search_form.shown {
border-color: #04bce6;
}
.search_form .input {
height: 100%;
overflow: hidden;
width: 45px;
transition: all .4s cubic-bezier(0.9,0,0.1,1);
}
.search_form.focused .input,
.search_form.shown .input {
width: 380px;
@@ -49,7 +48,6 @@
color: #FFF;
font-size: 25px;
height: 100%;
padding: 10px;
width: 100%;
opacity: 0;
padding: 0 40px 0 10px;
@@ -59,23 +57,23 @@
.search_form.shown .input input {
opacity: 1;
}
.search_form input::-ms-clear {
width : 0;
height: 0;
}
@media all and (max-width: 480px) {
.search_form .input input {
font-size: 15px;
}
.search_form.focused .input,
.search_form.shown .input {
width: 277px;
}
}
.search_form .input a {
position: absolute;
top: 0;
@@ -89,7 +87,7 @@
font-size: 15px;
color: #FFF;
}
.search_form .input a:after {
content: "\e03e";
}
@@ -97,7 +95,7 @@
.search_form.shown.filled .input a:after {
content: "\e04e";
}
@media all and (max-width: 480px) {
.search_form .input a {
line-height: 44px;
@@ -167,13 +165,13 @@
.media_result .options select[name=title] { width: 170px; }
.media_result .options select[name=profile] { width: 90px; }
.media_result .options select[name=category] { width: 80px; }
@media all and (max-width: 480px) {
.media_result .options select[name=title] { width: 90px; }
.media_result .options select[name=profile] { width: 50px; }
.media_result .options select[name=category] { width: 50px; }
}
.media_result .options .button {
@@ -227,14 +225,14 @@
right: 7px;
vertical-align: middle;
}
.media_result .info h2 {
margin: 0;
font-weight: normal;
font-size: 20px;
padding: 0;
}
.search_form .info h2 {
position: absolute;
width: 100%;
@@ -247,12 +245,12 @@
overflow: hidden;
white-space: nowrap;
}
.search_form .info h2 .title {
position: absolute;
width: 88%;
}
.media_result .info h2 .year {
padding: 0 5px;
text-align: center;
@@ -260,14 +258,14 @@
width: 12%;
right: 0;
}
@media all and (max-width: 480px) {
.search_form .info h2 .year {
font-size: 12px;
margin-top: 7px;
}
}
.search_form .mask,
@@ -277,4 +275,4 @@
width: 100%;
left: 0;
top: 0;
}
}
@@ -16,7 +16,7 @@ Block.Search = new Class({
'keyup': self.keyup.bind(self),
'focus': function(){
if(focus_timer) clearTimeout(focus_timer);
self.el.addClass('focused')
self.el.addClass('focused');
if(this.get('value'))
self.hideResults(false)
},
@@ -57,17 +57,17 @@ Block.Search = new Class({
(e).preventDefault();
if(self.last_q === ''){
self.input.blur()
self.input.blur();
self.last_q = null;
}
else {
self.last_q = '';
self.input.set('value', '');
self.input.focus()
self.input.focus();
self.media = {}
self.results.empty()
self.media = {};
self.results.empty();
self.el.removeClass('filled')
}
@@ -92,16 +92,16 @@ Block.Search = new Class({
self.hidden = bool;
},
keyup: function(e){
keyup: function(){
var self = this;
self.el[self.q() ? 'addClass' : 'removeClass']('filled')
self.el[self.q() ? 'addClass' : 'removeClass']('filled');
if(self.q() != self.last_q){
if(self.api_request && self.api_request.isRunning())
self.api_request.cancel();
if(self.autocomplete_timer) clearTimeout(self.autocomplete_timer)
if(self.autocomplete_timer) clearTimeout(self.autocomplete_timer);
self.autocomplete_timer = self.autocomplete.delay(300, self)
}
@@ -111,7 +111,7 @@ Block.Search = new Class({
var self = this;
if(!self.q()){
self.hideResults(true)
self.hideResults(true);
return
}
@@ -139,7 +139,7 @@ Block.Search = new Class({
})
}
else
self.fill(q, cache)
self.fill(q, cache);
self.last_q = q;
@@ -148,31 +148,31 @@ Block.Search = new Class({
fill: function(q, json){
var self = this;
self.cache[q] = json
self.cache[q] = json;
self.media = {}
self.results.empty()
Object.each(json, function(media, type){
self.media = {};
self.results.empty();
Object.each(json, function(media){
if(typeOf(media) == 'array'){
Object.each(media, function(m){
var m = new Block.Search[m.type.capitalize() + 'Item'](m);
$(m).inject(self.results)
self.media[m.imdb || 'r-'+Math.floor(Math.random()*10000)] = m
$(m).inject(self.results);
self.media[m.imdb || 'r-'+Math.floor(Math.random()*10000)] = m;
if(q == m.imdb)
m.showOptions()
});
}
})
});
// Calculate result heights
var w = window.getSize(),
rc = self.result_container.getCoordinates();
self.results.setStyle('max-height', (w.y - rc.top - 50) + 'px')
self.results.setStyle('max-height', (w.y - rc.top - 50) + 'px');
self.mask.fade('out')
},
@@ -185,4 +185,4 @@ Block.Search = new Class({
return this.input.get('value').trim();
}
});
});
@@ -14,6 +14,7 @@ log = CPLog(__name__)
class Searcher(SearcherBase):
# noinspection PyMissingConstructor
def __init__(self):
addEvent('searcher.protocols', self.getSearchProtocols)
addEvent('searcher.contains_other_quality', self.containsOtherQuality)
@@ -195,7 +196,7 @@ class Searcher(SearcherBase):
req = splitString(req_set, '&')
req_match += len(list(set(rel_words) & set(req))) == len(req)
if len(required_words) > 0 and req_match == 0:
if len(required_words) > 0 and req_match == 0:
log.info2('Wrong: Required word missing: %s', rel_name)
return False
@@ -26,7 +26,7 @@ var MovieList = new Class({
self.filter = self.options.filter || {
'starts_with': null,
'search': null
}
};
self.el = new Element('div.movies').adopt(
self.title = self.options.title ? new Element('h2', {
@@ -52,7 +52,7 @@ var MovieList = new Class({
self.getMovies();
App.on('movie.added', self.movieAdded.bind(self))
App.on('movie.added', self.movieAdded.bind(self));
App.on('movie.deleted', self.movieDeleted.bind(self))
},
@@ -96,7 +96,7 @@ var MovieList = new Class({
if(self.options.load_more)
self.scrollspy = new ScrollSpy({
min: function(){
var c = self.load_more.getCoordinates()
var c = self.load_more.getCoordinates();
return c.top - window.document.getSize().y - 300
},
onEnter: self.loadMore.bind(self)
@@ -179,7 +179,7 @@ var MovieList = new Class({
m.fireEvent('injected');
self.movies.include(m)
self.movies.include(m);
self.movies_added[movie._id] = true;
},
@@ -187,7 +187,7 @@ var MovieList = new Class({
var self = this;
var chars = '#ABCDEFGHIJKLMNOPQRSTUVWXYZ';
self.el.addClass('with_navigation')
self.el.addClass('with_navigation');
self.navigation = new Element('div.alph_nav').adopt(
self.mass_edit_form = new Element('div.mass_edit_form').adopt(
@@ -242,7 +242,7 @@ var MovieList = new Class({
this.addClass(a);
el.inject(el.getParent(), 'top');
el.getSiblings().hide()
el.getSiblings().hide();
setTimeout(function(){
el.getSiblings().setStyle('display', null);
}, 100)
@@ -286,7 +286,7 @@ var MovieList = new Class({
'status': self.options.status
}, self.filter),
'onSuccess': function(json){
available_chars = json.chars
available_chars = json.chars;
available_chars.each(function(c){
self.letters[c.capitalize()].addClass('available')
@@ -300,7 +300,7 @@ var MovieList = new Class({
self.navigation_alpha = new Element('ul.numbers', {
'events': {
'click:relay(li.available)': function(e, el){
self.activateLetter(el.get('data-letter'))
self.activateLetter(el.get('data-letter'));
self.getMovies(true)
}
}
@@ -318,7 +318,7 @@ var MovieList = new Class({
// All
self.letters['all'] = new Element('li.letter_all.available.active', {
'text': 'ALL',
'text': 'ALL'
}).inject(self.navigation_alpha);
// Chars
@@ -334,7 +334,7 @@ var MovieList = new Class({
if (self.options.menu.length > 0)
self.options.menu.each(function(menu_item){
self.navigation_menu.addLink(menu_item);
})
});
else
self.navigation_menu.hide();
@@ -347,15 +347,15 @@ var MovieList = new Class({
movies = self.movies.length;
self.movies.each(function(movie){
selected += movie.isSelected() ? 1 : 0
})
});
var indeterminate = selected > 0 && selected < movies,
checked = selected == movies && selected > 0;
self.mass_edit_select.set('indeterminate', indeterminate)
self.mass_edit_select.set('indeterminate', indeterminate);
self.mass_edit_select_class[checked ? 'check' : 'uncheck']()
self.mass_edit_select_class.element[indeterminate ? 'addClass' : 'removeClass']('indeterminate')
self.mass_edit_select_class[checked ? 'check' : 'uncheck']();
self.mass_edit_select_class.element[indeterminate ? 'addClass' : 'removeClass']('indeterminate');
self.mass_edit_selected.set('text', selected);
},
@@ -371,7 +371,7 @@ var MovieList = new Class({
'events': {
'click': function(e){
(e).preventDefault();
this.set('text', 'Deleting..')
this.set('text', 'Deleting..');
Api.request('media.delete', {
'data': {
'id': ids.join(','),
@@ -383,7 +383,7 @@ var MovieList = new Class({
var erase_movies = [];
self.movies.each(function(movie){
if (movie.isSelected()){
$(movie).destroy()
$(movie).destroy();
erase_movies.include(movie);
}
});
@@ -410,7 +410,7 @@ var MovieList = new Class({
changeQualitySelected: function(){
var self = this;
var ids = self.getSelectedMovies()
var ids = self.getSelectedMovies();
Api.request('movie.edit', {
'data': {
@@ -423,11 +423,11 @@ var MovieList = new Class({
refreshSelected: function(){
var self = this;
var ids = self.getSelectedMovies()
var ids = self.getSelectedMovies();
Api.request('media.refresh', {
'data': {
'id': ids.join(','),
'id': ids.join(',')
}
});
},
@@ -435,7 +435,7 @@ var MovieList = new Class({
getSelectedMovies: function(){
var self = this;
var ids = []
var ids = [];
self.movies.each(function(movie){
if (movie.isSelected())
ids.include(movie.get('_id'))
@@ -459,11 +459,11 @@ var MovieList = new Class({
reset: function(){
var self = this;
self.movies = []
self.movies = [];
if(self.mass_edit_select)
self.calculateSelected()
self.calculateSelected();
if(self.navigation_alpha)
self.navigation_alpha.getElements('.active').removeClass('active')
self.navigation_alpha.getElements('.active').removeClass('active');
self.offset = 0;
if(self.scrollspy){
@@ -475,7 +475,7 @@ var MovieList = new Class({
activateLetter: function(letter){
var self = this;
self.reset()
self.reset();
self.letters[letter || 'all'].addClass('active');
self.filter.starts_with = letter;
@@ -487,7 +487,7 @@ var MovieList = new Class({
self.el
.removeClass(self.current_view+'_list')
.addClass(new_view+'_list')
.addClass(new_view+'_list');
self.current_view = new_view;
Cookie.write(self.options.identifier+'_view2', new_view, {duration: 1000});
@@ -504,9 +504,9 @@ var MovieList = new Class({
if(self.search_timer) clearTimeout(self.search_timer);
self.search_timer = (function(){
var search_value = self.navigation_search_input.get('value');
if (search_value == self.last_search_value) return
if (search_value == self.last_search_value) return;
self.reset()
self.reset();
self.activateLetter();
self.filter.search = search_value;
@@ -563,7 +563,7 @@ var MovieList = new Class({
if(self.loader_first){
var lf = self.loader_first;
self.loader_first.addClass('hide')
self.loader_first.addClass('hide');
self.loader_first = null;
setTimeout(function(){
lf.destroy();
@@ -603,10 +603,10 @@ var MovieList = new Class({
var is_empty = self.movies.length == 0 && (self.total_movies == 0 || self.total_movies === undefined);
if(self.title)
self.title[is_empty ? 'hide' : 'show']()
self.title[is_empty ? 'hide' : 'show']();
if(self.description)
self.description.setStyle('display', [is_empty ? 'none' : ''])
self.description.setStyle('display', [is_empty ? 'none' : '']);
if(is_empty && self.options.on_empty_element){
self.options.on_empty_element.inject(self.loader_first || self.title || self.movie_list, 'after');
@@ -60,22 +60,6 @@ var MovieAction = new Class({
'z-index': '1'
}
}).inject(self.movie, 'top').fade('hide');
//self.positionMask();
},
positionMask: function(){
var self = this,
movie = $(self.movie),
s = movie.getSize()
return;
return self.mask.setStyles({
'width': s.x,
'height': s.y
}).position({
'relativeTo': movie
})
},
toElement: function(){
@@ -122,7 +106,7 @@ MA.Release = new Class({
});
if(!self.movie.data.releases || self.movie.data.releases.length == 0)
self.el.hide()
self.el.hide();
else
self.showHelper();
@@ -164,7 +148,7 @@ MA.Release = new Class({
new Element('span.age', {'text': 'Age'}),
new Element('span.score', {'text': 'Score'}),
new Element('span.provider', {'text': 'Provider'})
).inject(self.release_container)
).inject(self.release_container);
if(self.movie.data.releases)
self.movie.data.releases.each(function(release){
@@ -186,7 +170,7 @@ MA.Release = new Class({
}
// Create release
var item = new Element('div', {
release['el'] = new Element('div', {
'class': 'item '+release.status,
'id': 'release_'+release._id
}).adopt(
@@ -219,7 +203,6 @@ MA.Release = new Class({
}
})
).inject(self.release_container);
release['el'] = item;
if(release.status == 'ignored' || release.status == 'failed' || release.status == 'snatched'){
if(!self.last_release || (self.last_release && self.last_release.status != 'snatched' && release.status == 'snatched'))
@@ -242,13 +225,13 @@ MA.Release = new Class({
status_el.set('text', new_status);
if(!q && (new_status == 'snatched' || new_status == 'seeding' || new_status == 'done'))
var q = self.addQuality(release.quality_id);
q = self.addQuality(release.quality_id);
if(q && !q.hasClass(new_status)) {
q.removeClass(release.status).addClass(new_status);
q.set('title', q.get('title').replace(release.status, new_status));
}
}
};
App.on('release.update_status', update_handle);
@@ -391,12 +374,11 @@ MA.Release = new Class({
},
ignore: function(release){
var self = this;
Api.request('release.ignore', {
'data': {
'id': release._id
},
}
})
},
@@ -456,7 +438,7 @@ MA.Trailer = new Class({
watch: function(offset){
var self = this;
var data_url = 'https://gdata.youtube.com/feeds/videos?vq="{title}" {year} trailer&max-results=1&alt=json-in-script&orderby=relevance&sortorder=descending&format=5&fmt=18'
var data_url = 'https://gdata.youtube.com/feeds/videos?vq="{title}" {year} trailer&max-results=1&alt=json-in-script&orderby=relevance&sortorder=descending&format=5&fmt=18';
var url = data_url.substitute({
'title': encodeURI(self.getTitle()),
'year': self.get('year'),
@@ -515,7 +497,7 @@ MA.Trailer = new Class({
}
}
}
};
self.player.addEventListener('onStateChange', change_quality);
}
@@ -532,7 +514,7 @@ MA.Trailer = new Class({
$(self.movie).setStyle('height', null);
setTimeout(function(){
self.container.destroy()
self.container.destroy();
self.close_button.destroy();
}, 1800)
}
@@ -661,7 +643,7 @@ MA.Edit = new Class({
self.movie.slide('out');
}
})
});
MA.Refresh = new Class({
@@ -847,7 +829,7 @@ MA.Files = new Class({
new Element('div.item.head').adopt(
new Element('span.name', {'text': 'File'}),
new Element('span.type', {'text': 'Type'})
).inject(self.files_container)
).inject(self.files_container);
if(self.movie.data.releases)
Array.each(self.movie.data.releases, function(release){
@@ -398,7 +398,6 @@
.movies .data .quality span {
padding: 2px 3px;
font-weight: bold;
opacity: 0.5;
font-size: 10px;
height: 16px;
@@ -451,7 +450,6 @@
right: 20px;
line-height: 0;
top: 0;
display: block;
width: auto;
opacity: 0;
display: none;
@@ -833,7 +831,6 @@
}
.movies .alph_nav .search input {
padding: 6px 5px;
width: 100%;
height: 44px;
display: inline-block;
@@ -841,7 +838,6 @@
background: none;
color: #444;
font-size: 14px;
padding: 10px;
padding: 0 10px 0 30px;
border-bottom: 1px solid rgba(0,0,0,.08);
}
@@ -1043,7 +1039,6 @@
}
.movies .progress > div .percentage {
font-weight: bold;
display: inline-block;
text-transform: uppercase;
font-weight: normal;
@@ -23,7 +23,7 @@ var Movie = new Class({
addEvents: function(){
var self = this;
self.global_events = {}
self.global_events = {};
// Do refresh with new data
self.global_events['movie.update'] = function(notification){
@@ -32,7 +32,7 @@ var Movie = new Class({
self.busy(false);
self.removeView();
self.update.delay(2000, self, notification);
}
};
App.on('movie.update', self.global_events['movie.update']);
// Add spinner on load / search
@@ -40,20 +40,20 @@ var Movie = new Class({
self.global_events[listener] = function(notification){
if(notification.data && (self.data._id == notification.data._id || (typeOf(notification.data._id) == 'array' && notification.data._id.indexOf(self.data._id) > -1)))
self.busy(true);
}
};
App.on(listener, self.global_events[listener]);
})
});
// Remove spinner
self.global_events['movie.searcher.ended'] = function(notification){
if(notification.data && self.data._id == notification.data._id)
self.busy(false)
}
};
App.on('movie.searcher.ended', self.global_events['movie.searcher.ended']);
// Reload when releases have updated
self.global_events['release.update_status'] = function(notification){
var data = notification.data
var data = notification.data;
if(data && self.data._id == data.movie_id){
if(!self.data.releases)
@@ -62,7 +62,7 @@ var Movie = new Class({
self.data.releases.push({'quality': data.quality, 'status': data.status});
self.updateReleases();
}
}
};
App.on('release.update_status', self.global_events['release.update_status']);
@@ -73,7 +73,7 @@ var Movie = new Class({
self.el.destroy();
delete self.list.movies_added[self.get('id')];
self.list.movies.erase(self)
self.list.movies.erase(self);
self.list.checkIfEmpty();
@@ -117,18 +117,6 @@ var Movie = new Class({
}).inject(self.el, 'top').fade('hide');
},
positionMask: function(){
var self = this,
s = self.el.getSize()
return self.mask.setStyles({
'width': s.x,
'height': s.y
}).position({
'relativeTo': self.el
})
},
update: function(notification){
var self = this;
@@ -209,7 +197,7 @@ var Movie = new Class({
self.updateReleases();
Object.each(self.options.actions, function(action, key){
self.action[key.toLowerCase()] = action = new self.options.actions[key](self)
self.action[key.toLowerCase()] = action = new self.options.actions[key](self);
if(action.el)
self.actions.adopt(action)
});
@@ -226,7 +214,7 @@ var Movie = new Class({
status = release.status;
if(!q && (status == 'snatched' || status == 'seeding' || status == 'done'))
var q = self.addQuality(release.quality, release.is_3d || false)
q = self.addQuality(release.quality, release.is_3d || false);
if (q && !q.hasClass(status)){
q.addClass(status);
@@ -252,9 +240,9 @@ var Movie = new Class({
var self = this;
if(self.data.title)
return self.getUnprefixedTitle(self.data.title)
return self.getUnprefixedTitle(self.data.title);
else if(self.data.info.titles.length > 0)
return self.getUnprefixedTitle(self.data.info.titles[0])
return self.getUnprefixedTitle(self.data.info.titles[0]);
return 'Unknown movie'
},
@@ -275,12 +263,12 @@ var Movie = new Class({
self.el.addEvent('outerClick', function(){
self.removeView();
self.slide('out')
})
});
el.show();
self.data_container.addClass('hide_right');
}
else {
self.el.removeEvents('outerClick')
self.el.removeEvents('outerClick');
setTimeout(function(){
if(self.el)
@@ -297,7 +285,7 @@ var Movie = new Class({
if(self.el)
self.el
.removeClass(self.view+'_view')
.addClass(new_view+'_view')
.addClass(new_view+'_view');
self.view = new_view;
},
@@ -41,7 +41,7 @@ Block.Search.MovieItem = new Class({
)
)
)
)
);
if(info.titles)
info.titles.each(function(title){
@@ -132,19 +132,19 @@ Block.Search.MovieItem = new Class({
if(!self.options_el.hasClass('set')){
if(self.info.in_library){
if(info.in_library){
var in_library = [];
(self.info.in_library.releases || []).each(function(release){
(info.in_library.releases || []).each(function(release){
in_library.include(release.quality)
});
}
self.options_el.grab(
new Element('div', {
'class': self.info.in_wanted && self.info.in_wanted.profile_id || in_library ? 'in_library_wanted' : ''
'class': info.in_wanted && info.in_wanted.profile_id || in_library ? 'in_library_wanted' : ''
}).adopt(
self.info.in_wanted && self.info.in_wanted.profile_id ? new Element('span.in_wanted', {
'text': 'Already in wanted list: ' + Quality.getProfile(self.info.in_wanted.profile_id).get('label')
info.in_wanted && info.in_wanted.profile_id ? new Element('span.in_wanted', {
'text': 'Already in wanted list: ' + Quality.getProfile(info.in_wanted.profile_id).get('label')
}) : (in_library ? new Element('span.in_library', {
'text': 'Already in library: ' + in_library.join(', ')
}) : null),
@@ -172,7 +172,7 @@ Block.Search.MovieItem = new Class({
new Element('option', {
'text': alt.title
}).inject(self.title_select)
})
});
// Fill categories
@@ -215,9 +215,9 @@ Block.Search.MovieItem = new Class({
loadingMask: function(){
var self = this;
self.mask = new Element('div.mask').inject(self.el).fade('hide')
self.mask = new Element('div.mask').inject(self.el).fade('hide');
createSpinner(self.mask)
createSpinner(self.mask);
self.mask.fade('in')
},
@@ -62,7 +62,7 @@ class Bluray(Automation, RSS):
name = self.getTextElement(movie, 'title').lower().split('blu-ray')[0].strip('(').rstrip()
year = self.getTextElement(movie, 'description').split('|')[1].strip('(').strip()
if not name.find('/') == -1: # make sure it is not a double movie release
if not name.find('/') == -1: # make sure it is not a double movie release
continue
if tryInt(year) < self.getMinimal('year'):
@@ -46,7 +46,10 @@ class Goodfilms(Automation):
break
for movie in this_watch_list:
movies.append({ 'title': movie['data-film-title'], 'year': movie['data-film-year'] })
movies.append({
'title': movie['data-film-title'],
'year': movie['data-film-year']
})
if not 'next page' in data.lower():
break
@@ -50,7 +50,10 @@ class Letterboxd(Automation):
for movie in soup.find_all('a', attrs = {'class': 'frame'}):
match = removeEmpty(self.pattern.split(movie['title']))
movies.append({'title': match[0], 'year': match[1] })
movies.append({
'title': match[0],
'year': match[1]
})
return movies
@@ -74,6 +74,7 @@ class TheMovieDb(MovieProvider):
if not result:
try:
log.debug('Getting info: %s', cache_key)
# noinspection PyArgumentList
movie = tmdb3.Movie(identifier)
try: exists = movie.title is not None
except: exists = False
@@ -14,6 +14,6 @@ class BiTHDTV(MovieProvider, Base):
def buildUrl(self, media):
query = tryUrlencode({
'search': fireEvent('library.query', media, single = True),
'cat': 7 # Movie cat
'cat': 7 # Movie cat
})
return query
@@ -10,29 +10,29 @@ autoload = 'PassThePopcorn'
class PassThePopcorn(MovieProvider, Base):
quality_search_params = {
'bd50': {'media': 'Blu-ray', 'format': 'BD50'},
'1080p': {'resolution': '1080p'},
'720p': {'resolution': '720p'},
'brrip': {'media': 'Blu-ray'},
'dvdr': {'resolution': 'anysd'},
'dvdrip': {'media': 'DVD'},
'scr': {'media': 'DVD-Screener'},
'r5': {'media': 'R5'},
'tc': {'media': 'TC'},
'ts': {'media': 'TS'},
'cam': {'media': 'CAM'}
'bd50': {'media': 'Blu-ray', 'format': 'BD50'},
'1080p': {'resolution': '1080p'},
'720p': {'resolution': '720p'},
'brrip': {'media': 'Blu-ray'},
'dvdr': {'resolution': 'anysd'},
'dvdrip': {'media': 'DVD'},
'scr': {'media': 'DVD-Screener'},
'r5': {'media': 'R5'},
'tc': {'media': 'TC'},
'ts': {'media': 'TS'},
'cam': {'media': 'CAM'}
}
post_search_filters = {
'bd50': {'Codec': ['BD50']},
'1080p': {'Resolution': ['1080p']},
'720p': {'Resolution': ['720p']},
'brrip': {'Source': ['Blu-ray'], 'Quality': ['High Definition'], 'Container': ['!ISO']},
'dvdr': {'Codec': ['DVD5', 'DVD9']},
'dvdrip': {'Source': ['DVD'], 'Codec': ['!DVD5', '!DVD9']},
'scr': {'Source': ['DVD-Screener']},
'r5': {'Source': ['R5']},
'tc': {'Source': ['TC']},
'ts': {'Source': ['TS']},
'cam': {'Source': ['CAM']}
'bd50': {'Codec': ['BD50']},
'1080p': {'Resolution': ['1080p']},
'720p': {'Resolution': ['720p']},
'brrip': {'Source': ['Blu-ray'], 'Quality': ['High Definition'], 'Container': ['!ISO']},
'dvdr': {'Codec': ['DVD5', 'DVD9']},
'dvdrip': {'Source': ['DVD'], 'Codec': ['!DVD5', '!DVD9']},
'scr': {'Source': ['DVD-Screener']},
'r5': {'Source': ['R5']},
'tc': {'Source': ['TC']},
'ts': {'Source': ['TS']},
'cam': {'Source': ['CAM']}
}
@@ -12,11 +12,11 @@ autoload = 'ThePirateBay'
class ThePirateBay(MovieProvider, Base):
cat_ids = [
([209], ['3d']),
([207], ['720p', '1080p']),
([201], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']),
([201, 207], ['brrip']),
([202], ['dvdr'])
([209], ['3d']),
([207], ['720p', '1080p']),
([201], ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr']),
([201, 207], ['brrip']),
([202], ['dvdr'])
]
def buildUrl(self, media, page, cats):
@@ -16,5 +16,6 @@ class TorrentDay(MovieProvider, Base):
([3], ['dvdr']),
([5], ['bd50']),
]
def buildUrl(self, media):
return fireEvent('library.query', media, single = True)
@@ -52,7 +52,7 @@ class HDTrailers(TrailerProvider):
return result_data
def findViaAlternative(self, group):
results = {'480p':[], '720p':[], '1080p':[]}
results = {'480p': [], '720p': [], '1080p': []}
movie_name = getTitle(group)
-1
View File
@@ -249,7 +249,6 @@ class MovieSearcher(SearcherBase, MovieTypeBase):
log.info2('Wrong: "%s" is too large to be %s. %sMB instead of the maximum of %sMB.', (nzb['name'], preferred_quality['label'], nzb['size'], preferred_quality['size_max']))
return False
# Provider specific functions
get_more = nzb.get('get_more_info')
if get_more:
@@ -91,7 +91,6 @@
padding: 0 3px 10px 0;
}
.suggestions .media_result .data:before {
bottom: 0;
content: '';
display: block;
height: 10px;
@@ -107,7 +106,7 @@
z-index: 3;
pointer-events: none;
}
.suggestions .media_result .data .info .plot.full {
top: 0;
overflow: auto;
@@ -123,14 +122,14 @@
.suggestions .media_result .options select[name=title] { width: 100%; }
.suggestions .media_result .options select[name=profile] { width: 100%; }
.suggestions .media_result .options select[name=category] { width: 100%; }
.suggestions .media_result .button {
.suggestions .media_result .button {
position: absolute;
margin: 2px 0 0 0;
right: 15px;
bottom: 15px;
}
.suggestions .media_result .thumbnail {
width: 100px;
@@ -116,7 +116,7 @@ var SuggestList = new Class({
}
}
}) : null
)
);
$(m).inject(self.el);
@@ -150,4 +150,4 @@ var SuggestList = new Class({
return this.el;
}
})
});