[Python] 开发一个lychee相册命令行客户端以及python库pychee6

有一段时间收集了不少的写真集和漫画,但是一直苦于没有很好的组织和储存的方法,直到我找到了LycheeOrg/Lychee ,它的图片组织形式非常适合存放写真集或者漫画,于是我尝试把图片都放上去。体验很好,但是上传会很麻烦,因为它不支持文件夹上传,这意味着我需要一个一个上传图集并且创建相册,这简直是个灾难。

pychee6

于是我萌生了使用python写个上传器的想法,首先第一步就是找到一个能用的lychee的python库,经过lychee维护者ildyria推荐,我找到了Chostakovitch/pychee: Client for Lychee written in Python,然而已经很久没有维护了。所以我借鉴这个项目开发了一个lychee库x1ntt/pychee6

目前只封装了比较常用的几个功能,例如上传下载图片和相册,创建移动等等。

同时考虑到api原生接口需要的album_id是一个不方便的东西,还实现了相册路径转album_id的功能,可以将诸如/depth_1/depth_2这样的相册路径转换为形如p92kvXqyZUC6M-8CcPAwnCpdalbum_id


pychee6.cli

当然,只有一个库还不够,于是还开发了一个cli作为命令行客户端,它可以按照下面的方式使用

shell 复制代码
python3 -m pychee6.cli ls   # 列出相册和图片
python3 -m pychee6.cli la   # 列出相册
python3 -m pychee6.cli c_a / new_album # 在根目录创建名为`new_album`的相册
python3 -m pychee6.cli c_a /new_album deepth_1  # 在`new_album`下创建名为`deepth_2`的相册
python3 -m pychee6.cli d_a / ./tmp/     # 下载根目录下的相册到`./tmp/`
python3 -m pychee6.cli u_a /new_album ./tmp/test__album/ #  上传`./tmp/test__album/`目录到`/new_album`
python3 -m pychee6.cli u_p /new_album ./tmp/test__album/157_modify.webp # 上传图片

# 相册id和相册路径互相转换
python3 -m pychee6.cli c_v /new_album 
python3 -m pychee6.cli c_v p92kvXqyZUC6M-8CcPAwnCpd

考虑到维护成本和功能需求,我并没有实现一个GUI界面。

下面是完整的帮助信息,更多请去 x1ntt/pychee6

shell 复制代码
python -m pychee6.cli -h
usage: cli.py [-h] [-t TOKEN] [-u USER] [-p PASSWD] [-H HOST] [-m MAX_THREAD] [-v]
              {upload_album,u_a,upload_photo,u_p,download_album,d_a,create_album,c_a,delete_album,del_a,list,ls,list_album,la,conv,c_v,reg_context,unreg_context} ...

这是LycheeClient的cli版本,你可以把这个当作库的使用示例。
大多数情况下,你可以使用album_id或者相册路径为参数。
        album_id是一个24位长度的字符串形如:b4noPnuHQSSCXZL_IMsLEGAJ。
        相册路径是以/开头的字符串形如:/deepth_1/deepth_2。其中单独的/表示根目录或者说未分类

positional arguments:
  {upload_album,u_a,upload_photo,u_p,download_album,d_a,create_album,c_a,delete_album,del_a,list,ls,list_album,la,conv,c_v,reg_context,unreg_context}
    upload_album (u_a)  上传相册,album_id为'/'则上传到根相册
    upload_photo (u_p)  上传图片到相册,album_id为'/'则上传到未分类
    download_album (d_a)
                        下载相册,album_id为'/'则下载所有
    create_album (c_a)  创建相册,album_id为'/'则在根相册创建
    delete_album (del_a)
                        删除指定相册
    list (ls)           列出相册和图片
    list_album (la)     仅显示相册
    conv (c_v)          album_id和album_path互相转换
    reg_context         将上传下载功能注册到鼠标上下文菜单中
    unreg_context       取消注册鼠标上下文菜单中的上传下载功能

options:
  -h, --help            show this help message and exit
  -t, --token TOKEN     登录所需要的api token,与用户名二选一 可以通过 LYCHEE_TOKEN 环境变量提供
  -u, --user USER       用户名 可以通过环境变量 LYCHEE_USERNAME 提供
  -p, --passwd PASSWD   密码 可以通过环境变量 LYCHEE_PASSWORD 提供
  -H, --host HOST       服务器地址,形如: http://exp.com:8808/ 可以通过环境变量 LYCHEE_HOST 提供
  -m, --max_thread MAX_THREAD
                        线程池大小 影响上传下载数量,默认为5
  -v, --verbose         输出调试信息

pychee6_cm

然而在使用了几次之后,发现只有一个命令行并不方便。当我需要上传一个文件夹时,我还需要打开cmd然后输入命令行,这其实很不方便。

于是我的另一个主意是,把cli的功能注册到windows资源管理器的上下文菜单,于是就有了x1ntt/pychee6_cm: 用于注册pychee.cli到windows资源管理的上下文菜单

效果如下:

上图展示了注册到上下文菜单、上传到指定相册、下载到文件夹的过程。

至此,已经能够满足我自己的使用了。

如果有遇到什么bug或者需求,欢迎到x1ntt/pychee6提出issue 🫡