Skip to content

Commit 09d10d1

Browse files
committed
add other image server support
1 parent c1f4ef5 commit 09d10d1

31 files changed

+705
-47
lines changed

README.md

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Markdown-img使用指南
22

3+
## 项目地址
4+
5+
- pypi:<https://pypi.org/project/markdown-img-icexmoon/>
6+
- github:<https://github.com/icexmoon/markdown-img>
7+
38
## 用途
49

510
本程序用于扫描工作目录下的markdown文件,查找其中的本地图片并自动上传到`sm.ms`图床,并生成一个使用网络图片替换本地图片的markdown副本,存放于`当前工作目录/markdown_image`目录下。
@@ -9,10 +14,17 @@
914
## 注意事项
1015

1116
- 本程序不会改变原始markdown文件,请放心使用。
17+
1218
- 对于已经生成副本的原始文件,本程序不会再次处理,如果需要重新生成副本,请手动删除相应的已生成副本。
19+
1320
- 本程序依赖于`sm.ms`图床,请自行注册账号并生成token。
21+
22+
> 已加入其它图床支持,详情见功能,不过默认依然使用sm.ms图床。
23+
1424
- 因为`sm.ms`图床接口有调用限制,如果出现图片上传出错的情况,可能是上传频繁导致,请等待1分钟以上时间后重新使用本程序。
25+
1526
- 目前本程序只支持windows。
27+
1628
- `sm.ms`国内访问不算友好,生成的markdown拷贝立即在网络上发布可能会显示防盗链等图片挂掉的情况,那是因为国内CDN比较慢,等一段时间就好了。
1729

