• Home
  • Blog
  • Stack

© 2026 YIKZERO

Say Goodbye to Selection Stress: Use AI to Create Personalized Watchlists

Develop· November 23, 2024
This article was translated from Chinese byGemini 3 Pro. If there are any discrepancies, please refer to the Chinese version.

Foreword

My partner (Xiao Chen) and I really enjoy watching movies and TV series, but we often struggle to decide what to watch—we might have a bit of choice paralysis. Recently, I found something interesting in the MisakaF Emby group: this group tracks the most popular film and television works on their platform daily and weekly. This sparked an idea: I could find several similar rankings and have an AI aggregate and organize them. This way, every week I could generate a trending list that combines existing rankings with my personal preferences.

个人热榜效果
个人热榜效果

Basic Idea

The core workflow of the project can be summarized into three steps:

  1. Collect trending data
  2. Perform data analysis and processing using AI
  3. Push the processed results to the specified channels

Solution Iteration

Initially, I designed an integrated solution based on multiple specialized services:

  1. First, obtain the information feed from the Telegram channel via RSSHub.

  2. Next, use automation tools like IFTTT, Zapier, or n8n to synchronize and organize the RSS data for storage in a document database like Notion or Feishu.

  3. Then, Dify would regularly filter data from the past week based on defined requirements.

  4. Dify would send the filtered data along with predefined prompts to the AI for processing.

  5. Finally, the processed results returned by the AI would be sent to the specified group via a Telegram Bot.

Although this solution was functionally complete and achieved full workflow automation, it suffered from obvious over-engineering; it was too complicated, and ultimately, I abandoned it halfway through the implementation.

Final Solution

Considering the project scale and actual needs, I ultimately adopted a lighter and more direct tech stack:

  • Core implementation: Node.js
  • Automation scheduling: GitHub Actions

Data Input/Organization

During the data source screening process, I primarily considered data authenticity and sample representativeness.

Based on the above criteria, three data sources were finally selected:

  • Two highly active Telegram channels, both providing weekly viewing data:
    • MisakaF-Emby: Over 22K subscribers, average reads per post 2,000+
    • Odyssey+: Over 23K subscribers, average reads per post 3,000+
  • A third-party film and TV platform:
    • Ai Yi Fan (爱壹帆): Its ranking data is updated promptly and has high market representativeness

Ai Yi Fan data is relatively easy to obtain; you just need to inspect the network requests and call their API.

Data related to Telegram channels requires using RSSHub as an intermediary. It also supports the searchQuery parameter for filtering channel content; specific parameters can be viewed in the documentation.

I encountered an issue during actual calls: the official RSSHub service is very slow when returning Telegram channel data and frequently times out.

Here's a clever trick: try searching Google for Welcome to RSSHub. Google indexes many RSSHub services set up by other users, allowing you to discreetly pick a faster one to replace the original service.

Once we have the raw data, we can filter out the information for the current week based on the publication time and process it.

The final organized data will look something like this:

MisakaF 热度数据:
#每周榜单
在过去的一周内,共有2122部电影和2424部电视剧被各位宠幸,其中表现较为突出的有:
Movies:
- 毒液:最后一舞-870
- 浴火之路-585
- 某种物质-333
- 逆鳞-270
- 死侍与金刚狼-245
TV Shows:
- 小巷人家-13210
- 永夜星河-5893
- 英雄联盟:双城之战-3667
- 宿敌-3535

Everyone can find and consolidate data sources they approve of.

AI Application

I am using the AI SDK provided by Vercel, which makes calling large models from different platforms very convenient, and it supports Node.js.

For the large model, I am using Anthropic's latest Claude Sonnet 3.5. The $5 credit granted upon registration still hasn't been used up.

Regarding prompt engineering, here are a few tips that might help you write a better prompt:

  • Prompts should be written in English, but you can instruct the final result to be output in your desired language
  • You need to explicitly list specific rules: what can be done and what cannot be done
  • Give the large model enough space to think, encouraging it to output the process first before presenting the final result. This has an academic name called Chain of thought (CoT prompting)
  • Provide the large model with concrete examples of the output results
  • Use XML tags to structure your prompt

For more specific details, you can also refer to the Prompt engineering documentation written by Claude.

Below is the prompt I used to generate the viewing list, where the variables rssRankings and hotSearchRanking are the data compiled earlier, which needs to be combined and provided to Claude:

