MTP: Try to get modified date from the device

This commit is contained in:
Kovid Goyal 2012-09-01 14:51:52 +05:30
parent 023b947608
commit 1c3e62f35b
4 changed files with 27 additions and 3 deletions

View File

@ -11,8 +11,10 @@ import weakref, sys
from collections import deque from collections import deque
from operator import attrgetter from operator import attrgetter
from future_builtins import map from future_builtins import map
from datetime import datetime
from calibre import human_readable, prints, force_unicode from calibre import human_readable, prints, force_unicode
from calibre.utils.date import local_tz
from calibre.utils.icu import sort_key, lower from calibre.utils.icu import sort_key, lower
from calibre.ebooks import BOOK_EXTENSIONS from calibre.ebooks import BOOK_EXTENSIONS
@ -21,6 +23,8 @@ bexts = frozenset(BOOK_EXTENSIONS)
class FileOrFolder(object): class FileOrFolder(object):
def __init__(self, entry, fs_cache): def __init__(self, entry, fs_cache):
self.all_storage_ids = fs_cache.all_storage_ids
self.object_id = entry['id'] self.object_id = entry['id']
self.is_folder = entry['is_folder'] self.is_folder = entry['is_folder']
self.storage_id = entry['storage_id'] self.storage_id = entry['storage_id']
@ -31,7 +35,11 @@ class FileOrFolder(object):
self.name = force_unicode(n, 'utf-8') self.name = force_unicode(n, 'utf-8')
self.persistent_id = entry.get('persistent_id', self.object_id) self.persistent_id = entry.get('persistent_id', self.object_id)
self.size = entry.get('size', 0) self.size = entry.get('size', 0)
self.all_storage_ids = fs_cache.all_storage_ids md = entry.get('modified', 0)
try:
self.last_modified = datetime.fromtimestamp(md, local_tz)
except:
self.last_modified = datetime.fromtimestamp(0, local_tz)
if self.storage_id not in self.all_storage_ids: if self.storage_id not in self.all_storage_ids:
raise ValueError('Storage id %s not valid for %s, valid values: %s'%(self.storage_id, raise ValueError('Storage id %s not valid for %s, valid values: %s'%(self.storage_id,

View File

@ -121,12 +121,13 @@ static uint16_t data_from_python(void *params, void *priv, uint32_t wantlen, uns
static PyObject* build_file_metadata(LIBMTP_file_t *nf, uint32_t storage_id) { static PyObject* build_file_metadata(LIBMTP_file_t *nf, uint32_t storage_id) {
PyObject *ans = NULL; PyObject *ans = NULL;
ans = Py_BuildValue("{s:s, s:k, s:k, s:k, s:K, s:O}", ans = Py_BuildValue("{s:s, s:k, s:k, s:k, s:K, s:L, s:O}",
"name", (unsigned long)nf->filename, "name", (unsigned long)nf->filename,
"id", (unsigned long)nf->item_id, "id", (unsigned long)nf->item_id,
"parent_id", (unsigned long)nf->parent_id, "parent_id", (unsigned long)nf->parent_id,
"storage_id", (unsigned long)storage_id, "storage_id", (unsigned long)storage_id,
"size", nf->filesize, "size", nf->filesize,
"modified", (PY_LONG_LONG)nf->modificationdate,
"is_folder", (nf->filetype == LIBMTP_FILETYPE_FOLDER) ? Py_True : Py_False "is_folder", (nf->filetype == LIBMTP_FILETYPE_FOLDER) ? Py_True : Py_False
); );

View File

@ -34,6 +34,7 @@ static IPortableDeviceKeyCollection* create_filesystem_properties_collection() {
ADDPROP(WPD_OBJECT_ISHIDDEN); ADDPROP(WPD_OBJECT_ISHIDDEN);
ADDPROP(WPD_OBJECT_CAN_DELETE); ADDPROP(WPD_OBJECT_CAN_DELETE);
ADDPROP(WPD_OBJECT_SIZE); ADDPROP(WPD_OBJECT_SIZE);
ADDPROP(WPD_OBJECT_DATE_MODIFIED);
return properties; return properties;
@ -81,6 +82,16 @@ static void set_size_property(PyObject *dict, REFPROPERTYKEY key, const char *py
} }
} }
static void set_date_property(PyObject *dict, REFPROPERTYKEY key, const char *pykey, IPortableDeviceValues *properties) {
FLOAT val = 0;
PyObject *t;
if (SUCCEEDED(properties->GetFloatValue(key, &val))) {
t = Py_BuildValue("d", (double)val);
if (t != NULL) { PyDict_SetItemString(dict, pykey, t); Py_DECREF(t); }
}
}
static void set_content_type_property(PyObject *dict, IPortableDeviceValues *properties) { static void set_content_type_property(PyObject *dict, IPortableDeviceValues *properties) {
GUID guid = GUID_NULL; GUID guid = GUID_NULL;
BOOL is_folder = 0; BOOL is_folder = 0;
@ -103,6 +114,8 @@ static void set_properties(PyObject *obj, IPortableDeviceValues *values) {
set_bool_property(obj, WPD_OBJECT_ISSYSTEM, "is_system", values); set_bool_property(obj, WPD_OBJECT_ISSYSTEM, "is_system", values);
set_size_property(obj, WPD_OBJECT_SIZE, "size", values); set_size_property(obj, WPD_OBJECT_SIZE, "size", values);
set_date_property(obj, WPD_OBJECT_DATE_MODIFIED, "modified", values);
} }
// }}} // }}}

View File

@ -248,7 +248,9 @@ class MTP_DEVICE(MTPDeviceBase):
self._carda_id = storage[1]['id'] self._carda_id = storage[1]['id']
if len(storage) > 2: if len(storage) > 2:
self._cardb_id = storage[2]['id'] self._cardb_id = storage[2]['id']
self.current_friendly_name = devdata.get('friendly_name', None) self.current_friendly_name = devdata.get('friendly_name',
_('Unknown MTP device'))
self.currently_connected_pnp_id = connected_device
@same_thread @same_thread
def get_basic_device_information(self): def get_basic_device_information(self):