gjs/gnome-shell-extension: чтение удаленного изображения jpg из URL и установка в качестве значка
Я пытаюсь улучшить расширение оболочки gnome, позволяя получить удаленное изображение (jpg) и установить в качестве значка для определенного виджета.
Вот что я получил до сих пор, но это не работает из-за несоответствия типа данных:
// allow remote album art url
const GdkPixbuf = imports.gi.GdkPixbuf;
const Soup = imports.gi.Soup;
const _httpSession = new Soup.SessionAsync();
Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());
function getAlbumArt(url, callback) {
var request = Soup.Message.new('GET', url);
_httpSession.queue_message(request, function(_httpSession, message) {
if (message.status_code !== 200) {
callback(message.status_code, null);
return;
} else {
var albumart = request.response_body_data;
// this line gives error message:
// JS ERROR: Error: Expected type guint8 for Argument 'data'
// but got type 'object'
// getAlbumArt/<@~/.local/share/gnome-shell/extensions
// /laine@knasher.gmail.com/streamMenu.js:42
var icon = GdkPixbuf.Pixbuf.new_from_inline(albumart, true);
callback(null, icon);
};
});
Вот обратный звонок:
....
log('try retrieve albumart: ' + filePath);
if(GLib.file_test(iconPath, GLib.FileTest.EXISTS)){
let file = Gio.File.new_for_path(iconPath)
let icon = new Gio.FileIcon({file:file});
this._albumArt.gicon = icon;
} else if (filePath.indexOf('http') == 0) {
log('try retrieve from url: ' + filePath);
getAlbumArt(filePath, function(code, icon){
if (code) {
this._albumArt.gicon = icon;
} else {
this._albumArt.hide();
}
});
}
....
У меня вопрос, как разобрать ответ, который является изображением JPG, чтобы я мог установить значок виджета с ним? Большое спасибо!
0 ответов
Я смог добиться этого, просто выполнив:
const St = imports.gi.St;
const Gio = imports.gi.Gio;
// ...
this.icon = new St.Icon()
// ...
let url = 'https://some.url'
let icon = Gio.icon_new_for_string(url);
this.icon.set_gicon(icon);
И он его автоматически загрузит.
Я часами боролся с этой проблемой, пока наконец не нашел способ сделать это с помощью локального кеша изображений (загрузка изображения и сохранение его в папке с иконками). Затем я попробовал этот подход для развлечения (просто чтобы посмотреть, что произойдет, ожидая, что он потерпит неудачу с треском), и угадайте, что? Это просто сработало. Об этом нигде не упоминается в очень скудной документации, которую мне удалось найти.
Для тех, у кого все еще есть такая же проблема, вот мое решение:
_httpSession.queue_message(request, function(_httpSession, message) {
let buffer = message.response_body.flatten();
let bytes = buffer.get_data();
let gicon = Gio.BytesIcon.new(bytes);
// your code here
});