Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #319 from terwer/dev
feat: support sm.ms in electron
- Loading branch information
Showing
99 changed files
with
6,061 additions
and
3,922 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -39,4 +39,5 @@ yarn-error.log* | |
.idea | ||
artifacts | ||
cookie.txt | ||
token.txt | ||
token.txt | ||
__pycache__ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,23 @@ | ||
module.exports = { | ||
root: true, | ||
extends: ["./node_modules/@terwer/eslint-config-custom/typescript/index.cjs"], | ||
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "turbo", "prettier"], | ||
|
||
parser: "@typescript-eslint/parser", | ||
|
||
plugins: ["@typescript-eslint", "prettier"], | ||
|
||
rules: { | ||
// Note: you must disable the base rule as it can report incorrect errors | ||
semi: "off", | ||
quotes: "off", | ||
"no-undef": "off", | ||
"@typescript-eslint/no-var-requires": "off", | ||
"@typescript-eslint/no-this-alias": "off", | ||
"@typescript-eslint/no-non-null-assertion": "off", | ||
"@typescript-eslint/no-unused-vars": "off", | ||
"@typescript-eslint/no-explicit-any": "off", | ||
"@typescript-eslint/no-empty-function": "off", | ||
"@typescript-eslint/ban-types": "off", | ||
"turbo/no-undeclared-env-vars": "off", | ||
"prettier/prettier": "error", | ||
}, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
declare module '*.json' { | ||
const value: { [key: string]: any } | ||
export default value | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,157 @@ | ||
/* | ||
* GNU GENERAL PUBLIC LICENSE | ||
* Version 3, 29 June 2007 | ||
* | ||
* Copyright (C) 2024 Terwer, Inc. <https://terwer.space/> | ||
* Everyone is permitted to copy and distribute verbatim copies | ||
* of this license document, but changing it is not allowed. | ||
*/ | ||
|
||
import { EventEmitter } from "../utils/nodePolyfill" | ||
import { ILifecyclePlugins, IPicGo, IPlugin, Undefinable } from "../types" | ||
import { ILogger } from "zhi-lib-base" | ||
import { createContext } from "../utils/createContext" | ||
import { IBuildInEvent } from "../utils/enums" | ||
import { handleUrlEncode } from "../utils/common" | ||
|
||
export class Lifecycle extends EventEmitter { | ||
private readonly ctx: IPicGo | ||
private readonly logger: ILogger | ||
|
||
constructor(ctx: IPicGo) { | ||
super() | ||
this.ctx = ctx | ||
this.logger = this.ctx.getLogger("lifecycle") | ||
this.logger.debug("lifecycle is inited") | ||
} | ||
|
||
async start(input: any[]): Promise<IPicGo> { | ||
// ensure every upload process has an unique context | ||
const ctx = createContext(this.ctx) | ||
try { | ||
// images input | ||
if (!Array.isArray(input)) { | ||
throw new Error("Input must be an array.") | ||
} | ||
ctx.input = input | ||
ctx.output = [] | ||
|
||
// lifecycle main | ||
await this.beforeTransform(ctx) | ||
await this.doTransform(ctx) | ||
await this.beforeUpload(ctx) | ||
await this.doUpload(ctx) | ||
await this.afterUpload(ctx) | ||
return ctx | ||
} catch (e: any) { | ||
ctx.log.warn(IBuildInEvent.FAILED) | ||
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, -1) | ||
ctx.emit(IBuildInEvent.FAILED, e) | ||
ctx.log.error(e) | ||
// if (ctx.getConfig<Undefinable<string>>("debug")) { | ||
// } | ||
// should throw error to stop the process | ||
throw e | ||
// return ctx | ||
} | ||
} | ||
|
||
private async beforeTransform(ctx: IPicGo): Promise<IPicGo> { | ||
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 0) | ||
ctx.emit(IBuildInEvent.BEFORE_TRANSFORM, ctx) | ||
ctx.log.info("Before transform") | ||
await this.handlePlugins(ctx.helper.beforeTransformPlugins, ctx) | ||
return ctx | ||
} | ||
|
||
private async doTransform(ctx: IPicGo): Promise<IPicGo> { | ||
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 30) | ||
const type = ctx.getConfig<Undefinable<string>>("picBed.transformer") || "path" | ||
let currentTransformer = type | ||
let transformer = ctx.helper.transformer.get(type) | ||
if (!transformer) { | ||
transformer = ctx.helper.transformer.get("path") | ||
currentTransformer = "path" | ||
ctx.log.warn(`Can't find transformer - ${type}, switch to default transformer - path`) | ||
} | ||
ctx.log.info(`Transforming... Current transformer is [${currentTransformer}]`) | ||
await transformer?.handle(ctx) | ||
return ctx | ||
} | ||
|
||
private async beforeUpload(ctx: IPicGo): Promise<IPicGo> { | ||
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 60) | ||
ctx.log.info("Before upload") | ||
ctx.emit(IBuildInEvent.BEFORE_UPLOAD, ctx) | ||
await this.handlePlugins(ctx.helper.beforeUploadPlugins, ctx) | ||
return ctx | ||
} | ||
|
||
private async doUpload(ctx: IPicGo): Promise<IPicGo> { | ||
let type = | ||
ctx.getConfig<Undefinable<string>>("picBed.uploader") || | ||
ctx.getConfig<Undefinable<string>>("picBed.current") || | ||
"smms" | ||
let uploader = ctx.helper.uploader.get(type) | ||
let currentTransformer = type | ||
if (!uploader) { | ||
type = "smms" | ||
currentTransformer = "smms" | ||
uploader = ctx.helper.uploader.get("smms") | ||
ctx.log.warn(`Can't find uploader - ${type}, switch to default uploader - smms`) | ||
} | ||
ctx.log.info(`Uploading... Current uploader is [${currentTransformer}]`) | ||
await uploader?.handle(ctx) | ||
for (const outputImg of ctx.output) { | ||
outputImg.type = type | ||
} | ||
return ctx | ||
} | ||
|
||
private async afterUpload(ctx: IPicGo): Promise<IPicGo> { | ||
ctx.emit(IBuildInEvent.AFTER_UPLOAD, ctx) | ||
ctx.emit(IBuildInEvent.UPLOAD_PROGRESS, 100) | ||
await this.handlePlugins(ctx.helper.afterUploadPlugins, ctx) | ||
let msg = "" | ||
const length = ctx.output.length | ||
// notice, now picgo builtin uploader will encodeOutputURL by default | ||
const isEncodeOutputURL = ctx.getConfig<Undefinable<boolean>>("settings.encodeOutputURL") === true | ||
for (let i = 0; i < length; i++) { | ||
if (typeof ctx.output[i].imgUrl !== "undefined") { | ||
msg += isEncodeOutputURL ? handleUrlEncode(ctx.output[i].imgUrl!) : ctx.output[i].imgUrl! | ||
if (i !== length - 1) { | ||
msg += "\n" | ||
} | ||
} | ||
delete ctx.output[i].base64Image | ||
delete ctx.output[i].buffer | ||
} | ||
ctx.emit(IBuildInEvent.FINISHED, ctx) | ||
if (msg === "") { | ||
ctx.log.warn("[after-upload] image upload occured an error, please read log for details") | ||
} else { | ||
ctx.log.info(`[after-upload] upload finishied => \n${msg}`) | ||
} | ||
return ctx | ||
} | ||
|
||
// =================================================================================================================== | ||
|
||
private async handlePlugins(lifeCyclePlugins: ILifecyclePlugins, ctx: IPicGo): Promise<IPicGo> { | ||
const plugins = lifeCyclePlugins.getList() | ||
const pluginNames = lifeCyclePlugins.getIdList() | ||
const lifeCycleName = lifeCyclePlugins.getName() | ||
await Promise.all( | ||
plugins.map(async (plugin: IPlugin, index: number) => { | ||
try { | ||
ctx.log.info(`${lifeCycleName}: ${pluginNames[index]} running`) | ||
await plugin.handle(ctx) | ||
} catch (e) { | ||
ctx.log.error(`${lifeCycleName}: ${pluginNames[index]} error`) | ||
throw e | ||
} | ||
}) | ||
) | ||
return ctx | ||
} | ||
} |
Oops, something went wrong.