Repository: jxxghp/MoviePilot-Frontend Branch: v2 Commit: b7857691382b Files: 377 Total size: 2.4 MB Directory structure: gitextract_ghdmazve/ ├── .editorconfig ├── .eslintrc.js ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── config.yml │ │ ├── discussion.yml │ │ ├── feature_request.yml │ │ └── rfc.yml │ └── workflows/ │ └── build.yml ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── .stylelintrc.json ├── .vscode/ │ ├── anchor-comments.code-snippets │ ├── extensions.json │ ├── settings.json │ ├── vue-ts.code-snippets │ ├── vue.code-snippets │ └── vuetify.code-snippets ├── LICENSE ├── README.md ├── README_EN.md ├── auto-imports.d.ts ├── components.d.ts ├── docs/ │ ├── federation-troubleshooting.md │ └── module-federation-guide.md ├── env.d.ts ├── examples/ │ └── plugin-component/ │ ├── README.md │ ├── index.html │ ├── package.json │ ├── src/ │ │ ├── App.vue │ │ ├── components/ │ │ │ ├── AppPage.vue │ │ │ ├── AppPageSettings.vue │ │ │ ├── Config.vue │ │ │ ├── Dashboard.vue │ │ │ └── Page.vue │ │ ├── main.js │ │ └── vuetify/ │ │ ├── defaults.ts │ │ └── theme.ts │ └── vite.config.js ├── index.html ├── package.json ├── postcss.config.js ├── public/ │ ├── nginx.conf │ ├── offline.html │ ├── robots.txt │ └── service.js ├── shims.d.ts ├── src/ │ ├── @core/ │ │ ├── components/ │ │ │ ├── ConfirmDialog.vue │ │ │ ├── DialogCloseBtn.vue │ │ │ ├── ErrorHeader.vue │ │ │ ├── ExistIcon.vue │ │ │ ├── LoadingBanner.vue │ │ │ ├── MoreBtn.vue │ │ │ ├── PageContentTitle.vue │ │ │ ├── ScrollToTopBtn.vue │ │ │ └── StatIcon.vue │ │ ├── libs/ │ │ │ └── apex-chart/ │ │ │ └── apexCharConfig.ts │ │ ├── scss/ │ │ │ ├── README.md │ │ │ ├── _components.scss │ │ │ ├── _dark.scss │ │ │ ├── _default-layout-w-vertical-nav.scss │ │ │ ├── _default-layout.scss │ │ │ ├── _misc.scss │ │ │ ├── _mixins.scss │ │ │ ├── _utilities.scss │ │ │ ├── _utils.scss │ │ │ ├── _variables.scss │ │ │ ├── _vertical-nav.scss │ │ │ ├── index.scss │ │ │ ├── libs/ │ │ │ │ ├── apex-chart.scss │ │ │ │ ├── full-calendar.scss │ │ │ │ ├── perfect-scrollbar.scss │ │ │ │ └── vuetify/ │ │ │ │ ├── _overrides.scss │ │ │ │ ├── _variables.scss │ │ │ │ └── index.scss │ │ │ ├── pages/ │ │ │ │ ├── misc.scss │ │ │ │ └── page-auth.scss │ │ │ └── placeholders/ │ │ │ ├── _default-layout.scss │ │ │ ├── _index.scss │ │ │ ├── _nav.scss │ │ │ └── _vertical-nav.scss │ │ └── utils/ │ │ ├── compatibility.ts │ │ ├── dom.ts │ │ ├── formatters.ts │ │ ├── image.ts │ │ ├── index.ts │ │ ├── navigator.ts │ │ ├── theme.ts │ │ └── workflow.ts │ ├── @iconify/ │ │ ├── build-icons.ts │ │ ├── tsconfig.json │ │ └── tsconfig.tsbuildinfo │ ├── @layouts/ │ │ ├── components/ │ │ │ ├── VerticalNav.vue │ │ │ ├── VerticalNavLayout.vue │ │ │ ├── VerticalNavLink.vue │ │ │ └── VerticalNavSectionTitle.vue │ │ ├── components.ts │ │ ├── index.ts │ │ ├── styles/ │ │ │ ├── _classes.scss │ │ │ ├── _default-layout.scss │ │ │ ├── _global.scss │ │ │ ├── _mixins.scss │ │ │ ├── _placeholders.scss │ │ │ ├── _rtl.scss │ │ │ ├── _variables.scss │ │ │ └── index.scss │ │ ├── types.d.ts │ │ └── utils.ts │ ├── @validators/ │ │ └── index.ts │ ├── App.vue │ ├── ace-config.ts │ ├── api/ │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── nprogress.ts │ │ └── types.ts │ ├── components/ │ │ ├── FileBrowser.vue │ │ ├── NoDataFound.vue │ │ ├── PWAInstallPrompt.vue │ │ ├── cards/ │ │ │ ├── BackdropCard.vue │ │ │ ├── CustomRuleCard.vue │ │ │ ├── DirectoryCard.vue │ │ │ ├── DownloaderCard.vue │ │ │ ├── DownloadingCard.vue │ │ │ ├── FilterRuleCard.vue │ │ │ ├── FilterRuleGroupCard.vue │ │ │ ├── LibraryCard.vue │ │ │ ├── MediaCard.vue │ │ │ ├── MediaInfoCard.vue │ │ │ ├── MediaServerCard.vue │ │ │ ├── MessageCard.vue │ │ │ ├── NotificationChannelCard.vue │ │ │ ├── PersonCard.vue │ │ │ ├── PluginAppCard.vue │ │ │ ├── PluginCard.vue │ │ │ ├── PluginFolderCard.vue │ │ │ ├── PluginMixedSortCard.vue │ │ │ ├── PosterCard.vue │ │ │ ├── SiteCard.vue │ │ │ ├── StorageCard.vue │ │ │ ├── SubscribeCard.vue │ │ │ ├── SubscribeShareCard.vue │ │ │ ├── TorrentCard.vue │ │ │ ├── TorrentItem.vue │ │ │ ├── UserCard.vue │ │ │ ├── WorkflowShareCard.vue │ │ │ └── WorkflowTaskCard.vue │ │ ├── dialog/ │ │ │ ├── AboutDialog.vue │ │ │ ├── AddDownloadDialog.vue │ │ │ ├── AlistConfigDialog.vue │ │ │ ├── AliyunAuthDialog.vue │ │ │ ├── CategoryEditDialog.vue │ │ │ ├── ForkSubscribeDialog.vue │ │ │ ├── ForkWorkflowDialog.vue │ │ │ ├── ImportCodeDialog.vue │ │ │ ├── MediaInfoDialog.vue │ │ │ ├── OTPAuthDialog.vue │ │ │ ├── PasskeyDialog.vue │ │ │ ├── PluginConfigDialog.vue │ │ │ ├── PluginDataDialog.vue │ │ │ ├── PluginMarketSettingDialog.vue │ │ │ ├── ProgressDialog.vue │ │ │ ├── RcloneConfigDialog.vue │ │ │ ├── ReorganizeDialog.vue │ │ │ ├── SearchBarDialog.vue │ │ │ ├── SearchSiteDialog.vue │ │ │ ├── SiteAddEditDialog.vue │ │ │ ├── SiteCookieUpdateDialog.vue │ │ │ ├── SiteImportDialog.vue │ │ │ ├── SiteResourceDialog.vue │ │ │ ├── SiteStatisticsDialog.vue │ │ │ ├── SiteUserDataDialog.vue │ │ │ ├── SmbConfigDialog.vue │ │ │ ├── SubscribeEditDialog.vue │ │ │ ├── SubscribeFilesDialog.vue │ │ │ ├── SubscribeHistoryDialog.vue │ │ │ ├── SubscribeSeasonDialog.vue │ │ │ ├── SubscribeShareDialog.vue │ │ │ ├── SubscribeShareStatisticsDialog.vue │ │ │ ├── TransferQueueDialog.vue │ │ │ ├── U115AuthDialog.vue │ │ │ ├── UserAddEditDialog.vue │ │ │ ├── UserAuthDialog.vue │ │ │ ├── WorkflowActionsDialog.vue │ │ │ ├── WorkflowAddEditDialog.vue │ │ │ └── WorkflowShareDialog.vue │ │ ├── field/ │ │ │ ├── CronField.vue │ │ │ └── PathField.vue │ │ ├── filebrowser/ │ │ │ ├── FileList.vue │ │ │ ├── FileNavigator.vue │ │ │ └── FileToolbar.vue │ │ ├── filter/ │ │ │ └── TorrentFilterBar.vue │ │ ├── input/ │ │ │ ├── CronInput.vue │ │ │ └── PathInput.vue │ │ ├── misc/ │ │ │ ├── DashboardElement.vue │ │ │ ├── FilterOption.vue │ │ │ ├── MediaIdSelector.vue │ │ │ └── VersionHistory.vue │ │ ├── render/ │ │ │ ├── DashboardRender.vue │ │ │ ├── FormRender.vue │ │ │ └── PageRender.vue │ │ ├── slide/ │ │ │ ├── SlideView.vue │ │ │ └── SlideViewTitle.vue │ │ ├── toast/ │ │ │ └── VersionUpdateToast.vue │ │ └── workflow/ │ │ ├── AddDownloadAction.vue │ │ ├── AddSubscribeAction.vue │ │ ├── FetchDownloadsAction.vue │ │ ├── FetchMediasAction.vue │ │ ├── FetchRssAction.vue │ │ ├── FetchTorrentsAction.vue │ │ ├── FilterMediasAction.vue │ │ ├── FilterTorrentsAction.vue │ │ ├── InvokePluginAction.vue │ │ ├── NoteAction.vue │ │ ├── ScanFileAction.vue │ │ ├── ScrapeFileAction.vue │ │ ├── SendEventAction.vue │ │ ├── SendMessageAction.vue │ │ └── TransferFileAction.vue │ ├── composables/ │ │ ├── useAvailableHeight.ts │ │ ├── useBackgroundOptimization.ts │ │ ├── useCacheManager.ts │ │ ├── useConfirm.ts │ │ ├── useDynamicButton.ts │ │ ├── useDynamicHeaderTab.ts │ │ ├── useInfiniteScroll.ts │ │ ├── useOfflineStatus.ts │ │ ├── usePWA.ts │ │ ├── usePWAInstall.ts │ │ ├── usePullDownGesture.ts │ │ ├── useRecentPlugins.ts │ │ ├── useSetupWizard.ts │ │ ├── useStateRestore.ts │ │ ├── useTorrentFilter.ts │ │ └── useVersionChecker.ts │ ├── layouts/ │ │ ├── blank.vue │ │ ├── components/ │ │ │ ├── DefaultLayout.vue │ │ │ ├── DropzoneBackground.vue │ │ │ ├── Footer.vue │ │ │ ├── HeaderTab.vue │ │ │ ├── OfflinePage.vue │ │ │ ├── QuickAccess.vue │ │ │ ├── SearchBar.vue │ │ │ ├── ShortcutBar.vue │ │ │ ├── UserNotification.vue │ │ │ ├── UserProfile.vue │ │ │ └── WorkflowSidebar.vue │ │ └── default.vue │ ├── locales/ │ │ ├── en-US.ts │ │ ├── zh-CN.ts │ │ └── zh-TW.ts │ ├── main.ts │ ├── pages/ │ │ ├── [...all].vue │ │ ├── appcenter.vue │ │ ├── browse.vue │ │ ├── calendar.vue │ │ ├── credits.vue │ │ ├── dashboard.vue │ │ ├── discover.vue │ │ ├── downloading.vue │ │ ├── filemanager.vue │ │ ├── history.vue │ │ ├── login.vue │ │ ├── media.vue │ │ ├── person.vue │ │ ├── plugin-app.vue │ │ ├── plugin.vue │ │ ├── profile.vue │ │ ├── recommend.vue │ │ ├── resource.vue │ │ ├── setting.vue │ │ ├── setup.vue │ │ ├── site.vue │ │ ├── subscribe-share.vue │ │ ├── subscribe.vue │ │ ├── user.vue │ │ └── workflow.vue │ ├── plugins/ │ │ ├── i18n.ts │ │ ├── stateRestore.ts │ │ ├── vuetify/ │ │ │ ├── defaults.ts │ │ │ ├── icons.ts │ │ │ ├── index.ts │ │ │ └── theme.ts │ │ └── webfontloader.ts │ ├── router/ │ │ ├── i18n-menu.ts │ │ └── index.ts │ ├── service-worker.ts │ ├── stores/ │ │ ├── auth.ts │ │ ├── global.ts │ │ ├── index.ts │ │ ├── pluginSidebarNav.ts │ │ ├── types.ts │ │ └── user.ts │ ├── styles/ │ │ ├── common.scss │ │ ├── main.scss │ │ ├── themes/ │ │ │ └── transparent.scss │ │ └── variables/ │ │ ├── _template.scss │ │ └── _vuetify.scss │ ├── types/ │ │ ├── global.d.ts │ │ ├── i18n.ts │ │ ├── service-worker-sync.d.ts │ │ └── workbox-precaching.d.ts │ ├── utils/ │ │ ├── appDeepLink.ts │ │ ├── backgroundManager.ts │ │ ├── badge.ts │ │ ├── colorUtils.ts │ │ ├── federationLoader.ts │ │ ├── globalSetting.ts │ │ ├── imageUtils.ts │ │ ├── loadingStateManager.ts │ │ ├── permission.ts │ │ ├── pluginSidebarNav.ts │ │ ├── requestOptimizer.ts │ │ ├── sseManager.ts │ │ └── themeManager.ts │ └── views/ │ ├── dashboard/ │ │ ├── AnalyticsCpu.vue │ │ ├── AnalyticsMediaStatistic.vue │ │ ├── AnalyticsMemory.vue │ │ ├── AnalyticsNetwork.vue │ │ ├── AnalyticsProcesses.vue │ │ ├── AnalyticsScheduler.vue │ │ ├── AnalyticsSpeed.vue │ │ ├── AnalyticsStorage.vue │ │ ├── AnalyticsWeeklyOverview.vue │ │ ├── MediaServerLatest.vue │ │ ├── MediaServerLibrary.vue │ │ └── MediaServerPlaying.vue │ ├── discover/ │ │ ├── BangumiView.vue │ │ ├── DoubanView.vue │ │ ├── ExtraSourceView.vue │ │ ├── MediaCardListView.vue │ │ ├── MediaCardSlideView.vue │ │ ├── MediaDetailView.vue │ │ ├── PersonCardListView.vue │ │ ├── PersonCardSlideView.vue │ │ ├── PersonDetailView.vue │ │ └── TheMovieDbView.vue │ ├── plugin/ │ │ └── PluginCardListView.vue │ ├── reorganize/ │ │ ├── DownloadingListView.vue │ │ ├── FileBrowserView.vue │ │ └── TransferHistoryView.vue │ ├── setting/ │ │ ├── AccountSettingDirectory.vue │ │ ├── AccountSettingNotification.vue │ │ ├── AccountSettingRule.vue │ │ ├── AccountSettingSearch.vue │ │ ├── AccountSettingSite.vue │ │ ├── AccountSettingSubscribe.vue │ │ └── AccountSettingSystem.vue │ ├── setup/ │ │ ├── AgentSettingsStep.vue │ │ ├── BasicSettingsStep.vue │ │ ├── ConnectivityTest.vue │ │ ├── DownloaderSettingsStep.vue │ │ ├── MediaServerSettingsStep.vue │ │ ├── NotificationSettingsStep.vue │ │ ├── PreferencesSettingsStep.vue │ │ ├── SiteAuthSettingsStep.vue │ │ └── StorageSettingsStep.vue │ ├── site/ │ │ └── SiteCardListView.vue │ ├── subscribe/ │ │ ├── FullCalendarView.vue │ │ ├── SubscribeListView.vue │ │ ├── SubscribePopularView.vue │ │ └── SubscribeShareView.vue │ ├── system/ │ │ ├── CacheView.vue │ │ ├── LoggingView.vue │ │ ├── MessageView.vue │ │ ├── ModuleTestView.vue │ │ ├── NameTestView.vue │ │ ├── NetTestView.vue │ │ ├── RuleTestView.vue │ │ ├── ServiceView.vue │ │ └── WordsView.vue │ ├── user/ │ │ ├── UserListView.vue │ │ └── UserProfileView.vue │ └── workflow/ │ ├── WorkflowListView.vue │ └── WorkflowShareView.vue ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ # EditorConfig is awesome: https://EditorConfig.org # top-most EditorConfig file root = true # Unix-style newlines with a newline ending every file [*] end_of_line = lf insert_final_newline = true # Matches multiple files with brace expansion notation # Set default charset [*.{js,py}] charset = utf-8 # 4 space indentation [*.py] indent_style = space indent_size = 4 # 2 space indentation [*.{vue,scss,ts}] indent_style = space indent_size = 2 # Tab indentation (no size specified) [Makefile] indent_style = tab # Indentation override for all JS under lib directory [lib/**.js] indent_style = space indent_size = 2 # Matches the exact files either package.json or .travis.yml [{package.json,.travis.yml}] indent_style = space indent_size = 2 ================================================ FILE: .eslintrc.js ================================================ module.exports = { env: { browser: true, es2021: true, }, extends: ['@antfu/eslint-config-vue', 'plugin:sonarjs/recommended'], ignorePatterns: ['src/@iconify/*.js', 'node_modules', 'dist', '*.d.ts'], plugins: ['regex'], rules: { 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 'sonarjs/no-duplicate-string': 'warn', 'vue/valid-v-slot': ['error', { allowModifiers: true, }], // https://github.com/gmullerb/eslint-plugin-regex 'regex/invalid': [ 'error', [ { regex: '@/assets/images', replacement: '@images', message: 'Use \'@images\' path alias for image imports', }, { regex: '@/styles', replacement: '@styles', message: 'Use \'@styles\' path alias for importing styles from \'src/styles\'', }, // { // id: 'Disallow icon of icon library', // regex: 'tabler-\\w', // message: 'Only \'mdi\' icons are allowed', // }, { regex: '@core/\\w', message: 'You can\'t use @core when you are in @layouts module', files: { inspect: '@layouts/.*', }, }, { regex: 'useLayouts\\(', message: '`useLayouts` composable is only allowed in @layouts & @core directory. Please use `useThemeConfig` composable instead.', files: { inspect: '^(?!.*(@core|@layouts)).*', }, }, ], // Ignore files '.eslintrc.js', ], }, settings: { 'import/resolver': { node: { extensions: ['.ts', '.js', '.tsx', '.jsx', '.mjs', '.png', '.jpg'], }, typescript: {}, }, }, } ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.yml ================================================ name: 问题反馈 description: File a bug report title: "[错误报告]:请在此处简单描述你的问题" labels: ["bug"] body: - type: markdown attributes: value: | 请确认以下信息: 1. 请按此模板提交issues,不按模板提交的问题将直接关闭。 2. 如果你的问题可以直接在以往 issue 或者 Telegram频道 中找到,那么你的 issue 将会被直接关闭。 3. 提交问题务必描述清楚、附上日志,描述不清导致无法理解和分析的问题会被直接关闭。 4. 此仓库为前端仓库,如果是后端问题请在[后端仓库](https://github.com/jxxghp/MoviePilot)提 issue。 - type: checkboxes id: ensure attributes: label: 确认 description: 在提交 issue 之前,请确认你已经阅读并确认以下内容 options: - label: 我的版本是最新版本,我的版本号与 [version](https://github.com/jxxghp/MoviePilot-Frontend/releases/latest) 相同。 required: true - label: 我已经 [issue](https://github.com/jxxghp/MoviePilot-Frontend/issues) 中搜索过,确认我的问题没有被提出过。 required: true - label: 我已经 [Telegram频道](https://t.me/moviepilot_channel) 中搜索过,确认我的问题没有被提出过。 required: true - label: 我已经修改标题,将标题中的 描述 替换为我遇到的问题。 required: true - type: input id: version attributes: label: 当前程序版本 description: 遇到问题时程序所在的版本号 validations: required: true - type: textarea id: what-happened attributes: label: 问题描述 description: 请详细描述你碰到的问题 placeholder: "问题描述" validations: required: true - type: textarea id: logs attributes: label: 发生问题时系统日志和配置文件 description: 问题出现时,程序运行日志请复制到这里。 render: bash ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Telegram 频道 url: https://t.me/moviepilot_channel about: 更新日志 - name: Telegram 交流群 url: https://t.me/moviepilot_official about: 交流互助 ================================================ FILE: .github/ISSUE_TEMPLATE/discussion.yml ================================================ name: 项目讨论 description: discussion title: "[Discussion]: " labels: ["discussion"] body: - type: markdown attributes: value: | [BUG](https://github.com/jxxghp/MoviePilot-Frontend/issues/new?assignees=&labels=bug&template=bug_report.yml&title=%5BBUG%5D%3A) 与 [Feature Request](https://github.com/jxxghp/MoviePilot-Frontend/issues/new?assignees=&labels=feature+request&template=feature_request.yml&title=%5BFeature+Request%5D%3A+) 请转到对应位置提交。 - type: textarea id: discussion attributes: label: 项目讨论 description: 请详细描述需要讨论的内容。 placeholder: "项目讨论" validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.yml ================================================ name: 功能改进 description: Feature Request title: "[Feature Request]: " labels: ["feature request"] body: - type: markdown attributes: value: | 请说明你希望添加的功能。 - type: input id: version attributes: label: 当前程序版本 description: 目前使用的程序版本 validations: required: true - type: textarea id: feature-request attributes: label: 功能改进 description: 请详细描述需要改进或者添加的功能。 placeholder: "功能改进" validations: required: true - type: textarea id: references attributes: label: 参考资料 description: 可以列举一些参考资料,但是不要引用同类但商业化软件的任何内容。 placeholder: "参考资料" ================================================ FILE: .github/ISSUE_TEMPLATE/rfc.yml ================================================ name: 功能提案 description: Request for Comments title: '[RFC]' labels: ['RFC'] body: - type: markdown attributes: value: | 一份提案(RFC)定位为 **「在某功能/重构的具体开发前,用于开发者间 review 技术设计/方案的文档」**, 目的是让协作的开发者间清晰的知道「要做什么」和「具体会怎么做」,以及所有的开发者都能公开透明的参与讨论; 以便评估和讨论产生的影响 (遗漏的考虑、向后兼容性、与现有功能的冲突), 因此提案侧重在对解决问题的 **方案、设计、步骤** 的描述上。 如果仅希望讨论是否添加或改进某功能本身,请使用 -> [Issue: 功能改进](https://github.com/jxxghp/MoviePilot/issues/new?assignees=&labels=feature+request&projects=&template=feature_request.yml&title=%5BFeature+Request%5D%3A+) - type: textarea id: background attributes: label: 背景 or 问题 description: 简单描述遇到的什么问题或需要改动什么。可以引用其他 issue、讨论、文档等。 validations: required: true - type: textarea id: goal attributes: label: '目标 & 方案简述' description: 简单描述提案此提案实现后,**预期的目标效果**,以及简单大致描述会采取的方案/步骤,可能会/不会产生什么影响。 validations: required: true - type: textarea id: design attributes: label: '方案设计 & 实现步骤' description: | 详细描述你设计的具体方案,可以考虑拆分列表或要点,一步步描述具体打算如何实现的步骤和相关细节。 这部份不需要一次性写完整,即使在创建完此提案 issue 后,依旧可以再次编辑修改。 validations: required: false - type: textarea id: alternative attributes: label: '替代方案 & 对比' description: | [可选] 为来实现目标效果,还考虑过什么其他方案,有什么对比? validations: required: false ================================================ FILE: .github/workflows/build.yml ================================================ name: Build Moviepilot-Frontend v2 on: workflow_dispatch: push: branches: - v2 paths: - 'package.json' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Release version id: release_version run: | frontend_version=$(jq -r '.version' package.json) echo "frontend_version=v$frontend_version" >> $GITHUB_ENV - name: Setup node uses: actions/setup-node@v3 with: node-version: '20' cache: 'yarn' - name: Download Icons run: | pwd curl -sL "https://github.com/jxxghp/MoviePilot-Plugins/archive/refs/heads/main.zip" | busybox unzip -d /tmp - mv /tmp/MoviePilot-Plugins-main/icons public/plugin_icon rm -rf /tmp/MoviePilot-Plugins-main - name: Build frontend id: build_frontend run: | yarn yarn build echo "$frontend_version" > dist/version.txt zip -r dist.zip dist - name: Delete Release uses: dev-drprasad/delete-tag-and-release@v1.1 continue-on-error: true with: tag_name: ${{ env.frontend_version }} delete_release: true github_token: ${{ secrets.GITHUB_TOKEN }} - name: Generate Release uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.frontend_version }} name: ${{ env.frontend_version }} draft: false prerelease: false make_latest: true files: | dist.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log* node_modules .DS_Store dist dist-ssr dev-dist *.local package-lock.json /cypress/videos/ /cypress/screenshots/ # Editor directories and files .vscode/* !.vscode/extensions.json !.vscode/settings.json !.vscode/*.code-snippets !.vscode/tours .idea *.suo *.ntvs* *.njsproj *.sln *.sw? .yarn # iconify dist files src/@iconify/*.js public/plugin_icon/** ================================================ FILE: .prettierignore ================================================ dist node_modules ================================================ FILE: .prettierrc.json ================================================ { "arrowParens": "avoid", "bracketSpacing": true, "htmlWhitespaceSensitivity": "css", "insertPragma": false, "jsxBracketSameLine": false, "jsxSingleQuote": true, "printWidth": 120, "proseWrap": "preserve", "quoteProps": "preserve", "requirePragma": false, "semi": false, "singleQuote": true, "tabWidth": 2, "trailingComma": "all", "useTabs": false, "vueIndentScriptAndStyle": false, "endOfLine": "lf", "singleAttributePerLine": false } ================================================ FILE: .stylelintrc.json ================================================ { "extends": [ "stylelint-config-standard-scss", "stylelint-config-idiomatic-order" ], "plugins": [ "stylelint-use-logical-spec" ], "overrides": [ { "files": [ "**/*.scss" ], "customSyntax": "postcss-scss" }, { "files": [ "**/*.vue" ], "customSyntax": "postcss-html" } ], "rules": { "liberty/use-logical-spec": true, "selector-class-pattern": null, "color-function-notation": null }, "fix": true } ================================================ FILE: .vscode/anchor-comments.code-snippets ================================================ { "Add hand emoji": { "prefix": "cm-hand-emoji", "body": [ "👉" ], "description": "Add hand emoji" }, "Add info emoji": { "prefix": "cm-info-emoji", "body": [ "ℹ️" ], "description": "Add info emoji" }, "Add warning emoji": { "prefix": "cm-warning-emoji", "body": [ "❗" ], "description": "Add warning emoji" } } ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": [ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "mgmcdermott.vscode-language-babel", "editorconfig.editorconfig", "xabikos.javascriptsnippets", "stylelint.vscode-stylelint", "fabiospampinato.vscode-highlight", "github.vscode-pull-request-github", "vue.volar", "antfu.iconify", "cipchk.cssrem", "matijao.vue-nuxt-snippets" ] } ================================================ FILE: .vscode/settings.json ================================================ { "editor.formatOnSave": true, "javascript.updateImportsOnFileMove.enabled": "always", "editor.defaultFormatter": "esbenp.prettier-vscode", "files.eol": "\n", "[javascript]": { "editor.formatOnSave": false }, "[markdown]": { "editor.defaultFormatter": "DavidAnson.vscode-markdownlint" }, // SCSS "[scss]": { "editor.defaultFormatter": "stylelint.vscode-stylelint", "editor.formatOnSave": false }, // JSON "[json]": { "editor.defaultFormatter": "vscode.json-language-features" }, "[jsonc]": { "editor.defaultFormatter": "vscode.json-language-features" }, // Vue "[vue]": { "editor.formatOnSave": true }, // Extension: Volar "volar.preview.port": 3000, "volar.completion.preferredTagNameCase": "pascal", "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.fixAll.stylelint": "explicit" }, "[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, "eslint.alwaysShowStatus": true, "eslint.format.enable": true, // Extension: Stylelint "stylelint.packageManager": "yarn", "stylelint.validate": [ "css", "scss", "vue" ], // Extension: Spell Checker "cSpell.words": [ "Composables", "Customizer", "flagpack", "Iconify", "psudo", "stylelint", "touchless", "triggerer", "unref", "vuetify" ], // Extension: Comment Anchors "commentAnchors.tags.list": [ { "tag": "ℹ️", "scope": "hidden", // This color is taken from "Better Comments" Extension (?) "highlightColor": "#3498DB", "styleComment": true, "isItalic": false }, { "tag": "👉", "scope": "file", // This color is taken from "Better Comments" Extension (*) "highlightColor": "#98C379", "styleComment": true, "isItalic": false }, { "tag": "❗", "scope": "hidden", // This color is taken from "Better Comments" Extension (*) "highlightColor": "#FF2D00", "styleComment": true, "isItalic": false } ], // Extension: fabiospampinato.vscode-highlight "highlight.regexFlags": "gi", "highlight.regexes": { // We flaged this for enforcing logical CSS properties "(100vh|translate|margin:|padding:|margin-left|margin-right|rotate|text-align|border-top|border-right|border-bottom|border-left|float|background-position|transform|width|height|top|left|bottom|right|float|clear|(p|m)(l|r)-|border-(start|end)-(start|end)-radius)": [ { // "rangeBehavior": 1, "borderWidth": "1px", "borderColor": "tomato", "borderStyle": "solid" } ], "(overflow-x:|overflow-y:)": [ { // "rangeBehavior": 1, "borderWidth": "1px", "borderColor": "green", "borderStyle": "solid" } ] }, "vue3snippets.enable-compile-vue-file-on-did-save-code": false, "i18n-ally.localesPaths": [ "src/locales" ] } ================================================ FILE: .vscode/vue-ts.code-snippets ================================================ { "Vue TS - DefineProps": { "prefix": "dprops", "body": [ "defineProps<${1:Props}>()" ], "description": "DefineProps in script setup" }, "Vue TS - Props interface": { "prefix": "iprops", "body": [ "interface Props {", " ${1}", "}" ], "description": "Create props interface in script setup" } } ================================================ FILE: .vscode/vue.code-snippets ================================================ { "script": { "prefix": "vue-sfc-ts", "body": [ "", "", "", "", "", "" ], "description": "Vue SFC Typescript" }, "template": { "scope": "vue", "prefix": "template", "body": [ "" ], "description": "Create