用 LLM 整理我的电影收藏

我小时候家里第一台电视是个小小的黑白电视机,偶尔能看到《动物王国》。后来有了 Betamax 和 VHS 录像带,人们可以在家看节目了!再后来是 DVD。

接着一切变成了数字文件。存储成本暴跌,我开始保存自己喜欢的电影和电视剧的数字副本。为什么?因为我喜欢重看,也喜欢收藏,而且这样做似乎没什么坏处。

我心想:“太好了!生活可以变清爽了,现在只需要整理一堆文件!”于是我扔掉 DVD,拥抱数字生活。


文件沼泽

那是大约 25 年前的事了。如今我有一千多部电影、将近 200 部电视剧,还有一季又一季、数不清的剧集。

我一直尽量保持整洁,重命名文件和文件夹,维持一点秩序。做得其实还不错,但随着数量不断增加,寻找和浏览内容越来越困难,最后几乎不可能。目录实在太多了。


解决方案

答案显而易见。

  • 创建浏览和搜索界面。
  • 但首先得清理数据,让程序能够找到内容。

顺便建立媒体目录似乎也很自然。

The Movie Database 提供免费的公开电影和电视剧资料库,包括海报、剧集介绍、演员阵容等等。我可以利用这些资料为自己的影片建立漂亮的目录条目。


清理数据

我绝对不可能手动完成这件事。

要编写软件应对所有特殊情况,也很令人头疼。各种奇怪的文件名,要把它们准确匹配到 TMDB 条目,难度实在太高。坦白说,这超出了我当时能轻松解决的范围。

我真正需要的是一个实习生、一个跑腿助手,或者一个机器人,逐个目录帮我检查。

我刚好有这样的工具!我最近下载了小型 LLM Qwen 3.5 4B。它有点像 ChatGPT,但运行在我自己的电脑上,而且足够聪明,可以胜任这项工作。


让 LLM 当实习生

我刚刚完成 Ax3l,一个自主 AI 代理,通过运行数千次模拟来调整一个简单神经网络。它调一个参数,运行模拟,分析结果,再调参数,再运行模拟……

相比之下,这个项目就简单多了。我打算让 LLM:

  • 扫描目录。
  • 将内容匹配到 TMDB 目录条目。
  • 重命名文件并移动到整洁的新位置。
  • 在数据库里创建文件对应的目录条目。

于是我给项目起名 R3el,开始设计。

R3el 架构

好吧,也没有那么简单,但以 Ax3l 的代码为起点,绝对是我能做出来的项目。


控制界面

我知道最终会构建一个可以浏览和搜索收藏的 Web 界面,所以干脆顺势在里面加上控制功能。

控制界面


事件日志

与 LLM 合作的经历让我明白了细粒度报告的重要性。我再次借鉴 Ax3l 代码库,创建详细的事件日志,以便监控、调整和排查整个处理流程。

事件日志

我几乎花了一整天来梳理并命名所有感兴趣的消息,但这是一笔非常值得的投入,极大帮助了我集中开发精力。


成功了!!

经过一些调试,我增加了使用场景、改善模式匹配,还手动检查了一小部分文件系统。终于成功了!!!接下来的几天,我不断把一批批目录加入队列,让程序自己处理。

运行中的截图

  • R3el 扫描文件。
  • 识别电视剧和影片名称。
  • 重命名文件,清理文件名。
  • 删除已经空掉的旧目录。
  • 下载电影海报、演员及制作人员资料。
  • 最后在数据库里创建条目,将所有信息关联起来。

浏览和搜索

最后一步是做一个好看的浏览和搜索界面:

R3el 媒体目录

这部分确实简单。类似的用户界面范例实在太多,实现一个基础版本并不困难。

R3el 电视剧页面


完成

项目完成了。R3el 还在扫描,但我估计今天结束前就能做完。起初我还在想,为这件事写一个应用是不是有点大材小用。不过说实话,面对如此庞大的数据清理任务,我还是想不出更好的解决办法。

而且还挺酷的,对吧! :)

R3el 标志


链接

2026

Git Automation

Some of you may have read my Git Battles post, where I talked about how I developed and a documented a Git workflow.

My blog in Simplified Chinese

I recently built MyCount to track website visitors to my projects. I found that that over 40% of my visitors were from China, and that 35% of those used a Ch...

MyCount: Website Analytics & Marketing

I have a future project in mind which will require a Dynamic DNS service. I created BMDynIP for that purpose. After building the service, I wanted a simple a...

Animating Ax3l Playing Snake

