From 7df6ea4fea302e2655d4523e854e5077e45ec3a0 Mon Sep 17 00:00:00 2001 From: creep Date: Fri, 3 Nov 2023 16:06:10 +0800 Subject: [PATCH 1/4] perf(reader): add feed.pushOne service --- src/main/reader/crawler.ts | 2 +- src/main/reader/router/feed.ts | 2 +- src/main/reader/services/feed.ts | 31 ++++++++++++++++++------------- src/renderer/store/reader.ts | 16 ++++++++++++++-- src/types/reader.ts | 1 + 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/reader/crawler.ts b/src/main/reader/crawler.ts index 1566d1b..0cfdfe0 100644 --- a/src/main/reader/crawler.ts +++ b/src/main/reader/crawler.ts @@ -23,6 +23,7 @@ const crawlOne = async (f: Feed) => { } await articleService.upsert(items) + feedService.pushOne(id!) } catch (e) { logger.error(`[Reader] crawl error: ${url}`, e) } @@ -59,7 +60,6 @@ export const startCrawler = () => { try { const feeds = await feedService.getAll() await conQueue(feeds, 10, crawlOne) - await feedService.pushAll() } catch (e) { logger.error('[Reader] Crawl error', e) } finally { diff --git a/src/main/reader/router/feed.ts b/src/main/reader/router/feed.ts index 529fc7d..0988688 100644 --- a/src/main/reader/router/feed.ts +++ b/src/main/reader/router/feed.ts @@ -50,7 +50,7 @@ router.post('/feed', async (_, { url, title }: Pick) => { })) await articleService.upsert(items) - feedService.pushAll() + feedService.pushOne(ifeed.id!) }) router.get('/feed/all', async () => feedService.getAll()) diff --git a/src/main/reader/services/feed.ts b/src/main/reader/services/feed.ts index 002b0c6..5133d2c 100644 --- a/src/main/reader/services/feed.ts +++ b/src/main/reader/services/feed.ts @@ -31,27 +31,26 @@ export const getByUrl = async (url: string) => { return null } -export const getAll = async (): Promise => { +export const getAll = (): Promise => { const sql = ` - select f.*, count(a.id) as count + select f.*, count(a.id) as unreadCount from feeds as f left outer join articles as a on f.id = a.feedId and a.read = 0 group by f.id order by createTime desc; ` - const rows = await all(sql) - const feeds: Feed[] = rows.map((row) => ({ - id: row.id, - title: row.title, - url: row.url, - link: row.link, - createTime: row.createTime, - description: row.description, - unreadCount: row.count, - })) + return all(sql) +} + +export const getOne = (id: number): Promise => { + const sql = ` + select f.*, (select count(*) from articles as a where a.feedId = f.id and a.read = 0) as unreadCount + from feeds as f + where f.id = ?; + ` - return feeds + return get(sql, id) } export const deleteById = (id: number) => new Promise((resolve) => { @@ -74,3 +73,9 @@ export const pushAll = async () => { push('/reader/feed', feeds) } + +export const pushOne = async (id: number) => { + const feed = await getOne(id) + + push('/reader/feed', feed) +} diff --git a/src/renderer/store/reader.ts b/src/renderer/store/reader.ts index 9dbe2ec..42f2104 100644 --- a/src/renderer/store/reader.ts +++ b/src/renderer/store/reader.ts @@ -45,8 +45,20 @@ export class ReaderStore { } private initListeners() { - remote.on('/reader/feed', (_, feeds = []) => { - runInAction(() => { this.feeds = feeds }) + remote.on('/reader/feed', (_, feeds: Feed | Feed[] = []) => { + runInAction(() => { + if (Array.isArray(feeds)) { + this.feeds = feeds + return + } + + const index = this.feeds.findIndex((v) => v.id === feeds.id) + if (index === -1) { + this.feeds.unshift(feeds) + } else { + this.feeds.splice(index, 1, feeds) + } + }) }) } diff --git a/src/types/reader.ts b/src/types/reader.ts index 1e835cc..12f506a 100644 --- a/src/types/reader.ts +++ b/src/types/reader.ts @@ -22,4 +22,5 @@ export type Feed = { link?: string unreadCount?: number items?: Article[] + createTime?: string } From a99b0fe66f554489dfe11f13c2811324dabf8bc0 Mon Sep 17 00:00:00 2001 From: creep Date: Fri, 3 Nov 2023 18:01:33 +0800 Subject: [PATCH 2/4] docs: add links in readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 601bd80..12b6168 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # emo +[Download](https://github.com/xwcoder/emo/releases) | [Issue](https://github.com/xwcoder/emo/issues/new) I wish to develop **emo** as an **all in one** desktop application. Now, it includes the following apps: - **Reader** - A rss reader. From e30e4370030c412015ad40b0fda4c3adbae4411e Mon Sep 17 00:00:00 2001 From: creep Date: Fri, 3 Nov 2023 18:03:06 +0800 Subject: [PATCH 3/4] feat(reader): content:encoded is preferred --- src/utils/node/feed.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/node/feed.ts b/src/utils/node/feed.ts index 7e6d530..1a67cc1 100644 --- a/src/utils/node/feed.ts +++ b/src/utils/node/feed.ts @@ -2,7 +2,7 @@ import { parseStringPromise } from 'xml2js' import get from 'lodash.get' import { Feed } from '@/types/reader' -const trim = (s: string) => s.replaceAll('\n', '').trim() +const trim = (s = '') => s.replaceAll('\n', '').trim() const gettrim = (...args: Parameters) => trim(get(...args)) @@ -16,7 +16,7 @@ const parseRss = (xml: any): Omit => { items: (channel.item || []).map((v: any) => ({ title: gettrim(v, 'title[0]'), url: gettrim(v, 'link[0]'), - content: gettrim(v, 'description[0]'), + content: gettrim(v, 'content:encoded[0]') || gettrim(v, 'description[0]'), pubTime: gettrim(v, 'pubDate[0]'), })), } From ca5cda88014494aa1c69a82796e0601e1f711fe0 Mon Sep 17 00:00:00 2001 From: creep Date: Fri, 3 Nov 2023 18:06:46 +0800 Subject: [PATCH 4/4] 0.1.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62fb67f..70b85dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "emo", - "version": "0.1.2", + "version": "0.1.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "emo", - "version": "0.1.2", + "version": "0.1.3", "license": "MIT", "dependencies": { "@fluentui/react-components": "^9.30.1", diff --git a/package.json b/package.json index 0759e95..d14ab01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "emo", - "version": "0.1.2", + "version": "0.1.3", "description": "An all in one application, includes Reader-a rss reader", "main": "./dist/main.js", "scripts": {