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())