使用 Python 和 libgpod (gtkpod) 从 Linux 将音乐加载到 iPod

Posted

技术标签:

【中文标题】使用 Python 和 libgpod (gtkpod) 从 Linux 将音乐加载到 iPod【英文标题】:Using Python and libgpod (gtkpod) to load music to an iPod from Linux 【发布时间】:2012-08-02 12:56:58 【问题描述】:

以下代码,我认为是加载音乐的最小程序

db = Database('/media/andrew@acooke.org ipod')
itdb_device_set_sysinfo(db._itdb.device, "ModelNumStr", "C297")
db.import_file('/home/andrew/some-track.mp3')
db.copy_delayed_files()
db.close()

将以下内容打印到标准错误:

** (utrunner.py:11333): WARNING **: Itdb_Track ID '0' not found.
** (utrunner.py:11333): CRITICAL **: itdb_get_mountpoint: assertion `itdb' failed
** (utrunner.py:11333): CRITICAL **: prepare_itdb_for_write: assertion `link' failed
** (utrunner.py:11333): CRITICAL **: mk_mhla: assertion `fexp->albums' failed
** (utrunner.py:11333): CRITICAL **: mk_mhli: assertion `fexp->artists' failed
** (utrunner.py:11333): CRITICAL **: itdb_splr_validate: assertion `at != ITDB_SPLAT_UNKNOWN' failed

并且不加载任何音乐。

当我运行 gtkpod(它使用 libgpod - 它们都来自同一个项目)时,它确实工作(并且只打印初始警告和 ITDB_SPLAT_UNKNOWN 消息)。路径都正确,我可以打开目录、写入文件等。数据库对象似乎正确(例如显示 2 个播放列表)并且存在 SysInfoExtended 文件。

我做错了什么?有没有人让这个(libgpod Python 包装器)工作?

一个可能的线索是 gtkpod 提示我选择 iPod 类型(经典 160GB)。我没有在上面设置该信息。我该如何设置? update - 我确实尝试了上面显示的调用并在下面的答案中提到,但它似乎没有效果(我最初没有包含它,因为我认为它一定是错误的,但也许它是需要的,问题在其他地方)。还有,gtkpod 叫它“xB150”?!

我已经询问了 libgpod/gtkpod 邮件列表,但没有收到任何回复。这适用于最新的稳定版本和 git trunk(使用 CFLAGS=-w 编译)。

更新我删除了所有音乐,然后用 C297 和 xB150 运行上面的代码。在这两种情况下,Extras.itdb 文件(看起来像一个 sqlite db)都没有改变大小,并且断开连接的 iPod 没有歌曲。相关文件在以下链接:

SysInfo(空文件) SysInfoExtended Extras.itdb(sqlite 数据库?)

General notes on this issue, which will be updated in future, here.

【问题讨论】:

你能附上你的 .itdb 文件,如果它不是巨大的吗? 这只是在黑暗中刺伤,但它正在向我扑来。您可以将数据库的路径(代码中的/media/andrew@acooke.org ipod)更改为没有空格的内容并尝试一下吗? 谢谢,但我只是尝试过,但没有任何区别(正如预期的那样;这是 ipod 名称,它会自动挂载。如果它很重要,那将是一个非常常见的错误)。 @InternetSeriousBusiness - 我不知道您是否可以提供进一步的帮助,但我发布了文件并且赏金将在不到 24 小时内到期...... 【参考方案1】:

一个可能的线索是 gtkpod 提示我选择 iPod 类型(经典 160GB)。我没有在上面设置该信息。我该如何设置?

itdb_device_set_sysinfo (db._itdb.device, "ModelNumStr", "FOOBAR");

根据model list,将FOOBAR替换为您的模型。

编辑:

我的建议是使用调试符号编译gtkpod,并使用gdb 跟踪其运行。 libgtkpod/file.c:add_track_by_filename() 中的断点似乎是一个不错的起点。

libgpod 的用法与你的比较一下,看看是否还有其他调用。 显然,Python 绑定更多地抽象了事物,但弄清楚它们最终调用什么应该不成问题。

(例如,import_file 调用 itdb_cp_track_to_ipoditdb_playlist_add_track

抱歉,在没有访问设备的情况下,我只能提供这些帮助。

【讨论】:

我以为我已经尝试过了,但我的细节可能有误(抱歉,应该在帖子中包含更多细节)。我今晚会检查并更新。希望你是对的!谢谢! 不,似乎没有帮助(很抱歉没有提到我尝试过,因为我可能浪费了你的时间)。我已将代码添加到问题中。 ps,顺便说一句,它不是 db 的属性 - 我必须简单地调用该函数 itdb_device_set_sysinfo 好吧,你也可以点。谢谢您的帮助。我只需要将这该死的东西重新格式化为 FAT,因为 linux HFS 驱动程序崩溃了。当我有更多精力时,我可能会尝试追踪(我还会检查它是否仍然不适用于 FAT,但我很确定 HFS 是一个不同的问题)。

以上是关于使用 Python 和 libgpod (gtkpod) 从 Linux 将音乐加载到 iPod的主要内容,如果未能解决你的问题,请参考以下文章

将音乐复制到 iPod 的 API [重复]

python学习-python变量的命名和使用

1.1 Python安装和使用

python2和python3同时存在如何安装和使用pip

python的安装和简单使用

python的安装和简单使用