diff --git a/couchpotato/api.py b/couchpotato/api.py
index a9f449be..b6135583 100644
--- a/couchpotato/api.py
+++ b/couchpotato/api.py
@@ -50,7 +50,8 @@ class NonBlockHandler(RequestHandler):
self.finish(response)
except:
log.error('Failed doing nonblock request: %s', (traceback.format_exc()))
- self.finish({'success': False, 'error': 'Failed returning results'})
+ try: self.finish({'success': False, 'error': 'Failed returning results'})
+ except: pass
def on_connection_close(self):
diff --git a/couchpotato/core/_base/_core/main.py b/couchpotato/core/_base/_core/main.py
index 9647d959..803ac5a3 100644
--- a/couchpotato/core/_base/_core/main.py
+++ b/couchpotato/core/_base/_core/main.py
@@ -56,7 +56,7 @@ class Core(Plugin):
self.signalHandler()
def md5Password(self, value):
- return md5(value.encode(Env.get('encoding'))) if value else ''
+ return md5(value) if value else ''
def checkApikey(self, value):
return value if value and len(value) > 3 else uuid4().hex
diff --git a/couchpotato/core/downloaders/utorrent/main.py b/couchpotato/core/downloaders/utorrent/main.py
index d9330076..ce82c8c2 100644
--- a/couchpotato/core/downloaders/utorrent/main.py
+++ b/couchpotato/core/downloaders/utorrent/main.py
@@ -77,7 +77,7 @@ class uTorrent(Downloader):
else:
info = bdecode(filedata)["info"]
torrent_hash = sha1(benc(info)).hexdigest().upper()
- torrent_filename = self.createFileName(data, filedata, movie)
+ torrent_filename = self.createFileName(data, filedata, movie)
if data.get('seed_ratio'):
torrent_params['seed_override'] = 1
@@ -93,7 +93,7 @@ class uTorrent(Downloader):
# Send request to uTorrent
if data.get('protocol') == 'torrent_magnet':
- self.utorrent_api.add_torrent_uri(data.get('url'))
+ self.utorrent_api.add_torrent_uri(torrent_filename, data.get('url'))
else:
self.utorrent_api.add_torrent_file(torrent_filename, filedata)
@@ -102,6 +102,39 @@ class uTorrent(Downloader):
if self.conf('paused', default = 0):
self.utorrent_api.pause_torrent(torrent_hash)
+ count = 0
+ while True:
+
+ count += 1
+ # Check if torrent is saved in subfolder of torrent name
+ data = self.utorrent_api.get_files(torrent_hash)
+
+ torrent_files = json.loads(data)
+ if torrent_files.get('error'):
+ log.error('Error getting data from uTorrent: %s', torrent_files.get('error'))
+ return False
+
+ if (torrent_files.get('files') and len(torrent_files['files'][1]) > 0) or count > 60:
+ break
+
+ time.sleep(1)
+
+ # Torrent has only one file, so uTorrent wont create a folder for it
+ if len(torrent_files['files'][1]) == 1:
+ # Remove torrent and try again
+ self.utorrent_api.remove_torrent(torrent_hash, remove_data = True)
+
+ # Send request to uTorrent
+ if data.get('protocol') == 'torrent_magnet':
+ self.utorrent_api.add_torrent_uri(torrent_filename, data.get('url'), add_folder = True)
+ else:
+ self.utorrent_api.add_torrent_file(torrent_filename, filedata, add_folder = True)
+
+ # Change settings of added torrent
+ self.utorrent_api.set_torrent(torrent_hash, torrent_params)
+ if self.conf('paused', default = 0):
+ self.utorrent_api.pause_torrent(torrent_hash)
+
return self.downloadReturnId(torrent_hash)
def getAllDownloadStatus(self):
@@ -224,12 +257,16 @@ class uTorrentAPI(object):
token = re.findall("
(.*?)", request.read())[0]
return token
- def add_torrent_uri(self, torrent):
+ def add_torrent_uri(self, filename, torrent, add_folder = False):
action = "action=add-url&s=%s" % urllib.quote(torrent)
+ if add_folder:
+ action += "&path=%s" % urllib.quote(filename)
return self._request(action)
- def add_torrent_file(self, filename, filedata):
+ def add_torrent_file(self, filename, filedata, add_folder = False):
action = "action=add-file"
+ if add_folder:
+ action += "&path=%s" % urllib.quote(filename)
return self._request(action, {"torrent_file": (ss(filename), filedata)})
def set_torrent(self, hash, params):
@@ -291,3 +328,7 @@ class uTorrentAPI(object):
action = 'action=setsetting' + ''.join(['&s=%s&v=%s' % (key, value) for (key, value) in settings_dict.items()])
return self._request(action)
+
+ def get_files(self, hash):
+ action = "action=getfiles&hash=%s" % hash
+ return self._request(action)
diff --git a/couchpotato/core/helpers/variable.py b/couchpotato/core/helpers/variable.py
index fd1a101d..d93c9417 100644
--- a/couchpotato/core/helpers/variable.py
+++ b/couchpotato/core/helpers/variable.py
@@ -101,7 +101,7 @@ def flattenList(l):
return l
def md5(text):
- return hashlib.md5(text).hexdigest()
+ return hashlib.md5(ss(text)).hexdigest()
def sha1(text):
return hashlib.sha1(text).hexdigest()
@@ -123,9 +123,12 @@ def cleanHost(host):
return host
-def getImdb(txt, check_inside = True, multiple = False):
+def getImdb(txt, check_inside = False, multiple = False):
- txt = ss(txt)
+ if not check_inside:
+ txt = simplifyString(txt)
+ else:
+ txt = ss(txt)
if check_inside and os.path.isfile(txt):
output = open(txt, 'r')
@@ -170,8 +173,11 @@ def getTitle(library_dict):
if title.default:
return title.title
except:
- log.error('Could not get title for %s', library_dict.identifier)
- return None
+ try:
+ return library_dict['info']['titles'][0]
+ except:
+ log.error('Could not get title for %s', library_dict.identifier)
+ return None
log.error('Could not get title for %s', library_dict['identifier'])
return None
diff --git a/couchpotato/core/media/movie/_base/static/search.css b/couchpotato/core/media/movie/_base/static/search.css
index dc747346..80c18153 100644
--- a/couchpotato/core/media/movie/_base/static/search.css
+++ b/couchpotato/core/media/movie/_base/static/search.css
@@ -59,6 +59,11 @@
.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 {
diff --git a/couchpotato/core/media/movie/searcher/main.py b/couchpotato/core/media/movie/searcher/main.py
index a8fca185..b08e7532 100644
--- a/couchpotato/core/media/movie/searcher/main.py
+++ b/couchpotato/core/media/movie/searcher/main.py
@@ -1,7 +1,7 @@
from couchpotato import get_session
from couchpotato.api import addApiView
from couchpotato.core.event import addEvent, fireEvent, fireEventAsync
-from couchpotato.core.helpers.encoding import simplifyString, toUnicode
+from couchpotato.core.helpers.encoding import simplifyString, toUnicode, ss
from couchpotato.core.helpers.variable import md5, getTitle, splitString, \
possibleTitles, getImdb
from couchpotato.core.logger import CPLog
diff --git a/couchpotato/core/plugins/base.py b/couchpotato/core/plugins/base.py
index b9ec0c06..ce7c1b49 100644
--- a/couchpotato/core/plugins/base.py
+++ b/couchpotato/core/plugins/base.py
@@ -259,7 +259,7 @@ class Plugin(object):
def getCache(self, cache_key, url = None, **kwargs):
- cache_key_md5 = md5(ss(cache_key))
+ cache_key_md5 = md5(cache_key)
cache = Env.get('cache').get(cache_key_md5)
if cache:
if not Env.get('dev'): log.debug('Getting cache %s', cache_key)
@@ -284,7 +284,7 @@ class Plugin(object):
return ''
def setCache(self, cache_key, value, timeout = 300):
- cache_key_md5 = md5(ss(cache_key))
+ cache_key_md5 = md5(cache_key)
log.debug('Setting cache %s', cache_key)
Env.get('cache').set(cache_key_md5, value, timeout)
return value
diff --git a/couchpotato/core/plugins/file/main.py b/couchpotato/core/plugins/file/main.py
index 238bc76c..fc63aca8 100644
--- a/couchpotato/core/plugins/file/main.py
+++ b/couchpotato/core/plugins/file/main.py
@@ -71,11 +71,11 @@ class FileManager(Plugin):
db = get_session()
for root, dirs, walk_files in os.walk(Env.get('cache_dir')):
for filename in walk_files:
- if root == python_cache or 'minified' in root or 'version' in filename or 'temp_updater' in root: continue
- file_path = os.path.join(root, filename)
- f = db.query(File).filter(File.path == toUnicode(file_path)).first()
- if not f:
- os.remove(file_path)
+ if os.path.splitext(filename)[1] in ['.png', '.jpg', '.jpeg']:
+ file_path = os.path.join(root, filename)
+ f = db.query(File).filter(File.path == toUnicode(file_path)).first()
+ if not f:
+ os.remove(file_path)
except:
log.error('Failed removing unused file: %s', traceback.format_exc())
diff --git a/couchpotato/core/plugins/renamer/__init__.py b/couchpotato/core/plugins/renamer/__init__.py
index 6472a2df..921b3e1e 100755
--- a/couchpotato/core/plugins/renamer/__init__.py
+++ b/couchpotato/core/plugins/renamer/__init__.py
@@ -120,7 +120,13 @@ config = [{
{
'advanced': True,
'name': 'separator',
- 'label': 'Separator',
+ 'label': 'File-Separator',
+ 'description': 'Replace all the spaces with a character. Example: ".", "-" (without quotes). Leave empty to use spaces.',
+ },
+ {
+ 'advanced': True,
+ 'name': 'foldersep',
+ 'label': 'Folder-Separator',
'description': 'Replace all the spaces with a character. Example: ".", "-" (without quotes). Leave empty to use spaces.',
},
{
diff --git a/couchpotato/core/plugins/renamer/main.py b/couchpotato/core/plugins/renamer/main.py
old mode 100644
new mode 100755
index 0013298a..ad7df1cf
--- a/couchpotato/core/plugins/renamer/main.py
+++ b/couchpotato/core/plugins/renamer/main.py
@@ -252,7 +252,7 @@ class Renamer(Plugin):
replacements['cd_nr'] = cd if multiple else ''
# Naming
- final_folder_name = self.doReplace(folder_name, replacements)
+ final_folder_name = self.doReplace(folder_name, replacements, folder = True)
final_file_name = self.doReplace(file_name, replacements)
replacements['filename'] = final_file_name[:-(len(getExt(final_file_name)) + 1)]
@@ -508,7 +508,7 @@ class Renamer(Plugin):
for extra in set(filter(test, group['files'][extra_type])):
replacements['ext'] = getExt(extra)
- final_folder_name = self.doReplace(folder_name, replacements, remove_multiple = remove_multiple)
+ final_folder_name = self.doReplace(folder_name, replacements, remove_multiple = remove_multiple, folder = True)
final_file_name = self.doReplace(file_name, replacements, remove_multiple = remove_multiple)
rename_files[extra] = os.path.join(destination, final_folder_name, final_file_name)
@@ -603,7 +603,7 @@ Remove it if you want it to be renamed (again, or at least let it try again)
return True
- def doReplace(self, string, replacements, remove_multiple = False):
+ def doReplace(self, string, replacements, remove_multiple = False, folder = False):
"""
replace confignames with the real thing
"""
@@ -623,7 +623,7 @@ Remove it if you want it to be renamed (again, or at least let it try again)
replaced = re.sub(r"[\x00:\*\?\"<>\|]", '', replaced)
- sep = self.conf('separator')
+ sep = self.conf('foldersep') if folder else self.conf('separator')
return self.replaceDoubles(replaced.lstrip('. ')).replace(' ', ' ' if not sep else sep)
def replaceDoubles(self, string):
diff --git a/couchpotato/core/plugins/scanner/main.py b/couchpotato/core/plugins/scanner/main.py
index ff17b647..0662d008 100644
--- a/couchpotato/core/plugins/scanner/main.py
+++ b/couchpotato/core/plugins/scanner/main.py
@@ -565,7 +565,7 @@ class Scanner(Plugin):
if not imdb_id:
try:
for nf in files['nfo']:
- imdb_id = getImdb(nf)
+ imdb_id = getImdb(nf, check_inside = True)
if imdb_id:
log.debug('Found movie via nfo file: %s', nf)
nfo_file = nf
@@ -578,7 +578,7 @@ class Scanner(Plugin):
try:
for filetype in files:
for filetype_file in files[filetype]:
- imdb_id = getImdb(filetype_file, check_inside = False)
+ imdb_id = getImdb(filetype_file)
if imdb_id:
log.debug('Found movie via imdb in filename: %s', nfo_file)
break
diff --git a/couchpotato/core/providers/torrent/torrentshack/main.py b/couchpotato/core/providers/torrent/torrentshack/main.py
index b9d12c71..353b606e 100644
--- a/couchpotato/core/providers/torrent/torrentshack/main.py
+++ b/couchpotato/core/providers/torrent/torrentshack/main.py
@@ -11,12 +11,12 @@ log = CPLog(__name__)
class TorrentShack(TorrentProvider):
urls = {
- 'test' : 'http://www.torrentshack.net/',
- 'login' : 'http://www.torrentshack.net/login.php',
- 'login_check': 'http://www.torrentshack.net/inbox.php',
- 'detail' : 'http://www.torrentshack.net/torrent/%s',
- 'search' : 'http://www.torrentshack.net/torrents.php?searchstr=%s&filter_cat[%d]=1',
- 'download' : 'http://www.torrentshack.net/%s',
+ 'test' : 'https://torrentshack.net/',
+ 'login' : 'https://torrentshack.net/login.php',
+ 'login_check': 'https://torrentshack.net/inbox.php',
+ 'detail' : 'https://torrentshack.net/torrent/%s',
+ 'search' : 'https://torrentshack.net/torrents.php?searchstr=%s&filter_cat[%d]=1',
+ 'download' : 'https://torrentshack.net/%s',
}
cat_ids = [
diff --git a/libs/unrar2/PKG-INFO b/libs/unrar2/PKG-INFO
deleted file mode 100644
index 7e495929..00000000
--- a/libs/unrar2/PKG-INFO
+++ /dev/null
@@ -1,27 +0,0 @@
-Metadata-Version: 1.0
-Name: pyUnRAR2
-Version: 0.99.2
-Summary: Improved Python wrapper around the free UnRAR.dll
-Home-page: http://code.google.com/py-unrar2
-Author: Konstantin Yegupov
-Author-email: yk4ever@gmail.com
-License: MIT
-Description: pyUnRAR2 is a ctypes based wrapper around the free UnRAR.dll.
-
- It is an modified version of Jimmy Retzlaff's pyUnRAR - more simple,
- stable and foolproof.
- Notice that it has INCOMPATIBLE interface.
-
- It enables reading and unpacking of archives created with the
- RAR/WinRAR archivers. There is a low-level interface which is very
- similar to the C interface provided by UnRAR. There is also a
- higher level interface which makes some common operations easier.
-Platform: Windows
-Classifier: Development Status :: 4 - Beta
-Classifier: Environment :: Win32 (MS Windows)
-Classifier: License :: OSI Approved :: MIT License
-Classifier: Natural Language :: English
-Classifier: Operating System :: Microsoft :: Windows
-Classifier: Programming Language :: Python
-Classifier: Topic :: Software Development :: Libraries :: Python Modules
-Classifier: Topic :: System :: Archiving :: Compression
diff --git a/libs/unrar2/UnRAR2.html b/libs/unrar2/UnRAR2.html
deleted file mode 100644
index 0553ee04..00000000
--- a/libs/unrar2/UnRAR2.html
+++ /dev/null
@@ -1,191 +0,0 @@
-
-
-Python: package UnRAR2
-
-
-
- pyUnRAR2 is a ctypes based wrapper around the free UnRAR.dll.
-
-It is an modified version of Jimmy Retzlaff's pyUnRAR - more simple,
-stable and foolproof.
-Notice that it has INCOMPATIBLE interface.
-
-It enables reading and unpacking of archives created with the
-RAR/WinRAR archivers. There is a low-level interface which is very
-similar to the C interface provided by UnRAR. There is also a
-higher level interface which makes some common operations easier.
-
-
-
-
-Package Contents |
-
-| | |
- |
-
-
-
-Classes |
-
-| | |
-
-- UnRAR2.windows.RarFileImplementation(__builtin__.object)
-
-
-
-- RarFile
-
-
-- __builtin__.object
-
-
-
-- RarInfo
-
-
-
-
-
-
-
-class RarFile(UnRAR2.windows.RarFileImplementation) |
-
-| | |
-- Method resolution order:
-- RarFile
-- UnRAR2.windows.RarFileImplementation
-- __builtin__.object
-
-
-Methods defined here:
-- __del__(self)
-
-- __init__(self, archiveName, password=None)
- Instantiate the archive.
-
-archiveName is the name of the RAR file.
-password is used to decrypt the files in the archive.
-
-Properties:
- comment - comment associated with the archive
-
->>> print RarFile('test.rar').comment
-This is a test.
-
-- extract(self, condition='*', path='.', withSubpath=True, overwrite=True)
- Extract specific files from archive to disk.
-
-If "condition" is a list of numbers, then extract files which have those positions in infolist.
-If "condition" is a string, then it is treated as a wildcard for names of files to extract.
-If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
- and returns either boolean True (extract) or boolean False (skip).
-DEPRECATED: If "condition" callback returns string (only supported for Windows) -
- that string will be used as a new name to save the file under.
-If "condition" is omitted, all files are extracted.
-
-"path" is a directory to extract to
-"withSubpath" flag denotes whether files are extracted with their full path in the archive.
-"overwrite" flag denotes whether extracted files will overwrite old ones. Defaults to true.
-
-Returns list of RarInfos for extracted files.
-
-- infoiter(self)
- Iterate over all the files in the archive, generating RarInfos.
-
->>> import os
->>> for fileInArchive in RarFile('test.rar').infoiter():
-... print os.path.split(fileInArchive.filename)[-1],
-... print fileInArchive.isdir,
-... print fileInArchive.size,
-... print fileInArchive.comment,
-... print tuple(fileInArchive.datetime)[0:5],
-... print time.strftime('%a, %d %b %Y %H:%M', fileInArchive.datetime)
-test True 0 None (2003, 6, 30, 1, 59) Mon, 30 Jun 2003 01:59
-test.txt False 20 None (2003, 6, 30, 2, 1) Mon, 30 Jun 2003 02:01
-this.py False 1030 None (2002, 2, 8, 16, 47) Fri, 08 Feb 2002 16:47
-
-- infolist(self)
- Return a list of RarInfos, descripting the contents of the archive.
-
-- read_files(self, condition='*')
- Read specific files from archive into memory.
-If "condition" is a list of numbers, then return files which have those positions in infolist.
-If "condition" is a string, then it is treated as a wildcard for names of files to extract.
-If "condition" is a function, it is treated as a callback function, which accepts a RarInfo object
- and returns boolean True (extract) or False (skip).
-If "condition" is omitted, all files are returned.
-
-Returns list of tuples (RarInfo info, str contents)
-
-
-Methods inherited from UnRAR2.windows.RarFileImplementation:
-- destruct(self)
-
-- init(self, password=None)
-
-- make_sure_ready(self)
-
-
-Data descriptors inherited from UnRAR2.windows.RarFileImplementation:
-- __dict__
-- dictionary for instance variables (if defined)
-
-- __weakref__
-- list of weak references to the object (if defined)
-
- |
-
-
-
-class RarInfo(__builtin__.object) |
-
-| |
-Represents a file header in an archive. Don't instantiate directly.
-Use only to obtain information about file.
-YOU CANNOT EXTRACT FILE CONTENTS USING THIS OBJECT.
-USE METHODS OF RarFile CLASS INSTEAD.
-
-Properties:
- index - index of file within the archive
- filename - name of the file in the archive including path (if any)
- datetime - file date/time as a struct_time suitable for time.strftime
- isdir - True if the file is a directory
- size - size in bytes of the uncompressed file
- comment - comment associated with the file
-
-Note - this is not currently intended to be a Python file-like object. |
-| |
-Methods defined here:
-- __init__(self, rarfile, data)
-
-- __str__(self)
-
-
-Data descriptors defined here:
-- __dict__
-- dictionary for instance variables (if defined)
-
-- __weakref__
-- list of weak references to the object (if defined)
-
- | |
-
-
-
-Functions |
-
-| | |
-- condition2checker(condition)
- Converts different condition types to callback
- |
-
-
-
-Data |
-
-| | |
-__version__ = '0.99.1'
-in_windows = True |
-
\ No newline at end of file
diff --git a/libs/unrar2/UnRARDLL/license.txt b/libs/unrar2/UnRARDLL/license.txt
deleted file mode 100644
index 0c1540e5..00000000
--- a/libs/unrar2/UnRARDLL/license.txt
+++ /dev/null
@@ -1,18 +0,0 @@
- The unrar.dll library is freeware. This means:
-
- 1. All copyrights to RAR and the unrar.dll are exclusively
- owned by the author - Alexander Roshal.
-
- 2. The unrar.dll library may be used in any software to handle RAR
- archives without limitations free of charge.
-
- 3. THE RAR ARCHIVER AND THE UNRAR.DLL LIBRARY ARE DISTRIBUTED "AS IS".
- NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT
- YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS,
- DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING
- OR MISUSING THIS SOFTWARE.
-
- Thank you for your interest in RAR and unrar.dll.
-
-
- Alexander L. Roshal
\ No newline at end of file
diff --git a/libs/unrar2/UnRARDLL/unrar.h b/libs/unrar2/UnRARDLL/unrar.h
deleted file mode 100644
index 4582f2c6..00000000
--- a/libs/unrar2/UnRARDLL/unrar.h
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef _UNRAR_DLL_
-#define _UNRAR_DLL_
-
-#define ERAR_END_ARCHIVE 10
-#define ERAR_NO_MEMORY 11
-#define ERAR_BAD_DATA 12
-#define ERAR_BAD_ARCHIVE 13
-#define ERAR_UNKNOWN_FORMAT 14
-#define ERAR_EOPEN 15
-#define ERAR_ECREATE 16
-#define ERAR_ECLOSE 17
-#define ERAR_EREAD 18
-#define ERAR_EWRITE 19
-#define ERAR_SMALL_BUF 20
-#define ERAR_UNKNOWN 21
-#define ERAR_MISSING_PASSWORD 22
-
-#define RAR_OM_LIST 0
-#define RAR_OM_EXTRACT 1
-#define RAR_OM_LIST_INCSPLIT 2
-
-#define RAR_SKIP 0
-#define RAR_TEST 1
-#define RAR_EXTRACT 2
-
-#define RAR_VOL_ASK 0
-#define RAR_VOL_NOTIFY 1
-
-#define RAR_DLL_VERSION 4
-
-#ifdef _UNIX
-#define CALLBACK
-#define PASCAL
-#define LONG long
-#define HANDLE void *
-#define LPARAM long
-#define UINT unsigned int
-#endif
-
-struct RARHeaderData
-{
- char ArcName[260];
- char FileName[260];
- unsigned int Flags;
- unsigned int PackSize;
- unsigned int UnpSize;
- unsigned int HostOS;
- unsigned int FileCRC;
- unsigned int FileTime;
- unsigned int UnpVer;
- unsigned int Method;
- unsigned int FileAttr;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
-};
-
-
-struct RARHeaderDataEx
-{
- char ArcName[1024];
- wchar_t ArcNameW[1024];
- char FileName[1024];
- wchar_t FileNameW[1024];
- unsigned int Flags;
- unsigned int PackSize;
- unsigned int PackSizeHigh;
- unsigned int UnpSize;
- unsigned int UnpSizeHigh;
- unsigned int HostOS;
- unsigned int FileCRC;
- unsigned int FileTime;
- unsigned int UnpVer;
- unsigned int Method;
- unsigned int FileAttr;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
- unsigned int Reserved[1024];
-};
-
-
-struct RAROpenArchiveData
-{
- char *ArcName;
- unsigned int OpenMode;
- unsigned int OpenResult;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
-};
-
-struct RAROpenArchiveDataEx
-{
- char *ArcName;
- wchar_t *ArcNameW;
- unsigned int OpenMode;
- unsigned int OpenResult;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
- unsigned int Flags;
- unsigned int Reserved[32];
-};
-
-enum UNRARCALLBACK_MESSAGES {
- UCM_CHANGEVOLUME,UCM_PROCESSDATA,UCM_NEEDPASSWORD
-};
-
-typedef int (CALLBACK *UNRARCALLBACK)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2);
-
-typedef int (PASCAL *CHANGEVOLPROC)(char *ArcName,int Mode);
-typedef int (PASCAL *PROCESSDATAPROC)(unsigned char *Addr,int Size);
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData);
-HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData);
-int PASCAL RARCloseArchive(HANDLE hArcData);
-int PASCAL RARReadHeader(HANDLE hArcData,struct RARHeaderData *HeaderData);
-int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData);
-int PASCAL RARProcessFile(HANDLE hArcData,int Operation,char *DestPath,char *DestName);
-int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName);
-void PASCAL RARSetCallback(HANDLE hArcData,UNRARCALLBACK Callback,LPARAM UserData);
-void PASCAL RARSetChangeVolProc(HANDLE hArcData,CHANGEVOLPROC ChangeVolProc);
-void PASCAL RARSetProcessDataProc(HANDLE hArcData,PROCESSDATAPROC ProcessDataProc);
-void PASCAL RARSetPassword(HANDLE hArcData,char *Password);
-int PASCAL RARGetDllVersion();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/libs/unrar2/UnRARDLL/unrar.lib b/libs/unrar2/UnRARDLL/unrar.lib
deleted file mode 100644
index 0f6b3146..00000000
Binary files a/libs/unrar2/UnRARDLL/unrar.lib and /dev/null differ
diff --git a/libs/unrar2/UnRARDLL/unrardll.txt b/libs/unrar2/UnRARDLL/unrardll.txt
deleted file mode 100644
index c49dd5b4..00000000
--- a/libs/unrar2/UnRARDLL/unrardll.txt
+++ /dev/null
@@ -1,606 +0,0 @@
-
- UnRAR.dll Manual
- ~~~~~~~~~~~~~~~~
-
- UnRAR.dll is a 32-bit Windows dynamic-link library which provides
- file extraction from RAR archives.
-
-
- Exported functions
-
-====================================================================
-HANDLE PASCAL RAROpenArchive(struct RAROpenArchiveData *ArchiveData)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Open RAR archive and allocate memory structures
-
-Parameters
-~~~~~~~~~~
-ArchiveData Points to RAROpenArchiveData structure
-
-struct RAROpenArchiveData
-{
- char *ArcName;
- UINT OpenMode;
- UINT OpenResult;
- char *CmtBuf;
- UINT CmtBufSize;
- UINT CmtSize;
- UINT CmtState;
-};
-
-Structure fields:
-
-ArcName
- Input parameter which should point to zero terminated string
- containing the archive name.
-
-OpenMode
- Input parameter.
-
- Possible values
-
- RAR_OM_LIST
- Open archive for reading file headers only.
-
- RAR_OM_EXTRACT
- Open archive for testing and extracting files.
-
- RAR_OM_LIST_INCSPLIT
- Open archive for reading file headers only. If you open an archive
- in such mode, RARReadHeader[Ex] will return all file headers,
- including those with "file continued from previous volume" flag.
- In case of RAR_OM_LIST such headers are automatically skipped.
- So if you process RAR volumes in RAR_OM_LIST_INCSPLIT mode, you will
- get several file header records for same file if file is split between
- volumes. For such files only the last file header record will contain
- the correct file CRC and if you wish to get the correct packed size,
- you need to sum up packed sizes of all parts.
-
-OpenResult
- Output parameter.
-
- Possible values
-
- 0 Success
- ERAR_NO_MEMORY Not enough memory to initialize data structures
- ERAR_BAD_DATA Archive header broken
- ERAR_BAD_ARCHIVE File is not valid RAR archive
- ERAR_UNKNOWN_FORMAT Unknown encryption used for archive headers
- ERAR_EOPEN File open error
-
-CmtBuf
- Input parameter which should point to the buffer for archive
- comments. Maximum comment size is limited to 64Kb. Comment text is
- zero terminated. If the comment text is larger than the buffer
- size, the comment text will be truncated. If CmtBuf is set to
- NULL, comments will not be read.
-
-CmtBufSize
- Input parameter which should contain size of buffer for archive
- comments.
-
-CmtSize
- Output parameter containing size of comments actually read into the
- buffer, cannot exceed CmtBufSize.
-
-CmtState
- Output parameter.
-
- Possible values
-
- 0 comments not present
- 1 Comments read completely
- ERAR_NO_MEMORY Not enough memory to extract comments
- ERAR_BAD_DATA Broken comment
- ERAR_UNKNOWN_FORMAT Unknown comment format
- ERAR_SMALL_BUF Buffer too small, comments not completely read
-
-Return values
-~~~~~~~~~~~~~
- Archive handle or NULL in case of error
-
-
-========================================================================
-HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData)
-========================================================================
-
-Description
-~~~~~~~~~~~
- Similar to RAROpenArchive, but uses RAROpenArchiveDataEx structure
- allowing to specify Unicode archive name and returning information
- about archive flags.
-
-Parameters
-~~~~~~~~~~
-ArchiveData Points to RAROpenArchiveDataEx structure
-
-struct RAROpenArchiveDataEx
-{
- char *ArcName;
- wchar_t *ArcNameW;
- unsigned int OpenMode;
- unsigned int OpenResult;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
- unsigned int Flags;
- unsigned int Reserved[32];
-};
-
-Structure fields:
-
-ArcNameW
- Input parameter which should point to zero terminated Unicode string
- containing the archive name or NULL if Unicode name is not specified.
-
-Flags
- Output parameter. Combination of bit flags.
-
- Possible values
-
- 0x0001 - Volume attribute (archive volume)
- 0x0002 - Archive comment present
- 0x0004 - Archive lock attribute
- 0x0008 - Solid attribute (solid archive)
- 0x0010 - New volume naming scheme ('volname.partN.rar')
- 0x0020 - Authenticity information present
- 0x0040 - Recovery record present
- 0x0080 - Block headers are encrypted
- 0x0100 - First volume (set only by RAR 3.0 and later)
-
-Reserved[32]
- Reserved for future use. Must be zero.
-
-Information on other structure fields and function return values
-is available above, in RAROpenArchive function description.
-
-
-====================================================================
-int PASCAL RARCloseArchive(HANDLE hArcData)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Close RAR archive and release allocated memory. It must be called when
- archive processing is finished, even if the archive processing was stopped
- due to an error.
-
-Parameters
-~~~~~~~~~~
-hArcData
- This parameter should contain the archive handle obtained from the
- RAROpenArchive function call.
-
-Return values
-~~~~~~~~~~~~~
- 0 Success
- ERAR_ECLOSE Archive close error
-
-
-====================================================================
-int PASCAL RARReadHeader(HANDLE hArcData,
- struct RARHeaderData *HeaderData)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Read header of file in archive.
-
-Parameters
-~~~~~~~~~~
-hArcData
- This parameter should contain the archive handle obtained from the
- RAROpenArchive function call.
-
-HeaderData
- It should point to RARHeaderData structure:
-
-struct RARHeaderData
-{
- char ArcName[260];
- char FileName[260];
- UINT Flags;
- UINT PackSize;
- UINT UnpSize;
- UINT HostOS;
- UINT FileCRC;
- UINT FileTime;
- UINT UnpVer;
- UINT Method;
- UINT FileAttr;
- char *CmtBuf;
- UINT CmtBufSize;
- UINT CmtSize;
- UINT CmtState;
-};
-
-Structure fields:
-
-ArcName
- Output parameter which contains a zero terminated string of the
- current archive name. May be used to determine the current volume
- name.
-
-FileName
- Output parameter which contains a zero terminated string of the
- file name in OEM (DOS) encoding.
-
-Flags
- Output parameter which contains file flags:
-
- 0x01 - file continued from previous volume
- 0x02 - file continued on next volume
- 0x04 - file encrypted with password
- 0x08 - file comment present
- 0x10 - compression of previous files is used (solid flag)
-
- bits 7 6 5
-
- 0 0 0 - dictionary size 64 Kb
- 0 0 1 - dictionary size 128 Kb
- 0 1 0 - dictionary size 256 Kb
- 0 1 1 - dictionary size 512 Kb
- 1 0 0 - dictionary size 1024 Kb
- 1 0 1 - dictionary size 2048 KB
- 1 1 0 - dictionary size 4096 KB
- 1 1 1 - file is directory
-
- Other bits are reserved.
-
-PackSize
- Output parameter means packed file size or size of the
- file part if file was split between volumes.
-
-UnpSize
- Output parameter - unpacked file size.
-
-HostOS
- Output parameter - operating system used for archiving:
-
- 0 - MS DOS;
- 1 - OS/2.
- 2 - Win32
- 3 - Unix
-
-FileCRC
- Output parameter which contains unpacked file CRC. In case of file parts
- split between volumes only the last part contains the correct CRC
- and it is accessible only in RAR_OM_LIST_INCSPLIT listing mode.
-
-FileTime
- Output parameter - contains date and time in standard MS DOS format.
-
-UnpVer
- Output parameter - RAR version needed to extract file.
- It is encoded as 10 * Major version + minor version.
-
-Method
- Output parameter - packing method.
-
-FileAttr
- Output parameter - file attributes.
-
-CmtBuf
- File comments support is not implemented in the new DLL version yet.
- Now CmtState is always 0.
-
-/*
- * Input parameter which should point to the buffer for file
- * comments. Maximum comment size is limited to 64Kb. Comment text is
- * a zero terminated string in OEM encoding. If the comment text is
- * larger than the buffer size, the comment text will be truncated.
- * If CmtBuf is set to NULL, comments will not be read.
- */
-
-CmtBufSize
- Input parameter which should contain size of buffer for archive
- comments.
-
-CmtSize
- Output parameter containing size of comments actually read into the
- buffer, should not exceed CmtBufSize.
-
-CmtState
- Output parameter.
-
- Possible values
-
- 0 Absent comments
- 1 Comments read completely
- ERAR_NO_MEMORY Not enough memory to extract comments
- ERAR_BAD_DATA Broken comment
- ERAR_UNKNOWN_FORMAT Unknown comment format
- ERAR_SMALL_BUF Buffer too small, comments not completely read
-
-Return values
-~~~~~~~~~~~~~
-
- 0 Success
- ERAR_END_ARCHIVE End of archive
- ERAR_BAD_DATA File header broken
-
-
-====================================================================
-int PASCAL RARReadHeaderEx(HANDLE hArcData,
- struct RARHeaderDataEx *HeaderData)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Similar to RARReadHeader, but uses RARHeaderDataEx structure,
-containing information about Unicode file names and 64 bit file sizes.
-
-struct RARHeaderDataEx
-{
- char ArcName[1024];
- wchar_t ArcNameW[1024];
- char FileName[1024];
- wchar_t FileNameW[1024];
- unsigned int Flags;
- unsigned int PackSize;
- unsigned int PackSizeHigh;
- unsigned int UnpSize;
- unsigned int UnpSizeHigh;
- unsigned int HostOS;
- unsigned int FileCRC;
- unsigned int FileTime;
- unsigned int UnpVer;
- unsigned int Method;
- unsigned int FileAttr;
- char *CmtBuf;
- unsigned int CmtBufSize;
- unsigned int CmtSize;
- unsigned int CmtState;
- unsigned int Reserved[1024];
-};
-
-
-====================================================================
-int PASCAL RARProcessFile(HANDLE hArcData,
- int Operation,
- char *DestPath,
- char *DestName)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Performs action and moves the current position in the archive to
- the next file. Extract or test the current file from the archive
- opened in RAR_OM_EXTRACT mode. If the mode RAR_OM_LIST is set,
- then a call to this function will simply skip the archive position
- to the next file.
-
-Parameters
-~~~~~~~~~~
-hArcData
- This parameter should contain the archive handle obtained from the
- RAROpenArchive function call.
-
-Operation
- File operation.
-
- Possible values
-
- RAR_SKIP Move to the next file in the archive. If the
- archive is solid and RAR_OM_EXTRACT mode was set
- when the archive was opened, the current file will
- be processed - the operation will be performed
- slower than a simple seek.
-
- RAR_TEST Test the current file and move to the next file in
- the archive. If the archive was opened with
- RAR_OM_LIST mode, the operation is equal to
- RAR_SKIP.
-
- RAR_EXTRACT Extract the current file and move to the next file.
- If the archive was opened with RAR_OM_LIST mode,
- the operation is equal to RAR_SKIP.
-
-
-DestPath
- This parameter should point to a zero terminated string containing the
- destination directory to which to extract files to. If DestPath is equal
- to NULL, it means extract to the current directory. This parameter has
- meaning only if DestName is NULL.
-
-DestName
- This parameter should point to a string containing the full path and name
- to assign to extracted file or it can be NULL to use the default name.
- If DestName is defined (not NULL), it overrides both the original file
- name saved in the archive and path specigied in DestPath setting.
-
- Both DestPath and DestName must be in OEM encoding. If necessary,
- use CharToOem to convert text to OEM before passing to this function.
-
-Return values
-~~~~~~~~~~~~~
- 0 Success
- ERAR_BAD_DATA File CRC error
- ERAR_BAD_ARCHIVE Volume is not valid RAR archive
- ERAR_UNKNOWN_FORMAT Unknown archive format
- ERAR_EOPEN Volume open error
- ERAR_ECREATE File create error
- ERAR_ECLOSE File close error
- ERAR_EREAD Read error
- ERAR_EWRITE Write error
-
-
-Note: if you wish to cancel extraction, return -1 when processing
- UCM_PROCESSDATA callback message.
-
-
-====================================================================
-int PASCAL RARProcessFileW(HANDLE hArcData,
- int Operation,
- wchar_t *DestPath,
- wchar_t *DestName)
-====================================================================
-
-Description
-~~~~~~~~~~~
- Unicode version of RARProcessFile. It uses Unicode DestPath
- and DestName parameters, other parameters and return values
- are the same as in RARProcessFile.
-
-
-====================================================================
-void PASCAL RARSetCallback(HANDLE hArcData,
- int PASCAL (*CallbackProc)(UINT msg,LPARAM UserData,LPARAM P1,LPARAM P2),
- LPARAM UserData);
-====================================================================
-
-Description
-~~~~~~~~~~~
- Set a user-defined callback function to process Unrar events.
-
-Parameters
-~~~~~~~~~~
-hArcData
- This parameter should contain the archive handle obtained from the
- RAROpenArchive function call.
-
-CallbackProc
- It should point to a user-defined callback function.
-
- The function will be passed four parameters:
-
-
- msg Type of event. Described below.
-
- UserData User defined value passed to RARSetCallback.
-
- P1 and P2 Event dependent parameters. Described below.
-
-
- Possible events
-
- UCM_CHANGEVOLUME Process volume change.
-
- P1 Points to the zero terminated name
- of the next volume.
-
- P2 The function call mode:
-
- RAR_VOL_ASK Required volume is absent. The function should
- prompt user and return a positive value
- to retry or return -1 value to terminate
- operation. The function may also specify a new
- volume name, placing it to the address specified
- by P1 parameter.
-
- RAR_VOL_NOTIFY Required volume is successfully opened.
- This is a notification call and volume name
- modification is not allowed. The function should
- return a positive value to continue or -1
- to terminate operation.
-
- UCM_PROCESSDATA Process unpacked data. It may be used to read
- a file while it is being extracted or tested
- without actual extracting file to disk.
- Return a positive value to continue process
- or -1 to cancel the archive operation
-
- P1 Address pointing to the unpacked data.
- Function may refer to the data but must not
- change it.
-
- P2 Size of the unpacked data. It is guaranteed
- only that the size will not exceed the maximum
- dictionary size (4 Mb in RAR 3.0).
-
- UCM_NEEDPASSWORD DLL needs a password to process archive.
- This message must be processed if you wish
- to be able to handle archives with encrypted
- file names. It can be also used as replacement
- of RARSetPassword function even for usual
- encrypted files with non-encrypted names.
-
- P1 Address pointing to the buffer for a password.
- You need to copy a password here.
-
- P2 Size of the password buffer.
-
-
-UserData
- User data passed to callback function.
-
- Other functions of UnRAR.dll should not be called from the callback
- function.
-
-Return values
-~~~~~~~~~~~~~
- None
-
-
-
-====================================================================
-void PASCAL RARSetChangeVolProc(HANDLE hArcData,
- int PASCAL (*ChangeVolProc)(char *ArcName,int Mode));
-====================================================================
-
-Obsoleted, use RARSetCallback instead.
-
-
-
-====================================================================
-void PASCAL RARSetProcessDataProc(HANDLE hArcData,
- int PASCAL (*ProcessDataProc)(unsigned char *Addr,int Size))
-====================================================================
-
-Obsoleted, use RARSetCallback instead.
-
-
-====================================================================
-void PASCAL RARSetPassword(HANDLE hArcData,
- char *Password);
-====================================================================
-
-Description
-~~~~~~~~~~~
- Set a password to decrypt files.
-
-Parameters
-~~~~~~~~~~
-hArcData
- This parameter should contain the archive handle obtained from the
- RAROpenArchive function call.
-
-Password
- It should point to a string containing a zero terminated password.
-
-Return values
-~~~~~~~~~~~~~
- None
-
-
-====================================================================
-void PASCAL RARGetDllVersion();
-====================================================================
-
-Description
-~~~~~~~~~~~
- Returns API version.
-
-Parameters
-~~~~~~~~~~
- None.
-
-Return values
-~~~~~~~~~~~~~
- Returns an integer value denoting UnRAR.dll API version, which is also
-defined in unrar.h as RAR_DLL_VERSION. API version number is incremented
-only in case of noticeable changes in UnRAR.dll API. Do not confuse it
-with version of UnRAR.dll stored in DLL resources, which is incremented
-with every DLL rebuild.
-
- If RARGetDllVersion() returns a value lower than UnRAR.dll which your
-application was designed for, it may indicate that DLL version is too old
-and it will fail to provide all necessary functions to your application.
-
- This function is absent in old versions of UnRAR.dll, so it is safer
-to use LoadLibrary and GetProcAddress to access this function.
-
diff --git a/libs/unrar2/UnRARDLL/whatsnew.txt b/libs/unrar2/UnRARDLL/whatsnew.txt
deleted file mode 100644
index 874d19b1..00000000
--- a/libs/unrar2/UnRARDLL/whatsnew.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-List of unrar.dll API changes. We do not include performance and reliability
-improvements into this list, but this library and RAR/UnRAR tools share
-the same source code. So the latest version of unrar.dll usually contains
-same decompression algorithm changes as the latest UnRAR version.
-============================================================================
-
--- 18 January 2008
-
-all LONG parameters of CallbackProc function were changed
-to LPARAM type for 64 bit mode compatibility.
-
-
--- 12 December 2007
-
-Added new RAR_OM_LIST_INCSPLIT open mode for function RAROpenArchive.
-
-
--- 14 August 2007
-
-Added NoCrypt\unrar_nocrypt.dll without decryption code for those
-applications where presence of encryption or decryption code is not
-allowed because of legal restrictions.
-
-
--- 14 December 2006
-
-Added ERAR_MISSING_PASSWORD error type. This error is returned
-if empty password is specified for encrypted file.
-
-
--- 12 June 2003
-
-Added RARProcessFileW function, Unicode version of RARProcessFile
-
-
--- 9 August 2002
-
-Added RAROpenArchiveEx function allowing to specify Unicode archive
-name and get archive flags.
-
-
--- 24 January 2002
-
-Added RARReadHeaderEx function allowing to read Unicode file names
-and 64 bit file sizes.
-
-
--- 23 January 2002
-
-Added ERAR_UNKNOWN error type (it is used for all errors which
-do not have special ERAR code yet) and UCM_NEEDPASSWORD callback
-message.
-
-Unrar.dll automatically opens all next volumes not only when extracting,
-but also in RAR_OM_LIST mode.
-
-
--- 27 November 2001
-
-RARSetChangeVolProc and RARSetProcessDataProc are replaced by
-the single callback function installed with RARSetCallback.
-Unlike old style callbacks, the new function accepts the user defined
-parameter. Unrar.dll still supports RARSetChangeVolProc and
-RARSetProcessDataProc for compatibility purposes, but if you write
-a new application, better use RARSetCallback.
-
-File comments support is not implemented in the new DLL version yet.
-Now CmtState is always 0.
-
-
--- 13 August 2001
-
-Added RARGetDllVersion function, so you may distinguish old unrar.dll,
-which used C style callback functions and the new one with PASCAL callbacks.
-
-
--- 10 May 2001
-
-Callback functions in RARSetChangeVolProc and RARSetProcessDataProc
-use PASCAL style call convention now.
diff --git a/libs/unrar2/UnRARDLL/x64/readme.txt b/libs/unrar2/UnRARDLL/x64/readme.txt
deleted file mode 100644
index bbfb340d..00000000
--- a/libs/unrar2/UnRARDLL/x64/readme.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is x64 version of unrar.dll.
diff --git a/libs/unrar2/UnRARDLL/x64/unrar64.lib b/libs/unrar2/UnRARDLL/x64/unrar64.lib
deleted file mode 100644
index fd037919..00000000
Binary files a/libs/unrar2/UnRARDLL/x64/unrar64.lib and /dev/null differ
diff --git a/libs/unrar2/license.txt b/libs/unrar2/license.txt
deleted file mode 100644
index a395801b..00000000
--- a/libs/unrar2/license.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright (c) 2003-2005 Jimmy Retzlaff, 2008 Konstantin Yegupov
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
-ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/libs/unrar2/unix.py b/libs/unrar2/unix.py
index 9d87b18c..21f384cf 100644
--- a/libs/unrar2/unix.py
+++ b/libs/unrar2/unix.py
@@ -38,38 +38,38 @@ def call_unrar(params):
"Calls rar/unrar command line executable, returns stdout pipe"
global rar_executable_cached
if rar_executable_cached is None:
- for command in ('unrar', 'rar'):
+ for command in ('unrar', 'rar', os.path.join(os.path.dirname(__file__), 'unrar')):
try:
- subprocess.Popen([command], stdout=subprocess.PIPE)
+ subprocess.Popen([command], stdout = subprocess.PIPE)
rar_executable_cached = command
break
except OSError:
pass
if rar_executable_cached is None:
raise UnpackerNotInstalled("No suitable RAR unpacker installed")
-
+
assert type(params) == list, "params must be list"
args = [rar_executable_cached] + params
try:
gc.disable() # See http://bugs.python.org/issue1336
- return subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ return subprocess.Popen(args, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
finally:
gc.enable()
class RarFileImplementation(object):
- def init(self, password=None):
+ def init(self, password = None):
self.password = password
-
-
+
+
stdoutdata, stderrdata = self.call('v', []).communicate()
-
+
for line in stderrdata.splitlines():
if line.strip().startswith("Cannot open"):
raise FileOpenError
- if line.find("CRC failed")>=0:
- raise IncorrectRARPassword
+ if line.find("CRC failed") >= 0:
+ raise IncorrectRARPassword
accum = []
source = iter(stdoutdata.splitlines())
line = ''
@@ -85,39 +85,39 @@ class RarFileImplementation(object):
self.comment = '\n'.join(accum[:-1])
else:
self.comment = None
-
+
def escaped_password(self):
return '-' if self.password == None else self.password
-
-
- def call(self, cmd, options=[], files=[]):
- options2 = options + ['p'+self.escaped_password()]
- soptions = ['-'+x for x in options2]
- return call_unrar([cmd]+soptions+['--',self.archiveName]+files)
+
+
+ def call(self, cmd, options = [], files = []):
+ options2 = options + ['p' + self.escaped_password()]
+ soptions = ['-' + x for x in options2]
+ return call_unrar([cmd] + soptions + ['--', self.archiveName] + files)
def infoiter(self):
-
+
stdoutdata, stderrdata = self.call('v', ['c-']).communicate()
-
+
for line in stderrdata.splitlines():
if line.strip().startswith("Cannot open"):
raise FileOpenError
-
+
accum = []
source = iter(stdoutdata.splitlines())
line = ''
while not line.startswith('--------------'):
if line.strip().endswith('is not RAR archive'):
raise InvalidRARArchive
- if line.find("CRC failed")>=0:
- raise IncorrectRARPassword
+ if line.find("CRC failed") >= 0:
+ raise IncorrectRARPassword
line = source.next()
line = source.next()
i = 0
re_spaces = re.compile(r"\s+")
while not line.startswith('--------------'):
accum.append(line)
- if len(accum)==2:
+ if len(accum) == 2:
data = {}
data['index'] = i
data['filename'] = accum[0].strip()
@@ -125,7 +125,7 @@ class RarFileImplementation(object):
data['size'] = int(info[0])
attr = info[5]
data['isdir'] = 'd' in attr.lower()
- data['datetime'] = time.strptime(info[3]+" "+info[4], '%d-%m-%y %H:%M')
+ data['datetime'] = time.strptime(info[3] + " " + info[4], '%d-%m-%y %H:%M')
data['comment'] = None
yield data
accum = []
@@ -136,12 +136,12 @@ class RarFileImplementation(object):
res = []
for info in self.infoiter():
checkres = checker(info)
- if checkres==True and not info.isdir:
+ if checkres == True and not info.isdir:
pipe = self.call('p', ['inul'], [info.filename]).stdout
res.append((info, pipe.read()))
- return res
+ return res
+
-
def extract(self, checker, path, withSubpath, overwrite):
res = []
command = 'x'
@@ -159,17 +159,17 @@ class RarFileImplementation(object):
checkres = checker(info)
if type(checkres) in [str, unicode]:
raise NotImplementedError("Condition callbacks returning strings are deprecated and only supported in Windows")
- if checkres==True and not info.isdir:
+ if checkres == True and not info.isdir:
names.append(info.filename)
res.append(info)
names.append(path)
proc = self.call(command, options, names)
stdoutdata, stderrdata = proc.communicate()
- if stderrdata.find("CRC failed")>=0:
- raise IncorrectRARPassword
- return res
-
+ if stderrdata.find("CRC failed") >= 0:
+ raise IncorrectRARPassword
+ return res
+
def destruct(self):
pass
-
+
diff --git a/libs/unrar2/unrar b/libs/unrar2/unrar
new file mode 100755
index 00000000..3de16761
Binary files /dev/null and b/libs/unrar2/unrar differ
diff --git a/libs/unrar2/UnRARDLL/unrar.dll b/libs/unrar2/unrar.dll
similarity index 100%
rename from libs/unrar2/UnRARDLL/unrar.dll
rename to libs/unrar2/unrar.dll
diff --git a/libs/unrar2/UnRARDLL/x64/unrar64.dll b/libs/unrar2/unrar64.dll
similarity index 100%
rename from libs/unrar2/UnRARDLL/x64/unrar64.dll
rename to libs/unrar2/unrar64.dll
diff --git a/libs/unrar2/windows.py b/libs/unrar2/windows.py
index bb92481b..e249f8f3 100644
--- a/libs/unrar2/windows.py
+++ b/libs/unrar2/windows.py
@@ -23,10 +23,10 @@
# Low level interface - see UnRARDLL\UNRARDLL.TXT
from __future__ import generators
-
-import ctypes, ctypes.wintypes
-import os, os.path, sys
-import Queue
+from couchpotato.environment import Env
+from shutil import copyfile
+import ctypes.wintypes
+import os.path
import time
from rar_exceptions import *
@@ -64,13 +64,18 @@ UCM_NEEDPASSWORD = 2
architecture_bits = ctypes.sizeof(ctypes.c_voidp)*8
dll_name = "unrar.dll"
if architecture_bits == 64:
- dll_name = "x64\\unrar64.dll"
-
-
-try:
- unrar = ctypes.WinDLL(os.path.join(os.path.split(__file__)[0], 'UnRARDLL', dll_name))
-except WindowsError:
- unrar = ctypes.WinDLL(dll_name)
+ dll_name = "unrar64.dll"
+
+# Copy dll first
+dll_file = os.path.join(os.path.dirname(__file__), dll_name)
+dll_copy = os.path.join(Env.get('cache_dir'), 'copied.dll')
+
+if os.path.isfile(dll_copy):
+ os.remove(dll_copy)
+
+copyfile(dll_file, dll_copy)
+
+unrar = ctypes.WinDLL(dll_copy)
class RAROpenArchiveDataEx(ctypes.Structure):