Calibre 使用教程之批量获取电子书元数据
之前书伴写过一些 Calibre 教程,在 Calibre 发布 3.0 里程碑版本时,还专门写了一篇文章梳理了一下 Calibre 的常用功能。这些教程中的功能操作主要是在 Calibre 为我们提供的图形界面上进行的,虽然对于单个任务来说,在界面上进行更易用,但是对于需要批量处理的任务,界面反倒成了障碍。
比如本文将要以某种方法辨别大批量电子书的质量,为提高效率,就没用使用 Calibre 图形界面。
一、如何辨别电子书的质量
相信很多小伙伴都有屯电子书的习惯,很多小伙伴会以 G 计地把电子书文件拉取到自己的硬盘上,虽然都知道这些电子书的质量良莠不齐,但想要对成千上万的电子书文件一个一个查看,显然缺乏效率。那我们该怎么样辨别一本电子书文件质量的好坏呢?从电子书“元数据”上来判断是一个不错的方法。
Kindle 电子书的来源有两种,一种来源于亚马逊官网,另一种是网友自制。虽然亚马逊提供的电子书不能保证百分百完美,但相比自制的电子书质量仍算上乘。Kindle 电子书的格式一般包括 AZW3、AZW、MOBI 等。其中只有 MOBI 格式,亚马逊官方为其提供了生成工具 KindleGen,但亚马逊官方 Kindle 商店没有直接提供 MOBI 格式的电子书。其它格式如 AZW3 的生成方法均未公开,Calibre 软件之所以能转换的 AZW3 等格式应该也是高手们通过反编译等手段 Hack 到的,和原生的有些微差别。
使用 Calibre 转换过的电子书都会在元数据中留下 Calibre 的标记,很多提供电子书下载的网站也会通过 Calibre 等转换软件往电子书元数据中填充自己的网站宣传信息。虽然你看到的是 AZW3 格式,但已经不是从亚马逊官网获取到的原本的电子书文件了。所以我们可以简单的这样判断:凡是元数据和亚马逊官方提供的原版电子书不匹配的 AZW3、AZW 文件,都是经过修改过的非原版电子书文件。
对于亚马逊官方提供的 Kindle 电子书,其元数据内容如下所示:
Title : 白鹿原(茅盾文学奖获奖作品;插图珍藏精装本)
Author(s) : 陈忠实著
Publisher : 人民文学出版社
Languages : zho
Published : 2012-09-30T16:00:00+00:00
Identifiers : mobi-asin:B00OUS31CM
如果经过 Calibre 软件的转换,其元数据内容变成了这样:
Title : 白鹿原(茅盾文学奖获奖作品;插图珍藏精装本)
Author(s) : 陈忠实著
Publisher : 人民文学出版社
Book Producer : calibre (2.80.0) [https://calibre-ebook.com]
Languages : zho
Published : 2012-09-30T16:00:00+00:00
Identifiers : mobi-asin:fa225c79-f5ee-47b8-9fe1-1afb5f6c177f
以上可以看出,第三方软件会在电子书的元数据中插入和修改某些信息,如果转换者修改了标题、作者等信息,就和原版文件完全不同了。虽然对于 AZW3 格式来说,原版文件和通过 Calibre 转换的文件在内容排版上差别不算太大,但可能会影响到诸如生词提示、X-Ray 等依赖于 ASIN 编号的相关功能的使用。我们通过元数据就可以概略识别出,哪些电子书是没问题的,哪些电子书是有待检查的。
二、如何获取电子书的元数据
那我们该怎样获取电子书元数据呢?如果有大量的文件,又该怎样批量获取电子书元数据呢?在 Calibre 的图形界面中,我们可以通过菜单查看或编辑电子书的元数据,查看单本电子书的元数据还成,若想要批量获取就难以达成了。其实 Calibre 除了我们惯常使用的图形界面,还提供了一些命令行工具(Command Line Interface,简称 CLI)。图形界面上某些功能其实也是通过调用这些工具完成任务的。比如读取电子书的元数据,就是调用的本文要使用的一个命令行工具“ebook-meta” 完成的。
1、准备 ebook-meta 工具
如果你的电脑是 Windows 系统,一般在安装好 Calibre 之后 ebook-meta
命令就应该是可用的了。不放心可以打开“命令提示符”直接输入 ebook-meta
命令,如果出现命令的帮助信息,就确定是可用的。
* 提示:如果运行命令后提示找不到命令,需要你自行配置一下,右键单击“计算机”,在弹出的菜单中点击“属性 -> 高级系统设置 -> 环境变量”,在弹出的窗口中的“系统变量”中,双击“Path”项目,把 Calibre 的安装路径添加进去即可。
如果你的电脑是 macOS 系统,安装 Calibre 之后需要手动把命令行工具的路径添加到系统变量中。打开“终端”,把下面的命令粘贴进去,回车就可以使用 ebook-meta
命令了。
echo -e '\nexport PATH="$PATH:/Applications/calibre.app/Contents/MacOS"' >> ~/.bash_profile && source ~/.bash_profile
Calibre 的 ebook-meta
命令的所有使用方法可以直接运行 ebook-meta
查看帮助信息。此命令可以向电子书写入元数据,也可以读取电子书元数据。这里只使用它的读取功能。
2、获取单个电子书的元数据
读取单个电子书元数据的方法很简单,只需要打开“命令提示符”或“终端”,输入 ebook-meta
命令,空格后加上电子书路径,即可获取该电子书元数据,如之前我们所展示的那样。
Windows 系统“命令提示符”:
ebook-meta C:\Users\bookfere\Desktop\电子书名.azw3
macOS 系统“终端”:
ebook-meta /users/bookfere/desktop/电子书名.azw3
* 如果电子书文件就在当前目录,则可以省去绝对路径,只录入电子书文件名即可。
3、批量获取电子书的元数据
当然我们的目的是批量获取电子书的元数据列表,像上面那样单个读取就显得太没效率了。所以书伴为小伙伴们准备好了可以批量记录电子书元数据的脚本,可以把某个目录下所有电子书的元数据写入一个文本文档中。以下两个脚本分别适用于 Windows 和 macOS 系统,可根据自己的系统类型选用。
◆ Windows 系统批处理脚本
打开记事本,把下面的内容全部复制粘贴进去,存为 eBookMeta.bat 文件,注意编码要选择 ANSI。使用时只需要双击此文件,根据提示输入 Kindle 电子书文件所在目录的绝对路径,按回车,脚本会逐一读取电子书的元数据,并写入到 eBookMeta.txt 文件中(存放在电子书文件所在目录)。
::Author : bookfere.com
::Site : https://bookfere.com/post/550.html
@echo off & color 0A
::定义变量
set IDEN="书伴 - 为静心阅读而生(bookfere.com)"
set LINE="===================================="
set SPIL="------------------------------------"
echo %IDEN:"=%
echo.
where ebook-meta 2>nul >nul
if %errorlevel% neq 0 (
echo 脚本不可用!请先安装 Calibre 软件:https://bookfere.com/tools#calibre
echo.
echo 请按任意键退出。
pause > nul
exit
)
:RETRY
set /p DIR=请输入电子书文件所在的绝对路径:
if not exist %DIR% (
echo.
echo 请输入有效的路径!
echo.
goto RETRY
)
set LOG="%DIR%/eBookMeta.txt"
::开始处理
echo.
echo 开始读取电子书元数据……
echo 目录 %DIR% 下的电子书元数据列表 > %LOG%
echo.
echo %LINE:"=% >> %LOG%
for /R %DIR% %%i in (*.azw *.mobi *.epub) do (
echo 电子书 %%i 的元数据: >> %LOG%
echo %SPIL:"=% >> %LOG%
ebook-meta "%%i" | find /v "" >> %LOG%
echo %LINE:"=% >> %LOG%
echo - 已处理 %%i
)
chcp 936 > nul
echo %IDEN:"=% >> %LOG%
echo.
echo √ 全部处理完毕!
echo.
::处理结束
echo 请按任意键结束此次处理并打开结果。
pause > nul
notepad %LOG%
exit
* 提示:在 Windows 的批处理中 .azw 可以匹配 .azw3、.azw4 等后缀名。
◆ macOS 系统 Shell 脚本
使用代码编辑器(如 Sublime Text 3),把下面的代码复制粘贴并另存为 eBookMeta.sh,然后打开“终端”,运行命令 chmod +x eBookMeta.sh
让此脚本文件可执行。这样就可以用命令 ./eBookMeta.sh
运行此脚本了。根据提示输入电子书文件所在目录的绝对路径(也可以直接在命令后面加路径),脚本会逐一读取电子书元数据,写入到 eBookMeta.txt 文件中(存放在电子书文件所在目录)。
#!/bin/bash
# Author : bookfere.com
# Site : https://bookfere.com/post/550.html
# 定义变量
IDEN="书伴 - 为静心阅读而生(bookfere.com)"
LINE="===================================="
SPLI="------------------------------------"
if ! type -t ebook-meta > /dev/null; then
echo "脚本不可用!请先安装 Calibre 软件:https://bookfere.com/tools#calibre"
exit
fi
printf "\n$IDEN\n"
if [ ! $1 ]
then
printf '\n输入电子书文件所在的绝对路径:'
echo -n
read DIR
else
DIR="$1"
fi
if [[ ! -d "$DIR" ]]
then
printf "\n请输入有效的路径!\n"
bash $0
fi
LOG="$DIR/eBookMeta.txt"
# 开始处理
echo $LINE > $LOG
cd "$DIR"
echo "目录 $DIR 下的电子书元数据列表" > $LOG
printf "\n开始读取电子书元数据……\n"
echo "$LINE" >> $LOG
OIFS="$IFS"
IFS=$'\n'
for SUB in $(find "$DIR" -maxdepth 5 -type d)
do
if [[ -d "$SUB" ]]
then
cd "$SUB"
for f in $SUB/*.azw3 $SUB/*.mobi $SUB/*.azw $SUB/*.epub
do
if [[ -f "$f" ]]
then
echo "$f" >> $LOG
echo "$SPLI" >> $LOG
ebook-meta "$f" >> $LOG
echo $LINE >> $LOG
printf "\n- 已处理 $f"
fi
done
fi
done
echo $IDEN >> $LOG
printf "\n\n√ 全部处理完毕!\n\n"
# 处理结束
read -n 1 -s -r -p "请按任意键结束此次处理并打开结果。"
open $LOG
脚本运行完毕后,你就可以得到指定目录的所有电子书元数据列表了,就像下面这样:
目录 /users/bookfere/desktop/test 下的电子书元数据列表
====================================
/users/bookfere/desktop/test/哲学的慰藉.azw3
------------------------------------
Title : 哲学的慰藉 (阿兰·德波顿文集)
Author(s) : 阿兰·德波顿(Alain de Botton)
Languages : zho
Published : 2009-03-31T16:00:00+00:00
Identifiers : mobi-asin:B00JM2HNVG
====================================
/users/bookfere/desktop/test/白鹿原.azw3
------------------------------------
Title : 白鹿原(茅盾文学奖获奖作品;插图珍藏精装本)
Author(s) : 陈忠实著
Publisher : 人民文学出版社
Languages : zho
Published : 2012-09-30T16:00:00+00:00
Identifiers : mobi-asin:B00OUS31CM
====================================
/users/bookfere/desktop/test/出梁庄记.azw3
------------------------------------
Title : 出梁庄记
Author(s) : 梁鸿
Publisher : 花城出版社
Languages : zho
Published : 2013-02-28T16:00:00+00:00
Identifiers : mobi-asin:B00K68TX22
====================================
/users/bookfere/desktop/test/童年的消逝.azw3
------------------------------------
Title : 童年的消逝
Author(s) : 尼尔·波兹曼
Publisher : 中信出版社
Languages : zho
Published : 2014-05-11T16:00:00+00:00
Identifiers : isbn:9787508648279, mobi-asin:B06XGWRP6N
====================================
/users/bookfere/desktop/test/明智行动的艺术.azw3
------------------------------------
Title : 明智行动的艺术(《清醒思考的艺术》姊妹篇 精编图文版)
Author(s) : Rolf Dobelli, PhD,〔德〕罗尔夫•多贝里
Languages : zho
Published : 2013-08-25T16:00:00+00:00
Identifiers : isbn:9787508641287, mobi-asin:B00GFFKJIC
====================================
书伴 - 为静心阅读而生(bookfere.com)
根据这个列表,就可以通览每个电子书的元数据信息,作为你挑拣电子书的依据。
以上,就是利用了 Calibre 的 ebook-meta
这一个命令行工具,配以批处理文件达成批量获取电子书元数据列表的目的。当然玩儿法不止于此,比如我们还可以把一大批电子书自动归类,把原版 Kindle 电子书筛选出来,但是限于篇幅这里就不展开了。除了 ebook-meta
这个命令行工具外,Calibre 还有其他很多实用的命令行工具,能够让我们更方便的管理和处理电子书,今后书伴还会进行介绍。
© 「书伴」原创文章,转载请注明出处及原文链接:https://bookfere.com/post/550.html
“Calibre教程”相关阅读
- 用 GitHub Actions 让 Calibre 定时推送新闻到 Kindle
- 如何把 KFX 格式转换成 MOBI 等其它电子书格式
- Calibre 使用教程之把合集电子书拆分成单本
- Calibre 常用命令行工具详解之 ebook-convert
- 解决依赖内嵌字体才能正常显示的电子书乱码问题
- Calibre 使用教程之电子书繁体字转简体字
- Calibre 使用教程之通过 WiFi 向 Kindle 传输电子书
- Calibre 转换 TXT 文件出现 Errno 21 错误的解决方法
- 把 TXT 文档转换成带目录的 MOBI 格式电子书
- 如何用 Calibre 和 Count Pages 插件统计电子书的字数和页数
- 解决 Calibre 推送“500 Error: bad syntax”错误
- Calibre使用教程之为电子书添加或修改封面
- Calibre 使用教程之优化电子书的排版
- Calibre 常用命令行工具详解之 calibre-smtp
- 如何解决 Kindle 电子书无法更换字体的问题
请教一下,calibre可以编辑chm吗?
现在有的chm,内置的搜索功能无效,无法搜索,不知如何才能重建chm的索引?
谢谢!
Calibre 无法编辑 CHM,你可能需要专门的 CHM 编辑器来修改里面的内容。
你好,请问为什么运行完ebook-meta之后页面就闪退了。这样子看不到元数据呀
ebook-meta 是命令行工具,需要在命令提示符中使用这个命令。你是按照文章说明操作的吗?
书伴,您好!
一、CMD运行该批处理脚本,部分书会报错,比如下面的:“C:\\”,
– 已处理 F:\百度云下载2\自制造21-40\ZZ39-40\Xiao Wang Zi (Hu Yu Su Yi ) – An Dong Ni _De _Sheng Ai Ke Xu .mobi
C:\Program Files\Calibre2\app\pylib.zip\dateutil\parser.py:601: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
– 已处理 F:\百度云下载2\自制造21-40\ZZ39-40\Y之构造.mobi
– 已处理 F:\百度云下载2\自制造21-40\ZZ39-40\《匆匆那年》.mobi
但是可以正确输出元数据。
二、脚本中,格式加上AZW3才会输出,AZW3格式的元数据,只加AZW不会读取并输出AZW3的元数据。
站长,请问如果使用了calibre来破解电子书的话,meta信息里面会不会被加上calibre的标签呢?我下载到了有加calibre标签的书,但里边的mobi-asin又是可是正确,放在kindle上可以打开商店页面的。
另外,
for /R %DIR% %%i in (*.azw *.mobi *.epub) do (
这一行少了 *.azw3
如果你指的是 DeDRM 插件,只要不转换是不会添加 Calibre 标签的。
在 Windows 的批处理中 .azw 可以匹配 .azw3、.azw4 等后缀名。
为何运行脚本,提示未安装calibre
用的是什么系统呢?
我用的是win10,单独在命令符下可以用命令,但批处理却不行
您好,我想请教一下,如何将calibre当中的书籍数据导入到豆瓣书单(豆瓣想读tab)当中呢??有没有便捷的工具或者方法,一个一个地导入,实在是太麻烦了。我现在藏书2000+,想做一个整理。
发现有些电子书元数据本身就有问题,无法通过修改文件名解决。但是calibre导入却没有这个问题,不知道calibre是怎么解决的。
补充,所述的问题是指用ebook-meta提取出来是乱码的问题。
我这里也出现了就保存一本书的问题,暂未查明原因。
感觉网站的代码有点复杂,我参考网上写了以下代码,批处理扔到书籍所在目录运行即可,适用便携版:
Hello,批量获取电子书元数据的bat运行之后闪退,电子书目录的TXT只显示一本书的meta信息。
求解。
OS是Win10
建议打开命令提示符,然后把 bat 文件拖到命令提示符上运行,这样可以看到具体错误,以便排查。
显示:
The system cannot write to the specified device.
cmd命令正常使用,但是脚本却完全无法读取任何的目录,即使在纯英文目录的纯英文书名也不行。
结果:
目录 E:\1 下的电子书元数据列表
====================================
书伴 – 为静心阅读而生(bookfere.com)
问题解决了,好像跟目录有关系。
有些书读取时会提示如下,是什么原因呢?
C:\Program Files\Calibre2\app\pylib.zip\dateutil\parser.py:601: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal
请问如何抓取元数据和封面?试过calibre的插件,豆瓣可以抓,但中亚的抓不到,即便有ASIN和ISBN码也无法抓取。有一些AZW是合集,只有中亚可适配。
wangxin 您好。这个问题是因为中亚网站不允许第三方软件抓取其网站上的数据所导致的。你应该会看到在试图抓取元数据或封面时会返回 503 错误。
calibre反编译,竟然这么厉害!站长也厉害,没有基础脚本完全看不懂
不用看懂,写好脚本就是让小伙伴们直接使用的 :)
目录 azw3 下的电子书元数据列表
====================================
电子书 E:\azw3\鲁滨孙历险记 (译文经典) – 丹尼尔?笛福(Daniel Defoe).azw3 的元数据:
————————————
Title : 椴佹花瀛欏巻闄╄ (璇戞枃缁忓吀)
Author(s) : 涓瑰凹灏斺€㈢瑳绂?Daniel Defoe)
Publisher : 涓婃捣璇戞枃鍑虹増绀?
Languages : zho
Published : 2010-07-31T16:00:00+00:00
Rights : 浜氶┈閫?
Identifiers : mobi-asin:B0099MTHZ4
====================================
书伴 – 为静心阅读而生(bookfere.com)
还是那个鲁滨孙……
这个问题测试时也发现了,这应该是标题里含有特殊字符“•”导致的编码问题,因为不含此特殊字符元数据的电子书没问题。还没找到完美的方案,此问题待解决。
测试发现,半角该符号会出现乱码,而全角不会,建议使用脚本前,可以进行批量重命名。
如何更改书籍的元数据?特别是从 Kindle 商城购买的书籍的元数据。
Ohhahei 您好。可以输入命令
ebook-meta -h
查看修改各项元数据的相关用法。比如,修改电子书标题,可以使用命令ebook-meta -t 新书名 电子书.azw3
实现。书的封面也能改么?我主要是觉得有些 Kindle 商城里的书封面是立体样式的,不知道为什么要这样,但跟其他平面封面的书比起来,非常不统一。
可以。如果你运行
ebook-meta -h
查看了命令帮助,应该可以看到参数--cover=COVER
,这个就是修改封面的。示例用法:ebook-meta --cover=/绝对路径/封面图片.jpg 电子书.azw3
。推荐 AZW3Tool,更加方便友好。https://www.hi-pda.com/forum/viewthread.php?tid=1711825
我一般认为负分的一定不是官方原版。
这个压缩包下载后显示被木马感染,之后被杀软干掉了,,,
我绝非怀疑作者以及上传者的善意,但是用不上好苦恼。
站长帮我删掉这个评论吧,我把杀软禁用了,万事ok……
那啥……不支持中文文件名
刚 您好。具体什么表现,能详细描述一下吗?测试时用的都是中文名,是没问题的。
书伴 – 为静心阅读而生(bookfere.com)
请输入电子书文件所在的绝对路径:azw3
开始读取电子书元数据……
Traceback (most recent call last):
File “site.py”, line 101, in main
File “site.py”, line 78, in run_entry_point
File “site-packages\calibre\ebooks\metadata\cli.py”, line 180, in main
IOError: [Errno 2] No such file or directory: u’E:\\azw3\\\u9c81\u6ee8\u5b59\u5386\u9669\u8bb0′
– 已处理 E:\azw3\鲁滨孙历险记 (译文经典) – 丹尼尔•笛福(Daniel Defoe).azw3
Traceback (most recent call last):
File “site.py”, line 101, in main
File “site.py”, line 78, in run_entry_point
File “site-packages\calibre\ebooks\metadata\cli.py”, line 180, in main
IOError: [Errno 2] No such file or directory: u’E:\\azw3\\\u9c81\u6ee8\u5b59\u5386\u9669\u8bb0′
– 已处理 E:\azw3\鲁滨孙历险记 (译文经典) – 丹尼尔•笛福(Daniel Defoe).azw3
√ 全部处理完毕!
请按任意键结束此次处理并打开结果。
win10x64 calibre 64 3.40 估计是python运行环境没有安装
Calibre 应该不依赖 Python 环境。看错误显示同一文件处理了两次,目录里只有一个 AZW3 文件吗?
测试的时候一口气放了50本书,结果失败,这是随便找了一本出来的结果。两次的原因我不大清楚,过程就是这样的。
是否方便把那本出错的电子书发一份过来?邮箱在页面底部的“联系”处,谢谢。
已发,请查收。虽然感觉不是书的问题;)
找不到文件的原因是文件名含有空格。重复的原因是因为命令提示符把 azw3 当成 azw 又处理了一遍。批处理代码对这两个问题做了修复。
这是路径中存在 •,python 在 windows 通过 cmd 传入路径包含这类字符就错误。
刚才在 Windows 10 下测了一下,故意给文件名加上这个黑点,也是没问题的。很奇怪。以前用 Python 处理带有类似特殊字符的文件名时倒是遇到过这种错误。
我也是win10,但是跟楼主同样的错误
· 再一次没有通过测试,没有这个·的测试正常,
我用 ahk 传入这类路径就不会错误。