From 86743c74f58d81fa4ac017dd84ddf1a7b1ac54aa Mon Sep 17 00:00:00 2001 From: freearhey <7253922+freearhey@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:53:33 +0300 Subject: [PATCH] Update src/ --- src/actions/clickOutside.js | 15 + src/actions/index.js | 1 + src/app.css | 48 +- src/commands/api/load.ts | 52 ++ src/components/ActionButton.svelte | 20 - src/components/Badge.svelte | 5 + src/components/BlockedBadge.svelte | 58 +- src/components/BottomBar.svelte | 44 +- src/components/Button.svelte | 19 + src/components/Card.svelte | 16 + src/components/ChannelEditButton.svelte | 29 + src/components/ChannelGrid.svelte | 51 +- src/components/ChannelItem.svelte | 218 +++---- src/components/ChannelPopup.svelte | 101 ++-- src/components/ChannelRemoveButton.svelte | 29 + src/components/Checkbox.svelte | 64 +-- src/components/Clipboard.svelte | 7 +- src/components/CloseButton.svelte | 18 +- src/components/ClosedBadge.svelte | 28 +- src/components/CodeBlock.svelte | 7 + src/components/CopyLinkButton.svelte | 14 + src/components/CopyToClipboard.svelte | 60 +- src/components/CountryItem.svelte | 193 ++++--- src/components/CreatePlaylistButton.svelte | 29 +- src/components/DefaultButton.svelte | 8 - src/components/Divider.svelte | 1 - src/components/DownloadButton.svelte | 76 +-- src/components/EditButton.svelte | 74 --- src/components/ExpandButton.svelte | 33 +- src/components/FeedAddButton.svelte | 29 + src/components/FeedEditButton.svelte | 30 + src/components/FeedItem.svelte | 109 ++++ src/components/FeedPopup.svelte | 58 ++ src/components/FeedRemoveButton.svelte | 30 + src/components/GitHubButton.svelte | 30 +- src/components/GuideItem.svelte | 40 +- src/components/GuidesPopup.svelte | 88 +-- src/components/HTMLPreview.svelte | 169 ++---- src/components/IconButton.svelte | 20 + src/components/JsonDataViewer.svelte | 70 +-- src/components/Logo.svelte | 3 + src/components/Menu.svelte | 29 + src/components/NavBar.svelte | 150 +++-- src/components/OutlineButton.svelte | 7 - src/components/Popup.svelte | 8 + src/components/ResetButton.svelte | 22 + src/components/SearchButton.svelte | 24 +- src/components/SearchField.svelte | 114 ++-- src/components/SearchFieldMini.svelte | 39 -- src/components/SearchSyntaxPopup.svelte | 77 +-- src/components/SelectAllButton.svelte | 137 +++-- src/components/ShareChannelButton.svelte | 24 + src/components/SquareButton.svelte | 8 - src/components/StreamItem.svelte | 72 +-- src/components/StreamsPopup.svelte | 67 +-- src/components/ToggleModeButton.svelte | 37 +- src/components/index.ts | 45 ++ src/core/apiClient.ts | 15 + src/core/dataLoader.ts | 143 +++++ src/core/dataProcessor.ts | 91 +++ src/core/dataStorage.ts | 34 ++ src/core/index.ts | 5 + src/core/playlistCreator.ts | 17 + src/core/searchEngine.ts | 20 + src/icons/Add.svelte | 17 + src/icons/Check.svelte | 16 + src/icons/CheckboxChecked.svelte | 14 + src/icons/CheckboxDisabled.svelte | 10 + src/icons/CheckboxIndeterminate.svelte | 14 + src/icons/CheckboxUnchecked.svelte | 11 + src/icons/Clear.svelte | 13 + src/icons/Close.svelte | 14 + src/icons/Copy.svelte | 16 + src/icons/CreatePlaylist.svelte | 15 + src/icons/DarkMode.svelte | 13 + src/icons/DeselectAll.svelte | 16 + src/icons/Download.svelte | 19 + src/icons/Edit.svelte | 12 + src/icons/Expand.svelte | 16 + src/icons/ExternalLink.svelte | 19 + src/icons/Feed.svelte | 17 + src/icons/GitHub.svelte | 15 + src/icons/Guide.svelte | 17 + src/icons/LightMode.svelte | 14 + src/icons/Link.svelte | 21 + src/icons/Menu.svelte | 21 + src/icons/Remove.svelte | 17 + src/icons/Reset.svelte | 15 + src/icons/Search.svelte | 14 + src/icons/SelectAll.svelte | 17 + src/icons/Share.svelte | 15 + src/icons/Spinner.svelte | 25 + src/icons/Stream.svelte | 16 + src/icons/index.ts | 29 + src/load.js | 22 - src/models/blocklistRecord.ts | 50 ++ src/models/broadcastArea.ts | 195 +++++++ src/models/category.ts | 27 + src/models/channel.js | 56 -- src/models/channel.ts | 537 ++++++++++++++++++ src/models/country.ts | 54 ++ src/models/feed.ts | 259 +++++++++ src/models/guide.ts | 58 ++ src/models/index.js | 1 - src/models/index.ts | 11 + src/models/language.ts | 27 + src/models/region.ts | 32 ++ src/models/stream.ts | 149 +++++ src/models/subdivision.ts | 31 + src/pages/+layout.svelte | 38 +- src/pages/+page.svelte | 168 ++++-- src/pages/channel/+page.svelte | 4 +- .../channels/[country]/[name]/+page.server.js | 52 -- .../channels/[country]/[name]/+page.server.ts | 35 ++ .../channels/[country]/[name]/+page.svelte | 214 +++---- src/store.js | 276 --------- src/store.ts | 43 ++ src/types/blocklistRecord.d.ts | 11 + src/types/broadcastArea.d.ts | 15 + src/types/category.d.ts | 9 + src/types/channel.d.ts | 87 +++ src/types/country.d.ts | 13 + src/types/feed.d.ts | 32 ++ src/types/guide.d.ts | 17 + src/types/htmlPreviewField.ts | 8 + src/types/jsonDataViewerField.ts | 4 + src/types/language.d.ts | 9 + src/types/region.d.ts | 11 + src/types/stream.d.ts | 17 + src/types/subdivision.d.ts | 11 + src/utils.ts | 23 + src/utils/apiClient.js | 52 -- 132 files changed, 4418 insertions(+), 1907 deletions(-) create mode 100644 src/actions/clickOutside.js create mode 100644 src/actions/index.js create mode 100644 src/commands/api/load.ts delete mode 100644 src/components/ActionButton.svelte create mode 100644 src/components/Badge.svelte create mode 100644 src/components/Button.svelte create mode 100644 src/components/Card.svelte create mode 100644 src/components/ChannelEditButton.svelte create mode 100644 src/components/ChannelRemoveButton.svelte create mode 100644 src/components/CodeBlock.svelte create mode 100644 src/components/CopyLinkButton.svelte delete mode 100644 src/components/DefaultButton.svelte delete mode 100644 src/components/Divider.svelte delete mode 100644 src/components/EditButton.svelte create mode 100644 src/components/FeedAddButton.svelte create mode 100644 src/components/FeedEditButton.svelte create mode 100644 src/components/FeedItem.svelte create mode 100644 src/components/FeedPopup.svelte create mode 100644 src/components/FeedRemoveButton.svelte create mode 100644 src/components/IconButton.svelte create mode 100644 src/components/Logo.svelte create mode 100644 src/components/Menu.svelte delete mode 100644 src/components/OutlineButton.svelte create mode 100644 src/components/Popup.svelte create mode 100644 src/components/ResetButton.svelte delete mode 100644 src/components/SearchFieldMini.svelte create mode 100644 src/components/ShareChannelButton.svelte delete mode 100644 src/components/SquareButton.svelte create mode 100644 src/components/index.ts create mode 100644 src/core/apiClient.ts create mode 100644 src/core/dataLoader.ts create mode 100644 src/core/dataProcessor.ts create mode 100644 src/core/dataStorage.ts create mode 100644 src/core/index.ts create mode 100644 src/core/playlistCreator.ts create mode 100644 src/core/searchEngine.ts create mode 100644 src/icons/Add.svelte create mode 100644 src/icons/Check.svelte create mode 100644 src/icons/CheckboxChecked.svelte create mode 100644 src/icons/CheckboxDisabled.svelte create mode 100644 src/icons/CheckboxIndeterminate.svelte create mode 100644 src/icons/CheckboxUnchecked.svelte create mode 100644 src/icons/Clear.svelte create mode 100644 src/icons/Close.svelte create mode 100644 src/icons/Copy.svelte create mode 100644 src/icons/CreatePlaylist.svelte create mode 100644 src/icons/DarkMode.svelte create mode 100644 src/icons/DeselectAll.svelte create mode 100644 src/icons/Download.svelte create mode 100644 src/icons/Edit.svelte create mode 100644 src/icons/Expand.svelte create mode 100644 src/icons/ExternalLink.svelte create mode 100644 src/icons/Feed.svelte create mode 100644 src/icons/GitHub.svelte create mode 100644 src/icons/Guide.svelte create mode 100644 src/icons/LightMode.svelte create mode 100644 src/icons/Link.svelte create mode 100644 src/icons/Menu.svelte create mode 100644 src/icons/Remove.svelte create mode 100644 src/icons/Reset.svelte create mode 100644 src/icons/Search.svelte create mode 100644 src/icons/SelectAll.svelte create mode 100644 src/icons/Share.svelte create mode 100644 src/icons/Spinner.svelte create mode 100644 src/icons/Stream.svelte create mode 100644 src/icons/index.ts delete mode 100644 src/load.js create mode 100644 src/models/blocklistRecord.ts create mode 100644 src/models/broadcastArea.ts create mode 100644 src/models/category.ts delete mode 100644 src/models/channel.js create mode 100644 src/models/channel.ts create mode 100644 src/models/country.ts create mode 100644 src/models/feed.ts create mode 100644 src/models/guide.ts delete mode 100644 src/models/index.js create mode 100644 src/models/index.ts create mode 100644 src/models/language.ts create mode 100644 src/models/region.ts create mode 100644 src/models/stream.ts create mode 100644 src/models/subdivision.ts delete mode 100644 src/pages/channels/[country]/[name]/+page.server.js create mode 100644 src/pages/channels/[country]/[name]/+page.server.ts delete mode 100644 src/store.js create mode 100644 src/store.ts create mode 100644 src/types/blocklistRecord.d.ts create mode 100644 src/types/broadcastArea.d.ts create mode 100644 src/types/category.d.ts create mode 100644 src/types/channel.d.ts create mode 100644 src/types/country.d.ts create mode 100644 src/types/feed.d.ts create mode 100644 src/types/guide.d.ts create mode 100644 src/types/htmlPreviewField.ts create mode 100644 src/types/jsonDataViewerField.ts create mode 100644 src/types/language.d.ts create mode 100644 src/types/region.d.ts create mode 100644 src/types/stream.d.ts create mode 100644 src/types/subdivision.d.ts create mode 100644 src/utils.ts delete mode 100644 src/utils/apiClient.js diff --git a/src/actions/clickOutside.js b/src/actions/clickOutside.js new file mode 100644 index 000000000..ba8c0d4de --- /dev/null +++ b/src/actions/clickOutside.js @@ -0,0 +1,15 @@ +export function clickOutside(node) { + const handleClick = event => { + if (node && !node.contains(event.target) && !event.defaultPrevented) { + node.dispatchEvent(new CustomEvent('outside', node)) + } + } + + document.addEventListener('click', handleClick, true) + + return { + destroy() { + document.removeEventListener('click', handleClick, true) + } + } +} diff --git a/src/actions/index.js b/src/actions/index.js new file mode 100644 index 000000000..d2b6fcf48 --- /dev/null +++ b/src/actions/index.js @@ -0,0 +1 @@ +export * from './clickOutside' diff --git a/src/app.css b/src/app.css index bd95b3fd5..d3d527a01 100644 --- a/src/app.css +++ b/src/app.css @@ -1,7 +1,49 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; + +@plugin "tailwind-scrollbar-hide"; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --color-primary-950: hsl(219, 23%, 5%); + --color-primary-900: hsl(219, 23%, 10%); + --color-primary-890: hsl(219, 23%, 11%); + --color-primary-880: hsl(219, 23%, 12%); + --color-primary-870: hsl(219, 23%, 13%); + --color-primary-860: hsl(219, 23%, 14%); + --color-primary-850: hsl(219, 23%, 15%); + --color-primary-840: hsl(219, 23%, 16%); + --color-primary-830: hsl(219, 23%, 17%); + --color-primary-820: hsl(219, 23%, 18%); + --color-primary-810: hsl(219, 23%, 19%); + --color-primary-800: hsl(219, 23%, 20%); + --color-primary-790: hsl(219, 23%, 21%); + --color-primary-780: hsl(219, 23%, 22%); + --color-primary-770: hsl(219, 23%, 23%); + --color-primary-760: hsl(219, 23%, 24%); + --color-primary-750: hsl(219, 23%, 25%); + --color-primary-740: hsl(219, 23%, 26%); + --color-primary-730: hsl(219, 23%, 27%); + --color-primary-720: hsl(219, 23%, 28%); + --color-primary-710: hsl(219, 23%, 29%); + --color-primary-700: hsl(219, 23%, 30%); + --color-primary-650: hsl(219, 23%, 35%); + --color-primary-600: hsl(219, 23%, 40%); + --color-primary-500: hsl(219, 23%, 50%); + --color-primary-400: hsl(219, 23%, 60%); + --color-primary-300: hsl(219, 23%, 70%); + --color-primary-200: hsl(219, 23%, 80%); + --color-primary-100: hsl(219, 23%, 90%); + --color-primary-50: hsl(219, 23%, 95%); +} html { overflow-y: scroll; } + +input[type='search']::-webkit-search-decoration, +input[type='search']::-webkit-search-cancel-button, +input[type='search']::-webkit-search-results-button, +input[type='search']::-webkit-search-results-decoration { + -webkit-appearance: none; +} diff --git a/src/commands/api/load.ts b/src/commands/api/load.ts new file mode 100644 index 000000000..7daa8c0b5 --- /dev/null +++ b/src/commands/api/load.ts @@ -0,0 +1,52 @@ +import { ApiClient, DataLoader, DataProcessor } from '../../core' +import { DataStorage } from '../../core/dataStorage' +import cliProgress from 'cli-progress' +import numeral from 'numeral' + +async function main() { + const progressBar = new cliProgress.MultiBar({ + stopOnComplete: true, + hideCursor: true, + forceRedraw: true, + barsize: 36, + format(options, params, payload) { + const filename = payload.filename.padEnd(18, ' ') + const barsize = options.barsize || 40 + const percent = (params.progress * 100).toFixed(2) + const speed = payload.speed ? numeral(payload.speed).format('0.0 b') + '/s' : 'N/A' + const total = numeral(params.total).format('0.0 b') + const completeSize = Math.round(params.progress * barsize) + const incompleteSize = barsize - completeSize + const bar = + options.barCompleteString && options.barIncompleteString + ? options.barCompleteString.substr(0, completeSize) + + options.barGlue + + options.barIncompleteString.substr(0, incompleteSize) + : '-'.repeat(barsize) + + return `${filename} [${bar}] ${percent}% | ETA: ${params.eta}s | ${total} | ${speed}` + } + }) + const storage = new DataStorage() + const processor = new DataProcessor() + const client = new ApiClient() + const dataLoader = new DataLoader({ storage, client, processor, progressBar }) + + const requests = [ + dataLoader.download('channels.json'), + dataLoader.download('feeds.json'), + dataLoader.download('categories.json'), + dataLoader.download('countries.json'), + dataLoader.download('regions.json'), + dataLoader.download('subdivisions.json'), + dataLoader.download('timezones.json'), + dataLoader.download('languages.json'), + dataLoader.download('streams.json'), + dataLoader.download('guides.json'), + dataLoader.download('blocklist.json') + ] + + await Promise.all(requests) +} + +main() diff --git a/src/components/ActionButton.svelte b/src/components/ActionButton.svelte deleted file mode 100644 index 9d0261e8d..000000000 --- a/src/components/ActionButton.svelte +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/src/components/Badge.svelte b/src/components/Badge.svelte new file mode 100644 index 000000000..fd968d450 --- /dev/null +++ b/src/components/Badge.svelte @@ -0,0 +1,5 @@ +
+ +
diff --git a/src/components/BlockedBadge.svelte b/src/components/BlockedBadge.svelte index 9348a4934..866df9804 100644 --- a/src/components/BlockedBadge.svelte +++ b/src/components/BlockedBadge.svelte @@ -1,49 +1,37 @@ - -
- Blocked -
+ +
+ Blocked +
+
diff --git a/src/components/BottomBar.svelte b/src/components/BottomBar.svelte index f079a7b92..5d951b926 100644 --- a/src/components/BottomBar.svelte +++ b/src/components/BottomBar.svelte @@ -1,30 +1,28 @@ -
-
-
- Selected {$selected.length.toLocaleString()} channel(s) -
-
- - - - { - downloadMode.set(false) - }} - /> +
+
+
+
+ {$selected.count()} selected +
+
+ + + + { + downloadMode.set(false) + }} + variant="light" + /> +
diff --git a/src/components/Button.svelte b/src/components/Button.svelte new file mode 100644 index 000000000..e892e7e9e --- /dev/null +++ b/src/components/Button.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/Card.svelte b/src/components/Card.svelte new file mode 100644 index 000000000..860c049b2 --- /dev/null +++ b/src/components/Card.svelte @@ -0,0 +1,16 @@ + + +
+
+ + +
+
+ +
+
diff --git a/src/components/ChannelEditButton.svelte b/src/components/ChannelEditButton.svelte new file mode 100644 index 000000000..3894ef470 --- /dev/null +++ b/src/components/ChannelEditButton.svelte @@ -0,0 +1,29 @@ + + + diff --git a/src/components/ChannelGrid.svelte b/src/components/ChannelGrid.svelte index 91d50d73c..cd9271de9 100644 --- a/src/components/ChannelGrid.svelte +++ b/src/components/ChannelGrid.svelte @@ -1,51 +1,36 @@ - -
-
-
-
-
-
-
-
- Name -
-
- ID -
-
- Actions -
-
-
-
- {#each channelsDisplay as channel, idx (channel)} - - {/each} -
+
+
+
+
+ {#each channelsDisplay.all() as channel, index (channel.id)} + + {/each}
- {#if channelsDisplay.length < channels.length} + {#if channelsDisplay.count() < channels.count()} Show More {/if}
diff --git a/src/components/ChannelItem.svelte b/src/components/ChannelItem.svelte index 3c6c888b1..2d424f106 100644 --- a/src/components/ChannelItem.svelte +++ b/src/components/ChannelItem.svelte @@ -1,45 +1,47 @@ - {#if $downloadMode}
- +
{/if}
-
+
- {#if channel.logo} + {#if channel.logoUrl} {displayName} {/if}
-
-
-
-
- - {displayName} - -
- {#if channel.is_closed} - - {/if} - {#if channel.is_blocked} - - {/if} -
-
- {#if channel.alt_names.length} -
- {channel.alt_names.join(', ')} -
- {/if} -
-
-
-
-
- {channel.id} +
+ + {channel.getDisplayName()} + + {#if channel.isClosed()} + + {/if} + {#if channel.isBlocked()} + + {/if}
+ {#if channel.altNames.notEmpty()} +
+ {channel.altNames.join(', ')} +
+ {/if}
-
+ +
- {#if guides.length} + {#if channel.hasFeeds()} - {/if}{#if streams.length} - {/if}
diff --git a/src/components/ChannelPopup.svelte b/src/components/ChannelPopup.svelte index 12d105a28..329c59fad 100644 --- a/src/components/ChannelPopup.svelte +++ b/src/components/ChannelPopup.svelte @@ -1,57 +1,72 @@ - -