├── .github ├── FUNDING.yml ├── renovate.json └── workflows │ ├── codetests.yml │ └── release.yml ├── .gitignore ├── .golangci.yml ├── LICENSE ├── Makefile ├── README.md ├── build ├── README.md ├── appicon.png ├── darwin │ ├── Info.dev.plist │ ├── Info.plist │ ├── makedmg.sh │ ├── notarize.json │ └── sign.json ├── icon.icns └── windows │ ├── icon.ico │ ├── info.json │ ├── installer │ ├── project.nsi │ ├── resources │ │ ├── eula.txt │ │ ├── side.bmp │ │ └── side.psdb │ ├── tmp │ │ └── MicrosoftEdgeWebview2Setup.exe │ └── wails_tools.nsh │ ├── signexe.sh │ └── wails.exe.manifest ├── frontend ├── index.html ├── package-lock.json ├── package.json ├── package.json.md5 ├── src │ ├── About.svelte │ ├── Landing.svelte │ ├── Links.svelte │ ├── Navbar.svelte │ ├── Settings │ │ ├── Advanced.svelte │ │ ├── General.svelte │ │ ├── Index.svelte │ │ └── Logs.svelte │ ├── Starr │ │ ├── Actions │ │ │ ├── AppProfiles.svelte │ │ │ ├── BlockLists.svelte │ │ │ ├── CustomFilters.svelte │ │ │ ├── DownloadClients.svelte │ │ │ ├── Exclusions.svelte │ │ │ ├── ImportLists.svelte │ │ │ ├── Index.svelte │ │ │ ├── Indexers.svelte │ │ │ ├── QualityProfiles.svelte │ │ │ ├── action.svelte │ │ │ ├── blockListsRow.svelte │ │ │ ├── fragments │ │ │ │ ├── configModal.svelte │ │ │ │ ├── dropdown.svelte │ │ │ │ ├── fieldInput.svelte │ │ │ │ ├── footer.svelte │ │ │ │ ├── modalInput.svelte │ │ │ │ ├── paginate.svelte │ │ │ │ ├── selectAllHeader.svelte │ │ │ │ ├── selectAllRow.svelte │ │ │ │ ├── tableInput.svelte │ │ │ │ └── tabs.svelte │ │ │ └── methods.ts │ │ ├── Config │ │ │ ├── Index.svelte │ │ │ └── Instance.svelte │ │ ├── Database │ │ │ ├── Index.svelte │ │ │ ├── Inspector.svelte │ │ │ └── Migrator │ │ │ │ ├── Form.svelte │ │ │ │ └── Index.svelte │ │ ├── Index.svelte │ │ └── loading.svelte │ ├── Toolbox.svelte │ ├── assets │ │ ├── bootstrap-icons.css │ │ ├── bootstrap.darkly.css │ │ ├── bootstrap.flatly.css │ │ ├── fonts │ │ │ ├── OFL.txt │ │ │ ├── S6u8w4BMUTPHjxswWw.ttf │ │ │ ├── S6u9w4BMUTPHh6UVew8.ttf │ │ │ ├── S6uyw4BMUTPHvxk.ttf │ │ │ ├── bootstrap-icons.woff │ │ │ ├── bootstrap-icons.woff2 │ │ │ └── nunito-v16-latin-regular.woff2 │ │ └── images │ │ │ ├── Lidarr.png │ │ │ ├── Prowlarr.png │ │ │ ├── Radarr.png │ │ │ ├── Readarr.png │ │ │ ├── Sonarr.png │ │ │ ├── Toolbox.png │ │ │ ├── Whisparr.png │ │ │ ├── dark-background.png │ │ │ ├── golift.png │ │ │ ├── logo.png │ │ │ ├── notifiarr.png │ │ │ ├── servarr.png │ │ │ ├── settings.png │ │ │ ├── vintage-background.png │ │ │ └── windows-conf-file.png │ ├── index.ts │ ├── libs │ │ ├── Applogo.svelte │ │ ├── BackgroundLogo.svelte │ │ ├── Input.svelte │ │ ├── Link.svelte │ │ ├── Translate.svelte │ │ ├── config.ts │ │ ├── funcs.ts │ │ ├── info.ts │ │ └── locale │ │ │ ├── da.json │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── index.ts │ │ │ ├── it.json │ │ │ ├── nl.json │ │ │ ├── pt.json │ │ │ └── sv.json │ ├── style.css │ └── vite-env.d.ts ├── svelte.config.js ├── tsconfig.json ├── vite.config.ts └── wailsjs │ ├── go │ ├── app │ │ ├── App.d.ts │ │ └── App.js │ ├── models.ts │ └── starrs │ │ ├── Starrs.d.ts │ │ └── Starrs.js │ └── runtime │ ├── package.json │ ├── runtime.d.ts │ └── runtime.js ├── go.mod ├── go.sum ├── main.go ├── pkg ├── app │ ├── app.go │ ├── instances.go │ ├── setup.go │ └── updates.go ├── config │ ├── config.go │ └── settings.go ├── local │ ├── local.go │ ├── local_darwin.go │ ├── local_other.go │ ├── local_windows.go │ └── shortcut_windows.go ├── logs │ ├── filemode.go │ ├── interface.go │ ├── logs.go │ ├── logs_linux.go │ ├── logs_others.go │ └── logs_windows.go ├── mnd │ ├── constants.go │ ├── functions.go │ └── interface.go ├── starrs │ ├── blocklist.go │ ├── downloaders.go │ ├── exclusions.go │ ├── importable.go │ ├── importlist.go │ ├── indexers.go │ ├── migrator.go │ ├── profiles.go │ ├── prowlarr.go │ ├── rootfolders.go │ ├── sqlite3.go │ ├── starrs.go │ ├── tags.go │ └── test.go ├── translations │ ├── .gitignore │ ├── build.sh │ ├── locale.go │ └── locales │ │ ├── da │ │ └── messages.gotext.json │ │ ├── en │ │ └── messages.gotext.json │ │ ├── es │ │ └── messages.gotext.json │ │ ├── fr │ │ └── messages.gotext.json │ │ ├── it │ │ └── messages.gotext.json │ │ ├── nl │ │ └── messages.gotext.json │ │ ├── pt │ │ └── messages.gotext.json │ │ └── sv │ │ └── messages.gotext.json └── update │ ├── check.go │ ├── progress.go │ ├── unstable.go │ └── update.go └── wails.json /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [Notifiarr] 2 | -------------------------------------------------------------------------------- /.github/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:base" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.github/workflows/codetests.yml: -------------------------------------------------------------------------------- 1 | name: test-and-lint 2 | on: push 3 | permissions: 4 | contents: read 5 | jobs: 6 | gotest: 7 | # description: "Runs `go test` against 3 operating systems." 8 | strategy: 9 | matrix: 10 | os: [ubuntu, macos, windows] 11 | runs-on: ${{ matrix.os }}-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: actions/setup-go@v5 15 | with: 16 | go-version-file: 'go.mod' 17 | - name: go-test 18 | run: go test ./pkg/... 19 | 20 | codespell: 21 | runs-on: ubuntu-latest 22 | steps: 23 | - uses: actions/checkout@v4 24 | - uses: codespell-project/actions-codespell@v2 25 | with: 26 | check_hidden: true 27 | skip: .git,node_modules,dist,catalog.go,*.json,models.ts 28 | 29 | golangci: 30 | strategy: 31 | matrix: 32 | os: [darwin, linux, windows] 33 | name: golangci-lint 34 | runs-on: ubuntu-latest 35 | env: 36 | GOOS: ${{ matrix.os }} 37 | steps: 38 | - uses: actions/checkout@v4 39 | - uses: actions/setup-go@v5 40 | with: 41 | go-version-file: 'go.mod' 42 | - name: golangci-lint 43 | uses: golangci/golangci-lint-action@v6 44 | with: 45 | version: 'v1.57' 46 | args: --verbose ./pkg/... 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/bin 2 | node_modules 3 | frontend/dist 4 | /toolbarr* 5 | .DS* 6 | /Toolbarr* 7 | /*.new 8 | ? 9 | *.signing.* -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | linters: 2 | enable-all: true 3 | disable: 4 | # deprecated 5 | - maligned 6 | - scopelint 7 | - interfacer 8 | - golint 9 | - exhaustivestruct 10 | - nosnakecase 11 | - structcheck 12 | - deadcode 13 | - varcheck 14 | - ifshort 15 | # unused 16 | - dupl 17 | - wrapcheck 18 | - goerr113 19 | - exhaustruct 20 | - exhaustive 21 | - containedctx 22 | - nlreturn 23 | - contextcheck 24 | - depguard 25 | - perfsprint 26 | run: 27 | timeout: 5m -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022-2024 Notifiarr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # The Makefile is not used for GitHub Actions or official builds. Only used for development and testing. 2 | VERSION=$(shell git describe --abbrev=0 --tags $(shell git rev-list --tags --max-count=1) | tr -d v) 3 | COMMIT="$(shell git rev-parse --short HEAD || echo 0)" 4 | BRANCH="$(shell git rev-parse --abbrev-ref HEAD || echo unknown)" 5 | ifeq ($(VERSION),) 6 | VERSION:=0.0.0 7 | endif 8 | ifeq ($(REVISION),) 9 | REVISION=$(shell git rev-list --count --all || echo 0) 10 | endif 11 | 12 | VERSION_LDFLAGS:= -X \"golift.io/version.Branch=$(BRANCH) ($(COMMIT))\" \ 13 | -X \"golift.io/version.BuildDate=$(shell date -u +%Y-%m-%dT%H:%M:00Z)\" \ 14 | -X \"golift.io/version.BuildUser=$(shell whoami || echo "unknown")\" \ 15 | -X \"golift.io/version.Revision=$(REVISION)\" \ 16 | -X \"golift.io/version.Version=$(VERSION)\" 17 | 18 | .PHONY: all wailsjson build windows dev lint test 19 | 20 | all: 21 | @echo "Use 'make build', 'make dev' or 'make windows'" 22 | 23 | wailsjson: 24 | jq ".info.productVersion = \"$(VERSION)\"" wails.json > wails.json.new 25 | mv wails.json.new wails.json 26 | packagejson: 27 | jq ".version = \"$(VERSION)\"" frontend/package.json > frontend/package.json.new 28 | mv frontend/package.json.new frontend/package.json 29 | 30 | build: wailsjson packagejson 31 | wails build -debug -ldflags "$(VERSION_LDFLAGS)" 32 | 33 | windows: wailsjson packagejson 34 | wails build -debug -platform windows/amd64 -nsis -ldflags "$(VERSION_LDFLAGS)" 35 | 36 | dev: wailsjson packagejson 37 | wails dev -nosyncgomod -race -ldflags "$(VERSION_LDFLAGS)" 38 | 39 | # npm?? svelte? hm.. 40 | lint: 41 | codespell -S .git,node_modules,dist,catalog.go,*.json,models.ts 42 | GOOS=darwin golangci-lint run 43 | GOOS=linux golangci-lint run 44 | GOOS=windows golangci-lint run 45 | 46 | test: lint 47 | go test -race ./... 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 3 | 4 | Provides a suite of utilities to fix problems with Starr applications. 5 | Toolbarr allows you to perform various actions against your Starr apps and their SQLite3 databases. 6 | 7 | # Features 8 | 9 | The first release provides 1 major feature: 10 | 11 | - **Updating Root Folders**: Use this when you need to 12 | [migrate your starr application](https://github.com/Notifiarr/toolbarr/wiki/Change-Root-Folder) 13 | to another host, and the file system paths to your media are changing. 14 | 15 | And several other features: 16 | 17 | - Mass Quality Profiles management. 18 | - Mass Indexer management. 19 | - Mass Import List management. 20 | - Mass Import List Exclsions management. 21 | - Mass Download Client management. 22 | - Mass Block List management. 23 | 24 | # How? 25 | 26 | Run this application on _your_ computer (mac/windows). 27 | Configure it with your starr app details (url/api key), and an optional sqlite3 database file. 28 | 29 | # Installation 30 | 31 | There's a DMG for mac users and an EXE installer for Windows users on the 32 | [Releases](https://github.com/Notifiarr/toolbarr/releases) page. 33 | Download the latest file for your OS and install it. Once installed, 34 | you can use the `About` menu to check for updates. 35 | 36 | **While things are under development, you can grab a copy of the Windows or macOS installer 37 | @ [https://unstable.golift.io/toolbarr](https://unstable.golift.io/toolbarr)** 38 | 39 | Linux users may not have great luck with the binaries provided. 40 | They only work on a specific version of `glibc`. 41 | Prepare to compile it yourself, but you can try installing it from the repo first: 42 | 43 | ```shell 44 | curl -s https://golift.io/repo.sh | sudo bash -s - toolbarr 45 | ``` 46 | 47 | # Caution 48 | 49 | This app may be destructive. Make backups. Do not connect it to a live SQLite database file; use a backup copy! 50 | 51 | The `Actions` tab is safe, and well tested with the four primary Starr apps. 52 | Prowlarr has limited support. Whisparr may work, but is not tested. 53 | 54 | # I want more.. 55 | 56 | We do too. What other things do you want to do Sonarr or Radarr that you just can't do easily some other way? 57 | **This is a work in progress and your input will make it work better!** 58 | 59 | - [Let us know how we can make your life easier](https://github.com/Notifiarr/toolbarr/issues/new). 60 | -------------------------------------------------------------------------------- /build/README.md: -------------------------------------------------------------------------------- 1 | # Build Directory 2 | 3 | The build directory is used to house all the build files and assets for this application. 4 | 5 | The structure is: 6 | 7 | * bin - Output directory (not committed) 8 | * darwin - macOS specific build files 9 | * windows - Windows specific build files 10 | * appicon.png - Used for menu dialogs and whatnot. 11 | 12 | ## Mac 13 | 14 | - `icon.icns` - App bundle icon file. 15 | 16 | The `darwin` directory holds files specific to Mac builds. 17 | These may be customised and used as part of the build. 18 | To return these files to the default state, simply delete them and build with `wails build`. 19 | 20 | The directory contains the following files: 21 | 22 | - `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`. 23 | - `Info.dev.plist` - same as the main plist file but used when building using `wails dev`. 24 | 25 | ## Windows 26 | 27 | The `windows` directory contains the manifest and rc files used when building with `wails build`. 28 | These may be customised for your application. To return these files to the default state, simply delete them and 29 | build with `wails build`. 30 | 31 | - `icon.ico` - The icon used for the application. This is used when building using `wails build`. 32 | - `installer/*` - The files used to create the Windows installer. These are used when building using `wails build`. 33 | - `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer, 34 | as well as the application itself (right click the exe -> properties -> details) 35 | - `wails.exe.manifest` - The main application manifest file. -------------------------------------------------------------------------------- /build/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/appicon.png -------------------------------------------------------------------------------- /build/darwin/Info.dev.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundlePackageType 5 | APPL 6 | CFBundleName 7 | {{.Info.ProductName}} 8 | CFBundleExecutable 9 | {{.Name}} 10 | CFBundleIdentifier 11 | com.notifiarr.toolbarr 12 | CFBundleVersion 13 | {{.Info.ProductVersion}} 14 | CFBundleGetInfoString 15 | {{.Info.Comments}} 16 | CFBundleShortVersionString 17 | {{.Info.ProductVersion}} 18 | CFBundleIconFile 19 | iconfile 20 | LSMinimumSystemVersion 21 | 10.13.0 22 | NSHighResolutionCapable 23 | true 24 | NSHumanReadableCopyright 25 | {{.Info.Copyright}} 26 | NSAppTransportSecurity 27 | 28 | NSAllowsArbitraryLoads 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /build/darwin/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | CFBundlePackageType 5 | APPL 6 | CFBundleName 7 | {{.Info.ProductName}} 8 | CFBundleExecutable 9 | {{.Name}} 10 | CFBundleIdentifier 11 | com.notifiarr.toolbarr 12 | CFBundleVersion 13 | {{.Info.ProductVersion}} 14 | CFBundleGetInfoString 15 | {{.Info.Comments}} 16 | CFBundleShortVersionString 17 | {{.Info.ProductVersion}} 18 | CFBundleIconFile 19 | iconfile 20 | LSMinimumSystemVersion 21 | 10.13.0 22 | NSHighResolutionCapable 23 | true 24 | NSHumanReadableCopyright 25 | {{.Info.Copyright}} 26 | NSAppTransportSecurity 27 | 28 | NSAllowsArbitraryLoads 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /build/darwin/makedmg.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # This file builds a standard DMG installer for macOS. 3 | # This only works on macOS. 4 | ########################################### 5 | 6 | set -e -o pipefail 7 | 8 | # If we are running in GH Actions, make a new keychain and import the certificate. 9 | if [ -n "$APPLE_SIGNING_KEY" ]; then 10 | KEYCHAIN="ios-build.keychain" 11 | 12 | echo "==> Creating new keychain: $KEYCHAIN" 13 | security create-keychain -p secret $KEYCHAIN 14 | 15 | echo "==> Importing certificate into ${KEYCHAIN}" 16 | echo "${APPLE_SIGNING_KEY}" | base64 -d | \ 17 | security import /dev/stdin -P '' -f pkcs12 -k $KEYCHAIN -T /usr/bin/codesign 18 | 19 | echo "==> Unlocking keychain ${KEYCHAIN}" 20 | security unlock-keychain -p secret $KEYCHAIN 21 | 22 | echo "==> Increase keychain unlock timeout to 1 hour." 23 | security set-keychain-settings -lut 3600 $KEYCHAIN 24 | 25 | security set-key-partition-list -S apple-tool:,apple: -s -k secret $KEYCHAIN 26 | 27 | echo "==> Add keychain to keychain-list" 28 | security list-keychains -s $KEYCHAIN 29 | fi 30 | 31 | echo "==> Signing App." 32 | gon build/darwin/sign.json 33 | 34 | # Creating non-notarized DMG. 35 | mkdir -p build/bin 36 | hdiutil create build/bin/Toolbarr.dmg -srcfolder build/bin/Toolbarr.app -ov 37 | 38 | echo "==> Notarizing DMG." 39 | gon build/darwin/notarize.json 40 | 41 | echo "==> Finished." 42 | -------------------------------------------------------------------------------- /build/darwin/notarize.json: -------------------------------------------------------------------------------- 1 | { 2 | "notarize": [{ 3 | "path": "build/bin/Toolbarr.dmg", 4 | "bundle_id": "com.notifiarr.toolbarr", 5 | "staple": true 6 | }] 7 | } 8 | -------------------------------------------------------------------------------- /build/darwin/sign.json: -------------------------------------------------------------------------------- 1 | { 2 | "source": ["build/bin/Toolbarr.app"], 3 | "bundle_id": "com.notifiarr.toolbarr", 4 | "sign": { "application_identity" : "1AE9653F18114B23927AF7FA6624EF74F95A4544" } 5 | } 6 | -------------------------------------------------------------------------------- /build/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/icon.icns -------------------------------------------------------------------------------- /build/windows/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/windows/icon.ico -------------------------------------------------------------------------------- /build/windows/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "fixed": { 3 | "file_version": "{{.Info.ProductVersion}}" 4 | }, 5 | "info": { 6 | "0000": { 7 | "ProductVersion": "{{.Info.ProductVersion}}", 8 | "CompanyName": "{{.Info.CompanyName}}", 9 | "FileDescription": "{{.Info.ProductName}}", 10 | "LegalCopyright": "{{.Info.Copyright}}", 11 | "ProductName": "{{.Info.ProductName}}", 12 | "Comments": "{{.Info.Comments}}" 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /build/windows/installer/project.nsi: -------------------------------------------------------------------------------- 1 | Unicode true 2 | 3 | #### 4 | ## Please note: Template replacements don't work in this file. They are provided with default defines like 5 | ## mentioned underneath. 6 | ## If the keyword is not defined, "wails_tools.nsh" will populate them with the values from ProjectInfo. 7 | ## If they are defined here, "wails_tools.nsh" will not touch them. This allows to use this project.nsi manually 8 | ## from outside of Wails for debugging and development of the installer. 9 | ## 10 | ## For development first make a wails nsis build to populate the "wails_tools.nsh": 11 | ## > wails build --target windows/amd64 --nsis 12 | ## Then you can call makensis on this file with specifying the path to your binary: 13 | ## For a AMD64 only installer: 14 | ## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app.exe 15 | ## For a ARM64 only installer: 16 | ## > makensis -DARG_WAILS_ARM64_BINARY=..\..\bin\app.exe 17 | ## For a installer with both architectures: 18 | ## > makensis -DARG_WAILS_AMD64_BINARY=..\..\bin\app-amd64.exe -DARG_WAILS_ARM64_BINARY=..\..\bin\app-arm64.exe 19 | #### 20 | ## The following information is taken from the ProjectInfo file, but they can be overwritten here. 21 | #### 22 | ## !define INFO_PROJECTNAME "MyProject" # Default "{{.Name}}" 23 | ## !define INFO_COMPANYNAME "MyCompany" # Default "{{.Info.CompanyName}}" 24 | ## !define INFO_PRODUCTNAME "MyProduct" # Default "{{.Info.ProductName}}" 25 | ## !define INFO_PRODUCTVERSION "1.0.0" # Default "{{.Info.ProductVersion}}" 26 | ## !define INFO_COPYRIGHT "Copyright" # Default "{{.Info.Copyright}}" 27 | ### 28 | ## !define PRODUCT_EXECUTABLE "Application.exe" # Default "${INFO_PROJECTNAME}.exe" 29 | ## !define UNINST_KEY_NAME "UninstKeyInRegistry" # Default "${INFO_COMPANYNAME}${INFO_PRODUCTNAME}" 30 | #### 31 | ## !define REQUEST_EXECUTION_LEVEL "admin" # Default "admin" see also https://nsis.sourceforge.io/Docs/Chapter4.html 32 | #### 33 | ## Include the wails tools 34 | #### 35 | !include "wails_tools.nsh" 36 | 37 | # The version information for this two must consist of 4 parts 38 | VIProductVersion "${INFO_PRODUCTVERSION}.0" 39 | VIFileVersion "${INFO_PRODUCTVERSION}.0" 40 | 41 | VIAddVersionKey "CompanyName" "${INFO_COMPANYNAME}" 42 | VIAddVersionKey "FileDescription" "${INFO_PRODUCTNAME} Installer" 43 | VIAddVersionKey "ProductVersion" "${INFO_PRODUCTVERSION}" 44 | VIAddVersionKey "FileVersion" "${INFO_PRODUCTVERSION}" 45 | VIAddVersionKey "LegalCopyright" "${INFO_COPYRIGHT}" 46 | VIAddVersionKey "ProductName" "${INFO_PRODUCTNAME}" 47 | 48 | !include "MUI.nsh" 49 | 50 | !define MUI_ICON "..\icon.ico" 51 | !define MUI_UNICON "..\icon.ico" 52 | !define MUI_WELCOMEFINISHPAGE_BITMAP "resources\side.bmp" #Include this to add a bitmap on the left side of the Welcome Page. Must be a size of 164x314 53 | !define MUI_FINISHPAGE_NOAUTOCLOSE # Wait on the INSTFILES page so the user can take a look into the details of the installation steps 54 | !define MUI_ABORTWARNING # This will warn the user if they exit from the installer. 55 | !define MUI_FINISHPAGE_RUN "$INSTDIR\\${PRODUCT_EXECUTABLE}" 56 | !define MUI_FINISHPAGE_SHOWREADME "" # This reuses the 'show readme' checkbox to make a shortcut. 57 | !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED 58 | !define MUI_FINISHPAGE_SHOWREADME_TEXT "Create Desktop Shortcut" 59 | !define MUI_FINISHPAGE_SHOWREADME_FUNCTION createDesktopShortcut 60 | !define REGKEY "SOFTWARE\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" 61 | !define INSTALL_LOCATION "$PROGRAMFILES64\${INFO_COMPANYNAME}\${INFO_PRODUCTNAME}" 62 | 63 | !insertmacro MUI_PAGE_WELCOME # Welcome to the installer page. 64 | !insertmacro MUI_PAGE_LICENSE "resources\eula.txt" # Adds a EULA page to the installer 65 | !insertmacro MUI_PAGE_DIRECTORY # In which folder install page. 66 | !insertmacro MUI_PAGE_INSTFILES # Installing page. 67 | !insertmacro MUI_PAGE_FINISH # Finished installation page. 68 | !insertmacro MUI_UNPAGE_INSTFILES # Uinstalling page 69 | !insertmacro MUI_LANGUAGE "English" # Set the Language of the installer 70 | 71 | ## The following two statements can be used to sign the installer and the uninstaller. The path to the binaries are provided in %1 72 | !uninstfinalize '../signexe.sh "%1"' 73 | !finalize '../signexe.sh "%1"' 74 | 75 | Name "${INFO_PRODUCTNAME}" 76 | OutFile "..\..\bin\${INFO_PROJECTNAME}.${ARCH}.installer.exe" # Name of the installer's file. 77 | InstallDir "${INSTDIR}" # Default installing folder ($PROGRAMFILES is Program Files folder). 78 | ShowInstDetails show # This will always show the installation details. 79 | InstallDirRegKey HKLM "$REGKEY" InstallLocation 80 | 81 | Function createDesktopShortcut 82 | CreateShortCut "$DESKTOP\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" 83 | FunctionEnd 84 | 85 | Function .onInit 86 | !insertmacro wails.checkArchitecture 87 | SetRegView 64 88 | ReadRegStr $INSTDIR HKLM "${REGKEY}" InstallLocation 89 | StrCmp $INSTDIR "" 0 +2 90 | StrCpy $INSTDIR "${INSTALL_LOCATION}" 91 | FunctionEnd 92 | 93 | Section 94 | !insertmacro wails.webview2runtime 95 | 96 | SetOutPath $INSTDIR 97 | 98 | !insertmacro wails.files 99 | 100 | CreateShortcut "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" "$INSTDIR\${PRODUCT_EXECUTABLE}" 101 | SetRegView 64 102 | WriteRegStr HKLM "${REGKEY}" InstallLocation "$INSTDIR" 103 | 104 | !insertmacro wails.writeUninstaller 105 | SectionEnd 106 | 107 | Section "uninstall" 108 | RMDir /r "$AppData\${PRODUCT_EXECUTABLE}" # Remove the WebView2 DataPath 109 | SetRegView 64 110 | ReadRegStr $INSTDIR HKLM "${REGKEY}" InstallLocation 111 | StrCmp $INSTDIR "" +2 0 112 | RMDir /r $INSTDIR 113 | Delete "$SMPROGRAMS\${INFO_PRODUCTNAME}.lnk" 114 | Delete "$DESKTOP\${INFO_PRODUCTNAME}.lnk" 115 | SetRegView 64 116 | DeleteRegKey HKLM "${REGKEY}" 117 | 118 | !insertmacro wails.deleteUninstaller 119 | SectionEnd 120 | -------------------------------------------------------------------------------- /build/windows/installer/resources/eula.txt: -------------------------------------------------------------------------------- 1 | NOTIFIARR END USER LICENSE AGREEMENT 2 | 3 | Your use of this software constitutes unbinding agreement with this license. 4 | 5 | You shall forever acknowledge the creators of this application as supreme overlords. 6 | 7 | - Team Notifiarr -------------------------------------------------------------------------------- /build/windows/installer/resources/side.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/windows/installer/resources/side.bmp -------------------------------------------------------------------------------- /build/windows/installer/resources/side.psdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/windows/installer/resources/side.psdb -------------------------------------------------------------------------------- /build/windows/installer/tmp/MicrosoftEdgeWebview2Setup.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Notifiarr/toolbarr/63ea7f7c28a4cf6a1d9b039f14f9ce4eb70226cf/build/windows/installer/tmp/MicrosoftEdgeWebview2Setup.exe -------------------------------------------------------------------------------- /build/windows/signexe.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e -o pipefail 4 | 5 | # https://blog.synapp.nz/2017/06/16/code-signing-a-windows-application-on-linux-on-windows/ 6 | # https://stackoverflow.com/a/29073957/1142 7 | function sign() { 8 | if [ -z "${EXE_SIGNING_KEY}" ] || [ -z "${EXE_SIGNING_KEY_PASSWORD}" ]; then 9 | echo "Skipped ${FILE} .." >&2 10 | exit 0 11 | fi 12 | 13 | rm -f "${FILE}.signed" 14 | echo "${EXE_SIGNING_KEY}" | base64 -d | \ 15 | osslsigncode sign -pkcs12 /dev/stdin \ 16 | -pass "${EXE_SIGNING_KEY_PASSWORD}" \ 17 | -n "Toolbarr" \ 18 | -i "https://www.golift.io" \ 19 | -t "http://timestamp.comodoca.com/authenticode" \ 20 | -in "${FILE}" -out "${FILE}.signed" \ 21 | && cp "${FILE}.signed" "${FILE}" >> /tmp/pwd >&2 22 | echo "Signed ${FILE} .." >&2 23 | } 24 | 25 | [ -z "$1" ] || FILE="$1" sign 26 | -------------------------------------------------------------------------------- /build/windows/wails.exe.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | true/pm 12 | permonitorv2,permonitor 13 | 14 | 15 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "toolbarr", 3 | "private": true, 4 | "version": "0.1.2", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "@fortawesome/free-brands-svg-icons": "6.5.2", 13 | "@fortawesome/free-regular-svg-icons": "6.5.2", 14 | "@fortawesome/free-solid-svg-icons": "6.5.2", 15 | "@sveltejs/vite-plugin-svelte": "3.1.1", 16 | "@tsconfig/svelte": "5.0.4", 17 | "svelte": "4.2.18", 18 | "svelte-check": "3.8.1", 19 | "svelte-fa": "4.0.2", 20 | "svelte-preprocess": "6.0.1", 21 | "svelte-toasts": "1.1.2", 22 | "@sveltestrap/sveltestrap": "6.2.7", 23 | "tslib": "2.6.3", 24 | "typescript": "5.4.5", 25 | "vite": "5.3.1" 26 | }, 27 | "dependencies": { 28 | "svelte-i18n": "4.0.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /frontend/package.json.md5: -------------------------------------------------------------------------------- 1 | 4c00cceaefc3be1a241060fc6d002cb2 -------------------------------------------------------------------------------- /frontend/src/Landing.svelte: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 |
11 | 12 |

