Skip to content

Commit 29c2de2

Browse files
committed
Refactored mimetype handling.
- We now allow no mimetype to be sent in mimetype creations. - We now default to try using the file mimetype for downloads or, if there is none, octet-stream. - We now alo try to guess a mimetype based on the extension if we're otherwise not going to send a mimetype in creations (was there before but unimplemented). Fixes dsoprea#160 Fixes dsoprea#148
1 parent 6c65e42 commit 29c2de2

File tree

5 files changed

+36
-35
lines changed

5 files changed

+36
-35
lines changed

gdrivefs/conf.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ class Conf(object):
2525
file_jobthread_max_idle_time = 60
2626
file_chunk_size_kb = 1024
2727
file_download_temp_max_age_s = 86400
28-
file_default_mime_type = 'application/octet-stream'
2928
change_check_frequency_s = 3
3029
hidden_flags_list_local = [u'trashed', u'restricted']
3130
hidden_flags_list_remote = [u'trashed']
@@ -38,7 +37,6 @@ class Conf(object):
3837

3938
google_discovery_service_url = DISCOVERY_URI
4039
default_buffer_read_blocksize = 65536
41-
default_mimetype = 'application/octet-stream'
4240
directory_mimetype = u'application/vnd.google-apps.folder'
4341
default_perm_folder = '777'
4442
default_perm_file_editable = '666'
@@ -58,4 +56,3 @@ def set(key, value):
5856
raise KeyError(key)
5957

6058
setattr(Conf, key, value)
61-

gdrivefs/gdfs/gdfuse.py

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
LoggingMixIn
1515
from time import mktime, time
1616
from sys import argv, exit, excepthook
17-
from mimetypes import guess_type
1817
from datetime import datetime
1918
from os.path import split
2019

@@ -299,16 +298,14 @@ def __create(self, filepath, mode=None):
299298
filepath)
300299
raise FuseOSError(EIO)
301300

302-
distilled_filepath = build_filepath(path, filename)
303-
304-
# Try to guess at a mime-type, if not otherwise given.
305301
if mime_type is None:
306-
(mimetype_guess, _) = guess_type(filename, True)
307-
308-
if mimetype_guess is not None:
309-
mime_type = mimetype_guess
310-
else:
311-
mime_type = Conf.get('default_mimetype')
302+
_, ext = os.path.splitext(filename)
303+
if ext != '':
304+
ext = ext[1:]
305+
306+
mime_type = utility.get_first_mime_type_by_extension(ext)
307+
308+
distilled_filepath = build_filepath(path, filename)
312309

313310
gd = get_gdrive()
314311

gdrivefs/gdtool/drive.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import apiclient.http
1919
import apiclient.errors
2020

21+
import gdrivefs.constants
2122
import gdrivefs.config
2223
import gdrivefs.conf
2324
import gdrivefs.gdtool.chunked_download
@@ -395,8 +396,8 @@ def list_files(self, query_contains_string=None, query_is_string=None,
395396
return entries
396397

397398
@_marshall
398-
def download_to_local(self, output_file_path, normalized_entry, mime_type,
399-
allow_cache=True):
399+
def download_to_local(self, output_file_path, normalized_entry,
400+
mime_type=None, allow_cache=True):
400401
"""Download the given file. If we've cached a previous download and the
401402
mtime hasn't changed, re-use. The third item returned reflects whether
402403
the data has changed since any prior attempts.
@@ -405,6 +406,22 @@ def download_to_local(self, output_file_path, normalized_entry, mime_type,
405406
_logger.info("Downloading entry with ID [%s] and mime-type [%s] to "
406407
"[%s].", normalized_entry.id, mime_type, output_file_path)
407408

409+
if mime_type is None:
410+
if normalized_entry.mime_type in normalized_entry.download_links:
411+
mime_type = normalized_entry.mime_type
412+
413+
_logger.debug("Electing file mime-type for download: [%s]",
414+
normalized_entry.mime_type)
415+
elif gdrivefs.constants.OCTET_STREAM_MIMETYPE \
416+
in normalized_entry.download_links:
417+
mime_type = gdrivefs.constants.OCTET_STREAM_MIMETYPE
418+
419+
_logger.debug("Electing octet-stream for download.")
420+
else:
421+
raise ValueError("Could not determine what to fallback to for "
422+
"the mimetype: {}".format(
423+
normalized_entry.mime_type))
424+
408425
if mime_type != normalized_entry.mime_type and \
409426
mime_type not in normalized_entry.download_links:
410427
message = ("Entry with ID [%s] can not be exported to type [%s]. "
@@ -508,13 +525,6 @@ def create_file(self, filename, parents, mime_type, data_filepath=None,
508525
# without having one. We don't want to impose this when acting like a
509526
# normal FS.
510527

511-
# If no data and no mime-type was given, default it.
512-
if mime_type == None:
513-
mime_type = gdrivefs.conf.Conf.get('file_default_mime_type')
514-
_logger.debug("No mime-type was presented for file "
515-
"create/update. Defaulting to [%s].",
516-
mime_type)
517-
518528
return self.__insert_entry(
519529
True,
520530
filename,
@@ -646,10 +656,10 @@ def update_entry(self, normalized_entry, filename=None, data_filepath=None,
646656

647657
body = {}
648658

649-
if mime_type is not None:
650-
body['mimeType'] = mime_type
651-
else:
652-
body['mimeType'] = normalized_entry.mime_type
659+
if mime_type is None:
660+
mime_type = normalized_entry.mime_type
661+
662+
body['mimeType'] = mime_type
653663

654664
if filename is not None:
655665
body['title'] = filename

gdrivefs/gdtool/normal_entry.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020

2121
class NormalEntry(object):
22-
__default_general_mime_type = Conf.get('default_mimetype')
2322
__directory_mimetype = Conf.get('directory_mimetype')
2423

2524
__properties_extra = [
@@ -167,9 +166,6 @@ def normalize_download_mimetype(self, specific_mimetype=None):
167166
mimetype_candidate in self.download_links:
168167
mime_type = mimetype_candidate
169168

170-
elif NormalEntry.__default_general_mime_type in self.download_links:
171-
mime_type = NormalEntry.__default_general_mime_type
172-
173169
# If there's only one download link, resort to using it (perhaps it was
174170
# an uploaded file, assigned only one type).
175171
elif len(self.download_links) == 1:

gdrivefs/utility.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,12 @@ def __load_mappings(self):
7373

7474
def get_first_mime_type_by_extension(self, extension):
7575

76-
found = [ mime_type
77-
for mime_type, temp_extension
78-
in self.default_extensions.iteritems()
79-
if temp_extension == extension ]
76+
found = [
77+
mime_type
78+
for mime_type, temp_extension
79+
in self.default_extensions.iteritems()
80+
if temp_extension == extension
81+
]
8082

8183
if not found:
8284
return None
@@ -110,4 +112,3 @@ def make_safe_for_filename(self, text):
110112
return re.sub('[^a-z0-9\-_\.]+', '', text)
111113

112114
utility = _DriveUtility()
113-

0 commit comments

Comments
 (0)