diff --git a/lib/v2/kantarworldpanel/index.js b/lib/v2/kantarworldpanel/index.js new file mode 100644 index 00000000000000..f211d92aab03ee --- /dev/null +++ b/lib/v2/kantarworldpanel/index.js @@ -0,0 +1,96 @@ +const got = require('@/utils/got'); +const cheerio = require('cheerio'); +const { parseDate } = require('@/utils/parse-date'); +const { art } = require('@/utils/render'); +const path = require('path'); + +module.exports = async (ctx) => { + const { region = 'cn-en', category = 'news' } = ctx.params; + const limit = ctx.query.limit ? parseInt(ctx.query.limit, 10) : 30; + + const rootUrl = 'https://www.kantarworldpanel.com/'; + const currentUrl = new URL(`${region}/${category}`, rootUrl).href; + + const { data: response } = await got(currentUrl); + + const $ = cheerio.load(response); + + let items = $('ul.slide, #newssource') + .find('li') + .slice(0, limit) + .toArray() + .map((item) => { + item = $(item); + + const a = item.find('a'); + const image = item.find('img'); + + const title = item.find('h3.mediumFont').text().trim(); + + let link = a.prop('href'); + link = link === '#' ? currentUrl : link; + + return { + title, + link, + description: art(path.join(__dirname, 'templates/description.art'), { + description: item.find('p.gowhite').text(), + image: image.prop('src') + ? { + src: image.prop('src'), + alt: image.prop('alt'), + } + : undefined, + }), + guid: link.startsWith(rootUrl) ? `${link}#${title}` : link, + pubDate: parseDate(item.find('p.medGrey').text(), 'DD/MM/YYYY'), + }; + }); + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item.link, async () => { + // The URL similar to the example below is the file download URL. + // eg. https://www.kantarworldpanel.com/dwl.php?sn=publications&id=1632. + if (item.link === currentUrl || !item.link.startsWith(rootUrl)) { + return item; + } else if (/dwl\.php/.test(item.link)) { + item.enclosure_url = item.link; + item.enclosure_type = 'application/pdf'; + + return item; + } + + const detailResponse = await got(item.link); + + if (!detailResponse.url.startsWith(rootUrl)) { + return item; + } + + const content = cheerio.load(detailResponse.data); + + item.title = content('h1.newshead').text(); + item.description = content('div.center-content div.left-layout-col').html(); + item.category = content('meta[name="keywords"]').prop('content')?.split(/,\s?/) ?? []; + item.pubDate = parseDate(content('p.newsdateshare').text(), 'DD/MM/YYYY'); + + return item; + }) + ) + ); + + const icon = new URL('favicon.ico', rootUrl).href; + + ctx.state.data = { + item: items, + title: $('title').text(), + link: currentUrl, + description: $('meta[name="description"]').prop('content'), + language: $('html').prop('lang'), + image: $('#logoprint img').prop('src'), + icon, + logo: icon, + subtitle: $('meta[name="keywords"]').prop('content'), + allowEmpty: true, + }; +}; diff --git a/lib/v2/kantarworldpanel/maintainer.js b/lib/v2/kantarworldpanel/maintainer.js new file mode 100644 index 00000000000000..41b60e6794292e --- /dev/null +++ b/lib/v2/kantarworldpanel/maintainer.js @@ -0,0 +1,3 @@ +module.exports = { + '/:region/:category?': ['nczitzk'], +}; diff --git a/lib/v2/kantarworldpanel/radar.js b/lib/v2/kantarworldpanel/radar.js new file mode 100644 index 00000000000000..0a8578fed2fe61 --- /dev/null +++ b/lib/v2/kantarworldpanel/radar.js @@ -0,0 +1,199 @@ +module.exports = { + 'kantarworldpanel.com': { + _name: 'Kantar Worldpanel', + '.': [ + { + title: 'News Centre China Eng - News', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn-en/news'], + target: '/kantarworldpanel/cn-en/news', + }, + { + title: 'News Centre China Eng - Retail Snapshot', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn-en/publications'], + target: '/kantarworldpanel/cn-en/publications', + }, + { + title: 'News Centre China Eng - Publications', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn-en/publications/Reports'], + target: '/kantarworldpanel/cn-en/publications/Reports', + }, + { + title: 'News Centre China Eng - In the media', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn-en/In-the-media'], + target: '/kantarworldpanel/cn-en/In-the-media', + }, + { + title: 'News Centre China 中文 - 新闻发布', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn/news'], + target: '/kantarworldpanel/cn/news', + }, + { + title: 'News Centre China 中文 - 零售市场快报', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn/publications'], + target: '/kantarworldpanel/cn/publications', + }, + { + title: 'News Centre China 中文 - 市场报告', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn/publications/China-Insights'], + target: '/kantarworldpanel/cn/publications/China-Insights', + }, + { + title: 'News Centre China 中文 - 媒体报道', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/cn/press-releases'], + target: '/kantarworldpanel/cn/press-releases', + }, + { + title: 'News Centre Indonesia - News', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News'], + target: '/kantarworldpanel/id/News', + }, + { + title: 'News Centre Indonesia - Kantar Scoop', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News/Kantar-Worldpanel-Series'], + target: '/kantarworldpanel/id/News/Kantar-Worldpanel-Series', + }, + { + title: 'News Centre Indonesia - Video Series', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News/video-series'], + target: '/kantarworldpanel/id/News/video-series', + }, + { + title: 'News Centre Indonesia - Podcast', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News/podcast'], + target: '/kantarworldpanel/id/News/podcast', + }, + { + title: 'News Centre Indonesia - Ready, Steady, Shop!', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News/asia-shopper-series'], + target: '/kantarworldpanel/id/News/asia-shopper-series', + }, + { + title: 'News Centre Indonesia - Asia Pulse', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/id/News/Asia-Pulse'], + target: '/kantarworldpanel/id/News/Asia-Pulse', + }, + { + title: 'News Centre Korea - News', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/kr/news'], + target: '/kantarworldpanel/kr/news', + }, + { + title: 'News Centre Korea - Insight Reports', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/kr/publications'], + target: '/kantarworldpanel/kr/publications', + }, + { + title: 'News Centre Korea - In the Media', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/kr/press-releases'], + target: '/kantarworldpanel/kr/press-releases', + }, + { + title: 'News Centre Malaysia - News', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/my/news'], + target: '/kantarworldpanel/my/news', + }, + { + title: 'News Centre Philippines - Latest Insights', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/ph/Latest-Insights'], + target: '/kantarworldpanel/ph/Latest-Insights', + }, + { + title: 'News Centre Philippines - In the Media', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/ph/In-the-Media'], + target: '/kantarworldpanel/ph/In-the-Media', + }, + { + title: 'News Centre Philippines - Events', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/ph/events'], + target: '/kantarworldpanel/ph/events', + }, + { + title: 'News Centre Taiwan - 聚焦台灣', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/ph/news/spotlight-on-taiwan'], + target: '/kantarworldpanel/tw/news/spotlight-on-taiwan', + }, + { + title: 'News Centre Taiwan - WOW SPOT', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/tw/news/wowspot'], + target: '/kantarworldpanel/tw/news/wowspot', + }, + { + title: 'News Centre Taiwan - 市場報告', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/tw/publications'], + target: '/kantarworldpanel/tw/publications', + }, + { + title: 'News Centre Taiwan - 媒體報導', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/tw/press-releases'], + target: '/kantarworldpanel/tw/press-releases', + }, + { + title: 'News Centre Taiwan - 活動', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/tw/events'], + target: '/kantarworldpanel/tw/events', + }, + { + title: 'News Centre Thailand - News', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/th/news'], + target: '/kantarworldpanel/th/news', + }, + { + title: 'News Centre Vietnam - Insights', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/vn/news'], + target: '/kantarworldpanel/vn/news', + }, + { + title: 'News Centre Vietnam - FMCG Monitor', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/vn/news/FMCG-Monitor'], + target: '/kantarworldpanel/vn/news/FMCG-Monitor', + }, + { + title: 'News Centre Vietnam - Ready, Steady, Shop!', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/vn/news/ready-steady-shop'], + target: '/kantarworldpanel/vn/news/ready-steady-shop', + }, + { + title: 'News Centre Vietnam - Asia Pulse', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/vn/news/asia-pulse'], + target: '/kantarworldpanel/vn/news/asia-pulse', + }, + { + title: 'News Centre Vietnam - IN THE MEDIA', + docs: 'https://docs.rsshub.app/routes/new-media#kanta-worldpanel-news-centre', + source: ['/vn/In-the-media'], + target: '/kantarworldpanel/vn/In-the-media', + }, + ], + }, +}; diff --git a/lib/v2/kantarworldpanel/router.js b/lib/v2/kantarworldpanel/router.js new file mode 100644 index 00000000000000..3d38a5a5df3b0e --- /dev/null +++ b/lib/v2/kantarworldpanel/router.js @@ -0,0 +1,3 @@ +module.exports = (router) => { + router.get('/:region?/:category*', require('./')); +}; diff --git a/lib/v2/kantarworldpanel/templates/description.art b/lib/v2/kantarworldpanel/templates/description.art new file mode 100644 index 00000000000000..67f879084b82a0 --- /dev/null +++ b/lib/v2/kantarworldpanel/templates/description.art @@ -0,0 +1,9 @@ +{{ if description }} + {{@ description }} +{{ /if }} + +{{ if image }} +
+ +
+{{ /if }} \ No newline at end of file diff --git a/website/docs/routes/new-media.md b/website/docs/routes/new-media.md index 059223fdcddfaf..cd708876aca3b4 100644 --- a/website/docs/routes/new-media.md +++ b/website/docs/routes/new-media.md @@ -958,6 +958,85 @@ Provides a better reading experience (full text articles) over the official one. +## Kantar Worldpanel {#kantar-worldpanel} + +### News Centre {#kantar-worldpanel-news-centre} + + + +| Region | id | +| ----------- | ----- | +| China Eng | cn-en | +| China 中文 | cn | +| Indonesia | id | +| Korea | kr | +| Malaysia | my | +| Philippines | ph | +| Taiwan | tw | +| Thailand | th | +| Vietnam | vn | + +
+ More categories + +#### China Eng {#kantar-worldpanel-news-centre-china-eng} + + | News | Retail Snapshot | Publications | In the media | + | ---- | --------------- | -------------------- | ------------ | + | news | publications | publications/Reports | In-the-media | + +#### China 中文 {#kantar-worldpanel-news-centre-china-zhong-wen} + + | 新闻发布 | 零售市场快报 | 市场报告 | 媒体报道 | + | -------- | ------------ | --------------------------- | -------------- | + | news | publications | publications/China-Insights | press-releases | + +#### Indonesia {#kantar-worldpanel-news-centre-indonesia} + + | News | Kantar Scoop | Video Series | Podcast | Ready, Steady, Shop! | Asia Pulse | + | ---- | ----------------------------- | ----------------- | ------------ | ------------------------ | --------------- | + | News | News/Kantar-Worldpanel-Series | News/video-series | News/podcast | News/asia-shopper-series | News/Asia-Pulse | + +#### Korea {#kantar-worldpanel-news-centre-korea} + + | News | Insight Reports | In the Media | + | ---- | --------------- | -------------- | + | news | publications | press-releases | + +#### Malaysia {#kantar-worldpanel-news-centre-malaysia} + + | News | + | ---- | + | news | + +#### Philippines {#kantar-worldpanel-news-centre-philippines} + + | Latest Insights | In the Media | Events | + | --------------- | ------------ | ------ | + | Latest-Insights | In-the-Media | events | + +#### Taiwan {#kantar-worldpanel-news-centre-taiwan} + + | 聚焦台灣 | WOW SPOT | 市場報告 | 媒體報導 | 活動 | + | ------------------------ | ------------ | ------------ | -------------- | ------ | + | news/spotlight-on-taiwan | news/wowspot | publications | press-releases | events | + +#### Thailand {#kantar-worldpanel-news-centre-thailand} + + | News | + | ---- | + | news | + +#### Vietnam {#kantar-worldpanel-news-centre-vietnam} + + | Insights | FMCG Monitor | Ready, Steady, Shop! | Asia Pulse | IN THE MEDIA | + | -------- | ----------------- | ---------------------- | --------------- | ------------ | + | news | news/FMCG-Monitor | news/ready-steady-shop | news/asia-pulse | In-the-media | + +
+ +
+ ## KBS {#kbs} ### News {#kbs-news}