🔨 Refactor(custom): change eol to lf

This commit is contained in:
Kuingsmile
2025-08-15 13:44:35 +08:00
parent 992b893009
commit 70c46d661e
22 changed files with 7019 additions and 7019 deletions

View File

@@ -1,72 +1,72 @@
# main.yml
# Workflow's name
name: Mas Build
# Workflow's trigger
on:
workflow_dispatch:
env:
ELECTRON_OUTPUT_PATH: ./dist_electron
CSC_LINK: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
CSC_KEY_PASSWORD: ${{ secrets.P12_PASSWORD }}
# Workflow's jobs
jobs:
# job's id
release:
# job's name
name: build and release electron app
# the type of machine to run the job on
runs-on: ${{ matrix.os }}
# create a build matrix for jobs
strategy:
fail-fast: false
matrix:
os: [macos-13]
# create steps
steps:
# step1: check out repository
- name: Check out git repository
uses: actions/checkout@v2
# step2: sign
- name: Install the Apple certificates
if: matrix.os == 'macos-13'
run: |
PP_PATH=$RUNNER_TEMP/build/piclistmas.provisionprofile
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
# step2: install node env
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '18.17.0'
# step3: yarn
- name: Yarn install
run: |
yarn
yarn global add xvfb-maybe
- name: Build & release app
run: |
yarn build
yarn upload-beta
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
R2_SECRET_ID: ${{ secrets.R2_SECRET_ID }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
ELECTRON_SKIP_NOTARIZATION: ${{ secrets.ELECTRON_SKIP_NOTARIZATION }}
XCODE_APP_LOADER_EMAIL: ${{ secrets.XCODE_APP_LOADER_EMAIL }}
XCODE_APP_LOADER_PASSWORD: ${{ secrets.XCODE_APP_LOADER_PASSWORD }}
XCODE_TEAM_ID: ${{ secrets.XCODE_TEAM_ID }}
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
# main.yml
# Workflow's name
name: Mas Build
# Workflow's trigger
on:
workflow_dispatch:
env:
ELECTRON_OUTPUT_PATH: ./dist_electron
CSC_LINK: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
CSC_KEY_PASSWORD: ${{ secrets.P12_PASSWORD }}
# Workflow's jobs
jobs:
# job's id
release:
# job's name
name: build and release electron app
# the type of machine to run the job on
runs-on: ${{ matrix.os }}
# create a build matrix for jobs
strategy:
fail-fast: false
matrix:
os: [macos-13]
# create steps
steps:
# step1: check out repository
- name: Check out git repository
uses: actions/checkout@v2
# step2: sign
- name: Install the Apple certificates
if: matrix.os == 'macos-13'
run: |
PP_PATH=$RUNNER_TEMP/build/piclistmas.provisionprofile
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH
# step2: install node env
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '18.17.0'
# step3: yarn
- name: Yarn install
run: |
yarn
yarn global add xvfb-maybe
- name: Build & release app
run: |
yarn build
yarn upload-beta
env:
GH_TOKEN: ${{ secrets.GH_TOKEN }}
R2_SECRET_ID: ${{ secrets.R2_SECRET_ID }}
R2_SECRET_KEY: ${{ secrets.R2_SECRET_KEY }}
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
ELECTRON_SKIP_NOTARIZATION: ${{ secrets.ELECTRON_SKIP_NOTARIZATION }}
XCODE_APP_LOADER_EMAIL: ${{ secrets.XCODE_APP_LOADER_EMAIL }}
XCODE_APP_LOADER_PASSWORD: ${{ secrets.XCODE_APP_LOADER_PASSWORD }}
XCODE_TEAM_ID: ${{ secrets.XCODE_TEAM_ID }}
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}

View File

