diff --git a/docs/program-update.md b/docs/program-update.md
index a30075403..a76784da5 100644
--- a/docs/program-update.md
+++ b/docs/program-update.md
@@ -4,6 +4,16 @@ pageClass: routes
# 程序更新
+## AMD
+
+### 显卡驱动更新
+
+
+
+可从设备管理器查看 id 和 rid。如 `PCI\VEN_1002&DEV_731F&SUBSYS_05771043&REV_C1`,则 id 为 `731F`,rid 为 `C1`。
+
+
+
## Apkpure
### Versions
diff --git a/lib/router.js b/lib/router.js
index e20455bc0..3af5311e2 100644
--- a/lib/router.js
+++ b/lib/router.js
@@ -2886,4 +2886,7 @@ router.get('/missevan/drama/:id', require('./routes/missevan/drama'));
// Go语言爱好者周刊
router.get('/go-weekly', require('./routes/go-weekly'));
+// AMD
+router.get('/amd/graphicsdrivers/:id/:rid?', require('./routes/amd/graphicsdrivers'));
+
module.exports = router;
diff --git a/lib/routes/amd/graphicsdrivers.js b/lib/routes/amd/graphicsdrivers.js
new file mode 100644
index 000000000..7fea6591c
--- /dev/null
+++ b/lib/routes/amd/graphicsdrivers.js
@@ -0,0 +1,114 @@
+const got = require('@/utils/got');
+const config = require('@/config').value;
+const cheerio = require('cheerio');
+const url = 'https://download.amd.com/drivers/xml/driver_09_us.xml';
+
+// 06/10/2020 -> Wed Jun 10 2020 00:00:00
+function convertDate(dateStr) {
+ const [month, day, year] = dateStr.split('/').map((x) => parseInt(x, 10));
+ const date = new Date();
+ date.setFullYear(year, month - 1, day);
+ date.setHours(0, 0, 0, 0);
+ return date;
+}
+
+function versionToRss(info, isBeta) {
+ const date = convertDate(info.releaseDate);
+ return {
+ title: `Radeon Software ${info.edition} Edition ${info.version}` + (isBeta ? ' Beta' : ''),
+ description: `内部版本: ${info.internal}
发布时间: ${date.getFullYear()}-${date.getMonth() + 1}-${date.getDay()}`,
+ pubDate: date.toUTCString(),
+ link: info.releaseNotes,
+ };
+}
+
+module.exports = async (ctx) => {
+ let data = await ctx.cache.get(url, false);
+ if (!data) {
+ const res = await got.get(url);
+ data = res.data;
+ ctx.cache.set(url, data, config.cache.contentExpire, false);
+ }
+
+ const $ = cheerio.load(data, { xmlMode: true });
+ const productfamily = $('driverSelector > platform > productfamily')[0];
+
+ let product;
+ for (const node of productfamily.childNodes) {
+ if (node.tagName !== 'product') {
+ continue;
+ }
+
+ const ids = node.attribs.ids.split(', ');
+ if (!ids.includes(ctx.params.id)) {
+ continue;
+ }
+
+ if (ctx.params.rid && node.attribs.rid !== ctx.params.rid) {
+ continue;
+ }
+
+ product = node;
+ break;
+ }
+
+ if (product) {
+ let latestWHQL = '';
+ let latestBeta = '';
+ let whql, beta;
+ for (const node of product.childNodes) {
+ if (node.tagName !== 'version') {
+ continue;
+ }
+
+ if (node.attribs.number > latestWHQL) {
+ latestWHQL = node.attribs.number;
+ whql = {
+ version: node.attribs.number,
+ internal: node.attribs.internal,
+ edition: node.attribs.WHQLEdition,
+ releaseDate: node.attribs.whqlreleasedate,
+ releaseNotes: node.attribs.rnoteswin,
+ };
+ }
+
+ if (node.attribs.betaname > latestBeta) {
+ latestBeta = node.attribs.betaname;
+ beta = {
+ version: node.attribs.betaname,
+ internal: node.attribs.beta,
+ edition: node.attribs.BETAEdition,
+ releaseDate: node.attribs.betareleasedate,
+ releaseNotes: node.attribs.betarnoteswin,
+ };
+ }
+ }
+
+ const item = [];
+ if (whql || beta) {
+ if (whql) {
+ try {
+ item.push(versionToRss(whql, false));
+ } catch (e) {
+ // ignore
+ }
+ }
+ if (beta) {
+ try {
+ item.push(versionToRss(beta, true));
+ } catch (e) {
+ // ignore
+ }
+ }
+ }
+
+ ctx.state.data = {
+ title: `${product.attribs.label} (ids:${product.attribs.ids} rid:${product.attribs.rid})`,
+ link: 'https://www.amd.com/zh-hans/support',
+ allowEmpty: true,
+ item: item,
+ };
+ } else {
+ ctx.throw(404, 'Product Not Found');
+ }
+};