1830
## 安装
@@ -27,7 +39,15 @@ pip install markdown-img-icexmoon
2739
pip install --upgrade markdown-img-icexmoon
2840
```
2941

30-
## 使用方式
42+
## 功能
43+
44+
### 查看帮助文档
45+
46+
1. 执行`python -m markdown_img -h`
47+
48+
### 生成图床markdown副本
49+
50+
本程序的主要功能,将扫描命令行工作目录下的markdown文件,会将其中的本地图片替换为图床图片后生成一个图床副本,生成的副本会存储在工作目录下的`markdown_img`文件夹中。
3151

3252
1. 使用CMD定位到将要处理的markdown文件目录。
3353
2. 执行`python -m markdown_img`
@@ -36,9 +56,47 @@ pip install --upgrade markdown-img-icexmoon
3656
5. 等待处理。
3757
6. 完毕后查看`工作目录/markdown_img`目录。
3858

39-
> - 图床token存储在程序所在目录的`smms_token.config`文件中,如果需要修改的可以自行修改,也可以删除该配置文件后重新运行程序输入。
59+
> - 图床token存储在程序所在目录的`main.config`文件中,如果需要修改的可以自行修改,也可以删除该配置文件后重新运行程序输入。
60+
> - 目前仍不支持根据文件新旧程度重新生成markdown副本的功能,如果原文件改变,需要手动删除副本后重新生成。
4061
> - 稍后会丰富并完善程序的相关命令参数。
4162
63+
### 从图床恢复本地图库
64+
65+
如果图床副本完好,但本体markdown文件关联的本地图片丢失的,可以利用此功能尝试恢复。
66+
67+
1. 切换命令行工作目录到要恢复的markdown文件目录。
68+
2. 执行`python -m markdown_img -m img_recove`
69+
3. 等待处理。
70+
4. 完毕后查看本地markdown文件图片是否恢复。
71+
72+
> - 因为网络图床不稳定,虽然程序本身有超时重连机制,但如果恢复的图片过多,很可能处理中断,只需要重新运行程序即可。
73+
> - 恢复逻辑为对比副本和原本中的图片出现顺序,1对1恢复,所以务必保证两者没有差异,程序会在两者数量不同时中断并提示用户手动确认。
74+
75+
### 切换图床服务
76+
77+
可以切换图床服务,以备某个图床不可用或者访问不稳定。
78+
79+
目前支持的图床有[**sm.ms**](https://sm.ms/)、阿里、[**如优**](https://img.rruu.net/)[**Vim-CN**](https://img.vim-cn.com/)
80+
81+
1. 执行`python -m markdown_img -i ali`
82+
83+
> - 具体的图床标识可以查看帮助文档。
84+
> - 需要访问令牌的图床服务切换后使用中会提示输入相应的访问令牌。
85+
86+
## 更新日志
87+
88+
### 0.0.6
89+
90+
新增命令行参数功能,具体情况可使用`python -m markdown_img --help`进行查看。
91+
92+
新增使用图床备份恢复本地图片库的功能,具体使用方法见帮助信息。
93+
94+
### 0.1.1
95+
96+
加入阿里图床、Vim-CN图床、如优图床的调用支持。
4297

98+
其中阿里图床和如优图床通过如优的API调用实现,需要在如优图床官网申请账号并获取token。
4399

100+
> 如优图床的容量为单账号10G,不过注册只需要邮箱,可以注册多个账号。
44101
102+
加入从图床副本恢复本地markdown图片的功能,具体使用方式见帮助文档。

build/lib/markdown_img/__init__.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,33 @@
1-
import os
1+
import getopt
22
import sys
3-
part = __file__.rpartition('\\')
4-
packageDirPath = part[0]
5-
sys.path.append(packageDirPath)
6-
from main import Main
3+
import os
4+
from .main import Main
5+
try:
6+
opts, args = getopt.gnu_getopt(sys.argv[1:], 'm:hi:', ['mode=', 'help','img_service='])
7+
except getopt.GetoptError as e:
8+
print("获取参数信息出错,错误提示:", e.msg)
9+
exit()
710
mainProcess = Main()
8-
mainProcess.main()
11+
if len(opts) == 0:
12+
mainProcess.main()
13+
else:
14+
# print(opts)
15+
for opt in opts:
16+
argKey = opt[0]
17+
argVal = opt[1]
18+
if argKey == '--help' or argKey == '-h':
19+
mainProcess.outputHelpInfo()
20+
elif argKey == '--mode' or argKey == '-m':
21+
mode = argVal
22+
if mode == 'img_recove':
23+
mainProcess.imgRecovery()
24+
elif mode == 'normal':
25+
mainProcess.main()
26+
else:
27+
print("错误的mode参数")
28+
elif argKey == '--img_service' or argKey == '-i':
29+
mainProcess.changeImgService(argVal)
30+
else:
31+
mainProcess.main()
32+
break
33+
exit()

build/lib/markdown_img/config.py

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
11
import os
2-
from user_exception import UserException
2+
from .user_exception import UserException
3+
import json
34

45

56
class Config():
7+
PARAM_SMMS_TOKEN = 'smms_token'
8+
PARAM_RRUU_TOKEN = 'rruu_token'
9+
PARAM_IMG_SERVICE = 'img_service'
10+
IMG_SERVICE_SMMS = 'smms'
11+
IMG_SERVICE_RRUU = 'rruu'
12+
IMG_SERVICE_ALI = 'ali'
13+
IMG_SERVICE_VIMCN = 'vimcn'
614
smmsTokenFile = ""
15+
configFile = ""
16+
mainConfig = {}
717

818
def __init__(self):
919
pass
@@ -27,16 +37,60 @@ def getSmmsTokenFile(self):
2737
Config.smmsTokenFile = self.getCurrentDirPath()+'\\smms_token.config'
2838
return Config.smmsTokenFile
2939

40+
def __getConfigFile(self):
41+
if Config.configFile == "":
42+
Config.configFile = self.getCurrentDirPath()+'\\main.config'
43+
return Config.configFile
44+
45+
def __getMainConfig(self, real=False):
46+
if len(Config.mainConfig) == 0 or real == True:
47+
if os.path.exists(self.__getConfigFile()):
48+
with open(file=self.__getConfigFile(), mode='r', encoding='UTF-8') as fopen:
49+
Config.mainConfig = json.loads(fopen.read())
50+
else:
51+
# 不存在配置文件的,给予默认配置
52+
Config.mainConfig['img_service'] = 'smms'
53+
return Config.mainConfig
54+
55+
def getConfigParam(self, param):
56+
'''获取配置参数'''
57+
mainConfig = self.__getMainConfig()
58+
if param in mainConfig:
59+
return mainConfig[param]
60+
else:
61+
return ''
62+
63+
def setConfigParam(self, param, value):
64+
'''设置配置参数'''
65+
mainConfig = self.__getMainConfig()
66+
mainConfig[param] = value
67+
68+
def writeMainConfig(self):
69+
fopen = open(file=self.__getConfigFile(), mode='w', encoding='UTF-8')
70+
mainConfig = self.__getMainConfig()
71+
print(json.dumps(mainConfig), file=fopen)
72+
fopen.close()
73+
74+
def getRruuToken(self):
75+
token = self.getConfigParam(Config.PARAM_RRUU_TOKEN)
76+
if token == '':
77+
raise UserException(UserException.CODE_NO_RRUU_TOKEN)
78+
return token
79+
3080
def getSmmsToken(self):
31-
if not os.path.exists(self.getSmmsTokenFile()):
32-
raise UserException(UserException.CODE_NO_CONFIG)
33-
configFileOpen = open(file=self.getSmmsTokenFile(), mode='r')
34-
token = configFileOpen.readline()
35-
configFileOpen.close()
36-
if len(token) <= 4:
37-
raise UserException(UserException.CODE_NO_CONFIG)
38-
token = token[0:len(token)-1]
81+
token = self.getConfigParam(Config.PARAM_SMMS_TOKEN)
82+
if token == '':
83+
raise UserException(UserException.CODE_NO_SMMS_TOKEN)
3984
return token
85+
# if not os.path.exists(self.getSmmsTokenFile()):
86+
# raise UserException(UserException.CODE_NO_CONFIG)
87+
# configFileOpen = open(file=self.getSmmsTokenFile(), mode='r')
88+
# token = configFileOpen.readline()
89+
# configFileOpen.close()
90+
# if len(token) <= 4:
91+
# raise UserException(UserException.CODE_NO_CONFIG)
92+
# token = token[0:len(token)-1]
93+
# return token
4094

4195
def writeSmmsToken(self, token: str):
4296
with open(file=self.getSmmsTokenFile(), mode='w') as configFileOpen:
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import sys
2+
from urllib import request
3+
import requests
4+
from .user_exception import UserException
5+
6+
7+
class DownloadHelp():
8+
def processReport(self, a, b, c):
9+
per = 100.0*a*b/c
10+
if per > 100:
11+
per = 1
12+
# sys.stdout.write(" "+"%.2f%% 已经下载的大小:%1d 文件大小:%1d"%(per,a*b,c)+'\r')
13+
# sys.stdout.flush()
14+
15+
def download(self, url, fileName):
16+
request.urlretrieve(url, filename=fileName,
17+
reporthook=self.processReport)
18+
19+
def chunkDownload(self, url, fileName, timeout=5):
20+
i = 0
21+
while True:
22+
try:
23+
r = requests.get(url, stream=True, timeout=timeout)
24+
with open(fileName, 'wb') as f:
25+
for chunk in r.iter_content(chunk_size=32):
26+
f.write(chunk)
27+
return
28+
except requests.exceptions.RequestException:
29+
#链接超时重试三次
30+
i += 1
31+
if i < 3:
32+
continue
33+
else:
34+
raise UserException(UserException.CODE_TIMEOUT,"下载"+url+"超时,请重新再试")

build/lib/markdown_img/help.info

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
-h --help 输出帮助信息
2+
-m --mode 选择运行模式
3+
img_recove 使用图床的备份修复本地图片库
4+
normal 正常模式
5+
-i --img_service 选择图床服务商
6+
smms sm.ms图床,默认图床服务,稳定性好,访问速度一般。
7+
ali 阿里图床,访问速度快(非正常提供服务,稳定性不保证)。
8+
rruu 如优图床。
9+
vimcn Vim-CN图床,访问速度偏慢。

0 commit comments

Comments
 (0)