Downloaded files: include title + ext in filename
This commit is contained in:
parent
bd7b45cc7a
commit
7ee83c5fe4
|
@ -47,20 +47,30 @@ class MediaCache:
|
|||
self.downloads_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
async def get_media(self, mxc: str, crypt_dict: CryptDict = None) -> Path:
|
||||
async def get_media(
|
||||
self,
|
||||
mxc: str,
|
||||
title: str,
|
||||
crypt_dict: CryptDict = None,
|
||||
) -> Path:
|
||||
"""Return a `Media` object. Method intended for QML convenience."""
|
||||
|
||||
return await Media(self, mxc, crypt_dict).get()
|
||||
return await Media(self, mxc, title, crypt_dict).get()
|
||||
|
||||
|
||||
async def get_thumbnail(
|
||||
self, mxc: str, width: int, height: int, crypt_dict: CryptDict = None,
|
||||
self,
|
||||
mxc: str,
|
||||
title: str,
|
||||
width: int,
|
||||
height: int,
|
||||
crypt_dict: CryptDict = None,
|
||||
) -> Path:
|
||||
"""Return a `Thumbnail` object. Method intended for QML convenience."""
|
||||
|
||||
thumb = Thumbnail(
|
||||
# QML sometimes pass float sizes, which matrix API doesn't like.
|
||||
self, mxc, crypt_dict, (round(width), round(height)),
|
||||
self, mxc, title, crypt_dict, (round(width), round(height)),
|
||||
)
|
||||
return await thumb.get()
|
||||
|
||||
|
@ -71,6 +81,7 @@ class Media:
|
|||
|
||||
cache: "MediaCache" = field()
|
||||
mxc: str = field()
|
||||
title: str = field()
|
||||
crypt_dict: CryptDict = field(repr=False)
|
||||
|
||||
|
||||
|
@ -85,9 +96,11 @@ class Media:
|
|||
def local_path(self) -> Path:
|
||||
"""The path where the file either exists or should be downloaded."""
|
||||
|
||||
parsed = urlparse(self.mxc)
|
||||
name = parsed.path.lstrip("/")
|
||||
return self.cache.downloads_dir / parsed.netloc / name
|
||||
parsed = urlparse(self.mxc)
|
||||
mxc_id = parsed.path.lstrip("/")
|
||||
title = Path(self.title)
|
||||
filename = f"{title.stem}_{mxc_id}{title.suffix}"
|
||||
return self.cache.downloads_dir / parsed.netloc / filename
|
||||
|
||||
|
||||
async def get(self) -> Path:
|
||||
|
@ -165,7 +178,7 @@ class Media:
|
|||
) -> "Media":
|
||||
"""Copy an existing file to cache and return a `Media` for it."""
|
||||
|
||||
media = cls(cache, mxc, {}, **kwargs) # type: ignore
|
||||
media = cls(cache, mxc, existing.name, {}, **kwargs) # type: ignore
|
||||
media.local_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
if not media.local_path.exists() or overwrite:
|
||||
|
@ -202,6 +215,7 @@ class Thumbnail(Media):
|
|||
|
||||
cache: "MediaCache" = field()
|
||||
mxc: str = field()
|
||||
title: str = field()
|
||||
crypt_dict: CryptDict = field(repr=False)
|
||||
wanted_size: Size = field()
|
||||
|
||||
|
@ -244,11 +258,15 @@ class Thumbnail(Media):
|
|||
e.g. `~/.cache/appname/thumbnails/matrix.org/32x32/Hm24ar11i768b0el`.
|
||||
"""
|
||||
|
||||
parsed = urlparse(self.mxc)
|
||||
size = self.normalize_size(self.server_size or self.wanted_size)
|
||||
name = "%dx%d/%s" % (size[0], size[1], parsed.path.lstrip("/"))
|
||||
size = self.normalize_size(self.server_size or self.wanted_size)
|
||||
size_dir = f"{size[0]}x{size[1]}"
|
||||
|
||||
return self.cache.thumbs_dir / parsed.netloc / name
|
||||
parsed = urlparse(self.mxc)
|
||||
mxc_id = parsed.path.lstrip("/")
|
||||
title = Path(self.title)
|
||||
filename = f"{title.stem}_{mxc_id}{title.suffix}"
|
||||
|
||||
return self.cache.thumbs_dir / parsed.netloc / size_dir / filename
|
||||
|
||||
|
||||
async def _get_local_existing_file(self) -> Path:
|
||||
|
|
|
@ -18,6 +18,7 @@ Rectangle {
|
|||
|
||||
property string name
|
||||
property alias mxc: avatarImage.mxc
|
||||
property alias title: avatarImage.title
|
||||
|
||||
property alias toolTipMxc: avatarToolTipImage.mxc
|
||||
property alias sourceOverride: avatarImage.sourceOverride
|
||||
|
@ -77,6 +78,7 @@ Rectangle {
|
|||
id: avatarToolTipImage
|
||||
fillMode: Image.PreserveAspectCrop
|
||||
mxc: avatarImage.mxc
|
||||
title: avatarImage.title
|
||||
|
||||
sourceSize.width: avatarToolTip.dimension
|
||||
sourceSize.height: avatarToolTip.dimension
|
||||
|
|
|
@ -13,6 +13,7 @@ HImage {
|
|||
|
||||
|
||||
property string mxc
|
||||
property string title
|
||||
property string sourceOverride: ""
|
||||
property bool thumbnail: true
|
||||
property var cryptDict: ({})
|
||||
|
@ -41,7 +42,8 @@ HImage {
|
|||
|
||||
const method = image.thumbnail ? "get_thumbnail" : "get_media"
|
||||
const args = image.thumbnail ?
|
||||
[image.mxc, w, h, cryptDict] : [image.mxc, cryptDict]
|
||||
[image.mxc, image.title, w, h, cryptDict] :
|
||||
[image.mxc, image.title, cryptDict]
|
||||
|
||||
py.callCoro("media_cache." + method, args, path => {
|
||||
if (! image) return
|
||||
|
|
|
@ -7,6 +7,9 @@ HAvatar {
|
|||
displayName.substring(1) :
|
||||
displayName
|
||||
|
||||
title: "room_" + roomId + ".avatar"
|
||||
|
||||
|
||||
property string roomId
|
||||
property string displayName
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import QtQuick 2.12
|
|||
|
||||
HAvatar {
|
||||
name: displayName || userId.substring(1) // no leading @
|
||||
title: "user_" + userId + ".avatar"
|
||||
|
||||
|
||||
property string userId
|
||||
|
|
|
@ -12,6 +12,7 @@ HTileDelegate {
|
|||
opacity: model.left ? theme.mainPane.room.leftRoomOpacity : 1
|
||||
|
||||
image: HRoomAvatar {
|
||||
roomId: model.id
|
||||
displayName: model.display_name
|
||||
mxc: model.avatar_url
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ HBox {
|
|||
|
||||
HRoomAvatar {
|
||||
id: avatar
|
||||
roomId: ""
|
||||
displayName: nameField.text
|
||||
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
|
|
@ -14,6 +14,7 @@ Rectangle {
|
|||
|
||||
HRoomAvatar {
|
||||
id: avatar
|
||||
roomId: chat.roomId
|
||||
displayName: chat.roomInfo.display_name
|
||||
mxc: chat.roomInfo.avatar_url
|
||||
Layout.alignment: Qt.AlignTop
|
||||
|
|
|
@ -55,6 +55,7 @@ HBox {
|
|||
|
||||
HRoomAvatar {
|
||||
id: avatar
|
||||
roomId: chat.roomId
|
||||
displayName: chat.roomInfo.display_name
|
||||
mxc: chat.roomInfo.avatar_url
|
||||
// enabled: chat.roomInfo.can_set_avatar # put this in "change avatar"
|
||||
|
|
|
@ -9,6 +9,7 @@ HMxcImage {
|
|||
height: fitSize.height
|
||||
horizontalAlignment: Image.AlignLeft
|
||||
|
||||
title: loader.title
|
||||
animated: loader.singleMediaInfo.media_mime === "image/gif" ||
|
||||
utils.urlExtension(loader.mediaUrl).toLowerCase() === "gif"
|
||||
thumbnail: ! animated && loader.thumbnailMxc
|
||||
|
|
|
@ -85,6 +85,7 @@ HLoader {
|
|||
|
||||
const args = [
|
||||
loader.mediaUrl,
|
||||
loader.title,
|
||||
JSON.parse(loader.singleMediaInfo.media_crypt_dict)
|
||||
]
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user