diff --git a/src/calibre/ebooks/metadata/archive.py b/src/calibre/ebooks/metadata/archive.py
index 45d549b6ea..624c2ad5e5 100644
--- a/src/calibre/ebooks/metadata/archive.py
+++ b/src/calibre/ebooks/metadata/archive.py
@@ -10,12 +10,31 @@ import os
from contextlib import closing
from calibre.customize import FileTypePlugin
+from calibre.utils.zipfile import ZipFile, stringFileHeader
def is_comic(list_of_names):
extensions = set([x.rpartition('.')[-1].lower() for x in list_of_names])
comic_extensions = set(['jpg', 'jpeg', 'png'])
return len(extensions - comic_extensions) == 0
+def archive_type(stream):
+ try:
+ pos = stream.tell()
+ except:
+ pos = 0
+ id_ = stream.read(4)
+ ans = None
+ if id_ == stringFileHeader:
+ ans = 'zip'
+ elif id_.startswith('Rar'):
+ ans = 'rar'
+ try:
+ stream.seek(pos)
+ except:
+ pass
+ return ans
+
+
class ArchiveExtract(FileTypePlugin):
name = 'Archive Extract'
author = 'Kovid Goyal'
@@ -31,7 +50,6 @@ class ArchiveExtract(FileTypePlugin):
if is_rar:
from calibre.libunrar import extract_member, names
else:
- from calibre.utils.zipfile import ZipFile
zf = ZipFile(archive, 'r')
if is_rar:
diff --git a/src/calibre/gui2/book_details.py b/src/calibre/gui2/book_details.py
index 8ec9e75f72..6978c68fc2 100644
--- a/src/calibre/gui2/book_details.py
+++ b/src/calibre/gui2/book_details.py
@@ -9,7 +9,7 @@ import os, collections
from PyQt4.Qt import QLabel, QPixmap, QSize, QWidget, Qt, pyqtSignal, \
QVBoxLayout, QScrollArea, QPropertyAnimation, QEasingCurve, \
- QSizePolicy, QPainter, QRect, pyqtProperty
+ QSizePolicy, QPainter, QRect, pyqtProperty, QDesktopServices, QUrl
from calibre import fit_image, prepare_string_for_xml
from calibre.gui2.widgets import IMAGE_EXTENSIONS
@@ -42,7 +42,6 @@ def render_rows(data):
txt = prepare_string_for_xml(txt)
if 'id' in data:
if key == _('Path'):
- txt = '...'+os.sep+os.sep.join(txt.split(os.sep)[-2:])
txt = u'%s'%(data['id'],
_('Click to open'))
if key == _('Formats') and txt and txt != _('None'):
@@ -50,6 +49,11 @@ def render_rows(data):
fmts = [u'%s' % (data['id'], x, x) for x
in fmts]
txt = ', '.join(fmts)
+ else:
+ if key == _('Path'):
+ txt = u'%s'%(txt,
+ _('Click to open'))
+
rows.append((key, txt))
return rows
@@ -150,6 +154,7 @@ class Label(QLabel):
def __init__(self):
QLabel.__init__(self)
+ self.setTextFormat(Qt.RichText)
self.setText('')
self.setWordWrap(True)
self.linkActivated.connect(self.link_activated)
@@ -249,9 +254,13 @@ class BookDetails(QWidget):
typ, _, val = link.partition(':')
if typ == 'path':
self.open_containing_folder.emit(int(val))
- if typ == 'format':
+ elif typ == 'format':
id_, fmt = val.split(':')
self.view_specific_format.emit(int(id_), fmt)
+ elif typ == 'devpath':
+ path = os.path.dirname(val)
+ QDesktopServices.openUrl(QUrl.fromLocalFile(path))
+
def mouseReleaseEvent(self, ev):
ev.accept()
diff --git a/src/calibre/gui2/status.py b/src/calibre/gui2/status.py
index 10775ec327..876d4cdb05 100644
--- a/src/calibre/gui2/status.py
+++ b/src/calibre/gui2/status.py
@@ -5,7 +5,7 @@ import os
from PyQt4.Qt import QStatusBar, QLabel, QWidget, QHBoxLayout, QPixmap, \
QSizePolicy, QScrollArea, Qt, QSize, pyqtSignal, \
- QPropertyAnimation, QEasingCurve
+ QPropertyAnimation, QEasingCurve, QDesktopServices, QUrl
from calibre import fit_image, preferred_encoding, isosx
@@ -231,9 +231,13 @@ class StatusBar(QStatusBar, StatusBarInterface, BookDetailsInterface):
typ, _, val = link.partition(':')
if typ == 'path':
self.open_containing_folder.emit(int(val))
- if typ == 'format':
+ elif typ == 'format':
id_, fmt = val.split(':')
self.view_specific_format.emit(int(id_), fmt)
+ elif typ == 'devpath':
+ path = os.path.dirname(val)
+ QDesktopServices.openUrl(QUrl.fromLocalFile(path))
+
def resizeEvent(self, ev):
self.resized.emit(self.size())