diff --git a/couchpotato/core/loader.py b/couchpotato/core/loader.py
index 4fa31e20..a9f75d7b 100644
--- a/couchpotato/core/loader.py
+++ b/couchpotato/core/loader.py
@@ -14,11 +14,18 @@ class Loader:
def preload(self, root = ''):
+ core = os.path.join(root, 'couchpotato', 'core')
+ providers = os.path.join(root, 'couchpotato', 'core', 'providers')
+
self.paths = {
- 'plugin' : ('couchpotato.core.plugins', os.path.join(root, 'couchpotato', 'core', 'plugins')),
- 'provider' : ('couchpotato.core.providers', os.path.join(root, 'couchpotato', 'core', 'providers')),
- 'notifications' : ('couchpotato.core.notifications', os.path.join(root, 'couchpotato', 'core', 'notifications')),
+ 'plugin' : ('couchpotato.core.plugins', os.path.join(core, 'plugins')),
+ 'notifications' : ('couchpotato.core.notifications', os.path.join(core, 'notifications')),
'downloaders' : ('couchpotato.core.downloaders', os.path.join(root, 'couchpotato', 'core', 'downloaders')),
+ 'movie_provider' : ('couchpotato.core.providers.movie', os.path.join(providers, 'movie')),
+ 'nzb_provider' : ('couchpotato.core.providers.nzb', os.path.join(providers, 'nzb')),
+ 'torrent_provider' : ('couchpotato.core.providers.torrent', os.path.join(providers, 'torrent')),
+ 'trailer_provider' : ('couchpotato.core.providers.trailer', os.path.join(providers, 'trailer')),
+ 'subtitle_provider' : ('couchpotato.core.providers.subtitle', os.path.join(providers, 'subtitle')),
}
for type, tuple in self.paths.iteritems():
diff --git a/couchpotato/core/providers/movie/__init__.py b/couchpotato/core/providers/movie/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/couchpotato/core/providers/imdb/__init__.py b/couchpotato/core/providers/movie/imdb/__init__.py
similarity index 100%
rename from couchpotato/core/providers/imdb/__init__.py
rename to couchpotato/core/providers/movie/imdb/__init__.py
diff --git a/couchpotato/core/providers/imdb/main.py b/couchpotato/core/providers/movie/imdb/main.py
similarity index 100%
rename from couchpotato/core/providers/imdb/main.py
rename to couchpotato/core/providers/movie/imdb/main.py
diff --git a/couchpotato/core/providers/themoviedb/__init__.py b/couchpotato/core/providers/movie/themoviedb/__init__.py
similarity index 100%
rename from couchpotato/core/providers/themoviedb/__init__.py
rename to couchpotato/core/providers/movie/themoviedb/__init__.py
diff --git a/couchpotato/core/providers/themoviedb/main.py b/couchpotato/core/providers/movie/themoviedb/main.py
similarity index 100%
rename from couchpotato/core/providers/themoviedb/main.py
rename to couchpotato/core/providers/movie/themoviedb/main.py
diff --git a/couchpotato/core/providers/nzb/__init__.py b/couchpotato/core/providers/nzb/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/couchpotato/core/providers/newzbin/__init__.py b/couchpotato/core/providers/nzb/newzbin/__init__.py
similarity index 100%
rename from couchpotato/core/providers/newzbin/__init__.py
rename to couchpotato/core/providers/nzb/newzbin/__init__.py
diff --git a/couchpotato/core/providers/newzbin/main.py b/couchpotato/core/providers/nzb/newzbin/main.py
similarity index 100%
rename from couchpotato/core/providers/newzbin/main.py
rename to couchpotato/core/providers/nzb/newzbin/main.py
diff --git a/couchpotato/core/providers/newznab/__init__.py b/couchpotato/core/providers/nzb/newznab/__init__.py
similarity index 100%
rename from couchpotato/core/providers/newznab/__init__.py
rename to couchpotato/core/providers/nzb/newznab/__init__.py
diff --git a/couchpotato/core/providers/newznab/main.py b/couchpotato/core/providers/nzb/newznab/main.py
similarity index 100%
rename from couchpotato/core/providers/newznab/main.py
rename to couchpotato/core/providers/nzb/newznab/main.py
diff --git a/couchpotato/core/providers/nzbmatrix/__init__.py b/couchpotato/core/providers/nzb/nzbmatrix/__init__.py
similarity index 100%
rename from couchpotato/core/providers/nzbmatrix/__init__.py
rename to couchpotato/core/providers/nzb/nzbmatrix/__init__.py
diff --git a/couchpotato/core/providers/nzbmatrix/main.py b/couchpotato/core/providers/nzb/nzbmatrix/main.py
similarity index 100%
rename from couchpotato/core/providers/nzbmatrix/main.py
rename to couchpotato/core/providers/nzb/nzbmatrix/main.py
diff --git a/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py b/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py
new file mode 100644
index 00000000..905a00d0
--- /dev/null
+++ b/couchpotato/core/providers/nzb/nzbmatrix/nzbmatrix.py
@@ -0,0 +1,124 @@
+from app.config.cplog import CPLog
+from app.lib.provider.yarr.base import nzbBase
+from dateutil.parser import parse
+from urllib import urlencode
+from urllib2 import URLError
+import time
+
+log = CPLog(__name__)
+
+class nzbMatrix(nzbBase):
+ """Api for NZBMatrix"""
+
+ name = 'NZBMatrix'
+ downloadUrl = 'https://api.nzbmatrix.com/v1.1/download.php?id=%s%s'
+ detailUrl = 'https://nzbmatrix.com/nzb-details.php?id=%s&hit=1'
+ searchUrl = 'http://rss.nzbmatrix.com/rss.php'
+
+ catIds = {
+ 42: ['720p', '1080p'],
+ 2: ['cam', 'ts', 'dvdrip', 'tc', 'r5', 'scr'],
+ 54: ['brrip'],
+ 1: ['dvdr']
+ }
+ catBackupId = 2
+
+ timeBetween = 10 # Seconds
+
+ def __init__(self, config):
+ log.info('Using NZBMatrix provider')
+
+ self.config = config
+
+ def conf(self, option):
+ return self.config.get('NZBMatrix', option)
+
+ def enabled(self):
+ return self.conf('enabled') and self.config.get('NZB', 'enabled') and self.conf('username') and self.conf('apikey')
+
+ def find(self, movie, quality, type, retry = False):
+
+ self.cleanCache();
+
+ results = []
+ if not self.enabled() or not self.isAvailable(self.searchUrl):
+ return results
+
+ catId = self.getCatId(type)
+ arguments = urlencode({
+ 'term': movie.imdb,
+ 'subcat': catId,
+ 'username': self.conf('username'),
+ 'apikey': self.conf('apikey'),
+ 'searchin': 'weblink',
+ 'english': 1 if self.conf('english') else 0,
+ })
+ url = "%s?%s" % (self.searchUrl, arguments)
+ cacheId = str(movie.imdb) + '-' + str(catId)
+ singleCat = (len(self.catIds.get(catId)) == 1 and catId != self.catBackupId)
+
+ try:
+ cached = False
+ if(self.cache.get(cacheId)):
+ data = True
+ cached = True
+ log.info('Getting RSS from cache: %s.' % cacheId)
+ else:
+ log.info('Searching: %s' % url)
+ data = self.urlopen(url)
+ self.cache[cacheId] = {
+ 'time': time.time()
+ }
+
+ except (IOError, URLError):
+ log.error('Failed to open %s.' % url)
+ return results
+
+ if data:
+ try:
+ try:
+ if cached:
+ xml = self.cache[cacheId]['xml']
+ else:
+ xml = self.getItems(data)
+ self.cache[cacheId]['xml'] = xml
+ except:
+ log.debug('No valid xml or to many requests.. You never know with %s.' % self.name)
+ return results
+
+ for nzb in xml:
+
+ title = self.gettextelement(nzb, "title")
+ if 'error' in title.lower(): continue
+
+ id = int(self.gettextelement(nzb, "link").split('&')[0].partition('id=')[2])
+ size = self.gettextelement(nzb, "description").split('
')[2].split('> ')[1]
+ date = str(self.gettextelement(nzb, "description").split('
')[3].partition('Added: ')[2])
+
+ new = self.feedItem()
+ new.id = id
+ new.type = 'nzb'
+ new.name = title
+ new.date = int(time.mktime(parse(date).timetuple()))
+ new.size = self.parseSize(size)
+ new.url = self.downloadLink(id)
+ new.detailUrl = self.detailLink(id)
+ new.content = self.gettextelement(nzb, "description")
+ new.score = self.calcScore(new, movie)
+ new.checkNZB = True
+
+ if new.date > time.time() - (int(self.config.get('NZB', 'retention')) * 24 * 60 * 60):
+ if self.isCorrectMovie(new, movie, type, imdbResults = True, singleCategory = singleCat):
+ results.append(new)
+ log.info('Found: %s' % new.name)
+ else:
+ log.info('Found outside retention: %s' % new.name)
+
+ return results
+ except SyntaxError:
+ log.error('Failed to parse XML response from NZBMatrix.com')
+
+ return results
+
+ def getApiExt(self):
+ return '&username=%s&apikey=%s' % (self.conf('username'), self.conf('apikey'))
diff --git a/couchpotato/core/providers/nzbs/__init__.py b/couchpotato/core/providers/nzb/nzbs/__init__.py
similarity index 100%
rename from couchpotato/core/providers/nzbs/__init__.py
rename to couchpotato/core/providers/nzb/nzbs/__init__.py
diff --git a/couchpotato/core/providers/nzbs/main.py b/couchpotato/core/providers/nzb/nzbs/main.py
similarity index 100%
rename from couchpotato/core/providers/nzbs/main.py
rename to couchpotato/core/providers/nzb/nzbs/main.py
diff --git a/couchpotato/core/providers/subtitle/__init__.py b/couchpotato/core/providers/subtitle/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/couchpotato/core/providers/torrent/__init__.py b/couchpotato/core/providers/torrent/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/couchpotato/core/providers/thepiratebay/__init__.py b/couchpotato/core/providers/torrent/thepiratebay/__init__.py
similarity index 100%
rename from couchpotato/core/providers/thepiratebay/__init__.py
rename to couchpotato/core/providers/torrent/thepiratebay/__init__.py
diff --git a/couchpotato/core/providers/thepiratebay/main.py b/couchpotato/core/providers/torrent/thepiratebay/main.py
similarity index 100%
rename from couchpotato/core/providers/thepiratebay/main.py
rename to couchpotato/core/providers/torrent/thepiratebay/main.py
diff --git a/couchpotato/core/providers/trailer/__init__.py b/couchpotato/core/providers/trailer/__init__.py
new file mode 100644
index 00000000..e69de29b