@@ -1,211 +1,211 @@
name: Test Build
on:
workflow_dispatch:
env:
ELECTRON_OUTPUT_PATH: ./dist_electron
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
USE_HARD_LINKS: false
jobs:
test-build:
name: Test Build for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-13, windows-latest, windows-11-arm, macos-latest]
steps:
- name: Set up git config
run: |
git config --global core.autocrlf false
- name: Check out git repository
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
- name: Install system deps
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils
- name: Install dependencies (macOS)
if: matrix.os == 'macos-13' || matrix.os == 'macos-latest'
run: |
yarn config set ignore-engines true
yarn install
- name: Install dependencies (Windows)
if: matrix.os == 'windows-latest' || matrix.os == 'windows-11-arm'
run: |
yarn config set ignore-engines true
yarn install
- name: Install dependencies (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
yarn config set ignore-engines true
yarn install
- name: Modify electron-builder.json for Windows x64
if: matrix.os == 'windows-latest'
run: |
# Remove arm64 from the arch array, keep only x64
$config = Get-Content electron-builder.json | ConvertFrom-Json
$config.win.target[0].arch = @("x64", "ia32")
$config | ConvertTo-Json -Depth 10 | Set-Content electron-builder.json
- name: Modify electron-builder.json for Windows ARM64
if: matrix.os == 'windows-11-arm'
run: |
# Remove x64 from the arch array, keep only arm64
$config = Get-Content electron-builder.json | ConvertFrom-Json
$config.win.target[0].arch = @("arm64")
$config | ConvertTo-Json -Depth 10 | Set-Content electron-builder.json
- name: Modify electron-builder.json for Macos x64
if: matrix.os == 'macos-13'
run: |
# Remove arm64 from the arch array, keep only x64
jq '.mac.target[0].arch = ["x64"]' electron-builder.json > tmp.json && mv tmp.json electron-builder.json
- name: Modify electron-builder.json for Macos ARM64
if: matrix.os == 'macos-latest'
run: |
# Remove x64 from the arch array, keep only arm64
jq '.mac.target[0].arch = ["arm64"]' electron-builder.json > tmp.json && mv tmp.json electron-builder.json
- name: Build application (Windows x64)
if: matrix.os == 'windows-latest' || matrix.os == 'windows-11-arm'
run: yarn build:win
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Build application (macOS)
if: matrix.os == 'macos-13' || matrix.os == 'macos-latest'
run: yarn build:mac
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
USE_HARD_LINKS: false
- name: Build application (Linux)
if: matrix.os == 'ubuntu-latest'
run: yarn build:linux
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Upload Windows x64 executables
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: windows-x64-executables
path: |
dist_electron/*
retention-days: 30
if-no-files-found: error
- name: Upload Windows ARM64 executables
if: matrix.os == 'windows-11-arm'
uses: actions/upload-artifact@v4
with:
name: windows-arm64-executables
path: |
dist_electron/*.exe
retention-days: 30
if-no-files-found: error
- name: Upload macOS packages
if: matrix.os == 'macos-13'
uses: actions/upload-artifact@v4
with:
name: macos-x64-packages
path: |
dist_electron/*.dmg
retention-days: 30
if-no-files-found: error
- name: Upload macOS ARM64 packages
if: matrix.os == 'macos-latest'
uses: actions/upload-artifact@v4
with:
name: macos-arm64-packages
path: |
dist_electron/*.dmg
retention-days: 30
- name: Upload Linux packages
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: linux-packages
path: |
dist_electron/*.AppImage
dist_electron/*.snap
retention-days: 30
if-no-files-found: ignore
- name: Upload Windows x64 yml
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: windows-x64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload Windows ARM64 yml
if: matrix.os == 'windows-11-arm'
uses: actions/upload-artifact@v4
with:
name: windows-arm64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload macOS yml
if: matrix.os == 'macos-13'
uses: actions/upload-artifact@v4
with:
name: macos-x64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload macOS ARM64 yml
if: matrix.os == 'macos-latest'
uses: actions/upload-artifact@v4
with:
name: macos-arm64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload Linux yml
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: linux-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: ignore
name: Test Build
on:
workflow_dispatch:
env:
ELECTRON_OUTPUT_PATH: ./dist_electron
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
USE_HARD_LINKS: false
jobs:
test-build:
name: Test Build for ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-13, windows-latest, windows-11-arm, macos-latest]
steps:
- name: Set up git config
run: |
git config --global core.autocrlf false
- name: Check out git repository
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '22.x'
- name: Install system deps
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils
- name: Install dependencies (macOS)
if: matrix.os == 'macos-13' || matrix.os == 'macos-latest'
run: |
yarn config set ignore-engines true
yarn install
- name: Install dependencies (Windows)
if: matrix.os == 'windows-latest' || matrix.os == 'windows-11-arm'
run: |
yarn config set ignore-engines true
yarn install
- name: Install dependencies (Linux)
if: matrix.os == 'ubuntu-latest'
run: |
yarn config set ignore-engines true
yarn install
- name: Modify electron-builder.json for Windows x64
if: matrix.os == 'windows-latest'
run: |
# Remove arm64 from the arch array, keep only x64
$config = Get-Content electron-builder.json | ConvertFrom-Json
$config.win.target[0].arch = @("x64", "ia32")
$config | ConvertTo-Json -Depth 10 | Set-Content electron-builder.json
- name: Modify electron-builder.json for Windows ARM64
if: matrix.os == 'windows-11-arm'
run: |
# Remove x64 from the arch array, keep only arm64
$config = Get-Content electron-builder.json | ConvertFrom-Json
$config.win.target[0].arch = @("arm64")
$config | ConvertTo-Json -Depth 10 | Set-Content electron-builder.json
- name: Modify electron-builder.json for Macos x64
if: matrix.os == 'macos-13'
run: |
# Remove arm64 from the arch array, keep only x64
jq '.mac.target[0].arch = ["x64"]' electron-builder.json > tmp.json && mv tmp.json electron-builder.json
- name: Modify electron-builder.json for Macos ARM64
if: matrix.os == 'macos-latest'
run: |
# Remove x64 from the arch array, keep only arm64
jq '.mac.target[0].arch = ["arm64"]' electron-builder.json > tmp.json && mv tmp.json electron-builder.json
- name: Build application (Windows x64)
if: matrix.os == 'windows-latest' || matrix.os == 'windows-11-arm'
run: yarn build:win
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Build application (macOS)
if: matrix.os == 'macos-13' || matrix.os == 'macos-latest'
run: yarn build:mac
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
USE_HARD_LINKS: false
- name: Build application (Linux)
if: matrix.os == 'ubuntu-latest'
run: yarn build:linux
env:
ELECTRON_SKIP_NOTARIZATION: true
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_TOKEN: ${{ secrets.GH_TOKEN }}
- name: Upload Windows x64 executables
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: windows-x64-executables
path: |
dist_electron/*
retention-days: 30
if-no-files-found: error
- name: Upload Windows ARM64 executables
if: matrix.os == 'windows-11-arm'
uses: actions/upload-artifact@v4
with:
name: windows-arm64-executables
path: |
dist_electron/*.exe
retention-days: 30
if-no-files-found: error
- name: Upload macOS packages
if: matrix.os == 'macos-13'
uses: actions/upload-artifact@v4
with:
name: macos-x64-packages
path: |
dist_electron/*.dmg
retention-days: 30
if-no-files-found: error
- name: Upload macOS ARM64 packages
if: matrix.os == 'macos-latest'
uses: actions/upload-artifact@v4
with:
name: macos-arm64-packages
path: |
dist_electron/*.dmg
retention-days: 30
- name: Upload Linux packages
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: linux-packages
path: |
dist_electron/*.AppImage
dist_electron/*.snap
retention-days: 30
if-no-files-found: ignore
- name: Upload Windows x64 yml
if: matrix.os == 'windows-latest'
uses: actions/upload-artifact@v4
with:
name: windows-x64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload Windows ARM64 yml
if: matrix.os == 'windows-11-arm'
uses: actions/upload-artifact@v4
with:
name: windows-arm64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload macOS yml
if: matrix.os == 'macos-13'
uses: actions/upload-artifact@v4
with:
name: macos-x64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload macOS ARM64 yml
if: matrix.os == 'macos-latest'
uses: actions/upload-artifact@v4
with:
name: macos-arm64-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: error
- name: Upload Linux yml
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: linux-yml
path: |
dist_electron/github/*
retention-days: 30
if-no-files-found: ignore

76
.vscode/launch.json vendored
View File

@@ -1,39 +1,39 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
"windows": {
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
},
"runtimeArgs": ["--sourcemap"],
"env": {
"REMOTE_DEBUGGING_PORT": "9222"
}
},
{
"name": "Debug Renderer Process",
"port": 9222,
"request": "attach",
"type": "chrome",
"webRoot": "${workspaceFolder}/src/renderer",
"timeout": 60000,
"presentation": {
"hidden": true
}
}
],
"compounds": [
{
"name": "Debug All",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"presentation": {
"order": 1
}
}
]
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite",
"windows": {
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/electron-vite.cmd"
},
"runtimeArgs": ["--sourcemap"],
"env": {
"REMOTE_DEBUGGING_PORT": "9222"
}
},
{
"name": "Debug Renderer Process",
"port": 9222,
"request": "attach",
"type": "chrome",
"webRoot": "${workspaceFolder}/src/renderer",
"timeout": 60000,
"presentation": {
"hidden": true
}
}
],
"compounds": [
{
"name": "Debug All",
"configurations": ["Debug Main Process", "Debug Renderer Process"],
"presentation": {
"order": 1
}
}
]
}

30
.vscode/mcp.json vendored
View File

@@ -1,15 +1,15 @@
{
"inputs": [
// The "inputs" section defines the inputs required for the MCP server configuration.
{
"type": "promptString"
}
],
"servers": {
// The "servers" section defines the MCP servers you want to use.
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}
{
"inputs": [
// The "inputs" section defines the inputs required for the MCP server configuration.
{
"type": "promptString"
}
],
"servers": {
// The "servers" section defines the MCP servers you want to use.
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,37 +1,37 @@
# 贡献指南
## 安装与启动
最低要求:
- Node.js >= 20
- Yarn >= 1.22
1. 使用 [yarn](https://yarnpkg.com/) 安装依赖
```bash
yarn
```
然后通过
```bash
yarn dev
```
启动项目。
1. 只跟 Electron 主进程相关的代码请在 `src/main` 目录下添加。只跟渲染进程相关的代码请在 `src/renderer` 目录下添加。需要暴露到渲染进程的代码请在 `src/preload` 目录下添加。
2. 所有的全局类型定义请在 `src/universal/types/` 里添加。
3. 与图床管理功能相关的代码请在 `src/main/manage``src/renderer/manage`目录下添加。
## i18n-主进程
1.`public/i18n/` 下面创建一种语言的 `yml` 文件,例如 `zh-Hans.yml`。然后参考 `zh-CN.yml` 或者 `en.yml` 编写语言文件。并注意PicList 会通过语言文件中的 `LANG_DISPLAY_LABEL` 向用户展示该语言的名称。
2.`src/universal/i18n/index.ts` 里添加一种默认语言。其中 `label` 就是语言文件中 `LANG_DISPLAY_LABEL` 的值,`value` 是语言文件名。
3. 如果是对已有语言文件进行更新,请在更新完,务必运行一遍 `yarn i18n`,确保能生成正确的语言定义文件。
## 提交代码
1. 请检查代码没有多余的注释、`console.log` 等调试代码。
2. 提交代码前,请执行命令 `git add . && yarn cz`,唤起 [代码提交规范工具](https://github.com/Kuingsmile/node-bump-version)。通过该工具提交代码。
# 贡献指南
## 安装与启动
最低要求:
- Node.js >= 20
- Yarn >= 1.22
1. 使用 [yarn](https://yarnpkg.com/) 安装依赖
```bash
yarn
```
然后通过
```bash
yarn dev
```
启动项目。
1. 只跟 Electron 主进程相关的代码请在 `src/main` 目录下添加。只跟渲染进程相关的代码请在 `src/renderer` 目录下添加。需要暴露到渲染进程的代码请在 `src/preload` 目录下添加。
2. 所有的全局类型定义请在 `src/universal/types/` 里添加。
3. 与图床管理功能相关的代码请在 `src/main/manage``src/renderer/manage`目录下添加。
## i18n-主进程
1.`public/i18n/` 下面创建一种语言的 `yml` 文件,例如 `zh-Hans.yml`。然后参考 `zh-CN.yml` 或者 `en.yml` 编写语言文件。并注意PicList 会通过语言文件中的 `LANG_DISPLAY_LABEL` 向用户展示该语言的名称。
2.`src/universal/i18n/index.ts` 里添加一种默认语言。其中 `label` 就是语言文件中 `LANG_DISPLAY_LABEL` 的值,`value` 是语言文件名。
3. 如果是对已有语言文件进行更新,请在更新完,务必运行一遍 `yarn i18n`,确保能生成正确的语言定义文件。
## 提交代码
1. 请检查代码没有多余的注释、`console.log` 等调试代码。
2. 提交代码前,请执行命令 `git add . && yarn cz`,唤起 [代码提交规范工具](https://github.com/Kuingsmile/node-bump-version)。通过该工具提交代码。

View File

@@ -1,37 +1,37 @@
# Contribution Guidelines
## Installation and startup
Minimum requirements:
- Node.js >= 20
- Yarn >= 1.22
1. Use [yarn](https://yarnpkg.com/) to install dependencies
```bash
yarn
```
then pass
```bash
yarn dev
```
Startup project.
1. Please add code only related to the main process of Electron in the `src/main` directory. Code only related to the rendering process should be added in the `src/renderer` directory. Add code that needs to be exposed to the rendering process in the `src/preload` directory.
2. Please add all global type definitions in `src/universal/types/`, if it is `enum`, please add it in `src/universal/types/enum.ts`.
3. Code related to the management function of the picture bed should be added in the `src/main/manage` and `src/renderer/manage` directory.
## i18n-Main Process
1. Create a language `yml` file under `public/i18n/`, for example `zh-Hans.yml`. Then refer to `zh-CN.yml` or `en.yml` to write language files. Also note that PicList will display the name of the language to the user via `LANG_DISPLAY_LABEL` in the language file.
2. Add a default language to `src/universal/i18n/index.ts`. where `label` is the value of `LANG_DISPLAY_LABEL` in the language file, and `value` is the name of the language file.
3. If you are updating an existing language file, be sure to run `yarn i18n` after the update to ensure that the correct language definition file can be generated.
## Submit code
1. Please check that the code has no extra comments, `console.log` and other debugging code.
2. Before submitting the code, please execute the command `git add . && yarn cz` to invoke [Code Submission Specification Tool](https://github.com/Kuingsmile/node-bump-version). Submit code through this tool.
# Contribution Guidelines
## Installation and startup
Minimum requirements:
- Node.js >= 20
- Yarn >= 1.22
1. Use [yarn](https://yarnpkg.com/) to install dependencies
```bash
yarn
```
then pass
```bash
yarn dev
```
Startup project.
1. Please add code only related to the main process of Electron in the `src/main` directory. Code only related to the rendering process should be added in the `src/renderer` directory. Add code that needs to be exposed to the rendering process in the `src/preload` directory.
2. Please add all global type definitions in `src/universal/types/`, if it is `enum`, please add it in `src/universal/types/enum.ts`.
3. Code related to the management function of the picture bed should be added in the `src/main/manage` and `src/renderer/manage` directory.
## i18n-Main Process
1. Create a language `yml` file under `public/i18n/`, for example `zh-Hans.yml`. Then refer to `zh-CN.yml` or `en.yml` to write language files. Also note that PicList will display the name of the language to the user via `LANG_DISPLAY_LABEL` in the language file.
2. Add a default language to `src/universal/i18n/index.ts`. where `label` is the value of `LANG_DISPLAY_LABEL` in the language file, and `value` is the name of the language file.
3. If you are updating an existing language file, be sure to run `yarn i18n` after the update to ensure that the correct language definition file can be generated.
## Submit code
1. Please check that the code has no extra comments, `console.log` and other debugging code.
2. Before submitting the code, please execute the command `git add . && yarn cz` to invoke [Code Submission Specification Tool](https://github.com/Kuingsmile/node-bump-version). Submit code through this tool.

332
FAQ.md
View File

@@ -1,166 +1,166 @@
# FAQ
本 FAQ 修改自 PicGo 的 FAQ感谢 PicGo 的作者 Molunerfinn。
## 常见问题
> 常规配置问题请参考 [官方文档](https://piclist.cn)
## 1. PicList 和 PicGo 有什么关系?
PicList 项目是从 PicGo 项目 fork 而来,基于 PicGo 进行了二次开发。同时,核心功能内核 PicGo-Core 也进行了二次开发,并重命名为 [PicList-Core](https://github.com/Kuingsmile/PicList-Core)。
PicList 添加的所有新功能未影响 PicGo 的原有功能,因此你可以在 PicList 中使用 PicGo 的大部分插件。同时,仍然可以配合 Typora、Obsidian 等软件使用。
## 2. 使用图床管理功能时,出现无法获取目录等错误
请查看日志文件 `manage.log`。此外,各平台的 API 调用基本都有每小时次数限制,如果出现错误,请稍后再试。
## 3. 支持哪些图床远端同步删除
目前支持的图床有:
- 阿里云 OSS
- 腾讯云 COS
- 七牛云 Kodo
- 又拍云
- SM.MS
- Imgur
- GitHub
- WebDav
- Aws S3
- 本地路径
- 内置SFTP
- 多吉云
- 华为云 OBS
- Alist
- 兰空图床
## 4. 能否支持上传视频文件
可以,通过新添加的图床管理功能,你可以上传任意格式的文件,包括视频文件。同时,在管理界面内上传时,使用分片上传/流式上传等方式相对于PicGo内置的转换为base64的方式上传更快更稳定。
## 5. 能否支持xxx图床
PicList本体支持了如下图床
- `七牛图床`
- `AWS S3 兼容平台`
- `腾讯云 COS`
- `又拍云`
- `GitHub`
- `SM.MS`
- `阿里云 OSS`
- `Imgur`
- `Webdav`
- `本地图床`
- `SFTP`
- `兰空图床`
- `PicList(套娃)`
- `高级自定义图床`
PicList计划整合和优化现有插件内置更多的常用图床。
此外PicList兼容PicGo的插件系统需要其他图床支持可以参考目前已有的PicGo三方 [插件](https://github.com/PicGo/Awesome-PicGo),如果还是没有你所需要的图床欢迎开发一个插件供大家使用。
## 6. Github 图床有时能上传,有时上传失败
GitHub 服务器和国内 GFW 的问题会导致有时上传成功,有时上传失败,无解。
想要稳定请使用付费云存储,如阿里云、腾讯云等,价格也不会贵。
## 7. Mac 上无法打开 PicList 的主窗口界面
要打开主窗口,请右键或者双指点按顶部栏 PicList 图标,选择「打开主窗口」即可打开主窗口。
或者在dock栏中右键PicList图标选择「打开主窗口」。
## 8. 上传失败,或者是服务器出错
1. PicList 自带的图床都经过测试,上传出错一般都不是 PicList 自身的原因。如果你用的是 GitHub 图床请参考上面的第 7 点。
2. 检查 PicList 的日志(报错日志可以在 PicList 设置 -> 设置日志文件 -> 点击打开 后找到),看看 `[PicList Error]` 的报错信息里有什么关键信息
1. 先自行搜索 error 里的报错信息,往往你能百度或者谷歌出问题原因,不必开 issue。
2. 如果有带有 `401``403``40X` 状态码字样的,不用怀疑,就是你配置写错了,仔细检查配置,看看是否多了空格之类的。
3. 如果带有 `HttpError``RequestError``socket hang up` 等字样的说明这是网络问题我无法帮你解决网络问题请检查你自己的网络是否有代理DNS 设置是否正常等。
3. 通常网络问题引起的上传失败都是因为代理设置不当导致的。如果开启了系统代理,建议同时也在 PicList 的代理设置中设置对应的HTTP代理。
## 10. macOS版本安装完之后没有主界面
请找到PicList在顶部栏的图标然后右键触摸板双指点按或者鼠标右键即可找到「打开主窗口」的菜单。
或者再Docker栏PicList的图标上右键即可找到「打开主窗口」的菜单。
## 11. macOS系统安装完PicList显示「文件已损坏」或者安装完打开没有反应
请升级至 PicList 1.4.1 或以上版本。
## 12. 水印没有正常添加
PicList在添加水印前会先检查字体文件是否存在如果不存在会自动下载字体文件但是由于网络问题可能会导致字体文件下载失败此时会跳过水印添加。
请根据自己的系统检查对应路径下的字体文件是否存在,如果不存在,请手动下载字体文件,然后放到对应的路径下。
Windows: `%APPDATA%\piclist\assets\simhei.ttf`
Linux: `$XDG_CONFIG_HOME/piclist/assets/simhei.ttf` or `~/.config//assets/simhei.ttf`
macOS: `~/Library/Application\ Support/picgo/assets/simhei.ttf`
字体文件下载地址:[https://release.piclist.cn/simhei.ttf](https://release.piclist.cn/simhei.ttf)
## 13. 使用aws-s3插件上传到cloudflare R2时出现上传失败问题
R2的endpoint地址会出现被GFW sni阻断的问题查看piclist.log后将对应的ip地址加入代理列表可解决。
## 14. PicList兼容所有的PicGo插件吗
PicList兼容绝大部分的PicGo插件。然而由于PicList使用了更新的electron版本与旧版本的sharp库不兼容所以部分插件可能无法使用。
已知的无法使用的插件有:
- picgo-plugin-watermark (已经内置)
- picgo-plugin-pic-migrater (该插件会校验PicGo的版本无法使用请换用pic-migrater-piclist插件)
- picgo-plugin-auto-delete (已经内置)
欢迎大家测试其他插件如果有无法使用的插件欢迎开issue反馈。
## 15. 如何通过Docker运行PicList-core?
### docker run
修改 `./piclist`为你自己的路径,修改 `piclist123456`为你自己的密钥。
```bash
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
### docker-compose
下载piclist-core仓库的 `docker-compose.yml`文件,或者复制以下内容到 `docker-compose.yml`文件中:
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
你可以修改 `volumes`为你自己的路径,修改 `command`为你自己的密钥。
然后运行
```bash
docker-compose up -d
```
# FAQ
本 FAQ 修改自 PicGo 的 FAQ感谢 PicGo 的作者 Molunerfinn。
## 常见问题
> 常规配置问题请参考 [官方文档](https://piclist.cn)
## 1. PicList 和 PicGo 有什么关系?
PicList 项目是从 PicGo 项目 fork 而来,基于 PicGo 进行了二次开发。同时,核心功能内核 PicGo-Core 也进行了二次开发,并重命名为 [PicList-Core](https://github.com/Kuingsmile/PicList-Core)。
PicList 添加的所有新功能未影响 PicGo 的原有功能,因此你可以在 PicList 中使用 PicGo 的大部分插件。同时,仍然可以配合 Typora、Obsidian 等软件使用。
## 2. 使用图床管理功能时,出现无法获取目录等错误
请查看日志文件 `manage.log`。此外,各平台的 API 调用基本都有每小时次数限制,如果出现错误,请稍后再试。
## 3. 支持哪些图床远端同步删除
目前支持的图床有:
- 阿里云 OSS
- 腾讯云 COS
- 七牛云 Kodo
- 又拍云
- SM.MS
- Imgur
- GitHub
- WebDav
- Aws S3
- 本地路径
- 内置SFTP
- 多吉云
- 华为云 OBS
- Alist
- 兰空图床
## 4. 能否支持上传视频文件
可以,通过新添加的图床管理功能,你可以上传任意格式的文件,包括视频文件。同时,在管理界面内上传时,使用分片上传/流式上传等方式相对于PicGo内置的转换为base64的方式上传更快更稳定。
## 5. 能否支持xxx图床
PicList本体支持了如下图床
- `七牛图床`
- `AWS S3 兼容平台`
- `腾讯云 COS`
- `又拍云`
- `GitHub`
- `SM.MS`
- `阿里云 OSS`
- `Imgur`
- `Webdav`
- `本地图床`
- `SFTP`
- `兰空图床`
- `PicList(套娃)`
- `高级自定义图床`
PicList计划整合和优化现有插件内置更多的常用图床。
此外PicList兼容PicGo的插件系统需要其他图床支持可以参考目前已有的PicGo三方 [插件](https://github.com/PicGo/Awesome-PicGo),如果还是没有你所需要的图床欢迎开发一个插件供大家使用。
## 6. Github 图床有时能上传,有时上传失败
GitHub 服务器和国内 GFW 的问题会导致有时上传成功,有时上传失败,无解。
想要稳定请使用付费云存储,如阿里云、腾讯云等,价格也不会贵。
## 7. Mac 上无法打开 PicList 的主窗口界面
要打开主窗口,请右键或者双指点按顶部栏 PicList 图标,选择「打开主窗口」即可打开主窗口。
或者在dock栏中右键PicList图标选择「打开主窗口」。
## 8. 上传失败,或者是服务器出错
1. PicList 自带的图床都经过测试,上传出错一般都不是 PicList 自身的原因。如果你用的是 GitHub 图床请参考上面的第 7 点。
2. 检查 PicList 的日志(报错日志可以在 PicList 设置 -> 设置日志文件 -> 点击打开 后找到),看看 `[PicList Error]` 的报错信息里有什么关键信息
1. 先自行搜索 error 里的报错信息,往往你能百度或者谷歌出问题原因,不必开 issue。
2. 如果有带有 `401``403``40X` 状态码字样的,不用怀疑,就是你配置写错了,仔细检查配置,看看是否多了空格之类的。
3. 如果带有 `HttpError``RequestError``socket hang up` 等字样的说明这是网络问题我无法帮你解决网络问题请检查你自己的网络是否有代理DNS 设置是否正常等。
3. 通常网络问题引起的上传失败都是因为代理设置不当导致的。如果开启了系统代理,建议同时也在 PicList 的代理设置中设置对应的HTTP代理。
## 10. macOS版本安装完之后没有主界面
请找到PicList在顶部栏的图标然后右键触摸板双指点按或者鼠标右键即可找到「打开主窗口」的菜单。
或者再Docker栏PicList的图标上右键即可找到「打开主窗口」的菜单。
## 11. macOS系统安装完PicList显示「文件已损坏」或者安装完打开没有反应
请升级至 PicList 1.4.1 或以上版本。
## 12. 水印没有正常添加
PicList在添加水印前会先检查字体文件是否存在如果不存在会自动下载字体文件但是由于网络问题可能会导致字体文件下载失败此时会跳过水印添加。
请根据自己的系统检查对应路径下的字体文件是否存在,如果不存在,请手动下载字体文件,然后放到对应的路径下。
Windows: `%APPDATA%\piclist\assets\simhei.ttf`
Linux: `$XDG_CONFIG_HOME/piclist/assets/simhei.ttf` or `~/.config//assets/simhei.ttf`
macOS: `~/Library/Application\ Support/picgo/assets/simhei.ttf`
字体文件下载地址:[https://release.piclist.cn/simhei.ttf](https://release.piclist.cn/simhei.ttf)
## 13. 使用aws-s3插件上传到cloudflare R2时出现上传失败问题
R2的endpoint地址会出现被GFW sni阻断的问题查看piclist.log后将对应的ip地址加入代理列表可解决。
## 14. PicList兼容所有的PicGo插件吗
PicList兼容绝大部分的PicGo插件。然而由于PicList使用了更新的electron版本与旧版本的sharp库不兼容所以部分插件可能无法使用。
已知的无法使用的插件有:
- picgo-plugin-watermark (已经内置)
- picgo-plugin-pic-migrater (该插件会校验PicGo的版本无法使用请换用pic-migrater-piclist插件)
- picgo-plugin-auto-delete (已经内置)
欢迎大家测试其他插件如果有无法使用的插件欢迎开issue反馈。
## 15. 如何通过Docker运行PicList-core?
### docker run
修改 `./piclist`为你自己的路径,修改 `piclist123456`为你自己的密钥。
```bash
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
### docker-compose
下载piclist-core仓库的 `docker-compose.yml`文件,或者复制以下内容到 `docker-compose.yml`文件中:
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
你可以修改 `volumes`为你自己的路径,修改 `command`为你自己的密钥。
然后运行
```bash
docker-compose up -d
```

334
FAQ_EN.md
View File

@@ -1,167 +1,167 @@
# FAQ
This FAQ has been modified from PicGo's FAQ, and thanks to the author Molunerfinn for PicGo.
## Common Questions
> Please refer to [user manual](https://piclist.cn/en) for general configuration issues.
## 1. What is the relationship between PicList and PicGo?
PicList is forked from the PicGo project and is based on PicGo for secondary development. At the same time, the core function kernel PicGo-Core has been developed for the second time and renamed as [PicList-Core](https://github.com/Kuingsmile/PicList-Core).
The addition of all new features to PicList has not affected PicGo's existing functions, so you can use all PicGo plugins in PicList. At the same time, it can still be used in conjunction with software such as Typora and Obsidian.
## 2. When using the image hosting management function, errors such as "unable to retrieve directory" occur
Please check the log file `manage.log`. In addition, the API calls of various platforms have a limit on the number of calls per hour. If an error occurs, please try again later.
## 3. Which remote image hosting deletion is supported?
Currently, the supported image hosting platforms are:
- Aliyun OSS
- Tencent Cloud COS
- Qiniu Cloud Kodo
- Upyun
- SM.MS
- Imgur
- GitHub
- Webdav
- Aws S3
- Local path
- Built-in SFTP
- Doge Cloud
- Huawei Cloud OBS
- Alist
- Lsky Pro
## 4. Is it possible to upload video files?
Yes. With the newly added image hosting management function, you can upload files of any format, including video files. At the same time, when uploading in the management interface, using methods such as chunked uploading and streaming uploading is faster and more stable compared to the base64 conversion method built into PicGo.
## 5. Does PicList support a certain image hosting platform?
PicList itself supports the following image hosting platforms:
- Qiniu Cloud
- AWS S3 compatible platform
- Tencent Cloud COS
- Upyun
- GitHub
- SM.MS
- Aliyun OSS
- Imgur
- Webdav
- Local path
- SFTP
- Lsky Pro
- PicList (nested)
- Advanced custom image hosting
PicList plans to integrate and optimize existing plugins and embed more commonly used image hosting platforms.
In addition, PicList is compatible with PicGo's plugin system. If you need support for other image hosting platforms, you can refer to the [PicGo third-party plugins](https://github.com/PicGo/Awesome-PicGo). If you still cannot find the image hosting platform you need, please develop a plugin for everyone to use.
## 6. The GitHub image hosting platform sometimes uploads successfully and sometimes fails
The problem with GitHub servers and China's Great Firewall may cause successful or failed uploads. There is no solution.
If you want stability, please use paid cloud storage such as Aliyun and Tencent Cloud. The price is not expensive.
## 7. The main window interface of PicList cannot be opened on Mac
To open the main window, right-click or two-finger tap the PicList icon in the top bar and select "Open Main Window."
Or right-click the PicList icon in the dock and select "Open Main Window."
## 8. Upload failed, or server error
1. PicList's built-in image hosting platforms have been tested, and upload errors are generally not caused by PicList itself. If you are using the GitHub image hosting platform, please refer to the 7th point above.
2. Check PicList's log (the error log can be found by clicking "Open" in PicList Settings -> Set Log File ->), and see if there is any key information in the `[PicList Error]` error message
1. First search for the error message in the error message by yourself, and you can often Baidu or Google the cause of the problem, so you don't need to open an issue.
2. If there are `401`, `403` and other `40X` status code words, don't doubt it, it means that your configuration is wrong, check the configuration carefully to see if there are extra spaces, etc.
3. If there are words such as `HttpError`, `RequestError`, `socket hang up`, etc., it means that this is a network problem, and I cannot help you solve the network problem. Please check your own network, whether there is a proxy, whether the DNS setting is normal, etc.
3. Usually, upload failures caused by network problems are caused by improper proxy settings. If the system proxy is turned on, it is recommended to set the corresponding HTTP proxy in the proxy settings of PicList at the same time.
## 10. After installing the macOS version, there is no main interface
Please find the icon of PicList in the top bar, and then right-click (touchpad two-finger tap, or right-click the mouse) to find the menu of "Open Main Window".
Or right-click on the icon of PicList in the Docker bar to find the menu of "Open Main Window".
## 11. After installing PicList on macOS, it shows "The file is damaged" or there is no response after installing and opening
Please upgrade PicList to version 1.4.1 or above.
## 12. Watermark is not added normally
Before adding a watermark, PicList will check whether the font file exists. If it does not exist, it will automatically download the font file. However, due to network problems, the font file may fail to download, and the watermark will be skipped.
Please check whether the font file under the corresponding path according to your system exists. If it does not exist, please download the font file manually and put it in the corresponding path.
Windows: `%APPDATA%\piclist\assets\simhei.ttf`
Linux: `$XDG_CONFIG_HOME/piclist/assets/simhei.ttf` or `~/.config//assets/simhei.ttf`
MacOS: `~/Library/Application\ Support/picgo/assets/simhei.ttf`
The font file download address: [https://release.piclist.cn/simhei.ttf](https://release.piclist.cn/simhei.ttf)
## 13. Upload failed when using aws-s3 plugin to upload to cloudflare R2
R2's endpoint address will be blocked by GFW sni. After checking piclist.log, adding the corresponding IP address to the proxy list can solve the problem.
## 14. Are all PicGo plugins compatible with PicList?
PicList is compatible with most PicGo plugins. However, since PicList uses an updated version of electron, it is not compatible with the old version of the sharp library, so some plugins may not work.
Known plugins that cannot be used are:
- picgo-plugin-watermark (built-in)
- picgo-plugin-pic-migrater (this plugin will verify the version of PicGo and cannot be used, please use the pic-migrater-piclist plugin)
- picgo-plugin-auto-delete (built-in)
Welcome everyone to test other plugins. If there are plugins that cannot be used, please open an issue for feedback.
## 15. How to run PicList-core through Docker?
### docker run
Change the `./piclist` to your own path, and change the `piclist123456` to your own secret key.
```bash
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
### docker-compose
download `docker-compose.yml` from piclist-core repo, or copy the following content to `docker-compose.yml`:
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
You can change the `volumes` to your own path and change the `command` to your own secret key.
Then run:
```bash
docker-compose up -d
```
# FAQ
This FAQ has been modified from PicGo's FAQ, and thanks to the author Molunerfinn for PicGo.
## Common Questions
> Please refer to [user manual](https://piclist.cn/en) for general configuration issues.
## 1. What is the relationship between PicList and PicGo?
PicList is forked from the PicGo project and is based on PicGo for secondary development. At the same time, the core function kernel PicGo-Core has been developed for the second time and renamed as [PicList-Core](https://github.com/Kuingsmile/PicList-Core).
The addition of all new features to PicList has not affected PicGo's existing functions, so you can use all PicGo plugins in PicList. At the same time, it can still be used in conjunction with software such as Typora and Obsidian.
## 2. When using the image hosting management function, errors such as "unable to retrieve directory" occur
Please check the log file `manage.log`. In addition, the API calls of various platforms have a limit on the number of calls per hour. If an error occurs, please try again later.
## 3. Which remote image hosting deletion is supported?
Currently, the supported image hosting platforms are:
- Aliyun OSS
- Tencent Cloud COS
- Qiniu Cloud Kodo
- Upyun
- SM.MS
- Imgur
- GitHub
- Webdav
- Aws S3
- Local path
- Built-in SFTP
- Doge Cloud
- Huawei Cloud OBS
- Alist
- Lsky Pro
## 4. Is it possible to upload video files?
Yes. With the newly added image hosting management function, you can upload files of any format, including video files. At the same time, when uploading in the management interface, using methods such as chunked uploading and streaming uploading is faster and more stable compared to the base64 conversion method built into PicGo.
## 5. Does PicList support a certain image hosting platform?
PicList itself supports the following image hosting platforms:
- Qiniu Cloud
- AWS S3 compatible platform
- Tencent Cloud COS
- Upyun
- GitHub
- SM.MS
- Aliyun OSS
- Imgur
- Webdav
- Local path
- SFTP
- Lsky Pro
- PicList (nested)
- Advanced custom image hosting
PicList plans to integrate and optimize existing plugins and embed more commonly used image hosting platforms.
In addition, PicList is compatible with PicGo's plugin system. If you need support for other image hosting platforms, you can refer to the [PicGo third-party plugins](https://github.com/PicGo/Awesome-PicGo). If you still cannot find the image hosting platform you need, please develop a plugin for everyone to use.
## 6. The GitHub image hosting platform sometimes uploads successfully and sometimes fails
The problem with GitHub servers and China's Great Firewall may cause successful or failed uploads. There is no solution.
If you want stability, please use paid cloud storage such as Aliyun and Tencent Cloud. The price is not expensive.
## 7. The main window interface of PicList cannot be opened on Mac
To open the main window, right-click or two-finger tap the PicList icon in the top bar and select "Open Main Window."
Or right-click the PicList icon in the dock and select "Open Main Window."
## 8. Upload failed, or server error
1. PicList's built-in image hosting platforms have been tested, and upload errors are generally not caused by PicList itself. If you are using the GitHub image hosting platform, please refer to the 7th point above.
2. Check PicList's log (the error log can be found by clicking "Open" in PicList Settings -> Set Log File ->), and see if there is any key information in the `[PicList Error]` error message
1. First search for the error message in the error message by yourself, and you can often Baidu or Google the cause of the problem, so you don't need to open an issue.
2. If there are `401`, `403` and other `40X` status code words, don't doubt it, it means that your configuration is wrong, check the configuration carefully to see if there are extra spaces, etc.
3. If there are words such as `HttpError`, `RequestError`, `socket hang up`, etc., it means that this is a network problem, and I cannot help you solve the network problem. Please check your own network, whether there is a proxy, whether the DNS setting is normal, etc.
3. Usually, upload failures caused by network problems are caused by improper proxy settings. If the system proxy is turned on, it is recommended to set the corresponding HTTP proxy in the proxy settings of PicList at the same time.
## 10. After installing the macOS version, there is no main interface
Please find the icon of PicList in the top bar, and then right-click (touchpad two-finger tap, or right-click the mouse) to find the menu of "Open Main Window".
Or right-click on the icon of PicList in the Docker bar to find the menu of "Open Main Window".
## 11. After installing PicList on macOS, it shows "The file is damaged" or there is no response after installing and opening
Please upgrade PicList to version 1.4.1 or above.
## 12. Watermark is not added normally
Before adding a watermark, PicList will check whether the font file exists. If it does not exist, it will automatically download the font file. However, due to network problems, the font file may fail to download, and the watermark will be skipped.
Please check whether the font file under the corresponding path according to your system exists. If it does not exist, please download the font file manually and put it in the corresponding path.
Windows: `%APPDATA%\piclist\assets\simhei.ttf`
Linux: `$XDG_CONFIG_HOME/piclist/assets/simhei.ttf` or `~/.config//assets/simhei.ttf`
MacOS: `~/Library/Application\ Support/picgo/assets/simhei.ttf`
The font file download address: [https://release.piclist.cn/simhei.ttf](https://release.piclist.cn/simhei.ttf)
## 13. Upload failed when using aws-s3 plugin to upload to cloudflare R2
R2's endpoint address will be blocked by GFW sni. After checking piclist.log, adding the corresponding IP address to the proxy list can solve the problem.
## 14. Are all PicGo plugins compatible with PicList?
PicList is compatible with most PicGo plugins. However, since PicList uses an updated version of electron, it is not compatible with the old version of the sharp library, so some plugins may not work.
Known plugins that cannot be used are:
- picgo-plugin-watermark (built-in)
- picgo-plugin-pic-migrater (this plugin will verify the version of PicGo and cannot be used, please use the pic-migrater-piclist plugin)
- picgo-plugin-auto-delete (built-in)
Welcome everyone to test other plugins. If there are plugins that cannot be used, please open an issue for feedback.
## 15. How to run PicList-core through Docker?
### docker run
Change the `./piclist` to your own path, and change the `piclist123456` to your own secret key.
```bash
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
### docker-compose
download `docker-compose.yml` from piclist-core repo, or copy the following content to `docker-compose.yml`:
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
You can change the `volumes` to your own path and change the `command` to your own secret key.
Then run:
```bash
docker-compose up -d
```

676
README.md
View File

@@ -1,338 +1,338 @@
<div align="center">
<img src="https://imgx.horosama.com/admin_uploads/2022/10/2022_10_05_633d79e401694.png" alt="PicList Logo">
<h1>PicList</h1>
<p><strong>Powerful cloud storage and image hosting management tool</strong></p>
<a href="https://github.com/Kuingsmile/PicList/actions">
<img src="https://img.shields.io/badge/code%20style-standard-green.svg?style=flat-square" alt="Code Style">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases">
<img src="https://img.shields.io/github/downloads/Kuingsmile/PicList/total.svg?style=flat-square" alt="Downloads">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases/latest">
<img src="https://img.shields.io/github/release/Kuingsmile/PicList.svg?style=flat-square" alt="Release">
</a>
</div>
![Repository Stats](https://repobeats.axiom.co/api/embed/9e4ec90b7b50f8e9c10d77439e49e26b303fabed.svg "Repobeats analytics image")
[简体中文](https://github.com/Kuingsmile/PicList/blob/dev/README_cn.md) | English
## 📑 Table of Contents
- [📑 Table of Contents](#-table-of-contents)
- [Introduction](#introduction)
- [Official Website](#official-website)
- [How to Migrate from PicGo](#how-to-migrate-from-picgo)
- [PicList-Core](#piclist-core)
- [Key Features](#key-features)
- [Integration Guides](#integration-guides)
- [VSCode Integration](#vscode-integration)
- [Typora Integration](#typora-integration)
- [**Version 1.6.0-dev and above**](#version-160-dev-and-above)
- [**Version \< 1.6.0-dev**](#version--160-dev)
- [Obsidian Integration](#obsidian-integration)
- [Docker Integration](#docker-integration)
- [Using docker run](#using-docker-run)
- [Using docker-compose](#using-docker-compose)
- [Supported Platforms](#supported-platforms)
- [Download and Install](#download-and-install)
- [Direct Download](#direct-download)
- [Scoop (Windows)](#scoop-windows)
- [Winget (Windows)](#winget-windows)
- [Homebrew (macOS)](#homebrew-macos)
- [OS Requirements](#os-requirements)
- [Windows](#windows)
- [macOS](#macos)
- [Linux](#linux)
- [Screenshots](#screenshots)
- [Development](#development)
- [Prerequisites](#prerequisites)
- [Getting Started](#getting-started)
- [Development Mode](#development-mode)
- [Production Build](#production-build)
- [Related Projects](#related-projects)
- [Community](#community)
- [License](#license)
- [Star Me](#star-me)
## Introduction
PicList is an efficient cloud storage and image hosting management tool built upon PicGo with extensive enhancements. It combines complete image hosting capabilities with comprehensive cloud storage management features, offering:
- All original PicGo functionality plus compatibility with most PicGo plugins
- Extended built-in image hosting platforms (WebDav, local hosting, SFTP, etc.)
- Cloud-synchronized file deletion in album view
- Comprehensive cloud storage management with file operations, search, and previews
- Built-in image processing tools (watermarks, compression, scaling, rotation, format conversion)
## Official Website
Please visit the [PicList official website piclist.cn](https://piclist.cn) for more information.
You can also visit the [DeepWiki of PicList](https://deepwiki.com/Kuingsmile/PicList) to learn more about the project architecture and development.
## How to Migrate from PicGo
PicList `V1.5.0` and above provide a `one-click migration` function. Enter the `Settings` page, click the button next to `Migrate from PicGo`, then restart the application for changes to take effect.
## PicList-Core
PicList uses a modified version of PicGo-Core called [PicList-core](https://github.com/Kuingsmile/PicList-Core), adapted for cloud deletion and extended with features like:
- Watermark addition
- Image compression, scaling, rotation, and format conversion
- CLI command support
- Built-in upload server via `picgo-server` command
To use PicList-core separately, visit [GitHub repo](https://github.com/Kuingsmile/PicList-Core) or the [npm package](https://www.npmjs.com/package/piclist).
## Key Features
- **Complete Compatibility**: Works with Typora, Obsidian, and most PicGo plugins
- **Extended Platform Support**: Added WebDav, Lsky Pro, local hosting, SFTP, and account-based Imgur uploads
- **Cloud-Sync Album**: Delete images from storage alongside local entries
- **Advanced Album Features**: Search, sort, and batch URL modification
- **Built-in Image Tools**: Add watermarks, compress, scale, rotate, and convert formats
- **Form Upload**: Share across multiple computers
- **Config Synchronization**: Save settings to GitHub/Gitee/Gitea repositories
- **Cloud Management**: Browse directories, search files, batch operations, and more
- **Multi-format Previews**: View images, videos, text files, and Markdown files (see [supported formats](https://github.com/Kuingsmile/PicList/blob/dev/supported_format.md))
- **Batch Operations**: Rename cloud files with regular expressions
- **Link Sharing**: Generate pre-signed URLs for private storage buckets
- **Usability Improvements**: Auto-updates, multiple startup modes, UI enhancements, and more
## Integration Guides
### VSCode Integration
Install the [VS-PicList](https://marketplace.visualstudio.com/items?itemName=Kuingsmile.vs-piclist) plugin, which integrates directly with PicList desktop software and supports a variety of uploads and cloud deletion operations in VSCode.
### Typora Integration
#### **Version 1.6.0-dev and above**
**Typora 1.6.0-dev and later versions natively support PicList.** For versions below 1.10.6, set Typora's language to Chinese.
If your Typora version is below 1.8.0, set both the PicList and PicGo (app) upload service paths to your PicList installation path.
[Typora download link](https://typora.io/releases/all)
#### **Version < 1.6.0-dev**
For Windows, in Typora settings:
1. Set upload service to `PicGo(app)`
2. Set `PicGo path` to your PicList installation path
![Typora configuration](https://user-images.githubusercontent.com/96409857/226522101-b3531b7b-534c-4149-b527-8738d4ebb041.png)
Alternatively, install PicList-core with `npm install piclist` and set the upload service to `PicGo-Core (command line)`.
### Obsidian Integration
1. Install the "Image auto upload Plugin" from community plugins
2. Set the default uploader to PicGo(app)
3. Configure PicGo server as `http://127.0.0.1:36677/upload`
4. For cloud deletion support, set the deletion interface to `http://127.0.0.1:36677/delete`
![Obsidian configuration](https://user-images.githubusercontent.com/96409857/226522718-8378c480-9fb4-4785-87e1-d59808862016.png)
### Docker Integration
#### Using docker run
```bash
docker pull kuingsmile/piclist:latest
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
Change `./piclist` to your config directory path and `piclist123456` to your preferred secret key.
#### Using docker-compose
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
Run with `docker-compose up -d`
## Supported Platforms
| Platform | Album Cloud Deletion | Cloud Storage Management |
| :------------------------: | :------------------: | :----------------------: |
| Built-in AList | ✔️ | ✔️ |
| SM.MS | ✔️ | ✔️ |
| Github | ✔️ | ✔️ |
| Imgur | ✔️ | ✔️ |
| Tencent COS V5 | ✔️ | ✔️ |
| Aliyun OSS | ✔️ | ✔️ |
| Upyun | ✔️ | ✔️ |
| Qiniu | ✔️ | ✔️ |
| S3 API compatible platform | ✔️ | ✔️ |
| WebDAV | ✔️ | ✔️ |
| Local | ✔️ | ✔️ |
| Built-in SFTP | ✔️ | ✔️ |
| Doge Cloud | ✔️ | ✔️ |
| PicList(Lasso-Doll) | ✔️ | ✔️ |
| Lsky Pro | ✔️ | ✔️ |
| Custom API platform | × | × |
**Supported Plugins with Cloud Deletion:**
- [picgo-plugin-s3](https://github.com/wayjam/picgo-plugin-s3)
- [picgo-plugin-alist](https://github.com/jinzhi0123/picgo-plugin-alist)
- [picgo-plugin-huawei-uploader](https://github.com/YunfengGao/picgo-plugin-huawei-uploader)
- [picgo-plugin-dogecloud](https://github.com/w4j1e/picgo-plugin-dogecloud)
## Download and Install
### Direct Download
[Download the latest release](https://github.com/Kuingsmile/PicList/releases/latest)
### Scoop (Windows)
```bash
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop install lemon/piclist
```
### Winget (Windows)
```bash
winget install Kuingsmile.PicList
```
### Homebrew (macOS)
```bash
# Install
brew install piclist --cask
# Uninstall
brew uninstall piclist
```
### OS Requirements
#### Windows
- **Supported Versions**: Windows 10 and later
- **Architectures**: `ia32` (x86), `x64` (amd64), `arm64`
#### macOS
- **Supported Versions**: macOS Big Sur (11) and later
- **Architectures**: Intel (x64) and Apple Silicon (arm64)
#### Linux
- **Supported Versions**:
- Ubuntu 18.04 and later
- Fedora 32 and later
- Debian 10 and later
## Screenshots
![Upload interface](https://github.com/Kuingsmile/PicList/blob/dev/imgs/upload.png?raw=true)
![Album view](https://github.com/Kuingsmile/PicList/blob/dev/imgs/gallery.png?raw=true)
![Cloud management](https://github.com/Kuingsmile/PicList/blob/dev/imgs/cloud_storage.png?raw=true)
![Settings](https://github.com/Kuingsmile/PicList/blob/dev/imgs/settings.png?raw=true)
![Image editing](https://github.com/Kuingsmile/PicList/blob/dev/imgs/image_editing.png?raw=true)
![Dark theme](https://github.com/Kuingsmile/PicList/blob/dev/imgs/dark.png?raw=true)
## Development
### Prerequisites
1. Node.js 20 + and Git
2. Knowledge of npm
3. Xcode for Mac or Visual Studio for Windows
### Getting Started
```bash
git clone https://github.com/Kuingsmile/PicList.git
cd PicList
yarn # Do not use npm install
```
To contribute, see the [contribution guide](https://github.com/Kuingsmile/PicList/blob/dev/CONTRIBUTING_EN.md).
### Development Mode
```bash
yarn run dev
```
Development mode has hot-reload but may be unstable. If the process crashes, exit with `Ctrl+C` and restart.
Note: The PicList application icon will appear in your taskbar/system tray while in development mode.
### Production Build
```bash
yarn run build
```
The built installer will be available in the `dist_electron` directory.
For network issues with electron-builder, set the mirror:
**Linux/macOS:**
```bash
export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
```
**Windows:**
```cmd
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
```
## Related Projects
- [PicList-Core](https://github.com/Kuingsmile/PicList-Core): Core library based on PicGo-Core for CLI and development
- [PicHoro](https://github.com/Kuingsmile/PicHoro): Mobile app companion for PicList
- [VS-PicList](https://github.com/Kuingsmile/vs-PicList/): VSCode plugin for PicList
## Community
Join our Telegram group for questions and discussion:
[PicList TG Group](https://t.me/+rq8y7wsj7Pg5ZTg1)
![TG QR Code](https://pichoro.msq.pub/wechat.png)
## License
This project is open source under the MIT license.
[MIT](https://opensource.org/licenses/MIT)
Copyright (c) 2017-present Molunerfinn
Copyright (c) 2023-present Kuingsmile
## Star Me
[![GitHub stars](https://img.shields.io/github/stars/kuingsmile/PicList?logo=github&style=social)](https://github.com/kuingsmile/PicList/stargazers)
[![Stargazers over time](https://starchart.cc/kuingsmile/PicList.svg)](https://github.com/kuingsmile/PicList/stargazers)
<div align="center">
<img src="https://imgx.horosama.com/admin_uploads/2022/10/2022_10_05_633d79e401694.png" alt="PicList Logo">
<h1>PicList</h1>
<p><strong>Powerful cloud storage and image hosting management tool</strong></p>
<a href="https://github.com/Kuingsmile/PicList/actions">
<img src="https://img.shields.io/badge/code%20style-standard-green.svg?style=flat-square" alt="Code Style">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases">
<img src="https://img.shields.io/github/downloads/Kuingsmile/PicList/total.svg?style=flat-square" alt="Downloads">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases/latest">
<img src="https://img.shields.io/github/release/Kuingsmile/PicList.svg?style=flat-square" alt="Release">
</a>
</div>
![Repository Stats](https://repobeats.axiom.co/api/embed/9e4ec90b7b50f8e9c10d77439e49e26b303fabed.svg "Repobeats analytics image")
[简体中文](https://github.com/Kuingsmile/PicList/blob/dev/README_cn.md) | English
## 📑 Table of Contents
- [📑 Table of Contents](#-table-of-contents)
- [Introduction](#introduction)
- [Official Website](#official-website)
- [How to Migrate from PicGo](#how-to-migrate-from-picgo)
- [PicList-Core](#piclist-core)
- [Key Features](#key-features)
- [Integration Guides](#integration-guides)
- [VSCode Integration](#vscode-integration)
- [Typora Integration](#typora-integration)
- [**Version 1.6.0-dev and above**](#version-160-dev-and-above)
- [**Version \< 1.6.0-dev**](#version--160-dev)
- [Obsidian Integration](#obsidian-integration)
- [Docker Integration](#docker-integration)
- [Using docker run](#using-docker-run)
- [Using docker-compose](#using-docker-compose)
- [Supported Platforms](#supported-platforms)
- [Download and Install](#download-and-install)
- [Direct Download](#direct-download)
- [Scoop (Windows)](#scoop-windows)
- [Winget (Windows)](#winget-windows)
- [Homebrew (macOS)](#homebrew-macos)
- [OS Requirements](#os-requirements)
- [Windows](#windows)
- [macOS](#macos)
- [Linux](#linux)
- [Screenshots](#screenshots)
- [Development](#development)
- [Prerequisites](#prerequisites)
- [Getting Started](#getting-started)
- [Development Mode](#development-mode)
- [Production Build](#production-build)
- [Related Projects](#related-projects)
- [Community](#community)
- [License](#license)
- [Star Me](#star-me)
## Introduction
PicList is an efficient cloud storage and image hosting management tool built upon PicGo with extensive enhancements. It combines complete image hosting capabilities with comprehensive cloud storage management features, offering:
- All original PicGo functionality plus compatibility with most PicGo plugins
- Extended built-in image hosting platforms (WebDav, local hosting, SFTP, etc.)
- Cloud-synchronized file deletion in album view
- Comprehensive cloud storage management with file operations, search, and previews
- Built-in image processing tools (watermarks, compression, scaling, rotation, format conversion)
## Official Website
Please visit the [PicList official website piclist.cn](https://piclist.cn) for more information.
You can also visit the [DeepWiki of PicList](https://deepwiki.com/Kuingsmile/PicList) to learn more about the project architecture and development.
## How to Migrate from PicGo
PicList `V1.5.0` and above provide a `one-click migration` function. Enter the `Settings` page, click the button next to `Migrate from PicGo`, then restart the application for changes to take effect.
## PicList-Core
PicList uses a modified version of PicGo-Core called [PicList-core](https://github.com/Kuingsmile/PicList-Core), adapted for cloud deletion and extended with features like:
- Watermark addition
- Image compression, scaling, rotation, and format conversion
- CLI command support
- Built-in upload server via `picgo-server` command
To use PicList-core separately, visit [GitHub repo](https://github.com/Kuingsmile/PicList-Core) or the [npm package](https://www.npmjs.com/package/piclist).
## Key Features
- **Complete Compatibility**: Works with Typora, Obsidian, and most PicGo plugins
- **Extended Platform Support**: Added WebDav, Lsky Pro, local hosting, SFTP, and account-based Imgur uploads
- **Cloud-Sync Album**: Delete images from storage alongside local entries
- **Advanced Album Features**: Search, sort, and batch URL modification
- **Built-in Image Tools**: Add watermarks, compress, scale, rotate, and convert formats
- **Form Upload**: Share across multiple computers
- **Config Synchronization**: Save settings to GitHub/Gitee/Gitea repositories
- **Cloud Management**: Browse directories, search files, batch operations, and more
- **Multi-format Previews**: View images, videos, text files, and Markdown files (see [supported formats](https://github.com/Kuingsmile/PicList/blob/dev/supported_format.md))
- **Batch Operations**: Rename cloud files with regular expressions
- **Link Sharing**: Generate pre-signed URLs for private storage buckets
- **Usability Improvements**: Auto-updates, multiple startup modes, UI enhancements, and more
## Integration Guides
### VSCode Integration
Install the [VS-PicList](https://marketplace.visualstudio.com/items?itemName=Kuingsmile.vs-piclist) plugin, which integrates directly with PicList desktop software and supports a variety of uploads and cloud deletion operations in VSCode.
### Typora Integration
#### **Version 1.6.0-dev and above**
**Typora 1.6.0-dev and later versions natively support PicList.** For versions below 1.10.6, set Typora's language to Chinese.
If your Typora version is below 1.8.0, set both the PicList and PicGo (app) upload service paths to your PicList installation path.
[Typora download link](https://typora.io/releases/all)
#### **Version < 1.6.0-dev**
For Windows, in Typora settings:
1. Set upload service to `PicGo(app)`
2. Set `PicGo path` to your PicList installation path
![Typora configuration](https://user-images.githubusercontent.com/96409857/226522101-b3531b7b-534c-4149-b527-8738d4ebb041.png)
Alternatively, install PicList-core with `npm install piclist` and set the upload service to `PicGo-Core (command line)`.
### Obsidian Integration
1. Install the "Image auto upload Plugin" from community plugins
2. Set the default uploader to PicGo(app)
3. Configure PicGo server as `http://127.0.0.1:36677/upload`
4. For cloud deletion support, set the deletion interface to `http://127.0.0.1:36677/delete`
![Obsidian configuration](https://user-images.githubusercontent.com/96409857/226522718-8378c480-9fb4-4785-87e1-d59808862016.png)
### Docker Integration
#### Using docker run
```bash
docker pull kuingsmile/piclist:latest
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
Change `./piclist` to your config directory path and `piclist123456` to your preferred secret key.
#### Using docker-compose
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
Run with `docker-compose up -d`
## Supported Platforms
| Platform | Album Cloud Deletion | Cloud Storage Management |
| :------------------------: | :------------------: | :----------------------: |
| Built-in AList | ✔️ | ✔️ |
| SM.MS | ✔️ | ✔️ |
| Github | ✔️ | ✔️ |
| Imgur | ✔️ | ✔️ |
| Tencent COS V5 | ✔️ | ✔️ |
| Aliyun OSS | ✔️ | ✔️ |
| Upyun | ✔️ | ✔️ |
| Qiniu | ✔️ | ✔️ |
| S3 API compatible platform | ✔️ | ✔️ |
| WebDAV | ✔️ | ✔️ |
| Local | ✔️ | ✔️ |
| Built-in SFTP | ✔️ | ✔️ |
| Doge Cloud | ✔️ | ✔️ |
| PicList(Lasso-Doll) | ✔️ | ✔️ |
| Lsky Pro | ✔️ | ✔️ |
| Custom API platform | × | × |
**Supported Plugins with Cloud Deletion:**
- [picgo-plugin-s3](https://github.com/wayjam/picgo-plugin-s3)
- [picgo-plugin-alist](https://github.com/jinzhi0123/picgo-plugin-alist)
- [picgo-plugin-huawei-uploader](https://github.com/YunfengGao/picgo-plugin-huawei-uploader)
- [picgo-plugin-dogecloud](https://github.com/w4j1e/picgo-plugin-dogecloud)
## Download and Install
### Direct Download
[Download the latest release](https://github.com/Kuingsmile/PicList/releases/latest)
### Scoop (Windows)
```bash
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop install lemon/piclist
```
### Winget (Windows)
```bash
winget install Kuingsmile.PicList
```
### Homebrew (macOS)
```bash
# Install
brew install piclist --cask
# Uninstall
brew uninstall piclist
```
### OS Requirements
#### Windows
- **Supported Versions**: Windows 10 and later
- **Architectures**: `ia32` (x86), `x64` (amd64), `arm64`
#### macOS
- **Supported Versions**: macOS Big Sur (11) and later
- **Architectures**: Intel (x64) and Apple Silicon (arm64)
#### Linux
- **Supported Versions**:
- Ubuntu 18.04 and later
- Fedora 32 and later
- Debian 10 and later
## Screenshots
![Upload interface](https://github.com/Kuingsmile/PicList/blob/dev/imgs/upload.png?raw=true)
![Album view](https://github.com/Kuingsmile/PicList/blob/dev/imgs/gallery.png?raw=true)
![Cloud management](https://github.com/Kuingsmile/PicList/blob/dev/imgs/cloud_storage.png?raw=true)
![Settings](https://github.com/Kuingsmile/PicList/blob/dev/imgs/settings.png?raw=true)
![Image editing](https://github.com/Kuingsmile/PicList/blob/dev/imgs/image_editing.png?raw=true)
![Dark theme](https://github.com/Kuingsmile/PicList/blob/dev/imgs/dark.png?raw=true)
## Development
### Prerequisites
1. Node.js 20 + and Git
2. Knowledge of npm
3. Xcode for Mac or Visual Studio for Windows
### Getting Started
```bash
git clone https://github.com/Kuingsmile/PicList.git
cd PicList
yarn # Do not use npm install
```
To contribute, see the [contribution guide](https://github.com/Kuingsmile/PicList/blob/dev/CONTRIBUTING_EN.md).
### Development Mode
```bash
yarn run dev
```
Development mode has hot-reload but may be unstable. If the process crashes, exit with `Ctrl+C` and restart.
Note: The PicList application icon will appear in your taskbar/system tray while in development mode.
### Production Build
```bash
yarn run build
```
The built installer will be available in the `dist_electron` directory.
For network issues with electron-builder, set the mirror:
**Linux/macOS:**
```bash
export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
```
**Windows:**
```cmd
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
```
## Related Projects
- [PicList-Core](https://github.com/Kuingsmile/PicList-Core): Core library based on PicGo-Core for CLI and development
- [PicHoro](https://github.com/Kuingsmile/PicHoro): Mobile app companion for PicList
- [VS-PicList](https://github.com/Kuingsmile/vs-PicList/): VSCode plugin for PicList
## Community
Join our Telegram group for questions and discussion:
[PicList TG Group](https://t.me/+rq8y7wsj7Pg5ZTg1)
![TG QR Code](https://pichoro.msq.pub/wechat.png)
## License
This project is open source under the MIT license.
[MIT](https://opensource.org/licenses/MIT)
Copyright (c) 2017-present Molunerfinn
Copyright (c) 2023-present Kuingsmile
## Star Me
[![GitHub stars](https://img.shields.io/github/stars/kuingsmile/PicList?logo=github&style=social)](https://github.com/kuingsmile/PicList/stargazers)
[![Stargazers over time](https://starchart.cc/kuingsmile/PicList.svg)](https://github.com/kuingsmile/PicList/stargazers)

View File

@@ -1,339 +1,339 @@
<div align="center">
<img src="https://imgx.horosama.com/admin_uploads/2022/10/2022_10_05_633d79e401694.png" alt="PicList Logo">
<h1>PicList</h1>
<p><strong>强大的云存储与图床管理工具</strong></p>
<a href="https://github.com/Kuingsmile/PicList/actions">
<img src="https://img.shields.io/badge/code%20style-standard-green.svg?style=flat-square" alt="Code Style">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases">
<img src="https://img.shields.io/github/downloads/Kuingsmile/PicList/total.svg?style=flat-square" alt="Downloads">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases/latest">
<img src="https://img.shields.io/github/release/Kuingsmile/PicList.svg?style=flat-square" alt="Release">
</a>
</div>
![仓库统计](https://repobeats.axiom.co/api/embed/9e4ec90b7b50f8e9c10d77439e49e26b303fabed.svg "Repobeats analytics image")
简体中文 | [English](https://github.com/Kuingsmile/PicList/blob/dev/README.md)
## 📑 目录
- [📑 目录](#-目录)
- [简介](#简介)
- [官方网址](#官方网址)
- [如何从PicGo迁移](#如何从picgo迁移)
- [PicList-Core](#piclist-core)
- [特色功能](#特色功能)
- [如何使用](#如何使用)
- [如何在VSCode中使用](#如何在vscode中使用)
- [如何在Typora中使用](#如何在typora中使用)
- [**1.6.0版本及以上**](#160版本及以上)
- [**1.6.0版本以下**](#160版本以下)
- [如何在Obsidian中使用](#如何在obsidian中使用)
- [如何在Docker中使用](#如何在docker中使用)
- [使用docker run命令](#使用docker-run命令)
- [使用docker-compose](#使用docker-compose)
- [已支持平台](#已支持平台)
- [下载安装](#下载安装)
- [直接下载](#直接下载)
- [ScoopWindows](#scoopwindows)
- [Winget (Windows)](#winget-windows)
- [HomebrewmacOS](#homebrewmacos)
- [系统版本要求](#系统版本要求)
- [Windows](#windows)
- [macOS](#macos)
- [Linux](#linux)
- [应用截图](#应用截图)
- [开发说明](#开发说明)
- [前提条件](#前提条件)
- [开始开发](#开始开发)
- [开发模式](#开发模式)
- [生产构建](#生产构建)
- [其它相关](#其它相关)
- [交流群](#交流群)
- [License](#license)
- [Star Me](#star-me)
## 简介
PicList是一款高效的云存储和图床平台管理工具基于PicGo深度二次开发提供完整的图床功能和全面的云存储管理能力主要特点包括
- 完整保留PicGo所有功能兼容大部分PicGo插件
- 扩展了内置图床平台如WebDav、本地图床和SFTP等
- 相册支持同步云端删除文件
- 全面的云存储管理功能,包括文件操作、搜索和预览
- 内置图像处理工具,如水印、压缩、缩放、旋转和格式转换
## 官方网址
请访问 [PicList官网 piclist.cn](https://piclist.cn) 获取更多信息。
此外,你也可以访问[DeepWiki of PicList](https://deepwiki.com/Kuingsmile/PicList)了解更多关于项目架构和开发的内容。
## 如何从PicGo迁移
PicList `V1.5.0`以上版本提供 `一键迁移`功能,进入 `设置`页面,然后在 `从PicGo迁移`选项点击右侧按钮即可,迁移后请重启应用生效。
## PicList-Core
PicList的内核使用[PicList-core](https://github.com/Kuingsmile/PicList-Core)这是基于原版PicGo-Core修改的版本具有以下增强功能
- 水印添加
- 图片压缩、缩放、旋转和格式转换
- CLI命令行支持
- 通过`picgo-server`命令启动上传服务器
如果您希望单独使用PicList-core请访问[GitHub仓库](https://github.com/Kuingsmile/PicList-Core)或[npm包](https://www.npmjs.com/package/piclist)。
## 特色功能
- **完全兼容性**适用于Typora、Obsidian和大多数PicGo插件
- **扩展平台支持**新增WebDav、兰空图床、本地图床、SFTP等原内置imgur图床额外支持账号登录上传
- **云端同步相册**:支持同步删除云端图片,兼容所有内置图床和多个插件
- **高级相册功能**高级搜索、排序和批量URL修改
- **内置图像工具**:水印添加、图片压缩、图片缩放、图片旋转和格式转换,支持高级重命名
- **表单上传**:支持多电脑共享使用
- **配置同步**支持配置同步至GitHub/Gitee/Gitea仓库
- **云存储管理**:云端目录查看、文件搜索、批量操作等功能
- **多格式预览**支持预览图片、视频、文本和Markdown文件查看[支持的文件格式列表](https://github.com/Kuingsmile/PicList/blob/dev/supported_format.md)
- **批量操作**:支持使用正则表达式批量重命名云端文件
- **链接分享**:为私有存储桶生成预签名链接
- **易用性改进**:软件自动更新、多种启动模式、界面优化等
## 如何使用
### 如何在VSCode中使用
安装[VS-PicList](https://marketplace.visualstudio.com/items?itemName=Kuingsmile.vs-piclist)插件与vs-picgo插件相比该插件直接依赖于PicList桌面端软件支持多种上传方式和直接在VSCode中进行云端删除等功能。
### 如何在Typora中使用
#### **1.6.0版本及以上**
**Typora 1.6.0-dev以及以上版本已原生支持PicList**。在1.10.6版本以下中需要将Typora的语言设置为中文。
如果您使用的是1.8.0以下版本的Typora需要同时设置PicList和PicGo(app)上传服务的路径为PicList的安装路径。
[Typora下载链接](https://typora.io/releases/all)
#### **1.6.0版本以下**
Windows系统
1. 进入Typora设置页面选择"图像"
2. 将上传服务设置为`PicGo(app)`
3.`PicGo路径`中填写PicList的安装路径
![Typora配置](https://user-images.githubusercontent.com/96409857/226522101-b3531b7b-534c-4149-b527-8738d4ebb041.png)
或者,您也可以使用`npm install piclist`命令安装PicList-core然后将上传服务设置为`PicGo-Core(command line)`
### 如何在Obsidian中使用
1. 在社区插件中搜索安装`Image auto upload Plugin`
2. 进入插件设置页面,将默认上传器修改为`PicGo(app)`
3. 设置`PicGo server``http://127.0.0.1:36677/upload`
4. 如需启用云端删除功能,请在删除接口中填入`http://127.0.0.1:36677/delete`
![Obsidian配置](https://user-images.githubusercontent.com/96409857/226522718-8378c480-9fb4-4785-87e1-d59808862016.png)
### 如何在Docker中使用
#### 使用docker run命令
```bash
docker pull kuingsmile/piclist:latest
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
请将`./piclist`修改为您的配置文件`config.json`所在路径,将`piclist123456`修改为您自己的密钥。
#### 使用docker-compose
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
使用`docker-compose up -d`命令启动。
## 已支持平台
| 平台 | 相册云删除 | 云存储管理 |
| :------------: | :--------: | :--------: |
| 内置AList | ✔️ | ✔️ |
| SM.MS | ✔️ | ✔️ |
| Github | ✔️ | ✔️ |
| Imgur | ✔️ | ✔️ |
| 腾讯COS V5 | ✔️ | ✔️ |
| 阿里云OSS | ✔️ | ✔️ |
| 又拍云 | ✔️ | ✔️ |
| 七牛云 | ✔️ | ✔️ |
| S3 API兼容平台 | ✔️ | ✔️ |
| WebDAV | ✔️ | ✔️ |
| 本地文件夹 | ✔️ | ✔️ |
| 内置SFTP | ✔️ | ✔️ |
| 多吉云 | ✔️ | ✔️ |
| PicList(套娃) | ✔️ | ✔️ |
| 兰空图床 | ✔️ | ✔️ |
| 自定义图床 | x | x |
**支持云删除功能的插件:**
- [picgo-plugin-s3](https://github.com/wayjam/picgo-plugin-s3)
- [picgo-plugin-alist](https://github.com/jinzhi0123/picgo-plugin-alist)
- [picgo-plugin-huawei-uploader](https://github.com/YunfengGao/picgo-plugin-huawei-uploader)
- [picgo-plugin-dogecloud](https://github.com/w4j1e/picgo-plugin-dogecloud)
## 下载安装
### 直接下载
[下载最新版本](https://github.com/Kuingsmile/PicList/releases/latest)
### ScoopWindows
```bash
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop install lemon/piclist
```
### Winget (Windows)
```bash
winget install Kuingsmile.PicList
```
### HomebrewmacOS
```bash
# 安装
brew install piclist --cask
# 卸载
brew uninstall piclist
```
### 系统版本要求
#### Windows
- **支持的版本**: Windows 10及以上版本
- **架构**: `ia32` (x86), `x64` (amd64), `arm64`
#### macOS
- **支持的版本**: macOS Big Sur (11)及以上
- **架构**: Intel (x64)和Apple Silicon (arm64)
#### Linux
- **包括不限于**:
- Ubuntu 18.04及更新版本
- Fedora 32及更新版本
- Debian 10及更新版本
## 应用截图
![上传界面](https://github.com/Kuingsmile/PicList/blob/dev/imgs/upload.png?raw=true)
![相册视图](https://github.com/Kuingsmile/PicList/blob/dev/imgs/gallery.png?raw=true)
![云存储管理](https://github.com/Kuingsmile/PicList/blob/dev/imgs/cloud_storage.png?raw=true)
![设置页面](https://github.com/Kuingsmile/PicList/blob/dev/imgs/settings.png?raw=true)
![图像编辑](https://github.com/Kuingsmile/PicList/blob/dev/imgs/image_editing.png?raw=true)
![深色主题](https://github.com/Kuingsmile/PicList/blob/dev/imgs/dark.png?raw=true)
## 开发说明
### 前提条件
1. 需要Node.js 20+ 和 Git
2. 了解npm相关知识
3. Mac需要Xcode环境Windows需要Visual Studio环境
### 开始开发
```bash
git clone https://github.com/Kuingsmile/PicList.git
cd PicList
yarn # 不要使用npm install
```
如需贡献代码,请参考[贡献指南](https://github.com/Kuingsmile/PicList/blob/dev/CONTRIBUTING.md)。
### 开发模式
```bash
yarn run dev
```
开发模式具有热重载特性,但可能不稳定。如果进程崩溃,请用`Ctrl+C`退出并重新启动。
注意开发模式运行后PicList的应用图标会出现在任务栏/系统托盘中。
### 生产构建
```bash
yarn run build
```
构建成功后,安装文件将出现在`dist_electron`目录中。
如果遇到网络问题导致electron-builder下载失败可以设置镜像源
**Linux/macOS:**
```bash
export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
```
**Windows:**
```cmd
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
```
## 其它相关
- [PicList-Core](https://github.com/Kuingsmile/PicList-Core)基于PicGo-Core的核心库用于CLI操作和项目开发
- [PicHoro](https://github.com/Kuingsmile/PicHoro)配合PicList使用的手机APP
- [VS-PicList](https://github.com/Kuingsmile/vs-PicList/)配合PicList使用的VSCode插件
## 交流群
如有任何问题欢迎加入TG群进行交流
[PicList交流群](https://t.me/+rq8y7wsj7Pg5ZTg1)
![TG群二维码](https://pichoro.msq.pub/wechat.png)
## License
本项目基于MIT协议开源欢迎大家使用和贡献代码感谢原作者Molunerfinn的开源精神。
[MIT](https://opensource.org/licenses/MIT)
Copyright (c) 2017-present Molunerfinn
Copyright (c) 2023-present Kuingsmile
## Star Me
[![GitHub stars](https://img.shields.io/github/stars/kuingsmile/PicList?logo=github&style=social)](https://github.com/kuingsmile/PicList/stargazers)
[![Stargazers over time](https://starchart.cc/kuingsmile/PicList.svg)](https://github.com/kuingsmile/PicList/stargazers)
<div align="center">
<img src="https://imgx.horosama.com/admin_uploads/2022/10/2022_10_05_633d79e401694.png" alt="PicList Logo">
<h1>PicList</h1>
<p><strong>强大的云存储与图床管理工具</strong></p>
<a href="https://github.com/Kuingsmile/PicList/actions">
<img src="https://img.shields.io/badge/code%20style-standard-green.svg?style=flat-square" alt="Code Style">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases">
<img src="https://img.shields.io/github/downloads/Kuingsmile/PicList/total.svg?style=flat-square" alt="Downloads">
</a>
<a href="https://github.com/Kuingsmile/PicList/releases/latest">
<img src="https://img.shields.io/github/release/Kuingsmile/PicList.svg?style=flat-square" alt="Release">
</a>
</div>
![仓库统计](https://repobeats.axiom.co/api/embed/9e4ec90b7b50f8e9c10d77439e49e26b303fabed.svg "Repobeats analytics image")
简体中文 | [English](https://github.com/Kuingsmile/PicList/blob/dev/README.md)
## 📑 目录
- [📑 目录](#-目录)
- [简介](#简介)
- [官方网址](#官方网址)
- [如何从PicGo迁移](#如何从picgo迁移)
- [PicList-Core](#piclist-core)
- [特色功能](#特色功能)
- [如何使用](#如何使用)
- [如何在VSCode中使用](#如何在vscode中使用)
- [如何在Typora中使用](#如何在typora中使用)
- [**1.6.0版本及以上**](#160版本及以上)
- [**1.6.0版本以下**](#160版本以下)
- [如何在Obsidian中使用](#如何在obsidian中使用)
- [如何在Docker中使用](#如何在docker中使用)
- [使用docker run命令](#使用docker-run命令)
- [使用docker-compose](#使用docker-compose)
- [已支持平台](#已支持平台)
- [下载安装](#下载安装)
- [直接下载](#直接下载)
- [ScoopWindows](#scoopwindows)
- [Winget (Windows)](#winget-windows)
- [HomebrewmacOS](#homebrewmacos)
- [系统版本要求](#系统版本要求)
- [Windows](#windows)
- [macOS](#macos)
- [Linux](#linux)
- [应用截图](#应用截图)
- [开发说明](#开发说明)
- [前提条件](#前提条件)
- [开始开发](#开始开发)
- [开发模式](#开发模式)
- [生产构建](#生产构建)
- [其它相关](#其它相关)
- [交流群](#交流群)
- [License](#license)
- [Star Me](#star-me)
## 简介
PicList是一款高效的云存储和图床平台管理工具基于PicGo深度二次开发提供完整的图床功能和全面的云存储管理能力主要特点包括
- 完整保留PicGo所有功能兼容大部分PicGo插件
- 扩展了内置图床平台如WebDav、本地图床和SFTP等
- 相册支持同步云端删除文件
- 全面的云存储管理功能,包括文件操作、搜索和预览
- 内置图像处理工具,如水印、压缩、缩放、旋转和格式转换
## 官方网址
请访问 [PicList官网 piclist.cn](https://piclist.cn) 获取更多信息。
此外,你也可以访问[DeepWiki of PicList](https://deepwiki.com/Kuingsmile/PicList)了解更多关于项目架构和开发的内容。
## 如何从PicGo迁移
PicList `V1.5.0`以上版本提供 `一键迁移`功能,进入 `设置`页面,然后在 `从PicGo迁移`选项点击右侧按钮即可,迁移后请重启应用生效。
## PicList-Core
PicList的内核使用[PicList-core](https://github.com/Kuingsmile/PicList-Core)这是基于原版PicGo-Core修改的版本具有以下增强功能
- 水印添加
- 图片压缩、缩放、旋转和格式转换
- CLI命令行支持
- 通过`picgo-server`命令启动上传服务器
如果您希望单独使用PicList-core请访问[GitHub仓库](https://github.com/Kuingsmile/PicList-Core)或[npm包](https://www.npmjs.com/package/piclist)。
## 特色功能
- **完全兼容性**适用于Typora、Obsidian和大多数PicGo插件
- **扩展平台支持**新增WebDav、兰空图床、本地图床、SFTP等原内置imgur图床额外支持账号登录上传
- **云端同步相册**:支持同步删除云端图片,兼容所有内置图床和多个插件
- **高级相册功能**高级搜索、排序和批量URL修改
- **内置图像工具**:水印添加、图片压缩、图片缩放、图片旋转和格式转换,支持高级重命名
- **表单上传**:支持多电脑共享使用
- **配置同步**支持配置同步至GitHub/Gitee/Gitea仓库
- **云存储管理**:云端目录查看、文件搜索、批量操作等功能
- **多格式预览**支持预览图片、视频、文本和Markdown文件查看[支持的文件格式列表](https://github.com/Kuingsmile/PicList/blob/dev/supported_format.md)
- **批量操作**:支持使用正则表达式批量重命名云端文件
- **链接分享**:为私有存储桶生成预签名链接
- **易用性改进**:软件自动更新、多种启动模式、界面优化等
## 如何使用
### 如何在VSCode中使用
安装[VS-PicList](https://marketplace.visualstudio.com/items?itemName=Kuingsmile.vs-piclist)插件与vs-picgo插件相比该插件直接依赖于PicList桌面端软件支持多种上传方式和直接在VSCode中进行云端删除等功能。
### 如何在Typora中使用
#### **1.6.0版本及以上**
**Typora 1.6.0-dev以及以上版本已原生支持PicList**。在1.10.6版本以下中需要将Typora的语言设置为中文。
如果您使用的是1.8.0以下版本的Typora需要同时设置PicList和PicGo(app)上传服务的路径为PicList的安装路径。
[Typora下载链接](https://typora.io/releases/all)
#### **1.6.0版本以下**
Windows系统
1. 进入Typora设置页面选择"图像"
2. 将上传服务设置为`PicGo(app)`
3.`PicGo路径`中填写PicList的安装路径
![Typora配置](https://user-images.githubusercontent.com/96409857/226522101-b3531b7b-534c-4149-b527-8738d4ebb041.png)
或者,您也可以使用`npm install piclist`命令安装PicList-core然后将上传服务设置为`PicGo-Core(command line)`
### 如何在Obsidian中使用
1. 在社区插件中搜索安装`Image auto upload Plugin`
2. 进入插件设置页面,将默认上传器修改为`PicGo(app)`
3. 设置`PicGo server``http://127.0.0.1:36677/upload`
4. 如需启用云端删除功能,请在删除接口中填入`http://127.0.0.1:36677/delete`
![Obsidian配置](https://user-images.githubusercontent.com/96409857/226522718-8378c480-9fb4-4785-87e1-d59808862016.png)
### 如何在Docker中使用
#### 使用docker run命令
```bash
docker pull kuingsmile/piclist:latest
docker run -d \
--name piclist \
--restart always \
-p 36677:36677 \
-v "./piclist:/root/.piclist" \
kuingsmile/piclist:latest \
node /usr/local/bin/picgo-server -k piclist123456
```
请将`./piclist`修改为您的配置文件`config.json`所在路径,将`piclist123456`修改为您自己的密钥。
#### 使用docker-compose
```yaml
version: '3.3'
services:
node:
image: 'kuingsmile/piclist:latest'
container_name: piclist
restart: always
ports:
- 36677:36677
volumes:
- './piclist:/root/.piclist'
command: node /usr/local/bin/picgo-server -k piclist123456
```
使用`docker-compose up -d`命令启动。
## 已支持平台
| 平台 | 相册云删除 | 云存储管理 |
| :------------: | :--------: | :--------: |
| 内置AList | ✔️ | ✔️ |
| SM.MS | ✔️ | ✔️ |
| Github | ✔️ | ✔️ |
| Imgur | ✔️ | ✔️ |
| 腾讯COS V5 | ✔️ | ✔️ |
| 阿里云OSS | ✔️ | ✔️ |
| 又拍云 | ✔️ | ✔️ |
| 七牛云 | ✔️ | ✔️ |
| S3 API兼容平台 | ✔️ | ✔️ |
| WebDAV | ✔️ | ✔️ |
| 本地文件夹 | ✔️ | ✔️ |
| 内置SFTP | ✔️ | ✔️ |
| 多吉云 | ✔️ | ✔️ |
| PicList(套娃) | ✔️ | ✔️ |
| 兰空图床 | ✔️ | ✔️ |
| 自定义图床 | x | x |
**支持云删除功能的插件:**
- [picgo-plugin-s3](https://github.com/wayjam/picgo-plugin-s3)
- [picgo-plugin-alist](https://github.com/jinzhi0123/picgo-plugin-alist)
- [picgo-plugin-huawei-uploader](https://github.com/YunfengGao/picgo-plugin-huawei-uploader)
- [picgo-plugin-dogecloud](https://github.com/w4j1e/picgo-plugin-dogecloud)
## 下载安装
### 直接下载
[下载最新版本](https://github.com/Kuingsmile/PicList/releases/latest)
### ScoopWindows
```bash
scoop bucket add lemon https://github.com/hoilc/scoop-lemon
scoop install lemon/piclist
```
### Winget (Windows)
```bash
winget install Kuingsmile.PicList
```
### HomebrewmacOS
```bash
# 安装
brew install piclist --cask
# 卸载
brew uninstall piclist
```
### 系统版本要求
#### Windows
- **支持的版本**: Windows 10及以上版本
- **架构**: `ia32` (x86), `x64` (amd64), `arm64`
#### macOS
- **支持的版本**: macOS Big Sur (11)及以上
- **架构**: Intel (x64)和Apple Silicon (arm64)
#### Linux
- **包括不限于**:
- Ubuntu 18.04及更新版本
- Fedora 32及更新版本
- Debian 10及更新版本
## 应用截图
![上传界面](https://github.com/Kuingsmile/PicList/blob/dev/imgs/upload.png?raw=true)
![相册视图](https://github.com/Kuingsmile/PicList/blob/dev/imgs/gallery.png?raw=true)
![云存储管理](https://github.com/Kuingsmile/PicList/blob/dev/imgs/cloud_storage.png?raw=true)
![设置页面](https://github.com/Kuingsmile/PicList/blob/dev/imgs/settings.png?raw=true)
![图像编辑](https://github.com/Kuingsmile/PicList/blob/dev/imgs/image_editing.png?raw=true)
![深色主题](https://github.com/Kuingsmile/PicList/blob/dev/imgs/dark.png?raw=true)
## 开发说明
### 前提条件
1. 需要Node.js 20+ 和 Git
2. 了解npm相关知识
3. Mac需要Xcode环境Windows需要Visual Studio环境
### 开始开发
```bash
git clone https://github.com/Kuingsmile/PicList.git
cd PicList
yarn # 不要使用npm install
```
如需贡献代码,请参考[贡献指南](https://github.com/Kuingsmile/PicList/blob/dev/CONTRIBUTING.md)。
### 开发模式
```bash
yarn run dev
```
开发模式具有热重载特性,但可能不稳定。如果进程崩溃,请用`Ctrl+C`退出并重新启动。
注意开发模式运行后PicList的应用图标会出现在任务栏/系统托盘中。
### 生产构建
```bash
yarn run build
```
构建成功后,安装文件将出现在`dist_electron`目录中。
如果遇到网络问题导致electron-builder下载失败可以设置镜像源
**Linux/macOS:**
```bash
export ELECTRON_MIRROR="https://npmmirror.com/mirrors/electron/"
```
**Windows:**
```cmd
set ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
```
## 其它相关
- [PicList-Core](https://github.com/Kuingsmile/PicList-Core)基于PicGo-Core的核心库用于CLI操作和项目开发
- [PicHoro](https://github.com/Kuingsmile/PicHoro)配合PicList使用的手机APP
- [VS-PicList](https://github.com/Kuingsmile/vs-PicList/)配合PicList使用的VSCode插件
## 交流群
如有任何问题欢迎加入TG群进行交流
[PicList交流群](https://t.me/+rq8y7wsj7Pg5ZTg1)
![TG群二维码](https://pichoro.msq.pub/wechat.png)
## License
本项目基于MIT协议开源欢迎大家使用和贡献代码感谢原作者Molunerfinn的开源精神。
[MIT](https://opensource.org/licenses/MIT)
Copyright (c) 2017-present Molunerfinn
Copyright (c) 2023-present Kuingsmile
## Star Me
[![GitHub stars](https://img.shields.io/github/stars/kuingsmile/PicList?logo=github&style=social)](https://github.com/kuingsmile/PicList/stargazers)
[![Stargazers over time](https://starchart.cc/kuingsmile/PicList.svg)](https://github.com/kuingsmile/PicList/stargazers)

View File

@@ -1,23 +1,23 @@
## 🎉 [v3.0.0] 更新日志
3.0.0大版本重大底层架构更新和前端UI重写。
### ⚠️ 重要变更
- **系统要求更新** 不再支持Win7和Win8以及 Mac OS BigSur以下版本
### ✨ 新增功能
- 底层electron版本更新至v36同时迁移至vite
- 新增Windows arm64架构安装包
- UI界面全面重写新增明亮/黑暗主题切换
- 大幅优化了相册性能,现在仅渲染视野内图片
- 新增图片水印透明度设置
- 现在支持折叠app导航栏
- 管理页面仓库列表栏现在支持拖拽调整宽度
### 🐛 问题修复
- 修复了部分图床云端删除闪退的问题
- 修复了使用webdav进行设置备份时自定义路径不生效的问题
- 修复了部分情况下s3图床云端删除失败的问题(#358)
## 🎉 [v3.0.0] 更新日志
3.0.0大版本重大底层架构更新和前端UI重写。
### ⚠️ 重要变更
- **系统要求更新** 不再支持Win7和Win8以及 Mac OS BigSur以下版本
### ✨ 新增功能
- 底层electron版本更新至v36同时迁移至vite
- 新增Windows arm64架构安装包
- UI界面全面重写新增明亮/黑暗主题切换
- 大幅优化了相册性能,现在仅渲染视野内图片
- 新增图片水印透明度设置
- 现在支持折叠app导航栏
- 管理页面仓库列表栏现在支持拖拽调整宽度
### 🐛 问题修复
- 修复了部分图床云端删除闪退的问题
- 修复了使用webdav进行设置备份时自定义路径不生效的问题
- 修复了部分情况下s3图床云端删除失败的问题(#358)

View File

@@ -1,23 +1,23 @@
## 🎉 [v3.0.0] Release Notes
3.0.0 major version, significant underlying architecture updates and front-end UI rewrite.
### ⚠️ Breaking Changes
- **System Requirements Update**: Support for Windows 7 and Windows 8, as well as macOS Big Sur and earlier versions, has been discontinued.
### ✨ Features
- The underlying Electron version has been updated to v36, and the project has been migrated to Vite.
- A Windows ARM64 architecture installation package has been added.
- The UI has been completely rewritten, with a new light/dark theme switch.
- Album performance has been significantly optimized, now only rendering images within the viewport.
- A new image watermark opacity setting has been added.
- The app navigation bar now supports collapsing.
- The repository list sidebar on the management page now supports drag-and-drop width adjustment.
### 🐛 Bug Fixes
- Fixed a crash issue when deleting images from certain cloud storage providers.
- Fixed an issue where custom paths were not effective when backing up settings using WebDAV.
- Fixed an issue where deletion from S3 cloud storage failed in certain cases (#358).
## 🎉 [v3.0.0] Release Notes
3.0.0 major version, significant underlying architecture updates and front-end UI rewrite.
### ⚠️ Breaking Changes
- **System Requirements Update**: Support for Windows 7 and Windows 8, as well as macOS Big Sur and earlier versions, has been discontinued.
### ✨ Features
- The underlying Electron version has been updated to v36, and the project has been migrated to Vite.
- A Windows ARM64 architecture installation package has been added.
- The UI has been completely rewritten, with a new light/dark theme switch.
- Album performance has been significantly optimized, now only rendering images within the viewport.
- A new image watermark opacity setting has been added.
- The app navigation bar now supports collapsing.
- The repository list sidebar on the management page now supports drag-and-drop width adjustment.
### 🐛 Bug Fixes
- Fixed a crash issue when deleting images from certain cloud storage providers.
- Fixed an issue where custom paths were not effective when backing up settings using WebDAV.
- Fixed an issue where deletion from S3 cloud storage failed in certain cases (#358).

View File

@@ -1,84 +1,84 @@
{
"productName": "PicList",
"appId": "com.kuingsmile.piclist",
"afterSign": "scripts/notarize.cjs",
"directories": {
"output": "dist_electron",
"buildResources": "build"
},
"asarUnpack": [
"**/node_modules/sharp/**",
"**/node_modules/ssh2-no-cpu-features/**",
"**/node_modules/@img/**",
"resources/**"
],
"files": ["out/**/*", "resources/**", "package.json"],
"publish": [
{
"provider": "s3",
"bucket": "piclist-dl",
"region": "auto",
"acl": "private",
"endpoint": "https://7ab4ed5cb1f4052a13d3b573876ecf33.r2.cloudflarestorage.com",
"path": "/latest"
},
{
"provider": "github",
"owner": "Kuingsmile",
"repo": "PicList",
"releaseType": "draft"
}
],
"dmg": {
"sign": false,
"contents": [
{
"x": 410,
"y": 150,
"type": "link",
"path": "/Applications"
},
{
"x": 130,
"y": 150,
"type": "file"
}
]
},
"mac": {
"icon": "resources/icon.icns",
"extendInfo": {
"LSUIElement": 0
},
"target": [
{
"target": "default",
"arch": ["x64", "arm64"]
}
],
"artifactName": "PicList-${version}-${arch}.${ext}"
},
"win": {
"icon": "resources/icon.ico",
"artifactName": "PicList-Setup-${version}-${arch}.exe",
"verifyUpdateCodeSignature": false,
"target": [
{
"target": "nsis",
"arch": ["x64", "ia32", "arm64"]
}
]
},
"nsis": {
"shortcutName": "PicList",
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"include": "build/installer.nsh"
},
"linux": {
"icon": "resources/"
},
"snap": {
"publish": ["github"]
}
}
{
"productName": "PicList",
"appId": "com.kuingsmile.piclist",
"afterSign": "scripts/notarize.cjs",
"directories": {
"output": "dist_electron",
"buildResources": "build"
},
"asarUnpack": [
"**/node_modules/sharp/**",
"**/node_modules/ssh2-no-cpu-features/**",
"**/node_modules/@img/**",
"resources/**"
],
"files": ["out/**/*", "resources/**", "package.json"],
"publish": [
{
"provider": "s3",
"bucket": "piclist-dl",
"region": "auto",
"acl": "private",
"endpoint": "https://7ab4ed5cb1f4052a13d3b573876ecf33.r2.cloudflarestorage.com",
"path": "/latest"
},
{
"provider": "github",
"owner": "Kuingsmile",
"repo": "PicList",
"releaseType": "draft"
}
],
"dmg": {
"sign": false,
"contents": [
{
"x": 410,
"y": 150,
"type": "link",
"path": "/Applications"
},
{
"x": 130,
"y": 150,
"type": "file"
}
]
},
"mac": {
"icon": "resources/icon.icns",
"extendInfo": {
"LSUIElement": 0
},
"target": [
{
"target": "default",
"arch": ["x64", "arm64"]
}
],
"artifactName": "PicList-${version}-${arch}.${ext}"
},
"win": {
"icon": "resources/icon.ico",
"artifactName": "PicList-Setup-${version}-${arch}.exe",
"verifyUpdateCodeSignature": false,
"target": [
{
"target": "nsis",
"arch": ["x64", "ia32", "arm64"]
}
]
},
"nsis": {
"shortcutName": "PicList",
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"include": "build/installer.nsh"
},
"linux": {
"icon": "resources/"
},
"snap": {
"publish": ["github"]
}
}

View File

@@ -1,153 +1,153 @@
{
"name": "piclist",
"version": "2.9.9",
"author": {
"name": "Kuingsmile",
"email": "pkukuing@gmail.com"
},
"description": "A powerful cloud storage manage tool.",
"homepage": "https://piclist.cn",
"bugs": {
"url": "https://github.com/Kuingsmile/PicList/issues",
"email": "pkukuing@gmail.com"
},
"license": "MIT",
"type": "module",
"main": "./out/main/index.js",
"private": true,
"scripts": {
"build": "electron-vite build && electron-builder",
"build:win": "electron-vite build && electron-builder --win",
"build:mac": "electron-vite build && electron-builder --mac",
"build:linux": "electron-vite build && electron-builder --linux",
"bump": "bump-version",
"cz": "git-cz",
"dev": "electron-vite dev --watch",
"i18n": "node ./scripts/gen-i18n-types.js",
"link": "node ./scripts/link.js",
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src/ scripts/ .",
"lint:dpdm": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/main/index.ts",
"lint:dpdm:renderer": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/renderer/main.ts",
"lint:fix": "eslint --fix --ext .js,.jsx,.ts,.tsx,.vue src/ scripts/ .",
"ncu": "node ./scripts/check-dep.js",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps",
"prebuild": "electron-vite build",
"preview": "electron-vite preview",
"release": "electron-vite build && electron-builder --publish always",
"sha256": "node ./scripts/gen-sha256.js",
"test": "vitest",
"upload-beta": "node ./scripts/upload-beta.cjs",
"upload-dist": "node ./scripts/upload-dist-to-r2.cjs"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.864.0",
"@aws-sdk/lib-storage": "^3.864.0",
"@aws-sdk/s3-request-presigner": "^3.864.0",
"@headlessui/vue": "^1.7.23",
"@highlightjs/vue-plugin": "^2.1.2",
"@nodelib/fs.walk": "^3.0.1",
"@octokit/rest": "^22.0.0",
"@piclist/i18n": "^2.0.0",
"@piclist/store": "^3.0.0",
"@smithy/node-http-handler": "^4.1.1",
"@videojs-player/vue": "^1.0.0",
"ali-oss": "^6.23.0",
"axios": "^1.11.0",
"chalk": "^5.5.0",
"compare-versions": "^6.1.1",
"cos-nodejs-sdk-v5": "^2.15.4",
"dayjs": "^1.11.13",
"dexie": "^3.2.4",
"electron-updater": "^6.6.2",
"fast-xml-parser": "^5.2.5",
"form-data": "^4.0.4",
"fs-extra": "^11.3.1",
"got": "^14.4.7",
"highlight.js": "^11.11.1",
"hpagent": "^1.2.0",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"lucide-vue-next": "^0.539.0",
"marked": "^16.1.2",
"mime-types": "^3.0.1",
"mitt": "^3.0.1",
"multer": "^2.0.2",
"node-ssh-no-cpu-features": "^2.0.0",
"nodejs-file-downloader": "^4.13.0",
"piclist": "^2.0.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
"qiniu": "7.14.0",
"qrcode.vue": "^3.6.0",
"semver": "^7.7.2",
"shell-path": "3.0.0",
"ssh2-no-cpu-features": "^2.0.0",
"tunnel": "^0.0.6",
"upyun": "^3.4.6",
"uuid": "^11.1.0",
"video.js": "^8.23.4",
"vue": "^3.5.18",
"vue-i18n": "^11.1.11",
"vue-router": "^4.5.1",
"vue3-lazyload": "^0.3.8",
"webdav": "^5.8.0",
"write-file-atomic": "^6.0.0"
},
"devDependencies": {
"@electron/notarize": "^3.0.2",
"@eslint/js": "^9.33.0",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@types/ali-oss": "^6.16.11",
"@types/fs-extra": "^11.0.4",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
"@types/mime-types": "^3.0.1",
"@types/multer": "^2.0.0",
"@types/node": "^24.1.0",
"@types/semver": "^7.5.6",
"@types/tunnel": "^0.0.7",
"@types/upyun": "^3.4.3",
"@types/video.js": "^7.3.58",
"@types/write-file-atomic": "^4.0.3",
"@vitejs/plugin-vue": "^6.0.1",
"@vue/eslint-config-standard": "^9.0.1",
"dotenv": "^16.3.1",
"dpdm": "^3.14.0",
"electron": "^36.7.4",
"electron-builder": "^26.0.12",
"electron-devtools-installer": "^4.0.0",
"electron-vite": "^4.0.0",
"eslint": "^9.33.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unicorn": "^60.0.0",
"eslint-plugin-vue": "^10.4.0",
"globals": "^16.3.0",
"husky": "^9.1.7",
"node-bump-version": "^2.0.0",
"npm-check-updates": "^18.0.2",
"prettier": "^3.6.2",
"stylus": "^0.64.0",
"typescript": "^5.8.3",
"typescript-eslint": "^8.39.1",
"vite": "^7.1.0",
"vitest": "^3.2.4",
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.0.5"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-customizable"
},
"cz-customizable": {
"config": "./node_modules/node-bump-version/.cz-config.cjs"
}
},
"commitlint": {
"extends": [
"./node_modules/node-bump-version/dist/commitlint-node/index.js"
]
}
}
{
"name": "piclist",
"version": "2.9.9",
"author": {
"name": "Kuingsmile",
"email": "pkukuing@gmail.com"
},
"description": "A powerful cloud storage manage tool.",
"homepage": "https://piclist.cn",
"bugs": {
"url": "https://github.com/Kuingsmile/PicList/issues",
"email": "pkukuing@gmail.com"
},
"license": "MIT",
"type": "module",
"main": "./out/main/index.js",
"private": true,
"scripts": {
"build": "electron-vite build && electron-builder",
"build:win": "electron-vite build && electron-builder --win",
"build:mac": "electron-vite build && electron-builder --mac",
"build:linux": "electron-vite build && electron-builder --linux",
"bump": "bump-version",
"cz": "git-cz",
"dev": "electron-vite dev --watch",
"i18n": "node ./scripts/gen-i18n-types.js",
"link": "node ./scripts/link.js",
"lint": "eslint --ext .js,.jsx,.ts,.tsx,.vue src/ scripts/ .",
"lint:dpdm": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/main/index.ts",
"lint:dpdm:renderer": "dpdm -T --tsconfig ./tsconfig.json --no-tree --no-warning --exit-code circular:1 src/renderer/main.ts",
"lint:fix": "eslint --fix --ext .js,.jsx,.ts,.tsx,.vue src/ scripts/ .",
"ncu": "node ./scripts/check-dep.js",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps",
"prebuild": "electron-vite build",
"preview": "electron-vite preview",
"release": "electron-vite build && electron-builder --publish always",
"sha256": "node ./scripts/gen-sha256.js",
"test": "vitest",
"upload-beta": "node ./scripts/upload-beta.cjs",
"upload-dist": "node ./scripts/upload-dist-to-r2.cjs"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.864.0",
"@aws-sdk/lib-storage": "^3.864.0",
"@aws-sdk/s3-request-presigner": "^3.864.0",
"@headlessui/vue": "^1.7.23",
"@highlightjs/vue-plugin": "^2.1.2",
"@nodelib/fs.walk": "^3.0.1",
"@octokit/rest": "^22.0.0",
"@piclist/i18n": "^2.0.0",
"@piclist/store": "^3.0.0",
"@smithy/node-http-handler": "^4.1.1",
"@videojs-player/vue": "^1.0.0",
"ali-oss": "^6.23.0",
"axios": "^1.11.0",
"chalk": "^5.5.0",
"compare-versions": "^6.1.1",
"cos-nodejs-sdk-v5": "^2.15.4",
"dayjs": "^1.11.13",
"dexie": "^3.2.4",
"electron-updater": "^6.6.2",
"fast-xml-parser": "^5.2.5",
"form-data": "^4.0.4",
"fs-extra": "^11.3.1",
"got": "^14.4.7",
"highlight.js": "^11.11.1",
"hpagent": "^1.2.0",
"js-yaml": "^4.1.0",
"lodash-es": "^4.17.21",
"lucide-vue-next": "^0.539.0",
"marked": "^16.1.2",
"mime-types": "^3.0.1",
"mitt": "^3.0.1",
"multer": "^2.0.2",
"node-ssh-no-cpu-features": "^2.0.0",
"nodejs-file-downloader": "^4.13.0",
"piclist": "^2.0.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.5.0",
"qiniu": "7.14.0",
"qrcode.vue": "^3.6.0",
"semver": "^7.7.2",
"shell-path": "3.0.0",
"ssh2-no-cpu-features": "^2.0.0",
"tunnel": "^0.0.6",
"upyun": "^3.4.6",
"uuid": "^11.1.0",
"video.js": "^8.23.4",
"vue": "^3.5.18",
"vue-i18n": "^11.1.11",
"vue-router": "^4.5.1",
"vue3-lazyload": "^0.3.8",
"webdav": "^5.8.0",
"write-file-atomic": "^6.0.0"
},
"devDependencies": {
"@electron/notarize": "^3.0.2",
"@eslint/js": "^9.33.0",
"@intlify/unplugin-vue-i18n": "^6.0.8",
"@types/ali-oss": "^6.16.11",
"@types/fs-extra": "^11.0.4",
"@types/js-yaml": "^4.0.9",
"@types/lodash-es": "^4.17.12",
"@types/mime-types": "^3.0.1",
"@types/multer": "^2.0.0",
"@types/node": "^24.1.0",
"@types/semver": "^7.5.6",
"@types/tunnel": "^0.0.7",
"@types/upyun": "^3.4.3",
"@types/video.js": "^7.3.58",
"@types/write-file-atomic": "^4.0.3",
"@vitejs/plugin-vue": "^6.0.1",
"@vue/eslint-config-standard": "^9.0.1",
"dotenv": "^16.3.1",
"dpdm": "^3.14.0",
"electron": "^36.7.4",
"electron-builder": "^26.0.12",
"electron-devtools-installer": "^4.0.0",
"electron-vite": "^4.0.0",
"eslint": "^9.33.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-unicorn": "^60.0.0",
"eslint-plugin-vue": "^10.4.0",
"globals": "^16.3.0",
"husky": "^9.1.7",
"node-bump-version": "^2.0.0",
"npm-check-updates": "^18.0.2",
"prettier": "^3.6.2",
"stylus": "^0.64.0",
"typescript": "^5.8.3",
"typescript-eslint": "^8.39.1",
"vite": "^7.1.0",
"vitest": "^3.2.4",
"vue-eslint-parser": "^10.2.0",
"vue-tsc": "^3.0.5"
},
"config": {
"commitizen": {
"path": "./node_modules/cz-customizable"
},
"cz-customizable": {
"config": "./node_modules/node-bump-version/.cz-config.cjs"
}
},
"commitlint": {
"extends": [
"./node_modules/node-bump-version/dist/commitlint-node/index.js"
]
}
}

View File

@@ -1,33 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSServices</key>
<array>
<dict>
<key>NSBackgroundColorName</key>
<string>background</string>
<key>NSBackgroundSystemColorName</key>
<string>systemBlueColor</string>
<key>NSIconName</key>
<string>NSTouchBarShare</string>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Upload pictures with PicList</string>
</dict>
<key>NSMessage</key>
<string>runWorkflowAsService</string>
<key>NSRequiredContext</key>
<dict>
<key>NSApplicationIdentifier</key>
<string>com.apple.finder</string>
</dict>
<key>NSSendFileTypes</key>
<array>
<string>public.image</string>
</array>
</dict>
</array>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSServices</key>
<array>
<dict>
<key>NSBackgroundColorName</key>
<string>background</string>
<key>NSBackgroundSystemColorName</key>
<string>systemBlueColor</string>
<key>NSIconName</key>
<string>NSTouchBarShare</string>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>Upload pictures with PicList</string>
</dict>
<key>NSMessage</key>
<string>runWorkflowAsService</string>
<key>NSRequiredContext</key>
<dict>
<key>NSApplicationIdentifier</key>
<string>com.apple.finder</string>
</dict>
<key>NSSendFileTypes</key>
<array>
<string>public.image</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@@ -1,314 +1,314 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AMApplicationBuild</key>
<string>444.42</string>
<key>AMApplicationVersion</key>
<string>2.9</string>
<key>AMDocumentVersion</key>
<string>2</string>
<key>actions</key>
<array>
<dict>
<key>action</key>
<dict>
<key>AMAccepts</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Optional</key>
<true/>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>AMActionVersion</key>
<string>2.0.3</string>
<key>AMApplication</key>
<array>
<string>自动操作</string>
</array>
<key>AMParameterProperties</key>
<dict>
<key>COMMAND_STRING</key>
<dict/>
<key>CheckedForUserDefaultShell</key>
<dict/>
<key>inputMethod</key>
<dict/>
<key>shell</key>
<dict/>
<key>source</key>
<dict/>
</dict>
<key>AMProvides</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>ActionBundlePath</key>
<string>/System/Library/Automator/Run Shell Script.action</string>
<key>ActionName</key>
<string>运行 Shell 脚本</string>
<key>ActionParameters</key>
<dict>
<key>COMMAND_STRING</key>
<string>/Applications/PicList.app/Contents/MacOS/PicList upload "$@" &gt; /dev/null 2&gt;&amp;1 &amp;</string>
<key>CheckedForUserDefaultShell</key>
<true/>
<key>inputMethod</key>
<integer>1</integer>
<key>shell</key>
<string>/bin/bash</string>
<key>source</key>
<string></string>
</dict>
<key>BundleIdentifier</key>
<string>com.apple.RunShellScript</string>
<key>CFBundleVersion</key>
<string>2.0.3</string>
<key>CanShowSelectedItemsWhenRun</key>
<false/>
<key>CanShowWhenRun</key>
<true/>
<key>Category</key>
<array>
<string>AMCategoryUtilities</string>
</array>
<key>Class Name</key>
<string>RunShellScriptAction</string>
<key>InputUUID</key>
<string>79609224-28DD-4ADE-AA8F-5A6C68C18C18</string>
<key>Keywords</key>
<array>
<string>Shell</string>
<string>脚本</string>
<string>命令</string>
<string>运行</string>
<string>Unix</string>
</array>
<key>OutputUUID</key>
<string>35CD6B4C-A616-4F89-8D76-DCD3249C5B4E</string>
<key>UUID</key>
<string>4350A83B-E7E6-4D2B-9768-B1D676CF58F3</string>
<key>UnlocalizedApplications</key>
<array>
<string>Automator</string>
</array>
<key>arguments</key>
<dict>
<key>0</key>
<dict>
<key>default value</key>
<integer>0</integer>
<key>name</key>
<string>inputMethod</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>0</string>
</dict>
<key>1</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>source</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>1</string>
</dict>
<key>2</key>
<dict>
<key>default value</key>
<false/>
<key>name</key>
<string>CheckedForUserDefaultShell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>2</string>
</dict>
<key>3</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>COMMAND_STRING</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>3</string>
</dict>
<key>4</key>
<dict>
<key>default value</key>
<string>/bin/sh</string>
<key>name</key>
<string>shell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>4</string>
</dict>
</dict>
<key>isViewVisible</key>
<true/>
<key>location</key>
<string>449.000000:305.000000</string>
<key>nibPath</key>
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
</dict>
<key>isViewVisible</key>
<true/>
</dict>
</array>
<key>connectors</key>
<dict/>
<key>workflowMetaData</key>
<dict>
<key>applicationBundleID</key>
<string>com.apple.finder</string>
<key>applicationBundleIDsByPath</key>
<dict>
<key>/System/Library/CoreServices/Finder.app</key>
<string>com.apple.finder</string>
</dict>
<key>applicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>applicationPaths</key>
<array>
<string>/System/Library/CoreServices/Finder.app</string>
</array>
<key>backgroundColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGNjdYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVy
VCR0b3ASAAGGoKoHCBMUFR4kKC8zVSRudWxs1QkKCwwNDg8QERJWJGNsYXNz
W05TQ29sb3JOYW1lXE5TQ29sb3JTcGFjZV1OU0NhdGFsb2dOYW1lV05TQ29s
b3KACYADEAaAAoAEVlN5c3RlbV8QD3N5c3RlbUJsdWVDb2xvctUWFwsYCRka
GxwOXE5TQ29tcG9uZW50c1VOU1JHQl8QEk5TQ3VzdG9tQ29sb3JTcGFjZUcw
IDAgMSAxTxARMCAwIDAuOTk4MTg4OTcyNQAQAYAFgAnTHyAJISIjVE5TSURV
TlNJQ0MQB4AGgAjSJQkmJ1dOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJS
R0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAA
AAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGE
AAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoA
AAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1
ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAA
JHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8
AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA
AAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAA
AAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BY
WVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAA
AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0
dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm
YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2
MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA
AAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2lu
ZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJl
bmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQT
CwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAA
AAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAA
AAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA
4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn
AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC
HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1
AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kE
BgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6
BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0G
rwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghG
CFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK
Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwq
DEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQO
fw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1
ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT
xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxay
FtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0a
BBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1w
HZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4
JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWsp
nSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4W
Lkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz
DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgU
OFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9
oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6
Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J
Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+T
T91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W
XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n
XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBk
lGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/
bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0
FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwh
fIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE
44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X
Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBp
oNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyq
j6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSc
tRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/
er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4
yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V
0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE
4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHt
nO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH
+lf65/t3/Af8mP0p/br+S/7c/23//4AH0ikqKyxaJGNsYXNzbmFtZVgkY2xh
c3Nlc11OU011dGFibGVEYXRhoystLlZOU0RhdGFYTlNPYmplY3TSKSowMVxO
U0NvbG9yU3BhY2WiMi5cTlNDb2xvclNwYWNl0ikqNDVXTlNDb2xvcqI0Ll8Q
D05TS2V5ZWRBcmNoaXZlctE4OVRyb290gAEACAARABoAIwAtADIANwBCAEgA
UwBaAGYAcwCBAIkAiwCNAI8AkQCTAJoArAC3AMQAygDfAOcA+wD9AP8BAQEI
AQ0BEwEVARcBGQEeASYNcg10DXkNhA2NDZsNnw2mDa8NtA3BDcQN0Q3WDd4N
4Q3zDfYN+wAAAAAAAAIBAAAAAAAAADoAAAAAAAAAAAAAAAAAAA39
</data>
<key>backgroundColorName</key>
<string>systemBlueColor</string>
<key>inputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject.image</string>
<key>outputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>presentationMode</key>
<integer>15</integer>
<key>processesInput</key>
<integer>0</integer>
<key>serviceApplicationBundleID</key>
<string>com.apple.finder</string>
<key>serviceApplicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>serviceInputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject.image</string>
<key>serviceOutputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>serviceProcessesInput</key>
<integer>0</integer>
<key>systemImageName</key>
<string>NSTouchBarShare</string>
<key>useAutomaticInputType</key>
<integer>0</integer>
<key>workflowTypeIdentifier</key>
<string>com.apple.Automator.servicesMenu</string>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AMApplicationBuild</key>
<string>444.42</string>
<key>AMApplicationVersion</key>
<string>2.9</string>
<key>AMDocumentVersion</key>
<string>2</string>
<key>actions</key>
<array>
<dict>
<key>action</key>
<dict>
<key>AMAccepts</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Optional</key>
<true/>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>AMActionVersion</key>
<string>2.0.3</string>
<key>AMApplication</key>
<array>
<string>自动操作</string>
</array>
<key>AMParameterProperties</key>
<dict>
<key>COMMAND_STRING</key>
<dict/>
<key>CheckedForUserDefaultShell</key>
<dict/>
<key>inputMethod</key>
<dict/>
<key>shell</key>
<dict/>
<key>source</key>
<dict/>
</dict>
<key>AMProvides</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>ActionBundlePath</key>
<string>/System/Library/Automator/Run Shell Script.action</string>
<key>ActionName</key>
<string>运行 Shell 脚本</string>
<key>ActionParameters</key>
<dict>
<key>COMMAND_STRING</key>
<string>/Applications/PicList.app/Contents/MacOS/PicList upload "$@" &gt; /dev/null 2&gt;&amp;1 &amp;</string>
<key>CheckedForUserDefaultShell</key>
<true/>
<key>inputMethod</key>
<integer>1</integer>
<key>shell</key>
<string>/bin/bash</string>
<key>source</key>
<string></string>
</dict>
<key>BundleIdentifier</key>
<string>com.apple.RunShellScript</string>
<key>CFBundleVersion</key>
<string>2.0.3</string>
<key>CanShowSelectedItemsWhenRun</key>
<false/>
<key>CanShowWhenRun</key>
<true/>
<key>Category</key>
<array>
<string>AMCategoryUtilities</string>
</array>
<key>Class Name</key>
<string>RunShellScriptAction</string>
<key>InputUUID</key>
<string>79609224-28DD-4ADE-AA8F-5A6C68C18C18</string>
<key>Keywords</key>
<array>
<string>Shell</string>
<string>脚本</string>
<string>命令</string>
<string>运行</string>
<string>Unix</string>
</array>
<key>OutputUUID</key>
<string>35CD6B4C-A616-4F89-8D76-DCD3249C5B4E</string>
<key>UUID</key>
<string>4350A83B-E7E6-4D2B-9768-B1D676CF58F3</string>
<key>UnlocalizedApplications</key>
<array>
<string>Automator</string>
</array>
<key>arguments</key>
<dict>
<key>0</key>
<dict>
<key>default value</key>
<integer>0</integer>
<key>name</key>
<string>inputMethod</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>0</string>
</dict>
<key>1</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>source</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>1</string>
</dict>
<key>2</key>
<dict>
<key>default value</key>
<false/>
<key>name</key>
<string>CheckedForUserDefaultShell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>2</string>
</dict>
<key>3</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>COMMAND_STRING</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>3</string>
</dict>
<key>4</key>
<dict>
<key>default value</key>
<string>/bin/sh</string>
<key>name</key>
<string>shell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>4</string>
</dict>
</dict>
<key>isViewVisible</key>
<true/>
<key>location</key>
<string>449.000000:305.000000</string>
<key>nibPath</key>
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
</dict>
<key>isViewVisible</key>
<true/>
</dict>
</array>
<key>connectors</key>
<dict/>
<key>workflowMetaData</key>
<dict>
<key>applicationBundleID</key>
<string>com.apple.finder</string>
<key>applicationBundleIDsByPath</key>
<dict>
<key>/System/Library/CoreServices/Finder.app</key>
<string>com.apple.finder</string>
</dict>
<key>applicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>applicationPaths</key>
<array>
<string>/System/Library/CoreServices/Finder.app</string>
</array>
<key>backgroundColor</key>
<data>
YnBsaXN0MDDUAQIDBAUGNjdYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVy
VCR0b3ASAAGGoKoHCBMUFR4kKC8zVSRudWxs1QkKCwwNDg8QERJWJGNsYXNz
W05TQ29sb3JOYW1lXE5TQ29sb3JTcGFjZV1OU0NhdGFsb2dOYW1lV05TQ29s
b3KACYADEAaAAoAEVlN5c3RlbV8QD3N5c3RlbUJsdWVDb2xvctUWFwsYCRka
GxwOXE5TQ29tcG9uZW50c1VOU1JHQl8QEk5TQ3VzdG9tQ29sb3JTcGFjZUcw
IDAgMSAxTxARMCAwIDAuOTk4MTg4OTcyNQAQAYAFgAnTHyAJISIjVE5TSURV
TlNJQ0MQB4AGgAjSJQkmJ1dOUy5kYXRhTxEMSAAADEhMaW5vAhAAAG1udHJS
R0IgWFlaIAfOAAIACQAGADEAAGFjc3BNU0ZUAAAAAElFQyBzUkdCAAAAAAAA
AAAAAAAAAAD21gABAAAAANMtSFAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWNwcnQAAAFQAAAAM2Rlc2MAAAGE
AAAAbHd0cHQAAAHwAAAAFGJrcHQAAAIEAAAAFHJYWVoAAAIYAAAAFGdYWVoA
AAIsAAAAFGJYWVoAAAJAAAAAFGRtbmQAAAJUAAAAcGRtZGQAAALEAAAAiHZ1
ZWQAAANMAAAAhnZpZXcAAAPUAAAAJGx1bWkAAAP4AAAAFG1lYXMAAAQMAAAA
JHRlY2gAAAQwAAAADHJUUkMAAAQ8AAAIDGdUUkMAAAQ8AAAIDGJUUkMAAAQ8
AAAIDHRleHQAAAAAQ29weXJpZ2h0IChjKSAxOTk4IEhld2xldHQtUGFja2Fy
ZCBDb21wYW55AABkZXNjAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAA
AAAAAAAAEnNSR0IgSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYWVogAAAAAAAA81EAAQAA
AAEWzFhZWiAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAG+iAAA49QAAA5BY
WVogAAAAAAAAYpkAALeFAAAY2lhZWiAAAAAAAAAkoAAAD4QAALbPZGVzYwAA
AAAAAAAWSUVDIGh0dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAWSUVDIGh0
dHA6Ly93d3cuaWVjLmNoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAGRlc2MAAAAAAAAALklFQyA2MTk2Ni0yLjEgRGVm
YXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAAAAAAAAAALklFQyA2
MTk2Ni0yLjEgRGVmYXVsdCBSR0IgY29sb3VyIHNwYWNlIC0gc1JHQgAAAAAA
AAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAACxSZWZlcmVuY2UgVmlld2lu
ZyBDb25kaXRpb24gaW4gSUVDNjE5NjYtMi4xAAAAAAAAAAAAAAAsUmVmZXJl
bmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAdmlldwAAAAAAE6T+ABRfLgAQzxQAA+3MAAQT
CwADXJ4AAAABWFlaIAAAAAAATAlWAFAAAABXH+dtZWFzAAAAAAAAAAEAAAAA
AAAAAAAAAAAAAAAAAAACjwAAAAJzaWcgAAAAAENSVCBjdXJ2AAAAAAAABAAA
AAAFAAoADwAUABkAHgAjACgALQAyADcAOwBAAEUASgBPAFQAWQBeAGMAaABt
AHIAdwB8AIEAhgCLAJAAlQCaAJ8ApACpAK4AsgC3ALwAwQDGAMsA0ADVANsA
4ADlAOsA8AD2APsBAQEHAQ0BEwEZAR8BJQErATIBOAE+AUUBTAFSAVkBYAFn
AW4BdQF8AYMBiwGSAZoBoQGpAbEBuQHBAckB0QHZAeEB6QHyAfoCAwIMAhQC
HQImAi8COAJBAksCVAJdAmcCcQJ6AoQCjgKYAqICrAK2AsECywLVAuAC6wL1
AwADCwMWAyEDLQM4A0MDTwNaA2YDcgN+A4oDlgOiA64DugPHA9MD4APsA/kE
BgQTBCAELQQ7BEgEVQRjBHEEfgSMBJoEqAS2BMQE0wThBPAE/gUNBRwFKwU6
BUkFWAVnBXcFhgWWBaYFtQXFBdUF5QX2BgYGFgYnBjcGSAZZBmoGewaMBp0G
rwbABtEG4wb1BwcHGQcrBz0HTwdhB3QHhgeZB6wHvwfSB+UH+AgLCB8IMghG
CFoIbgiCCJYIqgi+CNII5wj7CRAJJQk6CU8JZAl5CY8JpAm6Cc8J5Qn7ChEK
Jwo9ClQKagqBCpgKrgrFCtwK8wsLCyILOQtRC2kLgAuYC7ALyAvhC/kMEgwq
DEMMXAx1DI4MpwzADNkM8w0NDSYNQA1aDXQNjg2pDcMN3g34DhMOLg5JDmQO
fw6bDrYO0g7uDwkPJQ9BD14Peg+WD7MPzw/sEAkQJhBDEGEQfhCbELkQ1xD1
ERMRMRFPEW0RjBGqEckR6BIHEiYSRRJkEoQSoxLDEuMTAxMjE0MTYxODE6QT
xRPlFAYUJxRJFGoUixStFM4U8BUSFTQVVhV4FZsVvRXgFgMWJhZJFmwWjxay
FtYW+hcdF0EXZReJF64X0hf3GBsYQBhlGIoYrxjVGPoZIBlFGWsZkRm3Gd0a
BBoqGlEadxqeGsUa7BsUGzsbYxuKG7Ib2hwCHCocUhx7HKMczBz1HR4dRx1w
HZkdwx3sHhYeQB5qHpQevh7pHxMfPh9pH5Qfvx/qIBUgQSBsIJggxCDwIRwh
SCF1IaEhziH7IiciVSKCIq8i3SMKIzgjZiOUI8Ij8CQfJE0kfCSrJNolCSU4
JWgllyXHJfcmJyZXJocmtyboJxgnSSd6J6sn3CgNKD8ocSiiKNQpBik4KWsp
nSnQKgIqNSpoKpsqzysCKzYraSudK9EsBSw5LG4soizXLQwtQS12Last4S4W
Lkwugi63Lu4vJC9aL5Evxy/+MDUwbDCkMNsxEjFKMYIxujHyMioyYzKbMtQz
DTNGM38zuDPxNCs0ZTSeNNg1EzVNNYc1wjX9Njc2cjauNuk3JDdgN5w31zgU
OFA4jDjIOQU5Qjl/Obw5+To2OnQ6sjrvOy07azuqO+g8JzxlPKQ84z0iPWE9
oT3gPiA+YD6gPuA/IT9hP6I/4kAjQGRApkDnQSlBakGsQe5CMEJyQrVC90M6
Q31DwEQDREdEikTORRJFVUWaRd5GIkZnRqtG8Ec1R3tHwEgFSEtIkUjXSR1J
Y0mpSfBKN0p9SsRLDEtTS5pL4kwqTHJMuk0CTUpNk03cTiVObk63TwBPSU+T
T91QJ1BxULtRBlFQUZtR5lIxUnxSx1MTU19TqlP2VEJUj1TbVShVdVXCVg9W
XFapVvdXRFeSV+BYL1h9WMtZGllpWbhaB1pWWqZa9VtFW5Vb5Vw1XIZc1l0n
XXhdyV4aXmxevV8PX2Ffs2AFYFdgqmD8YU9homH1YklinGLwY0Njl2PrZEBk
lGTpZT1lkmXnZj1mkmboZz1nk2fpaD9olmjsaUNpmmnxakhqn2r3a09rp2v/
bFdsr20IbWBtuW4SbmtuxG8eb3hv0XArcIZw4HE6cZVx8HJLcqZzAXNdc7h0
FHRwdMx1KHWFdeF2Pnabdvh3VnezeBF4bnjMeSp5iXnnekZ6pXsEe2N7wnwh
fIF84X1BfaF+AX5ifsJ/I3+Ef+WAR4CogQqBa4HNgjCCkoL0g1eDuoQdhICE
44VHhauGDoZyhteHO4efiASIaYjOiTOJmYn+imSKyoswi5aL/IxjjMqNMY2Y
jf+OZo7OjzaPnpAGkG6Q1pE/kaiSEZJ6kuOTTZO2lCCUipT0lV+VyZY0lp+X
Cpd1l+CYTJi4mSSZkJn8mmia1ZtCm6+cHJyJnPedZJ3SnkCerp8dn4uf+qBp
oNihR6G2oiailqMGo3aj5qRWpMelOKWpphqmi6b9p26n4KhSqMSpN6mpqhyq
j6sCq3Wr6axcrNCtRK24ri2uoa8Wr4uwALB1sOqxYLHWskuywrM4s660JbSc
tRO1irYBtnm28Ldot+C4WbjRuUq5wro7urW7LrunvCG8m70VvY++Cr6Evv+/
er/1wHDA7MFnwePCX8Lbw1jD1MRRxM7FS8XIxkbGw8dBx7/IPci8yTrJuco4
yrfLNsu2zDXMtc01zbXONs62zzfPuNA50LrRPNG+0j/SwdNE08bUSdTL1U7V
0dZV1tjXXNfg2GTY6Nls2fHadtr724DcBdyK3RDdlt4c3qLfKd+v4DbgveFE
4cziU+Lb42Pj6+Rz5PzlhOYN5pbnH+ep6DLovOlG6dDqW+rl63Dr++yG7RHt
nO4o7rTvQO/M8Fjw5fFy8f/yjPMZ86f0NPTC9VD13vZt9vv3ivgZ+Kj5OPnH
+lf65/t3/Af8mP0p/br+S/7c/23//4AH0ikqKyxaJGNsYXNzbmFtZVgkY2xh
c3Nlc11OU011dGFibGVEYXRhoystLlZOU0RhdGFYTlNPYmplY3TSKSowMVxO
U0NvbG9yU3BhY2WiMi5cTlNDb2xvclNwYWNl0ikqNDVXTlNDb2xvcqI0Ll8Q
D05TS2V5ZWRBcmNoaXZlctE4OVRyb290gAEACAARABoAIwAtADIANwBCAEgA
UwBaAGYAcwCBAIkAiwCNAI8AkQCTAJoArAC3AMQAygDfAOcA+wD9AP8BAQEI
AQ0BEwEVARcBGQEeASYNcg10DXkNhA2NDZsNnw2mDa8NtA3BDcQN0Q3WDd4N
4Q3zDfYN+wAAAAAAAAIBAAAAAAAAADoAAAAAAAAAAAAAAAAAAA39
</data>
<key>backgroundColorName</key>
<string>systemBlueColor</string>
<key>inputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject.image</string>
<key>outputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>presentationMode</key>
<integer>15</integer>
<key>processesInput</key>
<integer>0</integer>
<key>serviceApplicationBundleID</key>
<string>com.apple.finder</string>
<key>serviceApplicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>serviceInputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject.image</string>
<key>serviceOutputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>serviceProcessesInput</key>
<integer>0</integer>
<key>systemImageName</key>
<string>NSTouchBarShare</string>
<key>useAutomaticInputType</key>
<integer>0</integer>
<key>workflowTypeIdentifier</key>
<string>com.apple.Automator.servicesMenu</string>
</dict>
</dict>
</plist>

View File

@@ -1,34 +1,34 @@
#!/bin/sh
if [ "$XDG_SESSION_TYPE" = "x11" ]; then
# require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)
command -v xclip >/dev/null 2>&1 || { echo >&1 "no xclip"; exit 1; }
# write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)
filePath=`xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-`
if [ ! -n "$filePath" ] ;then
if
xclip -selection clipboard -target image/png -o >/dev/null 2>&1
then
xclip -selection clipboard -target image/png -o >$1 2>/dev/null
echo $1
else
echo "no image"
fi
else
echo $filePath
fi
elif [ "$XDG_SESSION_TYPE" = "wayland" ]; then
command -v wl-copy >/dev/null 2>&1 || { echo >&1 "no wl-clipboard"; exit 1; }
filePath=`wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-`
if [ ! -n "$filePath" ] ;then
if
wl-copy -t image/png -o >/dev/null 2>&1
then
wl-copy -t image/png image/png -o >$1 2>/dev/null
echo $1
else
echo "no image"
fi
else
echo $filePath
fi
fi
#!/bin/sh
if [ "$XDG_SESSION_TYPE" = "x11" ]; then
# require xclip(see http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script/677212#677212)
command -v xclip >/dev/null 2>&1 || { echo >&1 "no xclip"; exit 1; }
# write image in clipboard to file (see http://unix.stackexchange.com/questions/145131/copy-image-from-clipboard-to-file)
filePath=`xclip -selection clipboard -o 2>/dev/null | grep ^file:// | cut -c8-`
if [ ! -n "$filePath" ] ;then
if
xclip -selection clipboard -target image/png -o >/dev/null 2>&1
then
xclip -selection clipboard -target image/png -o >$1 2>/dev/null
echo $1
else
echo "no image"
fi
else
echo $filePath
fi
elif [ "$XDG_SESSION_TYPE" = "wayland" ]; then
command -v wl-copy >/dev/null 2>&1 || { echo >&1 "no wl-clipboard"; exit 1; }
filePath=`wl-copy -o 2>/dev/null | grep ^file:// | cut -c8-`
if [ ! -n "$filePath" ] ;then
if
wl-copy -t image/png -o >/dev/null 2>&1
then
wl-copy -t image/png image/png -o >$1 2>/dev/null
echo $1
else
echo "no image"
fi
else
echo $filePath
fi
fi

View File

@@ -1,18 +1,18 @@
#!/bin/sh
# grab the paths
scriptPath=$(echo $0 | awk '{ print substr( $0, 1, length($0)-6 ) }')"windows10.ps1"
imagePath=$(echo $1 | awk '{ print substr( $0, 1, length($0)-18 ) }')
imageName=$(echo $1 | awk '{ print substr( $0, length($0)-17, length($0) ) }')
# run the powershell script
res=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\"$imageName)
# note that there is a return symbol in powershell result
noImage=$(echo "no image\r")
# check whether image exists
if [ "$res" = "$noImage" ] ;then
echo "no image"
else
echo $(wslpath -u $res)
fi
#!/bin/sh
# grab the paths
scriptPath=$(echo $0 | awk '{ print substr( $0, 1, length($0)-6 ) }')"windows10.ps1"
imagePath=$(echo $1 | awk '{ print substr( $0, 1, length($0)-18 ) }')
imageName=$(echo $1 | awk '{ print substr( $0, length($0)-17, length($0) ) }')
# run the powershell script
res=$(powershell.exe -noprofile -noninteractive -nologo -sta -executionpolicy unrestricted -file $(wslpath -w $scriptPath) $(wslpath -w $imagePath)"\\"$imageName)
# note that there is a return symbol in powershell result
noImage=$(echo "no image\r")
# check whether image exists
if [ "$res" = "$noImage" ] ;then
echo "no image"
else
echo $(wslpath -u $res)
fi

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff