Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feat]: telegram的动画贴纸无法下载 #282

Closed
jiongjiongJOJO opened this issue Jul 4, 2024 · 16 comments
Closed

[Feat]: telegram的动画贴纸无法下载 #282

jiongjiongJOJO opened this issue Jul 4, 2024 · 16 comments
Labels
enhancement 新功能或请求

Comments

@jiongjiongJOJO
Copy link
Contributor

需要调整的功能内容

通过api获取的贴纸是tgs格式的文件,实际上这个文件是一个lottie 的 json文件(经过了压缩),但是不太熟悉lottie,不知道该如何转换成gif,作者是否有考虑保存动画贴纸。或者外置程序来调用(类似ffmpeg)

@jiongjiongJOJO jiongjiongJOJO added the enhancement 新功能或请求 label Jul 4, 2024
@xiyuesaves
Copy link
Owner

xiyuesaves commented Jul 4, 2024

没有考虑,目前的逻辑应该会自动忽略无法下载的贴纸类型

@jiongjiongJOJO
Copy link
Contributor Author

没有考虑,目前的逻辑应该会自动忽略无法下载的贴纸类型

是的,但是这类贴纸能否转换成gif保存到本地

@xiyuesaves
Copy link
Owner

刚找到一个项目,可以将 lottie 转换成图片 lottie-converter 之后有空再说吧

@jiongjiongJOJO
Copy link
Contributor Author

刚找到一个项目,可以将 lottie 转换成图片 lottie-converter 之后有空再说吧

这个是c++写的,还有python相关的库,但是没找到合适的js库。后续打算通过外置转换程序的方式还是js来实现这个?

@xiyuesaves
Copy link
Owner

就像ffmpeg那样外挂吧,没必要内置

@jiongjiongJOJO
Copy link
Contributor Author

就像ffmpeg那样外挂吧,没必要内置

那我研究一下吧,之前用js没实现(对js和electron太不熟了),外挂的话可能简单很多

@jiongjiongJOJO
Copy link
Contributor Author

就像ffmpeg那样外挂吧,没必要内置

看了一下lottie-converter,对用户而言部署是比较麻烦的,还要下载gifski
https://github.com/ed-asriyan/lottie-converter/blob/778ba4931a027ba4462f69f53fe7f4f39d34f6e2/README.md?plain=1#L56
并添加环境变量。

是否有必要使用python的rlottie-python,这个可以封装一个小的执行文件,用起来也很简单

@xiyuesaves
Copy link
Owner

xiyuesaves commented Jul 4, 2024

是否有必要使用python的rlottie-python,这个可以封装一个小的执行文件,用起来也很简单

如果能三端通用的话倒也是个不错的方法

@jiongjiongJOJO
Copy link
Contributor Author

是否有必要使用python的rlottie-python,这个可以封装一个小的执行文件,用起来也很简单

如果能三端通用的话倒也是个不错的方法

可以开一个仓库,CI自动编译出来三端的可执行文件,我这边在Windows下测试的基本上通过了,还在改一些小问题
Clip_2024-07-04_16-18-24

@jiongjiongJOJO
Copy link
Contributor Author

jiongjiongJOJO commented Jul 5, 2024

https://github.com/jiongjiongJOJO/tgs_to_gif
创建了一个仓库用于将tgs转换成gif,后续可以用这个项目编译的程序进行处理

@xiyuesaves
Copy link
Owner

https://github.com/jiongjiongJOJO/tgs_to_gif 创建了一个仓库用于将tgs转换成gif,后续可以用这个项目编译的程序进行处理

能否支持管道输入?我希望是直接将 JSON 数据直接以数据流形式发送给子进程,而不是在本地再创建一个临时文件

@jiongjiongJOJO
Copy link
Contributor Author

jiongjiongJOJO/tgs_to_gif 创建了一个仓库用于将tgs转换成gif,后续可以用这个项目编译的程序进行处理

能否支持管道输入?我希望是直接将 JSON 数据直接以数据流形式发送给子进程,而不是在本地再创建一个临时文件

我本来也这样想的,但是测试后发现json文本太大了,命令行不支持

@xiyuesaves
Copy link
Owner

xiyuesaves commented Jul 5, 2024

我本来也这样想的,但是测试后发现json文本太大了,命令行不支持

