diff options
Diffstat (limited to 'module/FileList.py')
-rw-r--r-- | module/FileList.py | 485 |
1 files changed, 0 insertions, 485 deletions
diff --git a/module/FileList.py b/module/FileList.py deleted file mode 100644 index 6a43f7d54..000000000 --- a/module/FileList.py +++ /dev/null @@ -1,485 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -""" - This program 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. - - This program 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 this program; if not, see <http://www.gnu.org/licenses/>. - - @author: mkaay - @author: RaNaN - @version: v0.3.2 - @list-version: v4 -""" - -LIST_VERSION = 4 - -from operator import attrgetter -from operator import concat -from os.path import join -from threading import RLock -from time import sleep - -import cPickle -from module.DownloadThread import Status -from module.PullEvents import InsertEvent -from module.PullEvents import RemoveEvent -from module.PullEvents import UpdateEvent - -class NoSuchElementException(Exception): - pass - -class FileList(object): - def __init__(self, core): - self.core = core - self.lock = RLock() - self.download_folder = self.core.config["general"]["download_folder"] - self.collector = self.pyLoadCollector(self) - self.packager = self.pyLoadPackager(self) - - self.data = { - "version": LIST_VERSION, - "queue": [], - "packages": [], - "collector": [] - } - self.load() - - def load(self): - self.lock.acquire() - try: - pkl_file = open(join(self.core.configdir, "links.pkl"), "rb") - obj = cPickle.load(pkl_file) - except: - obj = False - if obj != False and obj["version"] == LIST_VERSION: - packages = [] - queue = [] - collector = [] - for n, pd in enumerate(obj["packages"]): - p = PyLoadPackage() - pd.get(p, self) - packages.append(p) - for pd in obj["queue"]: - p = PyLoadPackage() - pd.get(p, self) - queue.append(p) - for fd in obj["collector"]: - f = PyLoadFile("", self) - fd.get(f) - collector.append(f) - obj["packages"] = packages - obj["queue"] = queue - obj["collector"] = collector - self.data = obj - self.lock.release() - - if len(self.data["collector"]) > 0: - self.core.logger.info(_("Found %s links in linkcollector") % len(self.data["collector"])) - if len(self.data["packages"]) > 0: - self.core.logger.info(_("Found %s unqueued packages") % len(self.data["packages"])) - if len(self.data["queue"]) > 0: - self.core.logger.info(_("Added %s packages to queue") % len(self.data["queue"])) - - def save(self): - self.lock.acquire() - - pdata = { - "version": LIST_VERSION, - "queue": [], - "packages": [], - "collector": [] - } - - pdata["packages"] = [PyLoadPackageData().set(x) for x in self.data["packages"]] - pdata["queue"] = [PyLoadPackageData().set(x) for x in self.data["queue"]] - pdata["collector"] = [PyLoadFileData().set(x) for x in self.data["collector"]] - - output = open(join(self.core.configdir, "links.pkl"), "wb") - cPickle.dump(pdata, output, -1) - - self.lock.release() - - def queueEmpty(self): - return (self.data["queue"] == []) - - def getDownloadList(self, occ): - """ - for thread_list only, returns all elements that are suitable for downloadthread - """ - files = [] - files += [[x for x in p.files if x.status.type == None and x.plugin.__type__ == "container" and not x.active] for p in self.data["queue"] + self.data["packages"]] - files += [[x for x in p.files if (x.status.type == None or x.status.type == "reconnected") and not x.active and not x.plugin.__name__ in occ] for p in self.data["queue"]] - - return reduce(concat, files, []) - - def getAllFiles(self): - - return map(attrgetter("files"), self.data["queue"] + self.data["packages"]) - - def countDownloads(self): - """ simply return len of all files in all packages(which have no type) in queue and collector""" - return len(reduce(concat, [[x for x in p.files if x.status.type == None] for p in self.data["queue"] + self.data["packages"]], [])) - - def getFileInfo(self, id): - try: - n, pyfile = self.collector._getFileFromID(id) - except NoSuchElementException: - key, n, pyfile, pypack, pid = self.packager._getFileFromID(id) - info = {} - info["id"] = pyfile.id - info["url"] = pyfile.url - info["folder"] = pyfile.folder - info["filename"] = pyfile.status.filename - info["status_type"] = pyfile.status.type - info["status_url"] = pyfile.status.url - info["status_filename"] = pyfile.status.filename - info["status_error"] = pyfile.status.error - info["size"] = pyfile.status.size() - info["active"] = pyfile.active - info["plugin"] = pyfile.plugin.__name__ - try: - info["package"] = pypack.data["id"] - except: - pass - return info - - def continueAborted(self): - [[self.packager.resetFileStatus(x.id) for x in p.files if x.status.type == "aborted"] for p in self.data["queue"]] - - class pyLoadCollector(): - def __init__(collector, file_list): - collector.file_list = file_list - - def _getFileFromID(collector, id): - """ - returns PyLoadFile instance and position in collector with given id - """ - for n, pyfile in enumerate(collector.file_list.data["collector"]): - if pyfile.id == id: - return (n, pyfile) - raise NoSuchElementException() - - def _getFreeID(collector): - """ - returns a free id - """ - ids = [] - for pypack in (collector.file_list.data["packages"] + collector.file_list.data["queue"]): - for pyf in pypack.files: - ids.append(pyf.id) - ids += map(attrgetter("id"), collector.file_list.data["collector"]) - id = 1 - while id in ids: - id += 1 - return id - - def getFile(collector, id): - """ - returns PyLoadFile instance from given id - """ - return collector._getFileFromID(id)[1] - - def popFile(collector, id): - """ - returns PyLoadFile instance given id and remove it from the collector - """ - collector.file_list.lock.acquire() - try: - n, pyfile = collector._getFileFromID(id) - del collector.file_list.data["collector"][n] - collector.file_list.core.pullManager.addEvent(RemoveEvent("file", id, "collector")) - except Exception, e: - raise Exception, e - else: - return pyfile - finally: - collector.file_list.lock.release() - - def addLink(collector, url): - """ - appends a new PyLoadFile instance to the end of the collector - """ - pyfile = PyLoadFile(url, collector.file_list) - pyfile.id = collector._getFreeID() - pyfile.folder = collector.file_list.download_folder - collector.file_list.lock.acquire() - collector.file_list.data["collector"].append(pyfile) - collector.file_list.lock.release() - collector.file_list.core.pullManager.addEvent(InsertEvent("file", pyfile.id, -2, "collector")) - return pyfile.id - - def removeFile(collector, id): - """ - removes PyLoadFile instance with the given id from collector - """ - collector.popFile(id) - collector.file_list.core.pullManager.addEvent(RemoveEvent("file", id, "collector")) - - def replaceFile(collector, newpyfile): - """ - replaces PyLoadFile instance with the given PyLoadFile instance at the given id - """ - collector.file_list.lock.acquire() - try: - n, pyfile = collector._getFileFromID(newpyfile.id) - collector.file_list.data["collector"][n] = newpyfile - collector.file_list.core.pullManager.addEvent(UpdateEvent("file", newpyfile.id, "collector")) - finally: - collector.file_list.lock.release() - - class pyLoadPackager(): - def __init__(packager, file_list): - packager.file_list = file_list - - def _getFreeID(packager): - """ - returns a free id - """ - ids = [pypack.data["id"] for pypack in packager.file_list.data["packages"] + packager.file_list.data["queue"]] - - id = 1 - while id in ids: - id += 1 - return id - - def _getPackageFromID(packager, id): - """ - returns PyLoadPackage instance and position with given id - """ - for n, pypack in enumerate(packager.file_list.data["packages"]): - if pypack.data["id"] == id: - return ("packages", n, pypack) - for n, pypack in enumerate(packager.file_list.data["queue"]): - if pypack.data["id"] == id: - return ("queue", n, pypack) - raise NoSuchElementException() - - def _getFileFromID(packager, id): - """ - returns PyLoadFile instance and position with given id - """ - for n, pypack in enumerate(packager.file_list.data["packages"]): - for pyfile in pypack.files: - if pyfile.id == id: - return ("packages", n, pyfile, pypack, pypack.data["id"]) - for n, pypack in enumerate(packager.file_list.data["queue"]): - for pyfile in pypack.files: - if pyfile.id == id: - return ("queue", n, pyfile, pypack, pypack.data["id"]) - raise NoSuchElementException() - - def addNewPackage(packager, package_name=None): - pypack = PyLoadPackage() - pypack.data["id"] = packager._getFreeID() - if package_name is not None: - pypack.data["package_name"] = package_name - packager.file_list.data["packages"].append(pypack) - packager.file_list.core.pullManager.addEvent(InsertEvent("pack", pypack.data["id"], -2, "packages")) - return pypack.data["id"] - - def removePackage(packager, id): - packager.file_list.lock.acquire() - try: - key, n, pypack = packager._getPackageFromID(id) - for pyfile in pypack.files: - pyfile.plugin.req.abort = True - sleep(0.1) - del packager.file_list.data[key][n] - packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, key)) - finally: - packager.file_list.lock.release() - - def removeFile(packager, id): - """ - removes PyLoadFile instance with the given id from package - """ - packager.file_list.lock.acquire() - try: - key, n, pyfile, pypack, pid = packager._getFileFromID(id) - pyfile.plugin.req.abort = True - sleep(0.1) - packager.removeFileFromPackage(id, pid) - if not pypack.files: - packager.removePackage(pid) - finally: - packager.file_list.lock.release() - - def pushPackage2Queue(packager, id): - packager.file_list.lock.acquire() - try: - key, n, pypack = packager._getPackageFromID(id) - if key == "packages": - del packager.file_list.data["packages"][n] - packager.file_list.data["queue"].append(pypack) - packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, "packages")) - packager.file_list.core.pullManager.addEvent(InsertEvent("pack", id, -2, "queue")) - finally: - packager.file_list.lock.release() - - def pullOutPackage(packager, id): - packager.file_list.lock.acquire() - try: - key, n, pypack = packager._getPackageFromID(id) - if key == "queue": - del packager.file_list.data["queue"][n] - packager.file_list.data["packages"].append(pypack) - packager.file_list.core.pullManager.addEvent(RemoveEvent("pack", id, "queue")) - packager.file_list.core.pullManager.addEvent(InsertEvent("pack", id, -2, "packages")) - finally: - packager.file_list.lock.release() - - def setPackageData(packager, id, package_name=None, folder=None): - packager.file_list.lock.acquire() - try: - key, n, pypack = packager._getPackageFromID(id) - if package_name is not None: - pypack.data["package_name"] = package_name - if folder is not None: - pypack.data["folder"] = folder - packager.file_list.data[key][n] = pypack - packager.file_list.core.pullManager.addEvent(UpdateEvent("pack", id, key)) - finally: - packager.file_list.lock.release() - - def getPackageData(packager, id): - key, n, pypack = packager._getPackageFromID(id) - return pypack.data - - def getPackageFiles(packager, id): - key, n, pypack = packager._getPackageFromID(id) - ids = map(attrgetter("id"), pypack.files) - - return ids - - def addFileToPackage(packager, id, pyfile): - key, n, pypack = packager._getPackageFromID(id) - pyfile.package = pypack - pypack.files.append(pyfile) - packager.file_list.data[key][n] = pypack - packager.file_list.core.pullManager.addEvent(InsertEvent("file", pyfile.id, -2, key)) - - def resetFileStatus(packager, fileid): - packager.file_list.lock.acquire() - try: - key, n, pyfile, pypack, pid = packager._getFileFromID(fileid) - pyfile.init() - pyfile.status.type = None - packager.file_list.core.pullManager.addEvent(UpdateEvent("file", fileid, key)) - finally: - packager.file_list.lock.release() - - def abortFile(packager, fileid): - packager.file_list.lock.acquire() - try: - key, n, pyfile, pypack, pid = packager._getFileFromID(fileid) - pyfile.plugin.req.abort = True - packager.file_list.core.pullManager.addEvent(UpdateEvent("file", fileid, key)) - finally: - packager.file_list.lock.release() - - def removeFileFromPackage(packager, id, pid): - key, n, pypack = packager._getPackageFromID(pid) - for k, pyfile in enumerate(pypack.files): - if id == pyfile.id: - del pypack.files[k] - packager.file_list.core.pullManager.addEvent(RemoveEvent("file", pyfile.id, key)) - if not pypack.files: - packager.removePackage(pid) - return True - raise NoSuchElementException() - -class PyLoadPackage(): - def __init__(self): - self.files = [] - self.data = { - "id": None, - "package_name": "new_package", - "folder": "" - } - -class PyLoadFile(): - def __init__(self, url, file_list): - self.id = None - self.url = url - self.folder = "" - self.file_list = file_list - self.core = file_list.core - self.package = None - self.filename = "n/a" - self.init() - - def init(self): - self.active = False - pluginClass = self.core.pluginManager.getPluginFromPattern(self.url) - self.plugin = pluginClass(self) - self.status = Status(self) - self.status.filename = self.url - - def init_download(self): - if self.core.config['proxy']['activated']: - self.plugin.req.add_proxy(self.core.config['proxy']['protocol'], self.core.config['proxy']['adress']) - -class PyLoadFileData(): - def __init__(self): - self.id = None - self.url = None - self.folder = None - self.pack_id = None - self.filename = None - self.status_type = None - self.status_url = None - - def set(self, pyfile): - self.id = pyfile.id - self.url = pyfile.url - self.folder = pyfile.folder - self.parsePackage(pyfile.package) - self.filename = pyfile.filename - self.status_type = pyfile.status.type - self.status_url = pyfile.status.url - self.status_filename = pyfile.status.filename - self.status_error = pyfile.status.error - - return self - - def get(self, pyfile): - pyfile.id = self.id - pyfile.url = self.url - pyfile.folder = self.folder - pyfile.filename = self.filename - pyfile.status.type = self.status_type - pyfile.status.url = self.status_url - pyfile.status.filename = self.status_filename - pyfile.status.error = self.status_error - - def parsePackage(self, pack): - if pack: - self.pack_id = pack.data["id"] - -class PyLoadPackageData(): - def __init__(self): - self.data = None - self.files = [] - - def set(self, pypack): - self.data = pypack.data - self.files = [PyLoadFileData().set(x) for x in pypack.files] - return self - - def get(self, pypack, fl): - pypack.data = self.data - for fdata in self.files: - pyfile = PyLoadFile(fdata.url, fl) - fdata.get(pyfile) - pyfile.package = pypack - pypack.files.append(pyfile) |