You are a professional film and TV analyst specialized in entertainment rankings. Your task is to analyze weekly entertainment data and generate a ranking list of popular TV series and movies.
First, review the input data:
<rss_rankings>
${rssRankings}
</rss_rankings>
<hot_search_ranking>
${hotSearchRanking}
</hot_search_ranking>
Instructions:
1. Data Analysis:
- Exclude children's content from consideration.
- Works must appear in at least 2 data sources to be ranked.
- Analyze ranking data using the Scoring Criteria.
2. Scoring Criteria:
- Primary source (MisakaF热度数据) ranking positions: 1-2 = 40 points, 3-4 = 30 points, 5 = 20 points
- Public service (Odyssey+公益服点播数据) ranking positions: 1-2 = 40 points, 3-4 = 35 points, 5-6 = 30 points, 7-8 = 25 points
- Search ranking (搜索热度) positions: Top 5 = 20 points, 6-10 = 10 points
- Sum up weighted scores to determine the final ranking
3. Ranking Generation:
- Generate separate rankings for TV series and movies
- List exactly 5 works per category
4. Output Formatting:
- Use the following template, writing in Simplified Chinese:
**热门剧集**
1. [TV Series 1]
2. [TV Series 2]
3. [TV Series 3]
4. [TV Series 4]
5. [TV Series 5]
**热门电影**
1. [Movie 1]
2. [Movie 2]
3. [Movie 3]
4. [Movie 4]
5. [Movie 5]
- Use numerical prefixes (1.-5.) for each item
- Only bold category headers using markdown **header**
- Remove all markdown formatting from list items
Before providing the final output, wrap your scoring and ranking process inside <scoring_process> tags. In this section:
- List each TV series and movie with their respective scores from each source.
- Show your calculations for the weighted scores.
- Explain your reasoning for combining multiple seasons of TV series, if applicable.
- Demonstrate how you arrived at the final rankings.
This will help ensure accuracy and alignment with the given criteria. It's OK for this section to be quite long.
After your scoring process, present the final ranking list in the specified format, the final ranking must inside <final_ranking> tags.
Remember to carefully consider all aspects of the data to ensure the list is calculated in line with the specified requirements.

In the prompt, you can decide the weight of each ranking list according to your personal preferences.

You can also try asking the AI to filter out film and television works you don't like.

Claude 3.5 Sonnet Output Result
<scoring_process>
TV Series Scoring:
1. 小巷人家
- MisakaF: #1 (40 points)
- Odyssey+: #2 (40 points)
- Hot Search: #4 (20 points)
Total: 100 points
2. 永夜星河
- MisakaF: #2 (40 points)
- Odyssey+: #4 (35 points)
- Hot Search: #7 (10 points)
Total: 85 points
3. 英雄联盟:双城之战
- MisakaF: #3 (30 points)
- Odyssey+: #3 (35 points)
Total: 65 points
4. 白夜追凶/白夜破晓 (combined as same series)
- Odyssey+: #1 (40 points)
- Hot Search: #2 (20 points)
Total: 60 points
5. 宿敌
- MisakaF: #4 (30 points)
- Odyssey+: #6 (30 points)
Total: 60 points
Movies Scoring:
1. 夺命微笑
- Odyssey+: #1 (40 points)
Insufficient appearances - excluded
2. 夫妻吵架狗都不理,而查理笑了
- Odyssey+: #2 (40 points)
Insufficient appearances - excluded
3. 毒液:最后一舞
- MisakaF: #1 (40 points)
Insufficient appearances - excluded
4. 浴火之路
- MisakaF: #2 (40 points)
Insufficient appearances - excluded
5. 某种物质
- MisakaF: #3 (30 points)
Insufficient appearances - excluded
Note: For movies, none appeared in multiple data sources, so we'll need to rely on single-source appearances despite the criteria. This is a limitation of the available data.
</scoring_process>
<final_ranking>
**热门剧集**
1. 小巷人家
2. 永夜星河
3. 英雄联盟:双城之战
4. 白夜追凶
5. 宿敌
**热门电影**
1. 毒液:最后一舞
2. 浴火之路
3. 某种物质
4. 逆鳞
5. 死侍与金刚狼
</final_ranking>

We can see that the process, from scoring to final content output, is very stable. Claude's ability to follow instructions is quite strong!

We only need to extract the content within <final_ranking> to get the main body of the viewing list. The output is very standard and stable.

If you find adjusting prompts troublesome, you can also choose the Prompt Generator produced by Anthropic, which can generate quite professional prompts.

Result Push

There are various push channels: Feishu bots, Telegram bots, Bark notifications, and so on. Choose whatever you prefer. Implementation is not complicated.

Once the output data is available, we can add cover images, bolding, tags, etc., to the viewing list according to the specific syntax format of the platform. I also added a quick-launch button for the movie/TV software, allowing for one-click startup :)

Scheduled Execution

Since everything is developed using Node.js, the lightest and most convenient option is GitHub Actions. You just need to set up a Cron schedule based on when the trending list updates.

Since the MisakaF weekly trending list updates at 7 PM on Friday, I set the scheduled build for 7:30 PM on Friday, which automatically pushes the message upon completion. Time to start a wonderful weekend.

Github Action 运行记录
Github Action 运行记录

Final Thoughts

This is the simplest version of the implementation. However, high popularity doesn't necessarily mean it's good, nor does it mean the work suits your preferences. If I could integrate Douban scores, Rotten Tomatoes scores, or other dimensions, it should become much more personalized.

Regardless, Happy viewing, everyone! Cheers🍻

Lokalise MCP Automatic Translation Solution
Methods for Building a Blog, From a Product Designer's Perspective