Skip to content

Commit 63d76a7

Browse files
committed
Bring back automatic mime type detection for new uploads (fixes #239)
- Add mime.types file to contain a good database of type -> ext mappings from svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types - Load mime.type at BaseClient creation and add two convenience methods for guessing mime types from filenames and extensions from mime types, guess_mime_type and guess_extension - Make all send_* method as well as download_media use the new mime type database via guess_mime_type and guess_extension methods
1 parent 57be975 commit 63d76a7

File tree

12 files changed

+1908
-20
lines changed

12 files changed

+1908
-20
lines changed

pyrogram/client/client.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -861,18 +861,20 @@ def download_worker(self):
861861
file_name = file_name or getattr(media, "file_name", None)
862862

863863
if not file_name:
864-
if media_type == 3:
865-
extension = ".ogg"
864+
guessed_extension = self.guess_extension(media.mime_type)
865+
866+
if media_type in (0, 1, 2):
867+
extension = ".jpg"
868+
elif media_type == 3:
869+
extension = guessed_extension or ".ogg"
866870
elif media_type in (4, 10, 13):
867-
extension = mimetypes.guess_extension(media.mime_type) or ".mp4"
871+
extension = guessed_extension or ".mp4"
868872
elif media_type == 5:
869-
extension = mimetypes.guess_extension(media.mime_type) or ".unknown"
873+
extension = guessed_extension or ".zip"
870874
elif media_type == 8:
871-
extension = ".webp"
875+
extension = guessed_extension or ".webp"
872876
elif media_type == 9:
873-
extension = mimetypes.guess_extension(media.mime_type) or ".mp3"
874-
elif media_type in (0, 1, 2):
875-
extension = ".jpg"
877+
extension = guessed_extension or ".mp3"
876878
else:
877879
continue
878880

@@ -1708,3 +1710,13 @@ def get_file(self,
17081710
return ""
17091711
else:
17101712
return file_name
1713+
1714+
def guess_mime_type(self, filename: str):
1715+
extension = os.path.splitext(filename)[1]
1716+
return self.extensions_to_mime_types.get(extension)
1717+
1718+
def guess_extension(self, mime_type: str):
1719+
extensions = self.mime_types_to_extensions.get(mime_type)
1720+
1721+
if extensions:
1722+
return extensions.split(" ")[0]

pyrogram/client/ext/base_client.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# You should have received a copy of the GNU Lesser General Public License
1717
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
1818

19+
import os
1920
import platform
2021
import re
2122
from queue import Queue
@@ -67,6 +68,20 @@ class StopTransmission(StopIteration):
6768
13: "video_note"
6869
}
6970

71+
mime_types_to_extensions = {}
72+
extensions_to_mime_types = {}
73+
74+
with open("{}/mime.types".format(os.path.dirname(__file__)), "r", encoding="UTF-8") as f:
75+
for match in re.finditer(r"^([^#\s]+)\s+(.+)$", f.read(), flags=re.M):
76+
mime_type, extensions = match.groups()
77+
78+
extensions = [".{}".format(ext) for ext in extensions.split(" ")]
79+
80+
for ext in extensions:
81+
extensions_to_mime_types[ext] = mime_type
82+
83+
mime_types_to_extensions[mime_type] = " ".join(extensions)
84+
7085
def __init__(self):
7186
self.is_bot = None
7287
self.dc_id = None
@@ -132,3 +147,9 @@ def get_chat_members_count(self, *args, **kwargs):
132147

133148
def answer_inline_query(self, *args, **kwargs):
134149
pass
150+
151+
def guess_mime_type(self, *args, **kwargs):
152+
pass
153+
154+
def guess_extension(self, *args, **kwargs):
155+
pass

0 commit comments

Comments
 (0)