From 177706857997e7d5ed2ba56a35d36c37e8bfa1f1 Mon Sep 17 00:00:00 2001
From: bobbysteel <github@robk.com>
Date: Mon, 22 May 2017 16:50:50 +0100
Subject: [PATCH] Remove Freshon.tv provider (#3789)

---
 gui/slick/images/providers/freshontv.png | Bin 3618 -> 0 bytes
 sickbeard/providers/__init__.py          |   4 +-
 sickbeard/providers/freshontv.py         | 233 -----------------------
 3 files changed, 2 insertions(+), 235 deletions(-)
 delete mode 100644 gui/slick/images/providers/freshontv.png
 delete mode 100644 sickbeard/providers/freshontv.py

diff --git a/gui/slick/images/providers/freshontv.png b/gui/slick/images/providers/freshontv.png
deleted file mode 100644
index 089d3479baac284e422f703cafdd3492746d6586..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3618
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
O1_n=8KbLh*2~7ZyOVOzS

diff --git a/sickbeard/providers/__init__.py b/sickbeard/providers/__init__.py
index e300a14a3..015b9c948 100644
--- a/sickbeard/providers/__init__.py
+++ b/sickbeard/providers/__init__.py
@@ -24,14 +24,14 @@ from random import shuffle
 import sickbeard
 from sickbeard.providers import btn, thepiratebay, torrentleech, iptorrents, torrentz, \
     omgwtfnzbs, scc, hdtorrents, torrentday, hdbits, hounddawgs, speedcd, nyaa, xthor, abnormal, torrentbytes, cpasbien, \
-    torrent9, freshontv, morethantv, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, \
+    torrent9, morethantv, t411, tokyotoshokan, shazbat, rarbg, alpharatio, tntvillage, binsearch, torrentproject, \
     scenetime, nebulance, tvchaosuk, bitcannon, pretome, gftracker, hdspace, newpct, elitetorrent, danishbits, hd4free, limetorrents, \
     norbits, horriblesubs, filelist, skytorrents, ncore, archetorrent, hdtorrents_it, immortalseed, ilcorsaronero
 
 __all__ = [
     'btn', 'thepiratebay', 'torrentleech', 'scc', 'hdtorrents',
     'torrentday', 'hdbits', 'hounddawgs', 'iptorrents', 'omgwtfnzbs',
-    'speedcd', 'nyaa', 'torrentbytes', 'freshontv', 'cpasbien',
+    'speedcd', 'nyaa', 'torrentbytes', 'cpasbien',
     'torrent9','morethantv', 't411', 'tokyotoshokan', 'alpharatio',
     'shazbat', 'rarbg', 'tntvillage', 'binsearch',
     'xthor', 'abnormal', 'scenetime', 'nebulance', 'tvchaosuk',
diff --git a/sickbeard/providers/freshontv.py b/sickbeard/providers/freshontv.py
deleted file mode 100644
index 1c029bbc5..000000000
--- a/sickbeard/providers/freshontv.py
+++ /dev/null
@@ -1,233 +0,0 @@
-# coding=utf-8
-# Author: Idan Gutman
-#
-# URL: https://sickrage.github.io
-#
-# This file is part of SickRage.
-#
-# SickRage is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# SickRage is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with SickRage. If not, see <http://www.gnu.org/licenses/>.
-
-from __future__ import print_function, unicode_literals
-
-import re
-from requests.utils import add_dict_to_cookiejar, dict_from_cookiejar
-import time
-import traceback
-
-from sickbeard import logger, tvcache
-from sickbeard.bs4_parser import BS4Parser
-
-from sickrage.helper.common import convert_size, try_int
-from sickrage.providers.torrent.TorrentProvider import TorrentProvider
-
-
-class FreshOnTVProvider(TorrentProvider):  # pylint: disable=too-many-instance-attributes
-
-    def __init__(self):
-
-        TorrentProvider.__init__(self, "FreshOnTV")
-
-        self._uid = None
-        self._hash = None
-        self.username = None
-        self.password = None
-        self.minseed = None
-        self.minleech = None
-        self.freeleech = False
-
-        self.cache = tvcache.TVCache(self)
-
-        self.urls = {'base_url': 'https://freshon.tv/',
-                     'login': 'https://freshon.tv/login.php?action=makelogin',
-                     'detail': 'https://freshon.tv/details.php?id=%s',
-                     'search': 'https://freshon.tv/browse.php?incldead=%s&words=0&cat=0&search=%s',
-                     'download': 'https://freshon.tv/download.php?id=%s&type=torrent'}
-
-        self.url = self.urls['base_url']
-
-        self._cookies = None
-
-    def _check_auth(self):
-
-        if not self.username or not self.password:
-            logger.log("Invalid username or password. Check your settings", logger.WARNING)
-
-        return True
-
-    def login(self):
-        if any(dict_from_cookiejar(self.session.cookies).values()):
-            return True
-
-        if self._uid and self._hash:
-            add_dict_to_cookiejar(self.session.cookies, self._cookies)
-        else:
-            login_params = {'username': self.username,
-                            'password': self.password,
-                            'login': 'submit'}
-
-            response = self.get_url(self.urls['login'], post_data=login_params, returns='text')
-            if not response:
-                logger.log("Unable to connect to provider", logger.WARNING)
-                return False
-
-            if re.search('/logout.php', response):
-
-                try:
-                    if dict_from_cookiejar(self.session.cookies)['uid'] and dict_from_cookiejar(self.session.cookies)['pass']:
-                        self._uid = dict_from_cookiejar(self.session.cookies)['uid']
-                        self._hash = dict_from_cookiejar(self.session.cookies)['pass']
-
-                        self._cookies = {'uid': self._uid,
-                                        'pass': self._hash}
-                        return True
-                except Exception:
-                    logger.log("Unable to login to provider (cookie)", logger.WARNING)
-                    return False
-
-            else:
-                if re.search('Username does not exist in the userbase or the account is not confirmed yet.', response):
-                    logger.log("Invalid username or password. Check your settings", logger.WARNING)
-
-                if re.search('DDoS protection by CloudFlare', response):
-                    logger.log("Unable to login to provider due to CloudFlare DDoS javascript check", logger.WARNING)
-
-                    return False
-
-    def search(self, search_params, age=0, ep_obj=None):  # pylint: disable=too-many-locals, too-many-branches, too-many-statements
-        results = []
-        if not self.login():
-            return results
-
-        freeleech = '3' if self.freeleech else '0'
-
-        for mode in search_params:
-            items = []
-            logger.log("Search Mode: {0}".format(mode), logger.DEBUG)
-            for search_string in search_params[mode]:
-
-                if mode != 'RSS':
-                    logger.log("Search string: {0}".format
-                               (search_string.decode("utf-8")), logger.DEBUG)
-
-                search_url = self.urls['search'] % (freeleech, search_string)
-                init_html = self.get_url(search_url, returns='text')
-                max_page_number = 0
-
-                if not init_html:
-                    logger.log("No data returned from provider", logger.DEBUG)
-                    continue
-
-                try:
-                    with BS4Parser(init_html, 'html5lib') as init_soup:
-
-                        # Check to see if there is more than 1 page of results
-                        pager = init_soup.find('div', {'class': 'pager'})
-                        page_links = pager('a', href=True) if pager else []
-
-                        for lnk in page_links:
-                            link_text = lnk.text.strip()
-                            if link_text.isdigit():
-                                page_int = int(link_text)
-                                if page_int > max_page_number:
-                                    max_page_number = page_int
-
-                        # limit page number to 15 just in case something goes wrong
-                        if max_page_number > 15:
-                            max_page_number = 15
-                        # limit RSS search
-                        if max_page_number > 3 and mode == 'RSS':
-                            max_page_number = 3
-                except Exception:
-                    logger.log("Failed parsing provider. Traceback: {0}".format(traceback.format_exc()), logger.ERROR)
-                    continue
-
-                data_response_list = [init_html]
-
-                # Freshon starts counting pages from zero, even though it displays numbers from 1
-                if max_page_number > 1:
-                    for i in range(1, max_page_number):
-
-                        time.sleep(1)
-                        page_search_url = search_url + '&page=' + str(i)
-                        # '.log(u"Search string: " + page_search_url, logger.DEBUG)
-                        page_html = self.get_url(page_search_url, returns='text')
-
-                        if not page_html:
-                            continue
-
-                        data_response_list.append(page_html)
-
-                try:
-
-                    for data_response in data_response_list:
-
-                        with BS4Parser(data_response, 'html5lib') as html:
-
-                            torrent_rows = html("tr", class_=re.compile('torrent_[0-9]*'))
-
-                            # Continue only if a Release is found
-                            if not torrent_rows:
-                                logger.log("Data returned from provider does not contain any torrents", logger.DEBUG)
-                                continue
-
-                            for individual_torrent in torrent_rows:
-
-                                # skip if torrent has been nuked due to poor quality
-                                if individual_torrent.find('img', alt='Nuked') is not None:
-                                    continue
-
-                                try:
-                                    title = individual_torrent.find('a', {'class': 'torrent_name_link'})['title']
-                                except Exception:
-                                    logger.log("Unable to parse torrent title. Traceback: {0} ".format(traceback.format_exc()), logger.WARNING)
-                                    continue
-
-                                try:
-                                    details_url = individual_torrent.find('a', {'class': 'torrent_name_link'})['href']
-                                    torrent_id = int((re.match('.*?([0-9]+)$', details_url).group(1)).strip())
-                                    download_url = self.urls['download'] % (str(torrent_id))
-                                    seeders = try_int(individual_torrent.find('td', {'class': 'table_seeders'}).find('span').text.strip(), 1)
-                                    leechers = try_int(individual_torrent.find('td', {'class': 'table_leechers'}).find('a').text.strip(), 0)
-                                    torrent_size = individual_torrent.find('td', {'class': 'table_size'}).get_text()
-                                    size = convert_size(torrent_size) or -1
-                                except Exception:
-                                    continue
-
-                                if not all([title, download_url]):
-                                    continue
-
-                                # Filter unseeded torrent
-                                if seeders < self.minseed or leechers < self.minleech:
-                                    if mode != 'RSS':
-                                        logger.log("Discarding torrent because it doesn't meet the minimum seeders or leechers: {0} (S:{1} L:{2})".format
-                                                   (title, seeders, leechers), logger.DEBUG)
-                                    continue
-
-                                item = {'title': title, 'link': download_url, 'size': size, 'seeders': seeders, 'leechers': leechers, 'hash': ''}
-                                if mode != 'RSS':
-                                    logger.log("Found result: {0} with {1} seeders and {2} leechers".format(title, seeders, leechers), logger.DEBUG)
-
-                                items.append(item)
-
-                except Exception:
-                    logger.log("Failed parsing provider. Traceback: {0}".format(traceback.format_exc()), logger.ERROR)
-
-            # For each search mode sort all the items by seeders if available
-            items.sort(key=lambda d: try_int(d.get('seeders', 0)), reverse=True)
-            results += items
-
-        return results
-
-
-provider = FreshOnTVProvider()
-- 
GitLab