{$_("theStarroftheshow")}

13 |
14 |
15 | 16 | 22 | -------------------------------------------------------------------------------- /frontend/src/Links.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 |

{$_("words.Resources")}

14 | {$_("incompletePage")} 15 |

16 | Starr apps, unpackerr, notifiarr, autobrr, others?
17 | We can make this load dynamically from toys-arr.us. 18 |

19 |
20 |
21 |
22 | -------------------------------------------------------------------------------- /frontend/src/Navbar.svelte: -------------------------------------------------------------------------------- 1 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | {#if Object.keys($conf).length > 0 && $isReady == true} 71 | 72 | (pageName =$app.Title ? $app.Title : "Unknown",e.preventDefault())}> 73 | 74 | {$_("words."+pageName) == "words."+pageName ? pageName : $_("words."+pageName)} 75 | 76 | {#if $conf.Hide.Dark != true} 77 | 78 | {/if} 79 | (isOpen = !isOpen)} /> 80 | 81 | 112 | 113 | 114 |
115 | 116 |
117 | 118 | {#if pageName == "About"} 119 | 120 | {/if} 121 |
134 | {/if} 135 | 136 | 142 | -------------------------------------------------------------------------------- /frontend/src/Settings/Advanced.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 |

{$_("advanced_application_settings")}

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {$_("configinput.AppPath")} 23 | 24 | 25 | -------------------------------------------------------------------------------- /frontend/src/Settings/General.svelte: -------------------------------------------------------------------------------- 1 | 15 | 16 |

{$_("general_application_settings")}

17 | 18 | 19 | 20 | {#if langs != undefined && $conf.Lang != undefined} 21 | 22 | {#each Object.keys(langs) as $id} 23 | {#if $id != $conf.Lang} 24 | 25 | {/if} 26 | {/each} 27 | {/if} 28 | 29 | 32 | 33 | 34 | {langHelp = !langHelp}} 39 | header={$_("TranslationInformation")} placement="end"> 40 |

41 |
42 | -------------------------------------------------------------------------------- /frontend/src/Settings/Index.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 | 32 |
33 | 34 | 35 |

{$_("main_application_settings")}

36 |
37 |
{confSpin=true}} on:mouseleave={() => {confSpin=false}} role="link" tabindex="-1"> 38 | 39 | 40 | 43 | 44 |
45 |
46 | 51 |
52 | 53 | 54 |
55 |
56 |
57 | 58 | {confHelp = !confHelp}} 63 | header={$_("customconfig.CustomConfigPath")} placement="end"> 64 | {#if $app.IsLinux} 65 |

66 |
{$_("words.Example")}
67 |

68 | {$app.Name} -c /path/to/{$app.Name}.conf
69 | {$_("customconfig.Withafullpath")}:
70 | {$app.Exe} -c {$app.Home}/.{$app.Name}/{$app.Name}.conf
71 | {$_("customconfig.Makeabashscript")} 72 |

73 | {:else if $app.IsMac} 74 |

75 | {:else} 76 |

77 |

78 | 79 |
80 | 81 |

82 |
{$_("words.Directions")}
83 |
84 |
{$_("words.Example")}
85 | {$_( 86 | {/if} 87 |
88 |
89 | 90 | 97 | -------------------------------------------------------------------------------- /frontend/src/Settings/Logs.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 |

{$_("logs_application_settings")}

20 | 21 | 22 | 26 | 27 | 28 | 29 | 30 | 31 | {#if $conf.DevMode} 32 | 33 | {/if} 34 | 35 | 36 | 37 | {#if !$app.IsWindows} 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | {/if} 48 | 49 | 50 | {#each Array(20) as u, i} 51 | 52 | {/each} 53 | 54 | 55 | 56 | 57 | 58 | {#each Array(50) as u, i} 59 | 60 | {/each} 61 | 62 | 63 | -------------------------------------------------------------------------------- /frontend/src/Starr/Actions/AppProfiles.svelte: -------------------------------------------------------------------------------- 1 | 9 | 10 | {$_("incompletePage")} 11 |
12 | {instance.Name} App Profiles: {info.length} 13 | -------------------------------------------------------------------------------- /frontend/src/Starr/Actions/BlockLists.svelte: -------------------------------------------------------------------------------- 1 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 72 | 73 | 74 | 78 | 79 | 83 | 84 | 85 | 86 | 87 | {#each info.records as list, idx} 88 | {#if list} 89 | 90 | 91 | 92 | 93 | {/if} 94 | {/each} 95 | 96 |
69 | {cv} 70 | 71 | 75 | {$_("configvalues.SourceTitle")} 76 | 77 | {$_("words.Quality")} 80 | {$_("words.Date")} 81 | 82 |
97 | 98 |