Скачивание изображений без формата в конце ссылки
Собственно. Делаю возможность скачивания изображений драгндропом их с браузера. Однако я заметил, что далеко не все картинки, когда их открываешь "открыть изображений в новой вкладке" имеют в конце формат. Как можно скачивать их таким путём?
import sys, os, time
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
from threading import Thread
import requests
from PyQt5.QtWidgets import QApplication, QWidget, QAction, QLabel, QVBoxLayout, QScrollArea
class MyWin(QWidget):
def __init__(self):
super(QWidget, self).__init__()
self.drop_label = QLabel(self)
self.drop_label.resize(self.width(), self.height())
self.drop_label.setStyleSheet('background-color: #302720;')
self.drop_label.show()
self.setWindowFlags( Qt.WindowStaysOnTopHint)
self.setAcceptDrops(True)
self.show()
def dragEnterEvent(self, event):
if event.mimeData().hasText():
event.accept()
else:
event.ignore()
def dropEvent(self, event):
file_formats = ('.png', '.jpg', '.gif')
if event.mimeData().hasText():
mime = str(event.mimeData().text())
if mime.startswith('http') is True and mime.endswith(file_formats) is True:
Thread(target=self.downloader, args=(mime, 2)).start()
else:
# тут я сохраняю ссылку или текст просто как ссылку или текст
pass
def downloader(self, mime, x):
print(x)
current_time = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
img_name = os.getcwd() + r'\\Downloads\\images\\' + current_time + f'.{mime[-3:]}'
img_link = requests.get(mime)
load = open(img_name, "wb")
load.write(img_link.content)
load.close()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MyWin()
w.show()
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: Михаил Муругов
Для ссылки, которую Вы привели в комментариях:
→ Ссылка
Если формат файла может быть только из списка file_formats, то можно смотреть бинарную сигнатуру в начале файла и определять по ней.
PNG_SIGNS = (b'\x89PNG\r\n\x1a\n',) # Сигнатуры png файлов
JPG_SIGNS = (b'\xff\xd8\xff',) # Сигнатуры jpg файлов
GIF_SIGNS = (b'GIF87a', b'GIF89a') # Сигнатуры gif файлов
file = ... # Файл изображения в бинарном виде
if file.startswith(PNG_SIGNS):
print("This is PNG!")
elif file.startswith(JPG_SIGNS):
print("This is JPG!")
elif file.startswith(GIF_SIGNS):
print("This is GIF!")
else:
print("Unrecognized file type")
Для ссылки, которую Вы привели в комментариях:
In [1]: import requests
In [2]: url = "https://avatars.mds.yandex.net/get-pdb/2071464/a8f69da8-cc1f-4a08-a19f-d2ae0b18aa09/s1200?webp=false"
In [3]: resp = requests.get(url)
In [4]: PNG_SIGNS = (b'\x89PNG\r\n\x1a\n',) # Сигнатуры png файлов
...: JPG_SIGNS = (b'\xff\xd8\xff',) # Сигнатуры jpg файлов
...: GIF_SIGNS = (b'GIF87a', b'GIF89a') # Сигнатуры gif файлов
...:
...: file = resp.content # Файл изображения в бинарном виде
...:
...: if file.startswith(PNG_SIGNS):
...: print("This is PNG!")
...: elif file.startswith(JPG_SIGNS):
...: print("This is JPG!")
...: elif file.startswith(GIF_SIGNS):
...: print("This is GIF!")
...: else:
...: print("Unrecognized file type")
...:
This is JPG!