diff --git a/package-lock.json b/package-lock.json index e3f943f2..a0a0127e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.17.0", "@freearhey/core": "^0.4.0", - "@freearhey/search-js": "^0.1.1", "@ntlab/sfetch": "^1.0.0", "@octokit/plugin-paginate-rest": "^11.3.6", "@octokit/plugin-rest-endpoint-methods": "^13.2.6", @@ -43,6 +42,7 @@ "eslint-config-prettier": "^9.0.0", "form-data": "^4.0.0", "fs-extra": "^10.0.1", + "fuse.js": "^7.0.0", "glob": "^7.2.0", "globals": "^15.14.0", "husky": "^9.1.7", @@ -1284,17 +1284,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@freearhey/search-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.1.1.tgz", - "integrity": "sha512-nmXhqBg5lh6GxMT2g1hgmSc/pbXGw0P4ZxXaPt/cnuZYtvPHSo0CPOF65iNC9LEqvrrnLig4RFlG1dBDPNAU0g==", - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -5002,9 +4991,20 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fuse.js": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", + "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==", + "engines": { + "node": ">=10" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -10090,14 +10090,6 @@ } } }, - "@freearhey/search-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.1.1.tgz", - "integrity": "sha512-nmXhqBg5lh6GxMT2g1hgmSc/pbXGw0P4ZxXaPt/cnuZYtvPHSo0CPOF65iNC9LEqvrrnLig4RFlG1dBDPNAU0g==", - "requires": { - "lodash": "^4.17.21" - } - }, "@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -12752,9 +12744,14 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "fuse.js": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz", + "integrity": "sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q==" }, "gensync": { "version": "1.0.0-beta.2", diff --git a/package.json b/package.json index 95c5f9e8..6ac30d0a 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,10 @@ "transform": { "^.+\\.(ts|js)$": "@swc/jest" }, - "testMatch": ["/sites/**/*.test.(js|ts)", "/tests/commands/**/*.test.(js|ts)"], + "testMatch": [ + "/sites/**/*.test.(js|ts)", + "/tests/commands/**/*.test.(js|ts)" + ], "testTimeout": 10000 }, "dependencies": { @@ -38,7 +41,6 @@ "@eslint/eslintrc": "^3.2.0", "@eslint/js": "^9.17.0", "@freearhey/core": "^0.4.0", - "@freearhey/search-js": "^0.1.1", "@ntlab/sfetch": "^1.0.0", "@octokit/plugin-paginate-rest": "^11.3.6", "@octokit/plugin-rest-endpoint-methods": "^13.2.6", @@ -69,6 +71,7 @@ "eslint-config-prettier": "^9.0.0", "form-data": "^4.0.0", "fs-extra": "^10.0.1", + "fuse.js": "^7.0.0", "glob": "^7.2.0", "globals": "^15.14.0", "husky": "^9.1.7", diff --git a/scripts/commands/channels/edit.ts b/scripts/commands/channels/edit.ts index 0ee1c88b..8d4bdd96 100644 --- a/scripts/commands/channels/edit.ts +++ b/scripts/commands/channels/edit.ts @@ -5,7 +5,7 @@ import { Channel } from 'epg-grabber' import nodeCleanup from 'node-cleanup' import { program } from 'commander' import inquirer, { QuestionCollection } from 'inquirer' -import sj from '@freearhey/search-js' +import Fuse from 'fuse.js' program.argument('', 'Path to *.channels.xml file to edit').parse(process.argv) @@ -25,15 +25,15 @@ async function main() { const dataStorage = new Storage(DATA_DIR) const channelsContent = await dataStorage.json('channels.json') - const channelsIndex = sj.createIndex(channelsContent) + const searchIndex = new Fuse(channelsContent, { keys: ['name', 'alt_names'], threshold: 0.4 }) for (const channel of channels.all()) { if (channel.xmltv_id) continue const question: QuestionCollection = { name: 'option', - message: `"${channel.name}" (${channel.site_id}):`, + message: `Select xmltv_id for "${channel.name}" (${channel.site_id}):`, type: 'list', - choices: getOptions(channelsIndex, channel), + choices: getOptions(searchIndex, channel), pageSize: 10 } @@ -94,8 +94,7 @@ async function getInput(channel: Channel) { } function getOptions(index, channel: Channel) { - const query = prepareQuery(channel.name) - const similar = index.search(query).map(item => new ApiChannel(item)) + const similar = index.search(channel.name).map(result => new ApiChannel(result.item)) const variants = new Collection() similar.forEach((_channel: ApiChannel) => { @@ -110,11 +109,3 @@ function getOptions(index, channel: Channel) { return variants.all() } - -function prepareQuery(channelName: string) { - return channelName - .replace(/\s(SD|TV|HD|SD\/HD|HDTV)$/i, '') - .replace(/(\(|\)|,)/gi, '') - .replace(/-/gi, ' ') - .replace(/\+/gi, '') -} diff --git a/yarn.lock b/yarn.lock index 3248e67a..b4a77b87 100644 --- a/yarn.lock +++ b/yarn.lock @@ -414,13 +414,6 @@ object-treeify "^2.1.1" signale "^1.4.0" -"@freearhey/search-js@^0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@freearhey/search-js/-/search-js-0.1.1.tgz" - integrity sha512-nmXhqBg5lh6GxMT2g1hgmSc/pbXGw0P4ZxXaPt/cnuZYtvPHSo0CPOF65iNC9LEqvrrnLig4RFlG1dBDPNAU0g== - dependencies: - lodash "^4.17.21" - "@humanfs/core@^0.19.1": version "0.19.1" resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" @@ -2667,9 +2660,14 @@ fsevents@^2.3.2, fsevents@~2.3.3: integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +fuse.js@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/fuse.js/-/fuse.js-7.0.0.tgz" + integrity sha512-14F4hBIxqKvD4Zz/XjDc3y94mNZN6pRv3U13Udo0lNLCWRBUsrMv2xwcF/y/Z5sV6+FQW+/ow68cHpm4sunt8Q== gensync@^1.0.0-beta.2: version "1.0.0-beta.2"