mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Implement #6252 (View Format Timestamp)
This commit is contained in:
parent
f58ee6472a
commit
4650923e91
@ -27,10 +27,11 @@ from calibre.ebooks.metadata import string_to_authors, \
|
|||||||
from calibre.ebooks.metadata.library_thing import cover_from_isbn
|
from calibre.ebooks.metadata.library_thing import cover_from_isbn
|
||||||
from calibre.ebooks.metadata.meta import get_metadata
|
from calibre.ebooks.metadata.meta import get_metadata
|
||||||
from calibre.utils.config import prefs, tweaks
|
from calibre.utils.config import prefs, tweaks
|
||||||
from calibre.utils.date import qt_to_dt
|
from calibre.utils.date import qt_to_dt, local_tz, utcfromtimestamp
|
||||||
from calibre.customize.ui import run_plugins_on_import, get_isbndb_key
|
from calibre.customize.ui import run_plugins_on_import, get_isbndb_key
|
||||||
from calibre.gui2.dialogs.config.social import SocialMetadata
|
from calibre.gui2.dialogs.config.social import SocialMetadata
|
||||||
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
from calibre.gui2.custom_column_widgets import populate_metadata_page
|
||||||
|
from calibre import strftime
|
||||||
|
|
||||||
class CoverFetcher(QThread):
|
class CoverFetcher(QThread):
|
||||||
|
|
||||||
@ -75,13 +76,20 @@ class CoverFetcher(QThread):
|
|||||||
|
|
||||||
|
|
||||||
class Format(QListWidgetItem):
|
class Format(QListWidgetItem):
|
||||||
def __init__(self, parent, ext, size, path=None):
|
|
||||||
|
def __init__(self, parent, ext, size, path=None, timestamp=None):
|
||||||
self.path = path
|
self.path = path
|
||||||
self.ext = ext
|
self.ext = ext
|
||||||
self.size = float(size)/(1024*1024)
|
self.size = float(size)/(1024*1024)
|
||||||
text = '%s (%.2f MB)'%(self.ext.upper(), self.size)
|
text = '%s (%.2f MB)'%(self.ext.upper(), self.size)
|
||||||
QListWidgetItem.__init__(self, file_icon_provider().icon_from_ext(ext),
|
QListWidgetItem.__init__(self, file_icon_provider().icon_from_ext(ext),
|
||||||
text, parent, QListWidgetItem.UserType)
|
text, parent, QListWidgetItem.UserType)
|
||||||
|
if timestamp is not None:
|
||||||
|
ts = timestamp.astimezone(local_tz)
|
||||||
|
t = strftime('%a, %d %b %Y [%H:%M:%S]', ts.timetuple())
|
||||||
|
text = _('Last modified: %s')%t
|
||||||
|
self.setToolTip(text)
|
||||||
|
self.setStatusTip(text)
|
||||||
|
|
||||||
|
|
||||||
class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
||||||
@ -151,14 +159,16 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
nfile = run_plugins_on_import(_file)
|
nfile = run_plugins_on_import(_file)
|
||||||
if nfile is not None:
|
if nfile is not None:
|
||||||
_file = nfile
|
_file = nfile
|
||||||
size = os.stat(_file).st_size
|
stat = os.stat(_file)
|
||||||
|
size = stat.st_size
|
||||||
ext = os.path.splitext(_file)[1].lower().replace('.', '')
|
ext = os.path.splitext(_file)[1].lower().replace('.', '')
|
||||||
|
timestamp = utcfromtimestamp(stat.st_mtime)
|
||||||
for row in range(self.formats.count()):
|
for row in range(self.formats.count()):
|
||||||
fmt = self.formats.item(row)
|
fmt = self.formats.item(row)
|
||||||
if fmt.ext.lower() == ext:
|
if fmt.ext.lower() == ext:
|
||||||
self.formats.takeItem(row)
|
self.formats.takeItem(row)
|
||||||
break
|
break
|
||||||
Format(self.formats, ext, size, path=_file)
|
Format(self.formats, ext, size, path=_file, timestamp=timestamp)
|
||||||
self.formats_changed = True
|
self.formats_changed = True
|
||||||
added = True
|
added = True
|
||||||
if bad_perms:
|
if bad_perms:
|
||||||
@ -379,9 +389,10 @@ class MetadataSingleDialog(ResizableDialog, Ui_MetadataSingleDialog):
|
|||||||
if not ext:
|
if not ext:
|
||||||
ext = ''
|
ext = ''
|
||||||
size = self.db.sizeof_format(row, ext)
|
size = self.db.sizeof_format(row, ext)
|
||||||
|
timestamp = self.db.format_last_modified(self.id, ext)
|
||||||
if size is None:
|
if size is None:
|
||||||
continue
|
continue
|
||||||
Format(self.formats, ext, size)
|
Format(self.formats, ext, size, timestamp=timestamp)
|
||||||
|
|
||||||
|
|
||||||
self.initialize_combos()
|
self.initialize_combos()
|
||||||
|
@ -327,6 +327,7 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
''' Return last modified time as a UTC datetime object'''
|
''' Return last modified time as a UTC datetime object'''
|
||||||
return utcfromtimestamp(os.stat(self.dbpath).st_mtime)
|
return utcfromtimestamp(os.stat(self.dbpath).st_mtime)
|
||||||
|
|
||||||
|
|
||||||
def check_if_modified(self):
|
def check_if_modified(self):
|
||||||
if self.last_modified() > self.last_update_check:
|
if self.last_modified() > self.last_update_check:
|
||||||
self.refresh()
|
self.refresh()
|
||||||
@ -597,6 +598,11 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns):
|
|||||||
def has_format(self, index, format, index_is_id=False):
|
def has_format(self, index, format, index_is_id=False):
|
||||||
return self.format_abspath(index, format, index_is_id) is not None
|
return self.format_abspath(index, format, index_is_id) is not None
|
||||||
|
|
||||||
|
def format_last_modified(self, id_, fmt):
|
||||||
|
path = self.format_abspath(id_, fmt, index_is_id=True)
|
||||||
|
if path is not None:
|
||||||
|
return utcfromtimestamp(os.stat(path).st_mtime)
|
||||||
|
|
||||||
def format_abspath(self, index, format, index_is_id=False):
|
def format_abspath(self, index, format, index_is_id=False):
|
||||||
'Return absolute path to the ebook file of format `format`'
|
'Return absolute path to the ebook file of format `format`'
|
||||||
id = index if index_is_id else self.id(index)
|
id = index if index_is_id else self.id(index)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user