rsshub 1.0.0-master.f72af1b → 1.0.0-master.f7347d9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/lib/config.ts +18 -0
  2. package/lib/middleware/template.tsx +10 -2
  3. package/lib/routes/163/music/playlist.ts +2 -1
  4. package/lib/routes/5eplay/index.ts +1 -51
  5. package/lib/routes/a9vg/index.ts +214 -0
  6. package/lib/routes/a9vg/namespace.ts +1 -0
  7. package/lib/routes/a9vg/templates/description.art +17 -0
  8. package/lib/routes/aibase/discover.ts +388 -0
  9. package/lib/routes/aibase/namespace.ts +8 -0
  10. package/lib/routes/aibase/news.ts +118 -0
  11. package/lib/routes/aibase/templates/description.art +100 -0
  12. package/lib/routes/aibase/topic.ts +614 -0
  13. package/lib/routes/aibase/util.ts +114 -0
  14. package/lib/routes/apnews/api.ts +18 -3
  15. package/lib/routes/apnews/rss.ts +1 -1
  16. package/lib/routes/apnews/topics.ts +4 -3
  17. package/lib/routes/apple/podcast.ts +19 -15
  18. package/lib/routes/bangumi/templates/tv/subject.art +6 -0
  19. package/lib/routes/bangumi/tv/other/followrank.ts +19 -22
  20. package/lib/routes/bangumi/tv/user/collections.ts +172 -0
  21. package/lib/routes/bilibili/cache.ts +16 -8
  22. package/lib/routes/bilibili/utils.ts +85 -3
  23. package/lib/routes/bilibili/video.ts +7 -9
  24. package/lib/routes/bilibili/vsearch.ts +1 -1
  25. package/lib/routes/bjnews/cat.ts +9 -1
  26. package/lib/routes/cbpanet/index.ts +380 -0
  27. package/lib/routes/cbpanet/namespace.ts +8 -0
  28. package/lib/routes/ceph/blog.ts +72 -0
  29. package/lib/routes/ceph/namespace.ts +7 -0
  30. package/lib/routes/chinanews/index.ts +1 -1
  31. package/lib/routes/chinaventure/index.ts +1 -1
  32. package/lib/routes/cisia/index.ts +264 -0
  33. package/lib/routes/cisia/namespace.ts +8 -0
  34. package/lib/routes/cjlu/namespace.ts +10 -0
  35. package/lib/routes/cjlu/yjsy/index.ts +107 -0
  36. package/lib/routes/cnki/journals.ts +31 -2
  37. package/lib/routes/cohere/index.ts +54 -0
  38. package/lib/routes/cohere/namespace.ts +6 -0
  39. package/lib/routes/coolapk/dyh.ts +7 -1
  40. package/lib/routes/coolapk/hot.ts +7 -1
  41. package/lib/routes/coolapk/huati.ts +7 -1
  42. package/lib/routes/coolapk/namespace.ts +6 -0
  43. package/lib/routes/coolapk/toutiao.ts +7 -1
  44. package/lib/routes/coolapk/tuwen.ts +10 -5
  45. package/lib/routes/coolapk/user-dynamic.ts +7 -1
  46. package/lib/routes/damai/activity.ts +3 -2
  47. package/lib/routes/dcfever/trading.ts +3 -5
  48. package/lib/routes/dcfever/utils.ts +13 -4
  49. package/lib/routes/dealstreetasia/home.ts +72 -0
  50. package/lib/routes/dealstreetasia/namespace.ts +6 -0
  51. package/lib/routes/dealstreetasia/section.ts +57 -0
  52. package/lib/routes/dlsite/campaign.ts +1 -2
  53. package/lib/routes/dlsite/new.ts +1 -2
  54. package/lib/routes/dlsite/{index.ts → z-index/index.ts} +1 -1
  55. package/lib/routes/douban/other/topic.ts +10 -4
  56. package/lib/routes/douyin/types.ts +795 -0
  57. package/lib/routes/douyin/user.ts +51 -23
  58. package/lib/routes/douyin/utils.ts +1 -87
  59. package/lib/routes/dribbble/keyword.ts +1 -1
  60. package/lib/routes/dribbble/popular.ts +1 -1
  61. package/lib/routes/dribbble/user.ts +1 -1
  62. package/lib/routes/dribbble/utils.ts +16 -18
  63. package/lib/routes/famitsu/category.ts +1 -1
  64. package/lib/routes/fanbox/index.ts +1 -1
  65. package/lib/routes/fanbox/types.ts +1 -5
  66. package/lib/routes/fediverse/timeline.ts +21 -3
  67. package/lib/routes/follow/profile.ts +4 -2
  68. package/lib/routes/follow/types.ts +11 -1
  69. package/lib/routes/github/advisor.ts +97 -0
  70. package/lib/routes/github/discussions.ts +194 -0
  71. package/lib/routes/github/issue.ts +1 -1
  72. package/lib/routes/github/pulls.ts +1 -1
  73. package/lib/routes/gmcmonline/chinacustoms.ts +130 -0
  74. package/lib/routes/gmcmonline/namespace.ts +8 -0
  75. package/lib/routes/gov/csrc/csrc.ts +541 -0
  76. package/lib/routes/gov/customs/list.ts +5 -2
  77. package/lib/routes/gov/customs/namespace.ts +7 -0
  78. package/lib/routes/gov/jgjcndrc/index.ts +95 -66
  79. package/lib/routes/gov/moa/moa.ts +3 -3
  80. package/lib/routes/gov/moa/szcpxx.ts +115 -0
  81. package/lib/routes/gov/moa/zdscxx.ts +71 -21
  82. package/lib/routes/gov/ndrc/zfxxgk.ts +106 -0
  83. package/lib/routes/gov/pudong/zwgk.ts +65 -0
  84. package/lib/routes/gov/zj/search.ts +17 -12
  85. package/lib/routes/guancha/member.ts +1 -1
  86. package/lib/routes/hellogithub/index.ts +17 -67
  87. package/lib/routes/hellogithub/report.ts +1 -1
  88. package/lib/routes/hex-rays/index.ts +23 -29
  89. package/lib/routes/hfut/hf/notice.ts +43 -0
  90. package/lib/routes/hfut/hf/utils.ts +80 -0
  91. package/lib/routes/hfut/namespace.ts +6 -0
  92. package/lib/routes/hfut/xc/notice.ts +43 -0
  93. package/lib/routes/hfut/xc/utils.ts +73 -0
  94. package/lib/routes/hko/earthquake.ts +56 -0
  95. package/lib/routes/hko/namespace.ts +8 -0
  96. package/lib/routes/hko/weather.ts +56 -0
  97. package/lib/routes/huggingface/blog-zh.ts +1 -1
  98. package/lib/routes/hust/mse.ts +575 -0
  99. package/lib/routes/i-cable/namespace.ts +6 -0
  100. package/lib/routes/i-cable/news.ts +77 -0
  101. package/lib/routes/i-cable/templates/description.art +8 -0
  102. package/lib/routes/infoq/presentations.ts +203 -0
  103. package/lib/routes/infoq/templates/description.art +41 -0
  104. package/lib/routes/ipsw.dev/index.ts +64 -0
  105. package/lib/routes/ipsw.dev/namespace.ts +7 -0
  106. package/lib/routes/ipsw.dev/templates/description.art +20 -0
  107. package/lib/routes/ixigua/user-video.ts +18 -7
  108. package/lib/routes/javtiful/actress.ts +37 -0
  109. package/lib/routes/javtiful/channel.ts +37 -0
  110. package/lib/routes/javtiful/namespace.ts +6 -0
  111. package/lib/routes/javtiful/templates/description.art +7 -0
  112. package/lib/routes/javtiful/utils.ts +18 -0
  113. package/lib/routes/kisskiss/blog.ts +74 -0
  114. package/lib/routes/kisskiss/namespace.ts +6 -0
  115. package/lib/routes/ktown4u/artist-brandlist.ts +61 -0
  116. package/lib/routes/ktown4u/namespace.ts +6 -0
  117. package/lib/routes/lorientlejour/index.ts +186 -0
  118. package/lib/routes/lorientlejour/namespace.ts +7 -0
  119. package/lib/routes/lorientlejour/templates/description.art +18 -0
  120. package/lib/routes/lovelive-anime/namespace.ts +1 -1
  121. package/lib/routes/lovelive-anime/news.ts +56 -26
  122. package/lib/routes/lovelive-anime/schedules.ts +18 -6
  123. package/lib/routes/lovelive-anime/templates/description.art +1 -1
  124. package/lib/routes/lovelive-anime/templates/scheduleDesc.art +0 -1
  125. package/lib/routes/lovelive-anime/topics.ts +1 -1
  126. package/lib/routes/manhuagui/comic.ts +1 -1
  127. package/lib/routes/mi/crowdfunding.ts +43 -22
  128. package/lib/routes/mi/templates/crowdfunding.art +28 -0
  129. package/lib/routes/mi/types.ts +40 -0
  130. package/lib/routes/mi/utils.ts +80 -0
  131. package/lib/routes/misskey/utils.ts +1 -0
  132. package/lib/routes/misskon/namespace.ts +6 -0
  133. package/lib/routes/misskon/posts.ts +33 -0
  134. package/lib/routes/misskon/tag.ts +38 -0
  135. package/lib/routes/misskon/top.ts +67 -0
  136. package/lib/routes/misskon/utils.ts +41 -0
  137. package/lib/routes/natgeo/dailyphoto.ts +1 -1
  138. package/lib/routes/natgeo/dailyselection.ts +1 -1
  139. package/lib/routes/ncku/namespace.ts +1 -1
  140. package/lib/routes/ncku/phys.ts +95 -0
  141. package/lib/routes/news/namespace.ts +1 -1
  142. package/lib/routes/nikkei/cn/index.ts +12 -1
  143. package/lib/routes/nudt/yjszs.ts +33 -13
  144. package/lib/routes/nytimes/book.ts +11 -11
  145. package/lib/routes/nytimes/daily-briefing-chinese.ts +4 -4
  146. package/lib/routes/nytimes/namespace.ts +1 -1
  147. package/lib/routes/oncc/templates/article.art +1 -1
  148. package/lib/routes/papers/index.ts +7 -1
  149. package/lib/routes/parliament.uk/commonslibrary.ts +55 -0
  150. package/lib/routes/parliament.uk/lordslibrary.ts +55 -0
  151. package/lib/routes/parliament.uk/namespace.ts +6 -0
  152. package/lib/routes/picuki/profile.ts +50 -39
  153. package/lib/routes/pornhub/model.ts +3 -5
  154. package/lib/routes/pornhub/pornstar.ts +3 -5
  155. package/lib/routes/pornhub/users.ts +3 -5
  156. package/lib/routes/resonac/namespace.ts +6 -0
  157. package/lib/routes/resonac/products.ts +85 -0
  158. package/lib/routes/rsshub/transform/html.ts +114 -75
  159. package/lib/routes/rsshub/transform/json.ts +14 -8
  160. package/lib/routes/sciencenet/user.ts +3 -1
  161. package/lib/routes/scmp/utils.ts +2 -2
  162. package/lib/routes/skeb/following-creators.ts +52 -0
  163. package/lib/routes/skeb/following-works.ts +52 -0
  164. package/lib/routes/skeb/friend-works.ts +52 -0
  165. package/lib/routes/skeb/index.ts +131 -0
  166. package/lib/routes/skeb/namespace.ts +6 -0
  167. package/lib/routes/skeb/search.ts +77 -0
  168. package/lib/routes/skeb/templates/creator.art +8 -0
  169. package/lib/routes/skeb/templates/work.art +10 -0
  170. package/lib/routes/skeb/utils.ts +155 -0
  171. package/lib/routes/skeb/works.ts +88 -0
  172. package/lib/routes/skebetter/illust.ts +83 -0
  173. package/lib/routes/skebetter/index.ts +83 -0
  174. package/lib/routes/skebetter/manga.ts +65 -0
  175. package/lib/routes/skebetter/namespace.ts +6 -0
  176. package/lib/routes/skebetter/utils.ts +72 -0
  177. package/lib/routes/spankbang/namespace.ts +6 -0
  178. package/lib/routes/spankbang/new-videos.ts +90 -0
  179. package/lib/routes/spankbang/templates/video.art +7 -0
  180. package/lib/routes/straitstimes/index.ts +135 -0
  181. package/lib/routes/straitstimes/namespace.ts +7 -0
  182. package/lib/routes/straitstimes/templates/description.art +27 -0
  183. package/lib/routes/szftedu/dongtai.ts +62 -0
  184. package/lib/routes/szftedu/gonggao.ts +62 -0
  185. package/lib/routes/szftedu/namespace.ts +6 -0
  186. package/lib/routes/the/index.ts +1 -1
  187. package/lib/routes/tkww/index.ts +83 -0
  188. package/lib/routes/tkww/namespace.ts +6 -0
  189. package/lib/routes/ttv/index.ts +1 -1
  190. package/lib/routes/tvb/news.ts +2 -1
  191. package/lib/routes/twitter/api/mobile-api/login.ts +5 -0
  192. package/lib/routes/twitter/api/web-api/api.ts +16 -10
  193. package/lib/routes/twitter/api/web-api/constants.ts +1 -1
  194. package/lib/routes/twitter/api/web-api/utils.ts +94 -56
  195. package/lib/routes/twitter/list.ts +4 -12
  196. package/lib/routes/twitter/media.ts +13 -4
  197. package/lib/routes/twitter/user.ts +15 -6
  198. package/lib/routes/udn/breaking-news.ts +2 -2
  199. package/lib/routes/uestc/gr.ts +65 -37
  200. package/lib/routes/uestc/jwc.ts +49 -28
  201. package/lib/routes/wechat/ershcimi.ts +4 -2
  202. package/lib/routes/weibo/user.ts +10 -2
  203. package/lib/routes/xaut/index.ts +13 -20
  204. package/lib/routes/xaut/namespace.ts +1 -1
  205. package/lib/routes/xbookcn/blog.ts +66 -0
  206. package/lib/routes/xbookcn/namespace.ts +6 -0
  207. package/lib/routes/xiaoyuzhou/podcast.ts +35 -7
  208. package/lib/routes/xueqiu/cookies.ts +5 -3
  209. package/lib/routes/xueqiu/stock-info.ts +6 -12
  210. package/lib/routes/yande/namespace.ts +1 -1
  211. package/lib/routes/yande/post.ts +6 -6
  212. package/lib/routes/zaobao/util.ts +41 -43
  213. package/lib/routes/zhihu/activities.ts +2 -1
  214. package/lib/routes/zhihu/timeline.ts +6 -1
  215. package/lib/routes/zhihu/utils.ts +1 -1
  216. package/lib/routes/zjut/cs/index.ts +105 -0
  217. package/lib/routes/zjut/jwc/index.ts +117 -0
  218. package/lib/utils/cache/redis.ts +1 -1
  219. package/package.json +35 -36
  220. package/lib/routes/a9vg/a9vg.ts +0 -45
  221. package/lib/routes/gov/ndrc/zfxxgk/articles.ts +0 -73
  222. package/lib/routes-deprecated/hko/weather.js +0 -44