我的意思是指通过pipe传递数据,这是nodejs下的实现,我没用过py,不过应该都是差不多的

stdout.js

import { spawn } from "child_process";
import { readFileSync } from "fs";
import { Readable } from "stream";
const exampleStdin = spawn("node", ["./stdin.js"]);
const file = readFileSync("./large.json");
// 模拟下载到的二进制数据流
const inputStream = Readable.from(file);
exampleStdin.stdout.on("data", (data) => {
  console.log("子进程:", data.toString());
});

exampleStdin.stderr.on("data", (data) => {
  console.error("子进程错误:", data.toString());
});

exampleStdin.on("close", (code) => {
  console.log(`子进程退出,退出码 ${code}`);
});

inputStream.pipe(exampleStdin.stdin);

stdin.js

let file = "";

process.stdin.on("data", (data) => {
  console.log("接收到数据", data.length);
  file += data;
});

process.stdin.on("end", () => {
  console.log("接收结束,共收到", file.length, "个字符");
});

输出

E:\test>node stdout.js
子进程: 接收到数据 1756296

子进程: 接收结束,共收到 1744572 个字符

子进程退出,退出码 0

@jiongjiongJOJO
Copy link
Contributor Author

我本来也这样想的,但是测试后发现json文本太大了,命令行不支持

我的意思是指通过pipe传递数据,这是nodejs下的实现,我没用过py,不过应该都是差不多的

stdout.js

import { spawn } from "child_process";
import { readFileSync } from "fs";
import { Readable } from "stream";
const exampleStdin = spawn("node", ["./stdin.js"]);
const file = readFileSync("./large.json");
// 模拟下载到的二进制数据流
const inputStream = Readable.from(file);
exampleStdin.stdout.on("data", (data) => {
  console.log("子进程:", data.toString());
});

exampleStdin.stderr.on("data", (data) => {
  console.error("子进程错误:", data.toString());
});

exampleStdin.on("close", (code) => {
  console.log(`子进程退出,退出码 ${code}`);
});

inputStream.pipe(exampleStdin.stdin);

stdin.js

let file = "";

process.stdin.on("data", (data) => {
  console.log("接收到数据", data.length);
  file += data;
});

process.stdin.on("end", () => {
  console.log("接收结束,共收到", file.length, "个字符");
});

输出

E:\test>node stdout.js
子进程: 接收到数据 1756296

子进程: 接收结束,共收到 1744572 个字符

子进程退出,退出码 0

这一块我也不是很熟,周末有空看看吧,看这个示例应该是可以的

@Wfgukasha
Copy link

Wfgukasha commented Jul 5, 2024 via email

@jiongjiongJOJO
Copy link
Contributor Author

我本来也这样想的,但是测试后发现json文本太大了,命令行不支持

我的意思是指通过pipe传递数据,这是nodejs下的实现,我没用过py,不过应该都是差不多的

stdout.js

import { spawn } from "child_process";
import { readFileSync } from "fs";
import { Readable } from "stream";
const exampleStdin = spawn("node", ["./stdin.js"]);
const file = readFileSync("./large.json");
// 模拟下载到的二进制数据流
const inputStream = Readable.from(file);
exampleStdin.stdout.on("data", (data) => {
  console.log("子进程:", data.toString());
});

exampleStdin.stderr.on("data", (data) => {
  console.error("子进程错误:", data.toString());
});

exampleStdin.on("close", (code) => {
  console.log(`子进程退出,退出码 ${code}`);
});

inputStream.pipe(exampleStdin.stdin);

stdin.js

let file = "";

process.stdin.on("data", (data) => {
  console.log("接收到数据", data.length);
  file += data;
});

process.stdin.on("end", () => {
  console.log("接收结束,共收到", file.length, "个字符");
});

输出

E:\test>node stdout.js
子进程: 接收到数据 1756296

子进程: 接收结束,共收到 1744572 个字符

子进程退出,退出码 0

这个方案的pr已经提交了,同时jiongjiongJOJO/tgs_to_gif仓库的代码也已经更新,但是我这个月github action免费额度用完了,可能编译不了Windows和Mac端的了,或者我用小号编译完手动上传进来

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement 新功能或请求
Projects
None yet
Development

No branches or pull requests

3 participants