I’ve been tinkering with various incarnations of Patrick Loeber’s Train an AI to Play Snake tutorial for a while now. It’s my relaxing goto project that’s fu...

Dynamic DNS Service

This project started as a cron job and a flatfile and -honestly- that would work perfectly well for a small home setup. Say, two or three machines. I’m curre...

Local GeoIP Database

The Bear & Moose GeoIP Project provides an easy-to-use GeoIP service for your applications and for interactive lookups.

An LLM to organize my Movies

Our first TV was a small black-and-white thing where, on rare occasions, we’d watch Animal Kingdom. Then Beta and VHS came along, and you could watch them at...

From Prototype to Product (4/4)

Fr3d worked: It could talk to the Snake Lab, propose changes to the RNN configuration, run experiments, look at the results, and try again. It proved the ide...

Prompt Engineering 101 (3/4)

The Snake Lab had become a proper server, with a ZeroMQ API, configuration validation, a database, and a way to run experiments independently of the client. ...

The Evolution of Snake Lab (2/4)

In my last post, I setup a locally hosted LLM running on an old HP Z440 and wrote a crude little conversation loop. I generated random numbers, fed them to t...

Local LLM Writes Haikus (1/4)

This is part one of a four part blog series. In this post, I download, install and setup some software to prompt a local LLM to write haikus…

From Seed to Signal: AI FX

In the first post, AI FX was still mostly a seed: a repo, a PyPI package, and an idea about using automated FOREX tooling as a learning lab. Since then, the ...

Simulating the Power Grid

A potential client pointed me to Empowering the Energy Transition Through Fast and Flexible Network Simulation. The article describes an Open Source project,...

Delphi in a Day

I have a prospective client who runs a small group of technology businesses, at least one of which integrates with clients using the Delphi programming lan...

A Small Experiment: AI FX

I’ve spent some time around trading systemsL At Merrill Lynch, I supported the Order Audit Trail System (OATS), a compliance system required by NASDAQ. Its p...

Back to top ↑

2025

My Art on Etsy

I setup an Etsy Storefront to sell high quality, museum grade prints of some of my artwork.

Python systemctl Wrapper

I’ve been working on Db4E, my Monero deployment, operations and analytics platform. It uses Linux systemd to spin up manage Monero, P2Pool and XMRig instance...

AI Snake Lab

AI Snake Lab is an interactive reinforcement learning sandbox for experimenting with AI agents in a classic Snake Game environment — featuring a live Textual...

The Power of Pictures

You know that saying, “A picture is worth a thousand words.”? In programming, I’d argue it can be worth a thousand lines of code…

Caring About Constants

This post is about using constants in your code. Why it matters, what the benefits are and how you can do it well. I’m sad to say, I learned this the hard wa...

Why I Built Db4E

When I first started experimenting with Monero mining and self-hosted infrastructure, I did what everyone else does: I downloaded the Monero software, the P2...

Releasing with Git

Let me be honest: Git has punched me in the face more times than I can count. Every time I think I’ve got a smooth release flow down, Git yells, “Not so fast...

Documentation Matters

I was burned by opaque documentation: I’ve been building a modern terminal UI in Python using the excellent Textual framework. It’s sharp, fast, and honestly...

Textual Replaces ApexCharts

The original reporting system was a set of static dashboards built using GitHub Pages, JavaScript, and ApexCharts. It pulled data from my mining setup — via ...

Pivot to Textual

I’ve been deep in the trenches with my Db4E project — pulling together Monero mining infrastructure, MongoDB integration, and a bunch of orchestration magic....

Released Db4E SystemD

I recently published a small Python module to PyPI and GitHub: db4e-systemd, a lightweight wrapper around systemctl that lets you control services (start, st...

NIKU Farms

I received my order from NIKU Farms, YAY! It’s a meat delivery that my sister, Corinna Ghaznavi, gifted me this Christmas. Every two months I receive this am...

The Main Website

As part of my goal to be more visible in the world, I setup this domain i.e. https://osoyalce.com. I use it to publish information about the projects I’m wor...

Reviving the Blog

It’s been a while since I started and then abandoned this blog. My last post was in June of 2024!!

Changing the Blog Site’s Layout

I decided that I didn’t like the way that the main blog page looks. I am using GitHub to host the website and am using a fork of the jekyll/minima theme. My ...

Back to top ↑

2024

Aquaponics Update #1

It’s in the construction phase. I need to complete the water circulation process. I bought a fiber glass kit for this (and also to fix my kitchen sink!).

What I’m working on

The XMR Mining Farm complete with this eye-popping chart The Bear and Moose Knowledge Base My resume MyZODB - A Place to Store Everything

Back to top ↑