diff --git a/lbrynet/extras/daemon/Daemon.py b/lbrynet/extras/daemon/Daemon.py index 4a0f91d17..87edf3fc5 100644 --- a/lbrynet/extras/daemon/Daemon.py +++ b/lbrynet/extras/daemon/Daemon.py @@ -1,5 +1,4 @@ import logging.handlers -import mimetypes import os import requests import urllib @@ -29,6 +28,7 @@ from lbrynet.extras.daemon.ComponentManager import RequiredCondition from lbrynet.extras.daemon.Downloader import GetStream from lbrynet.extras.daemon.Publisher import Publisher from lbrynet.extras.daemon.auth.server import AuthJSONRPCServer +from lbrynet.extras.daemon.mime_types import guess_mime_type from lbrynet.extras.wallet import LbryWalletManager from lbrynet.extras.wallet.account import Account as LBCAccount from lbrynet.extras.wallet.dewies import dewies_to_lbc, lbc_to_dewies @@ -535,7 +535,7 @@ class Daemon(AuthJSONRPCServer): def _get_lbry_file_dict(self, lbry_file): key = hexlify(lbry_file.key) if lbry_file.key else None full_path = os.path.join(lbry_file.download_directory, lbry_file.file_name) - mime_type = mimetypes.guess_type(full_path)[0] + mime_type = guess_mime_type(lbry_file.file_name) if os.path.isfile(full_path): with open(full_path) as written_file: written_file.seek(0, os.SEEK_END) diff --git a/lbrynet/extras/daemon/Publisher.py b/lbrynet/extras/daemon/Publisher.py index 34d123a0c..bd35f7eb3 100644 --- a/lbrynet/extras/daemon/Publisher.py +++ b/lbrynet/extras/daemon/Publisher.py @@ -1,9 +1,9 @@ import asyncio import logging -import mimetypes import os from lbrynet.blob.EncryptedFileCreator import create_lbry_file +from lbrynet.extras.daemon.mime_types import guess_mime_type log = logging.getLogger(__name__) @@ -43,7 +43,7 @@ class Publisher: claim_dict['stream']['source'] = {} claim_dict['stream']['source']['source'] = self.lbry_file.sd_hash claim_dict['stream']['source']['sourceType'] = 'lbry_sd_hash' - claim_dict['stream']['source']['contentType'] = get_content_type(file_path) + claim_dict['stream']['source']['contentType'] = guess_mime_type(file_path) claim_dict['stream']['source']['version'] = "_0_0_1" # need current version here tx = await self.wallet.claim_name( self.account, name, bid, claim_dict, self.certificate, holding_address @@ -75,7 +75,3 @@ class Publisher: )) self.lbry_file = [f for f in self.lbry_file_manager.lbry_files if f.stream_hash == stream_hash][0] return tx - - -def get_content_type(filename): - return mimetypes.guess_type(filename)[0] or 'application/octet-stream' diff --git a/lbrynet/extras/daemon/mime_types.py b/lbrynet/extras/daemon/mime_types.py new file mode 100644 index 000000000..e4cb18788 --- /dev/null +++ b/lbrynet/extras/daemon/mime_types.py @@ -0,0 +1,154 @@ +import os + + +types_map = { + # http://www.iana.org/assignments/media-types + '.a': 'application/octet-stream', + '.ai': 'application/postscript', + '.aif': 'audio/x-aiff', + '.aifc': 'audio/x-aiff', + '.aiff': 'audio/x-aiff', + '.au': 'audio/basic', + '.avi': 'video/x-msvideo', + '.bat': 'text/plain', + '.bcpio': 'application/x-bcpio', + '.bin': 'application/octet-stream', + '.bmp': 'image/bmp', + '.c': 'text/plain', + '.cdf': 'application/x-netcdf', + '.cpio': 'application/x-cpio', + '.csh': 'application/x-csh', + '.css': 'text/css', + '.csv': 'text/csv', + '.dll': 'application/octet-stream', + '.doc': 'application/msword', + '.dot': 'application/msword', + '.dvi': 'application/x-dvi', + '.eml': 'message/rfc822', + '.eps': 'application/postscript', + '.etx': 'text/x-setext', + '.exe': 'application/octet-stream', + '.gif': 'image/gif', + '.gtar': 'application/x-gtar', + '.h': 'text/plain', + '.hdf': 'application/x-hdf', + '.htm': 'text/html', + '.html': 'text/html', + '.ico': 'image/vnd.microsoft.icon', + '.ief': 'image/ief', + '.iges': 'model/iges', + '.jpe': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.jpg': 'image/jpeg', + '.js': 'application/javascript', + '.json': 'application/json', + '.ksh': 'text/plain', + '.latex': 'application/x-latex', + '.m1v': 'video/mpeg', + '.m3u': 'application/vnd.apple.mpegurl', + '.m3u8': 'application/vnd.apple.mpegurl', + '.man': 'application/x-troff-man', + '.markdown': 'text/markdown', + '.md': 'text/markdown', + '.me': 'application/x-troff-me', + '.mht': 'message/rfc822', + '.mhtml': 'message/rfc822', + '.mif': 'application/x-mif', + '.mov': 'video/quicktime', + '.movie': 'video/x-sgi-movie', + '.mp2': 'audio/mpeg', + '.mp3': 'audio/mpeg', + '.mp4': 'video/mp4', + '.mpa': 'video/mpeg', + '.mpe': 'video/mpeg', + '.mpeg': 'video/mpeg', + '.mpg': 'video/mpeg', + '.ms': 'application/x-troff-ms', + '.nc': 'application/x-netcdf', + '.nws': 'message/rfc822', + '.o': 'application/octet-stream', + '.obj': 'application/octet-stream', + '.oda': 'application/oda', + '.p12': 'application/x-pkcs12', + '.p7c': 'application/pkcs7-mime', + '.pbm': 'image/x-portable-bitmap', + '.pdf': 'application/pdf', + '.pfx': 'application/x-pkcs12', + '.pgm': 'image/x-portable-graymap', + '.pl': 'text/plain', + '.png': 'image/png', + '.pnm': 'image/x-portable-anymap', + '.pot': 'application/vnd.ms-powerpoint', + '.ppa': 'application/vnd.ms-powerpoint', + '.ppm': 'image/x-portable-pixmap', + '.pps': 'application/vnd.ms-powerpoint', + '.ppt': 'application/vnd.ms-powerpoint', + '.ps': 'application/postscript', + '.pwz': 'application/vnd.ms-powerpoint', + '.py': 'text/x-python', + '.pyc': 'application/x-python-code', + '.pyo': 'application/x-python-code', + '.qt': 'video/quicktime', + '.ra': 'audio/x-pn-realaudio', + '.ram': 'application/x-pn-realaudio', + '.ras': 'image/x-cmu-raster', + '.rdf': 'application/xml', + '.rgb': 'image/x-rgb', + '.roff': 'application/x-troff', + '.rtx': 'text/richtext', + '.sgm': 'text/x-sgml', + '.sgml': 'text/x-sgml', + '.sh': 'application/x-sh', + '.shar': 'application/x-shar', + '.snd': 'audio/basic', + '.so': 'application/octet-stream', + '.src': 'application/x-wais-source', + '.stl': 'model/stl', + '.sv4cpio': 'application/x-sv4cpio', + '.sv4crc': 'application/x-sv4crc', + '.svg': 'image/svg+xml', + '.swf': 'application/x-shockwave-flash', + '.t': 'application/x-troff', + '.tar': 'application/x-tar', + '.tcl': 'application/x-tcl', + '.tex': 'application/x-tex', + '.texi': 'application/x-texinfo', + '.texinfo': 'application/x-texinfo', + '.tif': 'image/tiff', + '.tiff': 'image/tiff', + '.tr': 'application/x-troff', + '.tsv': 'text/tab-separated-values', + '.txt': 'text/plain', + '.ustar': 'application/x-ustar', + '.vcf': 'text/x-vcard', + '.wav': 'audio/x-wav', + '.webm': 'video/webm', + '.wiz': 'application/msword', + '.wsdl': 'application/xml', + '.xbm': 'image/x-xbitmap', + '.xlb': 'application/vnd.ms-excel', + '.xls': 'application/vnd.ms-excel', + '.xml': 'text/xml', + '.xpdl': 'application/xml', + '.xpm': 'image/x-xpixmap', + '.xsl': 'application/xml', + '.xwd': 'image/x-xwindowdump', + '.zip': 'application/zip', + + # These are non-standard types, commonly found in the wild. + '.mid': 'audio/midi', + '.midi': 'audio/midi', + '.pct': 'image/pict', + '.pic': 'image/pict', + '.pict': 'image/pict', + '.rtf': 'application/rtf', + '.xul': 'text/xul' +} + + +fallback_mime_type = 'application/octet-stream' + + +def guess_mime_type(path): + _, ext = os.path.splitext(path) + return types_map.get(ext, fallback_mime_type)