@@ -29,16 +29,14 @@ async function handler(ctx) {
29
29
  const response = await ofetch(link.href);
30
30
  const $ = load(response);
31
31
 
32
- const list = $('.item_list li a')
32
+ const list = $('.item_grid_wrap div a')
33
33
  .toArray()
34
- .filter((item) => $(item).attr('href') !== '/documents/advertising.php')
35
34
  .map((item) => {
36
35
  item = $(item);
37
- item.find('.optional').remove();
38
36
  return {
39
- title: item.find('.trade_title').text(),
37
+ title: item.find('.lazyloadx').attr('alt'),
40
38
  link: new URL(item.attr('href'), link.href).href,
41
- author: item.find('.trade_info').text(),
39
+ author: item.find('.trade_info div span').eq(1).text(),
42
40
  };
43
41
  });
44
42
 
@@ -63,11 +63,20 @@ const parseTradeItem = (item) =>
63
63
  const response = await ofetch(item.link);
64
64
  const $ = load(response);
65
65
 
66
- $('.selector_text').remove();
67
- $('.selector_image_div').each((_, div) => {
66
+ const photoSelector = $('#trading_item_section .description')
67
+ .contents()
68
+ .filter((_, e) => e.type === 'comment')
69
+ .toArray()
70
+ .map((e) => e.data)
71
+ .join('');
72
+
73
+ const $photo = load(photoSelector, null, false);
74
+
75
+ $photo('.selector_text').remove();
76
+ $photo('.selector_image_div').each((_, div) => {
68
77
  delete div.attribs.onclick;
69
78
  });
70
- $('.desktop_photo_selector img').each((_, img) => {
79
+ $photo('.desktop_photo_selector img').each((_, img) => {
71
80
  if (img.attribs.src.endsWith('_sqt.jpg')) {
72
81
  img.attribs.src = img.attribs.src.replace('_sqt.jpg', '.jpg');
73
82
  }
@@ -76,7 +85,7 @@ const parseTradeItem = (item) =>
76
85
  item.description = art(path.join(__dirname, 'templates/trading.art'), {
77
86
  info: $('.info_col'),
78
87
  description: $('.description_text').html(),
79
- photo: $('.desktop_photo_selector').html(),
88
+ photo: $photo('.desktop_photo_selector').html(),
80
89
  });
81
90
 
82
91
  return item;
@@ -0,0 +1,72 @@
1
+ import { Route } from '@/types';
2
+ // import cache from '@/utils/cache';
3
+ import ofetch from '@/utils/ofetch'; // Unified request library used
4
+ import { load } from 'cheerio'; // An HTML parser with an API similar to jQuery
5
+ // import puppeteer from '@/utils/puppeteer';
6
+ // import { parseDate } from '@/utils/parse-date';
7
+
8
+ export const route: Route = {
9
+ path: '/home',
10
+ categories: ['traditional-media'],
11
+ example: '/dealstreetasia/home',
12
+ // parameters: { section: 'target section' },
13
+ radar: [
14
+ {
15
+ source: ['dealstreetasia.com/'],
16
+ },
17
+ ],
18
+ name: 'Home',
19
+ maintainers: ['jack2game'],
20
+ handler,
21
+ url: 'dealstreetasia.com/',
22
+ };
23
+
24
+ async function handler() {
25
+ // const section = ctx.req.param('section');
26
+ const items = await fetchPage();
27
+
28
+ return items;
29
+ }
30
+
31
+ async function fetchPage() {
32
+ const baseUrl = 'https://dealstreetasia.com'; // Define base URL
33
+
34
+ const response = await ofetch(`${baseUrl}/`);
35
+ const $ = load(response);
36
+
37
+ const jsonData = JSON.parse($('#__NEXT_DATA__').text());
38
+ // const headingText = jsonData.props.pageProps.sectionData.name;
39
+
40
+ const pageProps = jsonData.props.pageProps;
41
+ const list = [
42
+ ...pageProps.topStories,
43
+ ...pageProps.privateEquity,
44
+ ...pageProps.ventureCapital,
45
+ ...pageProps.unicorns,
46
+ ...pageProps.interviews,
47
+ ...pageProps.deals,
48
+ ...pageProps.analysis,
49
+ ...pageProps.ipos,
50
+ ...pageProps.opinion,
51
+ ...pageProps.policyAndRegulations,
52
+ ...pageProps.people,
53
+ ...pageProps.earningsAndResults,
54
+ ...pageProps.theLpView,
55
+ ...pageProps.dvNewsletters,
56
+ ...pageProps.reports,
57
+ ].map((item) => ({
58
+ title: item.post_title || item.title || 'No Title',
59
+ link: item.post_url || item.link || '',
60
+ description: item.post_excerpt || item.excerpt || '',
61
+ pubDate: item.post_date ? new Date(item.post_date).toUTCString() : item.date ? new Date(item.date).toUTCString() : '',
62
+ category: item.category_link ? item.category_link.replaceAll(/(<([^>]+)>)/gi, '') : '', // Clean HTML if category_link exists
63
+ image: item.image_url ? item.image_url.replace(/\?.*$/, '') : '', // Remove query parameters if image_url exists
64
+ }));
65
+
66
+ return {
67
+ title: 'Deal Street Asia',
68
+ language: 'en',
69
+ item: list,
70
+ link: 'https://dealstreetasia.com/',
71
+ };
72
+ }
@@ -0,0 +1,6 @@
1
+ import type { Namespace } from '@/types';
2
+
3
+ export const namespace: Namespace = {
4
+ name: 'DealStreetAsia',
5
+ url: 'dealstreetasia.com',
6
+ };
@@ -0,0 +1,57 @@
1
+ import { Route } from '@/types';
2
+ // import cache from '@/utils/cache';
3
+ import ofetch from '@/utils/ofetch'; // Unified request library used
4
+ import { load } from 'cheerio'; // An HTML parser with an API similar to jQuery
5
+ // import puppeteer from '@/utils/puppeteer';
6
+ // import { parseDate } from '@/utils/parse-date';
7
+
8
+ export const route: Route = {
9
+ path: '/section/:section',
10
+ categories: ['traditional-media'],
11
+ example: '/dealstreetasia/section/private-equity',
12
+ parameters: { section: 'target section' },
13
+ radar: [
14
+ {
15
+ source: ['dealstreetasia.com/'],
16
+ },
17
+ ],
18
+ name: 'Section',
19
+ maintainers: ['jack2game'],
20
+ handler,
21
+ url: 'dealstreetasia.com/',
22
+ };
23
+
24
+ async function handler(ctx) {
25
+ const section = ctx.req.param('section');
26
+ const items = await fetchPage(section);
27
+
28
+ return items;
29
+ }
30
+
31
+ async function fetchPage(section: string) {
32
+ const baseUrl = 'https://dealstreetasia.com'; // Define base URL
33
+
34
+ const response = await ofetch(`${baseUrl}/section/${section}/`);
35
+ const $ = load(response);
36
+
37
+ const jsonData = JSON.parse($('#__NEXT_DATA__').text());
38
+ const headingText = jsonData.props.pageProps.sectionData.name;
39
+
40
+ const items = jsonData.props.pageProps.sectionData.stories.nodes;
41
+
42
+ const feedItems = items.map((item) => ({
43
+ title: item.title || 'No Title',
44
+ link: item.uri ? `https://www.dealstreetasia.com${item.uri}` : '',
45
+ description: item.excerpt || '', // Default to empty string if undefined
46
+ pubDate: item.post_date ? new Date(item.post_date).toUTCString() : '',
47
+ category: item.sections.nodes.map((section) => section.name),
48
+ image: item.featuredImage?.node?.mediaItemUrl.replace(/\?.*$/, ''), // Use .replace to sanitize the image URL
49
+ }));
50
+
51
+ return {
52
+ title: 'Deal Street Asia - ' + headingText,
53
+ language: 'en',
54
+ item: feedItems,
55
+ link: 'https://dealstreetasia.com/section/' + section + '/',
56
+ };
57
+ }
@@ -149,9 +149,8 @@ async function handler(ctx) {
149
149
  }
150
150
  const link = setUrl(info);
151
151
 
152
- const response = await got(link, {
152
+ const response = await got(new URL(link, host), {
153
153
  method: 'GET',
154
- prefixUrl: host,
155
154
  });
156
155
  const data = response.data;
157
156
  const $ = load(data);
@@ -81,9 +81,8 @@ async function handler(ctx) {
81
81
 
82
82
  const link = info.url.slice(1);
83
83
 
84
- const response = await got(link, {
84
+ const response = await got(new URL(link, host), {
85
85
  method: 'GET',
86
- prefixUrl: host,
87
86
  });
88
87
  const data = response.data;
89
88
  const $ = load(data);
@@ -1,5 +1,5 @@
1
1
  import { Route } from '@/types';
2
- import { ProcessItems } from './utils';
2
+ import { ProcessItems } from '../utils';
3
3
 
4
4
  export const route: Route = {
5
5
  path: '*',
@@ -4,7 +4,7 @@ import got from '@/utils/got';
4
4
 
5
5
  export const route: Route = {
6
6
  path: '/topic/:id/:sort?',
7
- categories: ['social-media'],
7
+ categories: ['social-media', 'popular'],
8
8
  example: '/douban/topic/48823',
9
9
  parameters: { id: '话题id', sort: '排序方式,hot或new,默认为new' },
10
10
  features: {
@@ -16,7 +16,7 @@ export const route: Route = {
16
16
  supportScihub: false,
17
17
  },
18
18
  name: '话题',
19
- maintainers: ['LogicJake'],
19
+ maintainers: ['LogicJake', 'pseudoyu'],
20
20
  handler,
21
21
  };
22
22
 
@@ -36,8 +36,14 @@ async function handler(ctx) {
36
36
  });
37
37
 
38
38
  const data = response.data.items;
39
- const title = data[0].topic.name;
40
- const description = data[0].topic.introduction;
39
+
40
+ let title = id;
41
+ let description = '';
42
+
43
+ if (data[0].topic !== null) {
44
+ title = data[0].topic.name;
45
+ description = data[0].topic.introduction;
46
+ }
41
47
 
42
48
  const out = await Promise.all(
43
49
  data.map(async (item) => {