比较提交
12
次代码提交
| 作者 | SHA1 | 提交日期 | |
|---|---|---|---|
|
|
79710f17b3 | ||
|
|
a0c5357efd | ||
|
|
623dcb878b | ||
|
|
b58fec1a86 | ||
|
|
8a70d38b7c | ||
|
|
767bba8ac1 | ||
|
|
47f6e55ecd | ||
|
|
d1137edd83 | ||
|
|
2faf7de779 | ||
|
|
e47736222d | ||
|
|
6a29d52a9a | ||
|
|
cd2e608ec6 |
没有与搜索条件相匹配的文件
+2
@@ -42,3 +42,5 @@ reference-binaries/
|
||||
!releases/1.2.0/*.pkg
|
||||
|
||||
!releases/1.3.1/*.pkg
|
||||
|
||||
!releases/1.3.2/*.pkg
|
||||
+48
-48
@@ -8,7 +8,7 @@
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
6945FC8F3088B7220013E108 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6945FC8E3088B7220013E108 /* Cocoa.framework */; };
|
||||
6945FC973088B7220013E108 /* beatygril XPC Service.pluginkit in Embed PlugIns */ = {isa = PBXBuildFile; fileRef = 6945FC963088B7220013E108 /* beatygril XPC Service.pluginkit */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
6945FC973088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit in Embed PlugIns */ = {isa = PBXBuildFile; fileRef = 6945FC963088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
6945FC9B3088B7220013E108 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6945FC9A3088B7220013E108 /* Foundation.framework */; };
|
||||
6945FC9D3088B7220013E108 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6945FC9C3088B7220013E108 /* AppKit.framework */; };
|
||||
6945FC9F3088B7220013E108 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6945FC9E3088B7220013E108 /* Accelerate.framework */; };
|
||||
@@ -22,14 +22,14 @@
|
||||
containerPortal = 6945FC833088B7220013E108 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 6945FC953088B7220013E108;
|
||||
remoteInfo = "XPC Service";
|
||||
remoteInfo = "FCP-BeautyGirl XPC Service";
|
||||
};
|
||||
6945FCA43088B7220013E108 /* PBXContainerItemProxy */ = {
|
||||
isa = PBXContainerItemProxy;
|
||||
containerPortal = 6945FC833088B7220013E108 /* Project object */;
|
||||
proxyType = 1;
|
||||
remoteGlobalIDString = 6945FC953088B7220013E108;
|
||||
remoteInfo = "XPC Service";
|
||||
remoteInfo = "FCP-BeautyGirl XPC Service";
|
||||
};
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
@@ -39,16 +39,16 @@
|
||||
dstPath = "";
|
||||
dstSubfolder = PlugIns;
|
||||
files = (
|
||||
6945FC973088B7220013E108 /* beatygril XPC Service.pluginkit in Embed PlugIns */,
|
||||
6945FC973088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit in Embed PlugIns */,
|
||||
);
|
||||
name = "Embed PlugIns";
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
6945FC8B3088B7220013E108 /* beatygril.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = beatygril.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
6945FC8B3088B7220013E108 /* FCP-BeautyGirl.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FCP-BeautyGirl.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
6945FC8E3088B7220013E108 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
6945FC963088B7220013E108 /* beatygril XPC Service.pluginkit */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "beatygril XPC Service.pluginkit"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
6945FC963088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FCP-BeautyGirl XPC Service.pluginkit"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
6945FC9A3088B7220013E108 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
||||
6945FC9C3088B7220013E108 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
|
||||
6945FC9E3088B7220013E108 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
|
||||
@@ -57,12 +57,12 @@
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
6945FCCB3088B7220013E108 /* Exceptions for "beatygril" folder in "Wrapper Application" target */ = {
|
||||
6945FCCB3088B7220013E108 /* Exceptions for "FCP-BeautyGirl" folder in "Wrapper Application" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
"/Localized: Plugin/InfoPlist.strings",
|
||||
"/Localized: Plugin/Localizable.strings",
|
||||
Plugin/beatygrilPlugIn.m,
|
||||
Plugin/FCPBeautyGirlPlugIn.m,
|
||||
Plugin/Info.plist,
|
||||
Plugin/main.m,
|
||||
Plugin/PGBeautyRenderer.m,
|
||||
@@ -74,7 +74,7 @@
|
||||
);
|
||||
target = 6945FC8A3088B7220013E108 /* Wrapper Application */;
|
||||
};
|
||||
6945FCD33088B7220013E108 /* Exceptions for "beatygril" folder in "XPC Service" target */ = {
|
||||
6945FCD33088B7220013E108 /* Exceptions for "FCP-BeautyGirl" folder in "XPC Service" target */ = {
|
||||
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
|
||||
membershipExceptions = (
|
||||
"/Localized: Wrapper Application/Credits.rtf",
|
||||
@@ -91,13 +91,13 @@
|
||||
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
|
||||
|
||||
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
||||
6945FCA63088B7220013E108 /* beatygril */ = {
|
||||
6945FCA63088B7220013E108 /* FCP-BeautyGirl */ = {
|
||||
isa = PBXFileSystemSynchronizedRootGroup;
|
||||
exceptions = (
|
||||
6945FCCB3088B7220013E108 /* Exceptions for "beatygril" folder in "Wrapper Application" target */,
|
||||
6945FCD33088B7220013E108 /* Exceptions for "beatygril" folder in "XPC Service" target */,
|
||||
6945FCCB3088B7220013E108 /* Exceptions for "FCP-BeautyGirl" folder in "Wrapper Application" target */,
|
||||
6945FCD33088B7220013E108 /* Exceptions for "FCP-BeautyGirl" folder in "XPC Service" target */,
|
||||
);
|
||||
path = beatygril;
|
||||
path = FCP-BeautyGirl;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXFileSystemSynchronizedRootGroup section */
|
||||
@@ -125,7 +125,7 @@
|
||||
6945FC823088B7220013E108 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
6945FCA63088B7220013E108 /* beatygril */,
|
||||
6945FCA63088B7220013E108 /* FCP-BeautyGirl */,
|
||||
6945FC8D3088B7220013E108 /* Frameworks */,
|
||||
6945FC8C3088B7220013E108 /* Products */,
|
||||
);
|
||||
@@ -134,8 +134,8 @@
|
||||
6945FC8C3088B7220013E108 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
6945FC8B3088B7220013E108 /* beatygril.app */,
|
||||
6945FC963088B7220013E108 /* beatygril XPC Service.pluginkit */,
|
||||
6945FC8B3088B7220013E108 /* FCP-BeautyGirl.app */,
|
||||
6945FC963088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -172,11 +172,11 @@
|
||||
6945FCA53088B7220013E108 /* PBXTargetDependency */,
|
||||
);
|
||||
fileSystemSynchronizedGroups = (
|
||||
6945FCA63088B7220013E108 /* beatygril */,
|
||||
6945FCA63088B7220013E108 /* FCP-BeautyGirl */,
|
||||
);
|
||||
name = "Wrapper Application";
|
||||
productName = "Wrapper Application";
|
||||
productReference = 6945FC8B3088B7220013E108 /* beatygril.app */;
|
||||
name = "FCP-BeautyGirl";
|
||||
productName = "FCP-BeautyGirl";
|
||||
productReference = 6945FC8B3088B7220013E108 /* FCP-BeautyGirl.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
6945FC953088B7220013E108 /* XPC Service */ = {
|
||||
@@ -192,11 +192,11 @@
|
||||
buildRules = (
|
||||
);
|
||||
fileSystemSynchronizedGroups = (
|
||||
6945FCA63088B7220013E108 /* beatygril */,
|
||||
6945FCA63088B7220013E108 /* FCP-BeautyGirl */,
|
||||
);
|
||||
name = "XPC Service";
|
||||
productName = "XPC Service";
|
||||
productReference = 6945FC963088B7220013E108 /* beatygril XPC Service.pluginkit */;
|
||||
name = "FCP-BeautyGirl XPC Service";
|
||||
productName = "FCP-BeautyGirl XPC Service";
|
||||
productReference = 6945FC963088B7220013E108 /* FCP-BeautyGirl XPC Service.pluginkit */;
|
||||
productType = "com.apple.product-type.bundle";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
@@ -216,7 +216,7 @@
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 6945FC863088B7220013E108 /* Build configuration list for PBXProject "beatygril" */;
|
||||
buildConfigurationList = 6945FC863088B7220013E108 /* Build configuration list for PBXProject "FCP-BeautyGirl" */;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
@@ -316,15 +316,15 @@
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
INFOPLIST_FILE = beatygril/Plugin/Info.plist;
|
||||
INFOPLIST_FILE = FCP-BeautyGirl/Plugin/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACH_O_TYPE = mh_execute;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.beatygril.fxplug;
|
||||
PRODUCT_NAME = "beatygril $(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "beatygril/Plugin/XPC Service-Bridging-Header.h";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.fcpbeautygirl.fxplug;
|
||||
PRODUCT_NAME = "FCP-BeautyGirl XPC Service";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "FCP-BeautyGirl/Plugin/XPC Service-Bridging-Header.h";
|
||||
WRAPPER_EXTENSION = pluginkit;
|
||||
};
|
||||
name = Debug;
|
||||
@@ -339,15 +339,15 @@
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
INFOPLIST_FILE = beatygril/Plugin/Info.plist;
|
||||
INFOPLIST_FILE = FCP-BeautyGirl/Plugin/Info.plist;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@loader_path/../Frameworks",
|
||||
);
|
||||
MACH_O_TYPE = mh_execute;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.beatygril.fxplug;
|
||||
PRODUCT_NAME = "beatygril $(TARGET_NAME)";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "beatygril/Plugin/XPC Service-Bridging-Header.h";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.fcpbeautygirl.fxplug;
|
||||
PRODUCT_NAME = "FCP-BeautyGirl XPC Service";
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "FCP-BeautyGirl/Plugin/XPC Service-Bridging-Header.h";
|
||||
WRAPPER_EXTENSION = pluginkit;
|
||||
};
|
||||
name = Release;
|
||||
@@ -355,7 +355,7 @@
|
||||
6945FCD13088B7220013E108 /* Debug configuration for PBXNativeTarget "Wrapper Application" */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "beatygril/Wrapper Application/SandboxEntitlements.entitlements";
|
||||
CODE_SIGN_ENTITLEMENTS = "FCP-BeautyGirl/Wrapper Application/SandboxEntitlements.entitlements";
|
||||
OTHER_LDFLAGS = ("$(inherited)", "-framework", CoreServices, );
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO;
|
||||
@@ -363,17 +363,17 @@
|
||||
DEVELOPMENT_TEAM = B3W25FX5H5;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
INFOPLIST_FILE = "beatygril/Wrapper Application/Info.plist";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.beatygril;
|
||||
PRODUCT_NAME = beatygril;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "beatygril/Wrapper Application/Wrapper Application-Bridging-Header.h";
|
||||
INFOPLIST_FILE = "FCP-BeautyGirl/Wrapper Application/Info.plist";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.fcpbeautygirl;
|
||||
PRODUCT_NAME = FCP-BeautyGirl;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "FCP-BeautyGirl/Wrapper Application/Wrapper Application-Bridging-Header.h";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
6945FCD23088B7220013E108 /* Release configuration for PBXNativeTarget "Wrapper Application" */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
CODE_SIGN_ENTITLEMENTS = "beatygril/Wrapper Application/SandboxEntitlements.entitlements";
|
||||
CODE_SIGN_ENTITLEMENTS = "FCP-BeautyGirl/Wrapper Application/SandboxEntitlements.entitlements";
|
||||
OTHER_LDFLAGS = ("$(inherited)", "-framework", CoreServices, );
|
||||
CODE_SIGN_IDENTITY = "Developer ID Application";
|
||||
CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO;
|
||||
@@ -381,14 +381,14 @@
|
||||
DEVELOPMENT_TEAM = B3W25FX5H5;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
||||
INFOPLIST_FILE = "beatygril/Wrapper Application/Info.plist";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.beatygril;
|
||||
PRODUCT_NAME = beatygril;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "beatygril/Wrapper Application/Wrapper Application-Bridging-Header.h";
|
||||
INFOPLIST_FILE = "FCP-BeautyGirl/Wrapper Application/Info.plist";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = com.dayu.fcpbeautygirl;
|
||||
PRODUCT_NAME = FCP-BeautyGirl;
|
||||
SWIFT_OBJC_BRIDGING_HEADER = "FCP-BeautyGirl/Wrapper Application/Wrapper Application-Bridging-Header.h";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
6945FCD43088B7220013E108 /* Debug configuration for PBXProject "beatygril" */ = {
|
||||
6945FCD43088B7220013E108 /* Debug configuration for PBXProject "FCP-BeautyGirl" */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ADDITIONAL_SDKS = /Library/Developer/SDKs/FxPlug.sdk;
|
||||
@@ -461,7 +461,7 @@
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
6945FCD53088B7220013E108 /* Release configuration for PBXProject "beatygril" */ = {
|
||||
6945FCD53088B7220013E108 /* Release configuration for PBXProject "FCP-BeautyGirl" */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ADDITIONAL_SDKS = /Library/Developer/SDKs/FxPlug.sdk;
|
||||
@@ -531,11 +531,11 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
6945FC863088B7220013E108 /* Build configuration list for PBXProject "beatygril" */ = {
|
||||
6945FC863088B7220013E108 /* Build configuration list for PBXProject "FCP-BeautyGirl" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
6945FCD43088B7220013E108 /* Debug configuration for PBXProject "beatygril" */,
|
||||
6945FCD53088B7220013E108 /* Release configuration for PBXProject "beatygril" */,
|
||||
6945FCD43088B7220013E108 /* Debug configuration for PBXProject "FCP-BeautyGirl" */,
|
||||
6945FCD53088B7220013E108 /* Release configuration for PBXProject "FCP-BeautyGirl" */,
|
||||
);
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
文件已重命名,内容未更改。
+1
-1
@@ -2,7 +2,7 @@
|
||||
#import <FxPlug/FxPlugSDK.h>
|
||||
#import "PGBeautyTypes.h"
|
||||
|
||||
@interface beatygrilPlugIn : NSObject <FxTileableEffect, FxAnalyzer, FxCustomParameterViewHost_v2>
|
||||
@interface FCPBeautyGirlPlugIn : NSObject <FxTileableEffect, FxAnalyzer, FxCustomParameterViewHost_v2>
|
||||
@property (nonatomic, assign) id<PROAPIAccessing> apiManager;
|
||||
- (PGBeautySettings)settingsAtTime:(CMTime)time;
|
||||
- (void)analyzeForward;
|
||||
+4
-4
@@ -1,4 +1,4 @@
|
||||
#import "beatygrilPlugIn.h"
|
||||
#import "FCPBeautyGirlPlugIn.h"
|
||||
#import "PGParameterIDs.h"
|
||||
#import "PGBeautyRenderer.h"
|
||||
#import "PGFaceProcessor.h"
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
static os_log_t PGRenderLog(void) {
|
||||
static os_log_t log; static dispatch_once_t once;
|
||||
dispatch_once(&once, ^{ log=os_log_create("com.dayu.beatygril", "render"); });
|
||||
dispatch_once(&once, ^{ log=os_log_create("com.dayu.fcpbeautygirl", "render"); });
|
||||
return log;
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ static CIImage *PGImageFromTile(FxImageTile *tile) {
|
||||
return [image imageByApplyingTransform:CGAffineTransformMakeTranslation(b.left,b.bottom)];
|
||||
}
|
||||
|
||||
@interface beatygrilPlugIn ()
|
||||
@interface FCPBeautyGirlPlugIn ()
|
||||
@property (strong) PGBeautyRenderer *beautyRenderer;
|
||||
@property (strong) PGFaceProcessor *faceProcessor;
|
||||
@property (strong) PGFaceProcessor *analysisFaceProcessor;
|
||||
@@ -99,7 +99,7 @@ static CIImage *PGImageFromTile(FxImageTile *tile) {
|
||||
@property (strong) NSHashTable<PGInspectorView *> *inspectorViews;
|
||||
@end
|
||||
|
||||
@implementation beatygrilPlugIn
|
||||
@implementation FCPBeautyGirlPlugIn
|
||||
- (instancetype)initWithAPIManager:(id<PROAPIAccessing>)manager {
|
||||
if ((self=[super init])) {
|
||||
_apiManager=manager;
|
||||
@@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.3.1</string>
|
||||
<string>1.3.2</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>16</string>
|
||||
<string>17</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string></string>
|
||||
<key>PlugInKit</key>
|
||||
@@ -57,7 +57,7 @@
|
||||
<array>
|
||||
<dict>
|
||||
<key>className</key>
|
||||
<string>beatygrilPlugIn</string>
|
||||
<string>FCPBeautyGirlPlugIn</string>
|
||||
<key>displayName</key>
|
||||
<string>大鱼人像美化</string>
|
||||
<key>group</key>
|
||||
@@ -72,7 +72,7 @@
|
||||
<key>uuid</key>
|
||||
<string>FB14B0E6-59B2-4836-916F-CD0C559E9241</string>
|
||||
<key>version</key>
|
||||
<string>1.3.1</string>
|
||||
<string>1.3.2</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>className</key>
|
||||
@@ -84,7 +84,7 @@
|
||||
<key>uuid</key>
|
||||
<string>E0E432C8-3D71-4ABA-B006-E7F519E06C87</string>
|
||||
<key>version</key>
|
||||
<string>1.3.1</string>
|
||||
<string>1.3.2</string>
|
||||
<key>protocolNames</key>
|
||||
<array>
|
||||
<string>FxOnScreenControl</string>
|
||||
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
+1
-1
@@ -5,7 +5,7 @@
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
static NSString * const PGFaceErrorDomain = @"media.dayu.PaintFCP.Face";
|
||||
static NSString * const PGFaceErrorDomain = @"com.dayu.fcpbeautygirl.face";
|
||||
// Contour origin / internal anchor, in the reference's recovered pin order.
|
||||
// The unused middle entry of each reference triplet is intentionally omitted.
|
||||
static const uint8_t PGThinPins[17][2] = {
|
||||
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
@@ -0,0 +1 @@
|
||||
"FCP-BeautyGirl::FxPlug Name" = "大鱼人像美化";
|
||||
@@ -0,0 +1 @@
|
||||
"FCP-BeautyGirl::FxPlug Description" = "Portrait smoothing, skin tone, face shaping and automatic face tracking.";
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// AppDelegate.h
|
||||
// beatygril
|
||||
// FCP-BeautyGirl
|
||||
//
|
||||
// Created by dayu on 2026/10/21.
|
||||
//
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
|
||||
@implementation AppDelegate
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
|
||||
self.window.title = @"大鱼人像美化 · 免费开源";
|
||||
self.window.title = @"FCP-BeautyGirl · 大鱼人像美化";
|
||||
[self.window setContentSize:NSMakeSize(800, 450)];
|
||||
self.window.styleMask &= ~NSWindowStyleMaskResizable;
|
||||
self.window.backgroundColor = [NSColor colorWithRed:0.94 green:0.92 blue:0.85 alpha:1];
|
||||
+7
-7
@@ -20,11 +20,11 @@
|
||||
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
|
||||
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
|
||||
<items>
|
||||
<menuItem title="beatygril" id="1Xt-HY-uBw">
|
||||
<menuItem title="FCP-BeautyGirl" id="1Xt-HY-uBw">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="beatygril" systemMenu="apple" id="uQy-DD-JDr">
|
||||
<menu key="submenu" title="FCP-BeautyGirl" systemMenu="apple" id="uQy-DD-JDr">
|
||||
<items>
|
||||
<menuItem title="About beatygril" id="5kV-Vb-QxS">
|
||||
<menuItem title="About FCP-BeautyGirl" id="5kV-Vb-QxS">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
|
||||
@@ -38,7 +38,7 @@
|
||||
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
|
||||
<menuItem title="Hide beatygril" keyEquivalent="h" id="Olw-nP-bQN">
|
||||
<menuItem title="Hide FCP-BeautyGirl" keyEquivalent="h" id="Olw-nP-bQN">
|
||||
<connections>
|
||||
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
|
||||
</connections>
|
||||
@@ -56,7 +56,7 @@
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
|
||||
<menuItem title="Quit beatygril" keyEquivalent="q" id="4sb-4s-VLi">
|
||||
<menuItem title="Quit FCP-BeautyGirl" keyEquivalent="q" id="4sb-4s-VLi">
|
||||
<connections>
|
||||
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
|
||||
</connections>
|
||||
@@ -669,7 +669,7 @@
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
|
||||
<items>
|
||||
<menuItem title="beatygril Help" keyEquivalent="?" id="FKE-Sm-Kum">
|
||||
<menuItem title="FCP-BeautyGirl Help" keyEquivalent="?" id="FKE-Sm-Kum">
|
||||
<connections>
|
||||
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
|
||||
</connections>
|
||||
@@ -679,7 +679,7 @@
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
<window title="beatygril" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
|
||||
<window title="FCP-BeautyGirl" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="335" y="390" width="480" height="360"/>
|
||||
+4
-2
@@ -4,6 +4,8 @@
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
||||
<key>CFBundleDisplayName</key>
|
||||
<string>FCP-BeautyGirl · 大鱼人像美化</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
@@ -17,9 +19,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.3.1</string>
|
||||
<string>1.3.2</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>16</string>
|
||||
<string>17</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
文件已重命名,内容未更改。
@@ -1,4 +1,4 @@
|
||||
# 大鱼人像美化 · beatygril
|
||||
# 大鱼人像美化 · FCP-BeautyGirl
|
||||
|
||||
基于本仓库的 FxPlug4 初始工程制作的人像美化滤镜,支持 Motion 和 Final Cut Pro。源码使用 Objective-C、Vision、Core Image 与 Metal。
|
||||
|
||||
@@ -6,28 +6,32 @@
|
||||
|
||||
功能包括磨皮、肤色、细节、牙齿美白、眼睛提亮、九类脸型调整、自动人脸跟随和多人处理。原版 MSE18V2 的静态分析依据、近似实现与尚未对齐的部分见 [分析说明](docs/analysis/REA-分析与复刻说明.md)。本版尚未完成原版逐像素与复杂运动跟踪对照。
|
||||
|
||||
1.3.2(17)已统一工程、APP、插件类名和应用ID,正式安装为 `FCP-BeautyGirl.app` / `com.dayu.fcpbeautygirl`,嵌套插件ID为 `com.dayu.fcpbeautygirl.fxplug`。旧APP已迁移清理,滤镜UUID、参数编号和归档格式保持兼容。1901项自动回归及身份迁移检查通过;APP和含配套模板的PKG均已签名、公证、粘附票据和验证。更名后的旧工程重开仍由用户实测。
|
||||
|
||||
## 使用
|
||||
|
||||
正式安装路径为 `/Library/Plug-Ins/FxPlug/beatygril.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼磨皮瘦脸 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要点击分析。界面以磨皮、美白、瘦脸三张卡片呈现,默认跟随主要人脸;多人模式对多脸变形。单项眼睛可暂时停用并保留数值,右侧箭头恢复默认;磨皮半径、饱和度、锐化和整体混合等收在「更多设置」。旧手动分析与调试参数仅保留隐藏兼容,实际输出统一使用实时自动跟随。
|
||||
正式安装路径为 `/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app`。Motion 滤镜分类为「大鱼」,滤镜名「大鱼人像美化」。Final Cut Pro 在「效果 → 大鱼磨皮瘦脸 → 大鱼人像美化」中使用配套 Motion 效果,模板目录必须同时保留 `.moef` 与 `Drop Zone.tiff`。美化会随当前帧的人脸自动更新,不需要点击分析。界面以磨皮、美白、瘦脸三张卡片呈现,默认跟随主要人脸;多人模式对多脸变形。单项眼睛可暂时停用并保留数值,右侧箭头恢复默认;磨皮半径、饱和度、锐化和整体混合等收在「更多设置」。旧手动分析与调试参数仅保留隐藏兼容,实际输出统一使用实时自动跟随。
|
||||
|
||||
1.3.0 的磨皮卡片依次提供「磨皮程度、微细锐化、五官保护、非肤色区保护」。两种保护默认 100%;降低五官保护让五官区域参与更多磨皮,降低非肤色区保护则扩大磨皮范围,均不扩大肤色提亮范围。微细锐化在局部支持区域恢复纹理;旧全局磨皮和全局锐化仍保留在更多设置,旧工程的参数与归档继续兼容。迁移证据、实现边界与验证见[新版磨皮参数迁移](docs/analysis/新版磨皮参数迁移.md)。1.3.0 的新增参数已随 1.3.1 一并提供。
|
||||
|
||||
1.3.1(16)修复 V 脸影响眼区的问题,改为四组下颌轮廓到外唇的局部采样,并对齐新目标的 0.065 强度映射。1901 项自动检查通过,APP 与本机 PKG 工坊制作的安装包均已签名、公证和验证。正式 APP 已安装;新效果的原生宿主视觉仍由用户实测。原理与边界见 [V 脸下颌区域修复](docs/analysis/V脸下颌区域修复.md)。
|
||||
|
||||
当前 [1.3.2 正式下载](https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.2) 与 [大鱼文章](https://dayu.media/15593/) 是本版发布入口,安装包包含「大鱼磨皮瘦脸」分类的配套效果及资源,源码快照也已同步。
|
||||
|
||||
## 开发和恢复
|
||||
|
||||
需要 Xcode 27.1、FxPlug SDK 4.3.4 与 PluginManager 1.7.4;最低运行系统 macOS 13。正式产物为 arm64/x86_64 通用版本。
|
||||
|
||||
```sh
|
||||
./scripts/test.sh
|
||||
PAINTFCP_HOST_ASAN=1 ./scripts/test-host.sh
|
||||
PAINTFCP_OSC_ASAN=1 ./scripts/test-osc.sh
|
||||
xcodebuild -project beatygril/beatygril.xcodeproj -scheme 'Wrapper Application' -configuration Release -derivedDataPath /tmp/paintfcp-build -destination 'generic/platform=macOS' build
|
||||
FCP_BEAUTYGIRL_HOST_ASAN=1 ./scripts/test-host.sh
|
||||
FCP_BEAUTYGIRL_OSC_ASAN=1 ./scripts/test-osc.sh
|
||||
xcodebuild -project FCP-BeautyGirl/FCP-BeautyGirl.xcodeproj -scheme 'FCP-BeautyGirl' -configuration Release -derivedDataPath /tmp/fcp-beautygirl-build -destination 'generic/platform=macOS' build
|
||||
```
|
||||
|
||||
工程从 `/Library/Developer/SDKs/FxPlug.sdk` 读取头文件与链接信息,从 `/Library/Developer/Frameworks` 嵌入可运行的 Apple 框架。构建默认使用团队 B3W25FX5H5 的 Developer ID Application 身份;正式交付使用 `python3 scripts/deliver.py` 完成公证、粘附和安装;安装前先关闭 Motion 与 FCP,脚本在检测到宿主仍运行时保留原安装版并停止。原生验收完成后继续脚本的清理阶段,清除临时注册与 APP 副本。
|
||||
|
||||
公开源码:[GitHub · FCP-BeatyGril](https://github.com/FAMEDaYu/FCP-BeatyGril)。大鱼站备份:`https://dayu.media/git/dayu/paintfcp-fxplug.git`。恢复入口见 [RECOVERY.md](RECOVERY.md),当前验证记录见 [验证记录](docs/验证记录.md)。原始模板保存在 `baseline-20261021` 标签。
|
||||
公开源码:[GitHub · FCP-BeautyGirl](https://github.com/dayumeida/FCP-BeautyGirl)。大鱼站备份:`https://dayu.media/git/dayu/paintfcp-fxplug.git`。恢复入口见 [RECOVERY.md](RECOVERY.md),当前验证记录见 [验证记录](docs/验证记录.md)。原始模板保存在 `baseline-20261021` 标签。
|
||||
|
||||
继续开发或移交时先读[项目交接文档](docs/项目交接.md),包含当前发布状态、源码入口、坐标与交互约定、验收边界,以及签名打包和双远端保存流程。
|
||||
|
||||
@@ -65,4 +69,4 @@ xcodebuild -project beatygril/beatygril.xcodeproj -scheme 'Wrapper Application'
|
||||
|
||||
`large.png`(640×360)和 `small.png`(192×108)与 `.moef` 同目录,安装器安装后重新锁定。手动复制或从 Git 恢复模板时,需对这两个 PNG 重新执行 `chflags uchg`,不能锁定整个模板目录。FCP 当前分类为「大鱼磨皮瘦脸」,Motion 原生滤镜分类仍为「大鱼」。
|
||||
|
||||
GitHub 提供公开源码、提交历史和版本标签;[1.2.0 Release](https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.2.0) 提供正式签名公证安装包。大鱼站 Git 备份仍受站点登录与会员网关限制,发布文章另提供公开源码快照;安装包始终免费。
|
||||
GitHub 提供公开源码、提交历史和版本标签;[1.2.0 Release](https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.2.0) 提供正式签名公证安装包。大鱼站 Git 备份仍受站点登录与会员网关限制,发布文章另提供公开源码快照;安装包始终免费。
|
||||
+29
-2
@@ -1,7 +1,10 @@
|
||||
# 恢复说明
|
||||
|
||||
当前产品身份自1.3.2(17)统一为FCP-BeautyGirl:工程 `FCP-BeautyGirl/FCP-BeautyGirl.xcodeproj`、scheme `FCP-BeautyGirl`、APP `/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app`、主ID `com.dayu.fcpbeautygirl`、插件ID `com.dayu.fcpbeautygirl.fxplug`。签名源码 `767bba8ac11e9bf9268a1e02d1a06d3c120c46aa`,APP公证Accepted `559eedf0-048f-4d0e-b013-6a187695f2da`,已安装并迁移清理旧APP;程序与滤镜参数、UUID保持兼容。中央身份定义见product.json,旧名称只用于经过ID、签名团队和滤镜UUID验证的迁移。下文历史版本保留各自当时的名称与路径。
|
||||
|
||||
|
||||
- 大鱼备份远程(origin):`https://dayu.media/git/dayu/paintfcp-fxplug.git`
|
||||
- GitHub 公开远程(github):`https://github.com/FAMEDaYu/FCP-BeatyGril.git`
|
||||
- GitHub 公开远程(github):`https://github.com/dayumeida/FCP-BeautyGirl.git`
|
||||
- 本地项目根:`/Users/dayu/Documents/PaintFCP`
|
||||
- 工作分支:`main`
|
||||
- 修改前版本标签:`baseline-20261021`,完整 SHA:`1746f38398588e2367abb37a5c2b31cb64042429`
|
||||
@@ -104,7 +107,7 @@ Motion/FCP原生验收范围及未完成项见`docs/verification/v1.1.2/native-q
|
||||
|
||||
## GitHub 公开恢复副本
|
||||
|
||||
GitHub 远端 `https://github.com/FAMEDaYu/FCP-BeatyGril.git` 已完成完整历史与七个标签的推送,`origin` 及其 main 上游保持大鱼仓库。独立匿名克隆恢复节点为 `356683b41af702d6c0143ad7fa5f540d752d6e14`,197 文件逐字节核验、strict/full fsck 和全部标签回读通过。后续 main 补充发布说明与验证文档,产品源码保持相同。GitHub Release 的公证安装包已匿名下载核对哈希、签名和票据。详见 `docs/GitHub同步说明.md` 和 `docs/verification/github/`。
|
||||
GitHub 远端 `https://github.com/dayumeida/FCP-BeautyGirl.git` 已完成完整历史与七个标签的推送,`origin` 及其 main 上游保持大鱼仓库。独立匿名克隆恢复节点为 `356683b41af702d6c0143ad7fa5f540d752d6e14`,197 文件逐字节核验、strict/full fsck 和全部标签回读通过。后续 main 补充发布说明与验证文档,产品源码保持相同。GitHub Release 的公证安装包已匿名下载核对哈希、签名和票据。详见 `docs/GitHub同步说明.md` 和 `docs/verification/github/`。
|
||||
|
||||
|
||||
## 1.3.0 新面板参数恢复
|
||||
@@ -121,3 +124,27 @@ GitHub 远端 `https://github.com/FAMEDaYu/FCP-BeatyGril.git` 已完成完整历
|
||||
签名源码完整 SHA 为 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`,APP 1.3.1(16),分支 `codex/v-face-jaw-fix`。origin 与 github 同名分支已推送并回读一致。已从 origin 独立克隆该节点,219个受跟踪文件字节和执行位一致、strict/full fsck及Xcode工程读取通过,无LFS或子模块;见 `docs/verification/v1.3.1/recovery-verification.json`。恢复依赖和签名入口沿用本文现有配置,用户帧和私钥不作为源码依赖保存。
|
||||
|
||||
V 脸现在为四组下颌到外唇局部 pin,映射为 V×0.065,无新版目标已取消的旧尺寸增益。此前瘦脸/下巴/短脸/下颌骨仍保留旧版本映射,大眼/窄脸/颧骨/小头和整体组合保留近似边界。1901项全套及1561项重叠真实帧几何ASan通过。Apple公证 Accepted `e353b701-2fc2-4fcc-b03e-69af7735400f`、staple/validate通过;已在用户确认退出宿主后完成1.3.1正式安装、身份/票据/注册核验和临时副本清理。后续FCP仍有后台进程,通过正常退出菜单结束后才替换APP。PKG由本机PKG工坊CLI制作,包含用户指定分类4项资源,Installer签名、公证Accepted 78105340-306f-4629-8670-772760d4cb9a、票据、Gatekeeper、载荷及隔离脚本均通过;详见同版本交付回执和验证记录。
|
||||
|
||||
|
||||
1.3.1最终发行标签为 `v1.3.1`,完整SHA `b35b4a5d1ca252d2f83c798613560a768274de3c`。GitHub已匿名独立克隆恢复并比对232个受跟踪文件的字节/执行位、strict/full fsck和恢复PKG签名/票据;产品源码与签名节点7fa3298完全一致。见 `docs/verification/v1.3.1/final-tag-recovery.json`。两个远端main纳入该标签后继续记录交付文档,不移动标签。文章15593和GitHub/大鱼Release已更新,GitHub与文章安装包/源码下载字节均校验,完整入口见 `docs/GitHub同步说明.md`。
|
||||
|
||||
|
||||
GitHub于2026-10-22更正仓库名为 `FCP-BeautyGirl`,远端为 `https://github.com/dayumeida/FCP-BeautyGirl.git`。更名后的恢复检查点 `6a29d52a9ad667665da4acf75017c008fa0a566d` 已通过新地址匿名独立克隆、239个文件字节/执行位和strict/full fsck核验,产品源码与此前正式版相同。Release、附件和原有标签保留,文章及本地远程/仓库目录表均已更新;详见 `docs/verification/github/rename-recovery-20261022.json`。
|
||||
|
||||
|
||||
GitHub用户名现为 `dayumeida`,账号ID117798680保持一致。当前公开远端 `https://github.com/dayumeida/FCP-BeautyGirl.git` 的恢复检查点 `2faf7de77929cf7707645ebb38095b03d5729647` 已通过匿名独立克隆、241文件字节/执行位和strict/full fsck核验,产品源码与账号更名前一致。两个仓库的全部分支/标签及Release附件均保留;当前文章、本地github远端和仓库目录表已同步。回执见 `docs/verification/github/username-recovery-20261022.json`。
|
||||
|
||||
|
||||
## 1.3.2 统一产品身份
|
||||
|
||||
发行入口为 `v1.3.2`;正式 APP 源码为 `767bba8ac11e9bf9268a1e02d1a06d3c120c46aa`。新机器按 `product.json` 的工程、scheme 与路径恢复,运行 `python3 scripts/deliver.py --wait-for-hosts --user-tests`;旧产品先验证 Bundle ID、签名团队和滤镜 UUID,再迁移并支持失败回滚。最终包为 `releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg`,SHA-256 `20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1`,签名、公证 Accepted `4a831775-2317-4372-a4cc-102415657ea3`、票据和 Gatekeeper 均通过。正式 APP 已安装并清理旧身份。1901 项自动回归、8 项 APP 迁移、8 项最终 PKG 身份脚本迁移与模板隔离测试通过;未运行真实 installer,原生旧工程重开仍待用户检查。
|
||||
|
||||
源码包须从发行标签导出,排除 PKG 二进制并加入 SOURCE-SNAPSHOT.json。发布与独立克隆恢复回执位于 `docs/verification/v1.3.2/`,不包含用户人脸素材、签名私钥或公证凭据。历史标签和旧版本安装包保留,不覆盖。
|
||||
|
||||
|
||||
1.3.2 发行标签完整 SHA 为 `8a70d38b7cd17e0ea530c5226f2be8c2df4308b3`。独立匿名 GitHub 克隆 271 个文件的字节/blob/执行位、strict/full fsck、Xcode 工程读取和恢复包签名/票据/Gatekeeper 均通过,无 LFS/子模块,临时克隆已清理。见 `docs/verification/v1.3.2/final-tag-recovery.json`。GitHub 与文章的安装包、源码快照已匿名下载核对哈希,源 ZIP 对应本标签;后续 main 补充回执,不移动发行标签或改变已签名产品源码。
|
||||
|
||||
|
||||
## 1.3.2 后续跟踪闪烁分析
|
||||
|
||||
分析节点 `a0c5357efd87a63dbee6269d9335e6aa3ba78799` 保留新目标2.4.0静态证据、实际当前FCP草帽素材的469帧独立采样摘要与两个通用诊断入口;产品源码和安装版仍为v1.3.2,未宣布闪烁修复。独立匿名克隆284文件/fsck/合成诊断重建复现通过,无LFS或子模块。具体运行与边界见 `docs/analysis/跟踪闪烁对齐分析.md`,用户素材和完整真实关键点不在仓库中。
|
||||
@@ -1,3 +0,0 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
|
||||
"beatygril::FxPlug Name" = "beatygril";
|
||||
@@ -1,4 +0,0 @@
|
||||
/* Localized versions of Info.plist keys */
|
||||
|
||||
"beatygril::FxPlug Description" = "A helpful description of\nwhat this plugin does.";
|
||||
|
||||
+32
-5
@@ -1,10 +1,10 @@
|
||||
# GitHub 同步与恢复
|
||||
|
||||
公开源码:https://github.com/FAMEDaYu/FCP-BeatyGril
|
||||
公开源码:https://github.com/dayumeida/FCP-BeautyGirl
|
||||
|
||||
正式安装包:https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.2.0
|
||||
正式安装包:https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.2
|
||||
|
||||
本地 `github` 远端指向上述 GitHub 仓库,`origin` 继续指向大鱼仓库,`main` 仍跟随 `origin/main`。当前项目的完整提交历史、main 和七个版本标签已推送,两端引用与本地一致;未改写历史或覆盖标签。后续更新需要分别推送到 origin 和 github,不会自动定时同步。
|
||||
本地 `github` 远端指向上述 GitHub 仓库,`origin` 继续指向大鱼仓库,`main` 仍跟随 `origin/main`。当前项目的完整提交历史、main 和全部现有版本标签已推送,两端引用与本地一致;未改写历史或覆盖标签。后续更新需要分别推送到 origin 和 github,不会自动定时同步。
|
||||
|
||||
## 已验证的 GitHub 恢复节点
|
||||
|
||||
@@ -13,11 +13,38 @@
|
||||
安装包:`Dayu-Portrait-1.2.0.pkg`,5,011,005 bytes,SHA-256 `5bd77c28b3a7e54f3d4060be1f16bcb145d9bc4d6b9cfb9eb137c01130440243`。Release 标签 `v1.2.0` 仍指向 `3c7261c3a861b9f4704cfb36055d7b500c239dab`,没有重新编译或改动正式安装包。
|
||||
|
||||
```sh
|
||||
git clone https://github.com/FAMEDaYu/FCP-BeatyGril.git
|
||||
cd FCP-BeatyGril
|
||||
git clone https://github.com/dayumeida/FCP-BeautyGirl.git
|
||||
cd FCP-BeautyGirl
|
||||
git switch --detach 356683b41af702d6c0143ad7fa5f540d752d6e14
|
||||
```
|
||||
|
||||
本项目没有 LFS 或子模块。编译仍需自行安装 Xcode 和 Apple FxPlug SDK;签名私钥与公证凭据不在 Git 内。GitHub 公共克隆无需登录;大鱼备份仍受站点登录和会员网关限制。两边都只承诺已经提交、推送并核验的节点。
|
||||
|
||||
源代码编写署名:代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。
|
||||
|
||||
|
||||
## 1.3.1 发行与恢复
|
||||
|
||||
main已快进纳入1.3.0磨皮参数和1.3.1的V脸下颌修复;origin和github的main及v1.3.1引用已回读核验。v1.3.1固定完整SHA为 `b35b4a5d1ca252d2f83c798613560a768274de3c`,签名APP源码为 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`。独立匿名GitHub克隆232文件字节与执行位一致、strict/full fsck和恢复PKG签名/票据通过。无LFS或子模块。后续main仅补充发布记录,不改写标签。
|
||||
|
||||
GitHub Release已提供 `Dayu-Portrait-1.3.1.pkg`(5,011,286 bytes,SHA256 `a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927`)和源码ZIP(9,682,532 bytes,SHA256 `7c335f54717a73e710ef484fc9f7b90864211c128a0f217bf170aa092333f228`)。两者匿名重新下载哈希一致,PKG签名和票据通过。源码快照基于上述v1.3.1节点,排除PKG本体而保留全部构建源码、模板、素材与验证文档。
|
||||
|
||||
大鱼站同名Release附件上传与名称/大小回读通过,下载入口仍受站点登录保护;未宣称API令牌可直接回读该浏览器附件入口。文章15593已就地更新,主包和源码链接的新文件哈希通过,免费规则、封面、作者、分类及未修改资源字段保持一致。正常URL和新请求的前台版本、安装/使用/故障说明及三项SEO均核验,未登录页面显示免费及登录获取入口;未下测试订单。详见verification/v1.3.1。
|
||||
|
||||
|
||||
## 2026-10-22 仓库名称拼写更正
|
||||
|
||||
GitHub仓库从 `FAMEDaYu/FCP-BeatyGril` 更名为 `FAMEDaYu/FCP-BeautyGirl`,仓库ID `1428817365` 保持一致。更名前后全部分支/标签SHA、Release与附件ID/大小一致,未另建仓库或改写历史。本地github远端已改为 `https://github.com/dayumeida/FCP-BeautyGirl.git`,origin和main上游仍为原大鱼仓库。现有发布标签、已公证APP/PKG及源码快照保留原始字节,旧快照里的旧链接由GitHub重定向到新地址;当前文档、文章和Release说明使用新地址。插件APP产品名、Bundle ID和安装路径沿用原配置。更名核验见verification/github/rename-20261022.json。
|
||||
|
||||
|
||||
## 2026-10-22 用户名更改
|
||||
|
||||
用户将GitHub登录名从 `FAMEDaYu` 改为 `dayumeida`,账号ID117798680保持不变。两个公开仓库迁移到dayumeida名下:FCP-BeautyGirl(ID1428817365)和FCPX-(ID904215594)。更名前后全部分支/标签SHA及Release/附件ID、名称、大小一致。当前项目github远端为 `https://github.com/dayumeida/FCP-BeautyGirl.git`,origin及main上游保持原大鱼仓库;文章15593、活动文档和Release说明更新为新地址。正式版本标签、公证APP/PKG和源码快照保留原始字节,不为账号更名重新构建。个人主页新地址为 `https://github.com/dayumeida`,旧个人主页不提供重定向;仓库旧地址由GitHub重定向。历史验证回执保留当时用户名。账号更名核验见verification/github/username-20261022.json。
|
||||
|
||||
|
||||
## 1.3.2 产品身份统一
|
||||
|
||||
发行标签 `v1.3.2`,正式 APP 签名源码 `767bba8ac11e9bf9268a1e02d1a06d3c120c46aa`。新工程和 APP 名为 FCP-BeautyGirl,应用标识及安装路径见 product.json;旧身份仅保留经过验证的迁移入口。GitHub、大鱼 Release 和文章 15593 使用新名称安装包及源码快照,历史发行资料不改写。当前交付与发布核验保存在 verification/v1.3.2。
|
||||
|
||||
|
||||
1.3.2 标签完整 SHA `8a70d38b7cd17e0ea530c5226f2be8c2df4308b3`,双远端引用回读一致。已匿名独立克隆核对 271 个文件、strict/full fsck、Xcode 工程和恢复包签名/票据/Gatekeeper。正式包 SHA256 `20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1`,源码 ZIP SHA256 `c75a516192375c45e446b3f0170615773ec2bd63b0430c3441a87282ba8b6834`;GitHub 与文章四项匿名下载均与本地字节一致。文章作者、封面和免费规则保留,正常及新请求前台版本/路径/SEO通过。大鱼 Release 只回读附件名称/大小,未绕过站点登录网关。
|
||||
@@ -0,0 +1,318 @@
|
||||
{
|
||||
"decodedSize": [
|
||||
1920,
|
||||
1080
|
||||
],
|
||||
"decodeOrVisionErrors": 0,
|
||||
"duplicateSourceFramePairs": 0,
|
||||
"durationSeconds": 18.752066666666668,
|
||||
"emptyDetectionFrames": 0,
|
||||
"frames": 469,
|
||||
"heldFrames": 0,
|
||||
"landmarkConfidenceBelow055Frames": 0,
|
||||
"largestContourChanges": [
|
||||
{
|
||||
"actualSeconds": 5.7057,
|
||||
"bboxCenterStep": 0.010612391844050412,
|
||||
"bboxRelativeSizeStep": 0.07225176667426436,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 143,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.85870361328125,
|
||||
"outputAllShapeStep": 0.05320087993361461,
|
||||
"outputContourShapeStep": 0.0524041977802718,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.06465122287331607,
|
||||
"rawContourShapeStep": 0.06330400492305996,
|
||||
"rawEyeShapeStep": 0.07106297705037405,
|
||||
"requestedSeconds": 5.72
|
||||
},
|
||||
{
|
||||
"actualSeconds": 5.538866666666666,
|
||||
"bboxCenterStep": 0.011085862886644501,
|
||||
"bboxRelativeSizeStep": 0.06308677201537605,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 139,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.86663818359375,
|
||||
"outputAllShapeStep": 0.05242709853363116,
|
||||
"outputContourShapeStep": 0.046564814499130476,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.06161259278352428,
|
||||
"rawContourShapeStep": 0.05478966859045086,
|
||||
"rawEyeShapeStep": 0.06493439304604706,
|
||||
"requestedSeconds": 5.56
|
||||
},
|
||||
{
|
||||
"actualSeconds": 5.6723333333333334,
|
||||
"bboxCenterStep": 0.009899754844891629,
|
||||
"bboxRelativeSizeStep": 0.07041863176014063,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 142,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.86846923828125,
|
||||
"outputAllShapeStep": 0.0504812129727618,
|
||||
"outputContourShapeStep": 0.04661140849311553,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.05657646866920014,
|
||||
"rawContourShapeStep": 0.05209665662633769,
|
||||
"rawEyeShapeStep": 0.0633232078503364,
|
||||
"requestedSeconds": 5.68
|
||||
},
|
||||
{
|
||||
"actualSeconds": 18.7187,
|
||||
"bboxCenterStep": 0.012083635671277248,
|
||||
"bboxRelativeSizeStep": 0.045801810508214524,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 468,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.813995361328125,
|
||||
"outputAllShapeStep": 0.034052174045594144,
|
||||
"outputContourShapeStep": 0.043147628575738506,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.04111983043006513,
|
||||
"rawContourShapeStep": 0.05091513919680358,
|
||||
"rawEyeShapeStep": 0.029191044989766733,
|
||||
"requestedSeconds": 18.72
|
||||
},
|
||||
{
|
||||
"actualSeconds": 5.739066666666667,
|
||||
"bboxCenterStep": 0.0096878552974905,
|
||||
"bboxRelativeSizeStep": 0.050414751769179866,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 144,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.86083984375,
|
||||
"outputAllShapeStep": 0.036875562148072825,
|
||||
"outputContourShapeStep": 0.036457754092126635,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.0466359793805061,
|
||||
"rawContourShapeStep": 0.04577259881583104,
|
||||
"rawEyeShapeStep": 0.05000862947922753,
|
||||
"requestedSeconds": 5.76
|
||||
},
|
||||
{
|
||||
"actualSeconds": 0.8675333333333334,
|
||||
"bboxCenterStep": 0.003874961092189615,
|
||||
"bboxRelativeSizeStep": 0.07178938570952054,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 22,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.8583984375,
|
||||
"outputAllShapeStep": 0.031532331820470494,
|
||||
"outputContourShapeStep": 0.0381074357036598,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.03707185765347939,
|
||||
"rawContourShapeStep": 0.04568537667821508,
|
||||
"rawEyeShapeStep": 0.034575716035532285,
|
||||
"requestedSeconds": 0.88
|
||||
},
|
||||
{
|
||||
"actualSeconds": 18.651966666666667,
|
||||
"bboxCenterStep": 0.007272824106484237,
|
||||
"bboxRelativeSizeStep": 0.03719342311108376,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 467,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.8199462890625,
|
||||
"outputAllShapeStep": 0.03952595504917539,
|
||||
"outputContourShapeStep": 0.0403761896420276,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.04399124673462057,
|
||||
"rawContourShapeStep": 0.0450952404425199,
|
||||
"rawEyeShapeStep": 0.04542945579876513,
|
||||
"requestedSeconds": 18.68
|
||||
},
|
||||
{
|
||||
"actualSeconds": 0.9009,
|
||||
"bboxCenterStep": 0.0017162987254983866,
|
||||
"bboxRelativeSizeStep": 0.014351427482534596,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 23,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.85809326171875,
|
||||
"outputAllShapeStep": 0.026103724683818753,
|
||||
"outputContourShapeStep": 0.04109990769809984,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.028649663225073875,
|
||||
"rawContourShapeStep": 0.04465304774876588,
|
||||
"rawEyeShapeStep": 0.02979010461963986,
|
||||
"requestedSeconds": 0.92
|
||||
},
|
||||
{
|
||||
"actualSeconds": 0.7007,
|
||||
"bboxCenterStep": 0.007675079557145801,
|
||||
"bboxRelativeSizeStep": 0.059965605197173644,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 18,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.877166748046875,
|
||||
"outputAllShapeStep": 0.038188462475739905,
|
||||
"outputContourShapeStep": 0.040855905682333056,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.04142583196750897,
|
||||
"rawContourShapeStep": 0.04413941822893812,
|
||||
"rawEyeShapeStep": 0.04424396634844577,
|
||||
"requestedSeconds": 0.72
|
||||
},
|
||||
{
|
||||
"actualSeconds": 0.8341666666666666,
|
||||
"bboxCenterStep": 0.0019315279136915449,
|
||||
"bboxRelativeSizeStep": 0.03041757827231506,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 21,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.861602783203125,
|
||||
"outputAllShapeStep": 0.023950562918532762,
|
||||
"outputContourShapeStep": 0.0391113963086702,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.026769304364061126,
|
||||
"rawContourShapeStep": 0.043656761461571575,
|
||||
"rawEyeShapeStep": 0.021617825564847367,
|
||||
"requestedSeconds": 0.84
|
||||
},
|
||||
{
|
||||
"actualSeconds": 5.9726333333333335,
|
||||
"bboxCenterStep": 0.0076538482284609945,
|
||||
"bboxRelativeSizeStep": 0.009531954788836172,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 150,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.85198974609375,
|
||||
"outputAllShapeStep": 0.03696981884576201,
|
||||
"outputContourShapeStep": 0.038389239030267384,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.04143716031529852,
|
||||
"rawContourShapeStep": 0.042871635488955444,
|
||||
"rawEyeShapeStep": 0.0428226737500748,
|
||||
"requestedSeconds": 6
|
||||
},
|
||||
{
|
||||
"actualSeconds": 16.649966666666668,
|
||||
"bboxCenterStep": 0.006605729070676864,
|
||||
"bboxRelativeSizeStep": 0.025478189396700213,
|
||||
"faceConfidence": 1,
|
||||
"faceCount": 1,
|
||||
"frame": 417,
|
||||
"held": false,
|
||||
"landmarkConfidence": 0.8674774169921875,
|
||||
"outputAllShapeStep": 0.03284710686769975,
|
||||
"outputContourShapeStep": 0.036339332152690744,
|
||||
"points76Count": 76,
|
||||
"rawAllShapeStep": 0.037116421558418974,
|
||||
"rawContourShapeStep": 0.04240155312389841,
|
||||
"rawEyeShapeStep": 0.03197382659897345,
|
||||
"requestedSeconds": 16.68
|
||||
}
|
||||
],
|
||||
"multipleFaceFrames": 0,
|
||||
"nominalSourceFPS": 29.970029830932617,
|
||||
"outputWithout76Frames": 0,
|
||||
"partial76Frames": 0,
|
||||
"samplingFPS": 25,
|
||||
"scope": "Independent offline decoding and the current production detector/tracker; not FCP render logs or target execution. Shape steps remove previous bbox translation/scale, but still include actual pose/expression changes.",
|
||||
"sourceBasename": "girl-in-sun-hat-smiling-in-rural-field-2026-10-03-13-54-14-utc.mov",
|
||||
"statistics": {
|
||||
"bboxCenterStep": {
|
||||
"max": 0.012083635671277248,
|
||||
"median": 0.0025497870742485452,
|
||||
"min": 0.00020005997144872253,
|
||||
"n": 468,
|
||||
"p95": 0.006821726779186577
|
||||
},
|
||||
"bboxRelativeSizeStep": {
|
||||
"max": 0.07225176667426436,
|
||||
"median": 0.009157247402053037,
|
||||
"min": 6.255832853296894e-06,
|
||||
"n": 468,
|
||||
"p95": 0.03431959948374386
|
||||
},
|
||||
"landmarkConfidence": {
|
||||
"max": 0.9240875244140625,
|
||||
"median": 0.867706298828125,
|
||||
"min": 0.813995361328125,
|
||||
"n": 469,
|
||||
"p95": 0.902191162109375
|
||||
},
|
||||
"outputAllShapeStep": {
|
||||
"max": 0.05320087993361461,
|
||||
"median": 0.009735492145012412,
|
||||
"min": 0.0029755122029975372,
|
||||
"n": 468,
|
||||
"p95": 0.026782532902396017
|
||||
},
|
||||
"outputContourShapeStep": {
|
||||
"max": 0.0524041977802718,
|
||||
"median": 0.011810624254892923,
|
||||
"min": 0.002450992809745613,
|
||||
"n": 468,
|
||||
"p95": 0.028720841841711312
|
||||
},
|
||||
"rawAllShapeStep": {
|
||||
"max": 0.06465122287331607,
|
||||
"median": 0.01108023509780489,
|
||||
"min": 0.0031002818411607846,
|
||||
"n": 468,
|
||||
"p95": 0.030464142596339925
|
||||
},
|
||||
"rawContourShapeStep": {
|
||||
"max": 0.06330400492305996,
|
||||
"median": 0.013550650249078297,
|
||||
"min": 0.002692092571665042,
|
||||
"n": 468,
|
||||
"p95": 0.03357642027607019
|
||||
},
|
||||
"rawEyeShapeStep": {
|
||||
"max": 0.07106297705037405,
|
||||
"median": 0.010302814344493833,
|
||||
"min": 0.0013460890263982167,
|
||||
"n": 468,
|
||||
"p95": 0.02979010461963986
|
||||
}
|
||||
},
|
||||
"timelineOffsetSeconds": 18.72,
|
||||
"nativeContext": {
|
||||
"app": "Final Cut Pro",
|
||||
"project": "大鱼人像美化验收-20261021",
|
||||
"format": "1080p25",
|
||||
"selectedClipStartTimecode": "00:00:18:18",
|
||||
"selectedClipEndTimecode": "00:00:37:11",
|
||||
"timelinePlayheadAX": "00:00:24:11",
|
||||
"viewerLCD": "00:00:35:22",
|
||||
"faceThin": 1,
|
||||
"faceBigEye": 0.9035486629353234,
|
||||
"fastMultiFace": false,
|
||||
"sourceResolvedBy": "Selected timeline clip > File > Reveal in Finder",
|
||||
"timelineMediaMapping": "Offset18.72 is inferred from clip placement; source in-point/retiming not exported, so source5.72 -> timeline24:11 is approximate. Viewer LCD differs from AX playhead; displayed frame not asserted."
|
||||
},
|
||||
"interpretation": {
|
||||
"partialTopologySwitchObserved": false,
|
||||
"candidate": "Fully detected geometry changes retained by the current box-remapping and 90% current-frame point blend; eye effect also active",
|
||||
"notProven": [
|
||||
"Observed geometric change includes actual head motion, rotation and expression; not all measured change is detector noise",
|
||||
"No target output frames or live target internal geometry captured",
|
||||
"Native FCP arrival order and detection/color/scale can differ from the independent decode",
|
||||
"Big-eye contribution not measured independently on the native timeline"
|
||||
]
|
||||
},
|
||||
"referenceProcessIdentity": {
|
||||
"observedAlreadyRunning": true,
|
||||
"outerApp": "/Library/Plug-Ins/FxPlug/MSE18V2.app",
|
||||
"version": "2.4.0",
|
||||
"pluginSha256": "577303e0de72e07feb576c882e82382b3f056b023a7e987d990ffb37f6b16109",
|
||||
"matchesRequestedDownloadsBinary": true,
|
||||
"analysisLaunchedTarget": false,
|
||||
"internalTargetGeometryCaptured": false
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"scope": "Current source review, isolated authored diagnostics, static REA of requested2.4.0, and independent25fps scan of the user-selected current clip; no native dual-plugin comparison",
|
||||
"sourceBaseline": "b58fec1a86db7a2e474e1cc65a5911447b5906b9",
|
||||
"installedVersion": "1.3.2 (17)",
|
||||
"productSourceUnchanged": true,
|
||||
"selectedTarget": {
|
||||
"path": "/Users/dayu/Downloads/MSE18V2.app",
|
||||
"version": "2.4.0",
|
||||
"build": "20260724150000",
|
||||
"universalPluginSha256": "577303e0de72e07feb576c882e82382b3f056b023a7e987d990ffb37f6b16109",
|
||||
"arm64Sha256": "afc71d0d21fd3c1ca95ca745ddafcd729e36ad95f17d8638009f2e45d9b7e8df"
|
||||
},
|
||||
"comparisonCaution": "Existing auto-follow-report.json describes the older /Applications target; its temporal weights/history must not be asserted as 2.4.0 default behavior",
|
||||
"evidenceRecordsRetained": 17,
|
||||
"checks": {
|
||||
"FCP-BeautyGirl/FCP-BeautyGirl/Plugin/PGFaceProcessor.m": "cca826d5602b45b2c79ea3c3c78be7c78ad1defe7b062ed8ec54c311d53ac395",
|
||||
"FCP-BeautyGirl/FCP-BeautyGirl/Plugin/FCPBeautyGirlPlugIn.m": "9d3d30d1f7f6467c634e8d6e832d2330618b9ff240de37f57de9bc48e2792de8",
|
||||
"scripts/diagnose-tracking.m": "bc758bf5ec4825006930be8997889404f63c28da1fe06ad8872b0901b2795d2c",
|
||||
"docs/analysis/tracking-flicker-20261022/synthetic-results.json": "5fdbad4887dd78658c06f5c6d8e70c9e53fd7b54e11a9cc31ee1958631cbc1a8",
|
||||
"docs/analysis/tracking-flicker-20261022/rea-evidence.json": "4b367759388c8e061e138623184ae8a6875dbab22659eefd4e474b141b8868fa",
|
||||
"scripts/diagnose-tracking.sh": "c1993ca91cee596a21db1e4f86ba224be85c37495c783f9c3b21872aff210765",
|
||||
"scripts/inspect-tracking-sequence.m": "0b94fc92669acf4d36861ccb25077b767189b8a72647e0d304627dbda5d052eb",
|
||||
"docs/analysis/tracking-flicker-20261022/current-clip-summary.json": "043ba688c606fb9e56449fd02108b34789fd41c4d9a2552cd07f4d3bf78a00f0"
|
||||
},
|
||||
"limits": [
|
||||
"Static reachable/default-configuration branches do not prove runtime branch execution",
|
||||
"Same-frame raw cache, hold and out-of-order behavior were isolated using our actual current implementation",
|
||||
"No APP rebuild, install, package or article publication for this analysis",
|
||||
"User source decoded only locally; no source frames or complete real landmark arrays uploaded",
|
||||
"User current FCP clip confirmed, all469 offline samples have full76; earlier missing-point synthetic case is not established as this clip cause",
|
||||
"Only scalar clip summary retained; full scalar per-frame diagnostics remain in ignored build",
|
||||
"Approximate timeline offset is not a substitute for verified source in-point/retiming",
|
||||
"Reference was already running; only process executable identity read. Native UI read/reveal/raise only, no effect/timeline edits; no target launch, debugger or geometry trace."
|
||||
],
|
||||
"currentClipSummary": "current-clip-summary.json"
|
||||
}
|
||||
文件差异过大,未显示。
加载差异
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"repository": "https://github.com/dayumeida/FCP-BeautyGirl.git",
|
||||
"anonymousClone": true,
|
||||
"commit": "a0c5357efd87a63dbee6269d9335e6aa3ba78799",
|
||||
"trackedFilesByteBlobAndModeCompared": 284,
|
||||
"strictFullFsck": true,
|
||||
"syntheticDiagnosticRebuiltAndReproduced": true,
|
||||
"productSourceUnchangedFromRelease": "v1.3.2",
|
||||
"lfs": false,
|
||||
"submodules": false,
|
||||
"temporaryCloneRemoved": true,
|
||||
"mediaBoundary": "User source clip not included; clip scalar summary and static/synthetic evidence retained"
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
{
|
||||
"authoredTwoFaceCrossing" : {
|
||||
"rawIndex0" : "same authored identity A moved by .10",
|
||||
"rawIndex1" : "different authored identity B moved within .01 of old center",
|
||||
"selectedRawIndex" : 1
|
||||
},
|
||||
"defaultAppearanceOnDetectionLoss" : {
|
||||
"geometryFacesAfter" : 1,
|
||||
"geometryFacesBefore" : 1,
|
||||
"meanColorMaskAfter" : 0,
|
||||
"meanColorMaskBefore" : 0.39522577568114048,
|
||||
"meanSkinMaskAfter" : 0,
|
||||
"meanSkinMaskBefore" : 0.29670316041502076
|
||||
},
|
||||
"landmarkWeightsByFrameRate" : [
|
||||
{
|
||||
"currentLandmarkWeight" : 0.89999999999999925,
|
||||
"fps" : 25
|
||||
},
|
||||
{
|
||||
"currentLandmarkWeight" : 0.89999999999999925,
|
||||
"fps" : 30
|
||||
},
|
||||
{
|
||||
"currentLandmarkWeight" : 0.5,
|
||||
"fps" : 60
|
||||
},
|
||||
{
|
||||
"currentLandmarkWeight" : 0.25,
|
||||
"fps" : 120
|
||||
}
|
||||
],
|
||||
"outOfOrderCachedMissingFrame" : {
|
||||
"initial40OutputFaces" : 0,
|
||||
"ordered0Then40OutputFaces" : 1,
|
||||
"replay40AfterAdding0OutputFaces" : 0
|
||||
},
|
||||
"pureBBoxTranslationJitter" : {
|
||||
"fps" : 25,
|
||||
"frames" : 20,
|
||||
"maximumOutputVsRawPointError" : 0,
|
||||
"outputOverRawAmplitude" : 1,
|
||||
"outputStepNormalized" : 0.0080000000000000071,
|
||||
"rawStepNormalized" : 0.0080000000000000071
|
||||
},
|
||||
"reacquisition" : {
|
||||
"continuousPoint69x" : 0.60288473677011323,
|
||||
"rawPoint69x" : 0.60568473677011325,
|
||||
"reacquiredPoint69x" : 0.60568473677011325
|
||||
},
|
||||
"scope" : "Authored synthetic geometry and image only; actual current PGFaceProcessor implementation linked; no target binary or user media.",
|
||||
"topologyValidMissingValid" : {
|
||||
"held" : [
|
||||
false,
|
||||
false,
|
||||
false
|
||||
],
|
||||
"pixelDifferencesFromUnwarpedInput" : [
|
||||
{
|
||||
"changedChannelsAbove1e_6" : 85835,
|
||||
"maxChannelDifference" : 0.89999997615814209,
|
||||
"meanChannelDifference" : 0.055795646515334418
|
||||
},
|
||||
{
|
||||
"changedChannelsAbove1e_6" : 0,
|
||||
"maxChannelDifference" : 0,
|
||||
"meanChannelDifference" : 0
|
||||
},
|
||||
{
|
||||
"changedChannelsAbove1e_6" : 85835,
|
||||
"maxChannelDifference" : 0.89999997615814209,
|
||||
"meanChannelDifference" : 0.055795646515334418
|
||||
}
|
||||
],
|
||||
"points76Counts" : [
|
||||
76,
|
||||
0,
|
||||
76
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
# 瘦脸跟踪闪烁:1.3.2 与目标 2.4.0 的对齐缺口
|
||||
|
||||
2026-10-22。用户实测同一段素材,本插件瘦脸跟踪闪烁,目标插件稳定。本次分析基线为 `b58fec1a86db7a2e474e1cc65a5911447b5906b9`,已安装版仍为 1.3.2(17)。完成源码审查、隔离合成复现、静态二进制对照和当前素材的独立连续帧采样;通过宿主界面读取状态并定位源文件,没有修改参数/片段、产品源码或重新编译 APP。
|
||||
|
||||
主要缺口在跨帧几何的有效性判定、坏帧保持与缓存更新。此前恢复单帧瘦脸位移场,并没有完整对齐新版目标的连续跟踪链。以下区分已经复现的本品行为、目标的静态分支,以及尚未定位到用户素材具体帧的部分。
|
||||
|
||||
## 目标版本与旧分析的边界
|
||||
|
||||
本次目标是用户指定的 `/Users/dayu/Downloads/MSE18V2.app`,版本 **2.4.0 / 20260724150000**。插件通用二进制 SHA-256 为 `577303e0de72e07feb576c882e82382b3f056b023a7e987d990ffb37f6b16109`,arm64 切片为 `afc71d0d21fd3c1ca95ca745ddafcd729e36ad95f17d8638009f2e45d9b7e8df`。切片逐字节核对过本次目标,REA 使用 Ghidra 12.1.4。随后仅读取已运行的系统 FxPlug 目标进程,其2.4.0可执行文件摘要与Downloads目标一致;本次没有启动目标、附加调试器或采集其内部几何。
|
||||
|
||||
原有 [auto-follow-report.json](auto-follow-report.json) 分析的是 `/Applications/MSE18V2.app` 的旧版 `1.0.20260617-170517`,通用二进制 SHA 为 `6c5d74bc844a5c5f745718b48ea10ec6635d08aa08a5b6dc6e62653980849f8a`。其中 temporal 混合系数和历史优先级不能直接当成 2.4.0 的默认瘦脸实现。
|
||||
|
||||
新版 `renderDestinationImage`(`0x10002179c`)的单主要人脸几何分支直接调用 **`mss_pinStyleFacePoints…`(`0x10003d69c`)**。后者在筛选当前几何后,选择接纳新点或回用上一组有效点,并可向 `trackedFaceBox…`(`0x10003cc78`)请求连续跟踪框。旧 `temporalFacePoints…` 方法仍存在,但当前提供者没有解析到它的直接调用者;这不能排除任意 Objective-C 间接调用,却足以纠正“只按旧 temporal 方法调平滑系数即可对齐新版”的假设。
|
||||
|
||||
对应 Evidence:render `ev_2330b66132cd6539b8c66313c8dc43ca6ff5eb3e0881abbbe26857f99de6a83b`;pin-style `ev_58dee36fddf4e4c98ce3d880a0bb98190351d1269c960b3ccc275aef81265e8f`;直接调用关系 `ev_568a93f2165e5dc5046e610f47c23e9cebc33f55b5d12d3ee005a1e99a7191f6`、`ev_a8cf6f3aec6fbcf2b698ab8ec52313e20a6a5e0d636bc922c4293e436861db7e`、`ev_7c53c39d245e0063cab89358ab8948cdd734488460464d5f455674bb80a1515a`。
|
||||
|
||||
## 当前时间线素材的连续帧核对
|
||||
|
||||
用户补充截图后,在 Final Cut Pro 当前时间线选中片段,通过“文件 → 在访达中显示”确认源视频为 `girl-in-sun-hat-smiling-in-rural-field-2026-10-03-13-54-14-utc.mov`。项目为 1080p25,选中片段从18:18到37:11,瘦脸1.00、大眼0.90355、多人模式关闭。没有修改参数或片段;检查结束返回 FCP。
|
||||
|
||||
直接调用当前产品检测器与跟踪器,在独立1920×1080解码上按25fps采样源文件全长18.752秒,共 **469帧**。源帧率为29.97003,因此这里模拟项目的采样节奏,并非逐一处理所有源帧,也不等同于FCP的实时请求/色彩/尺寸路径。
|
||||
|
||||
- 469帧全部为单脸且完整76点;空检测、部分点、held、Vision/解码错误均为0,关键点置信度最低0.814。**本段离线检查没有触发上文合成的“缺点使瘦脸归零”路径,也没有触发低于0.55的置信度条件。不能将它直接认定为当前素材的主因。**
|
||||
- 最大轮廓形状步幅出现在请求源时间5.72秒(实际取到5.7057秒)附近。扣除前后检测框的平移/缩放后,raw轮廓RMS步幅为脸框尺度的6.33%,当前稳定输出仍为5.24%;眼部区域步幅7.11%。同一步检测框尺寸变化7.23%,框中心变化0.01061(全图归一化距离)。
|
||||
- 变化较大的连续区间包括源5.56–5.76秒,另有0.7–0.92秒与片尾。按照所选片段位置、假设源入点为0且未变速,5.72秒约对应时间线24:11,与AX播放头24:11相近;未导出源入点/重定时,且检视器LCD同时为35:22,不能断言用户截图就是该源帧。
|
||||
- 数值包含真实头部旋转和表情变化;平移/缩放抵消并未消除这些运动。因此它证明“检测仍成功时,几何变化大部分继续进入变形”,尚未量出其中多少属于错误检测。瘦脸和接近0.90的大眼都开启,大眼实现仍为近似,需要独立排查其视觉贡献。
|
||||
|
||||
这次素材的排查优先级应先放在**完整有效帧的框/点变化如何进入瘦脸,以及高强度大眼叠加**,再核对新版目标的连续框、几何质量判定与时间状态。一般性的部分失检、空缓存和蒙版缺口仍成立,但不能拿其他情境的合成失败代替这段素材的逐帧归因。
|
||||
|
||||
[当前素材标量摘要](tracking-flicker-20261022/current-clip-summary.json) 保存计数、分布和峰值时间;原视频、截图和完整真实关键点没有上传。通用诊断源码为 `scripts/inspect-tracking-sequence.m`;包含生产 .m 以复用真实静态几何转换和跟踪器,编译时只编译该诊断入口,不再重复链接 PGFaceProcessor.m。
|
||||
|
||||
## 已确定的差异
|
||||
|
||||
| 环节 | 当前 1.3.2 | 目标 2.4.0 的静态证据 | 对闪烁的意义 |
|
||||
| --- | --- | --- | --- |
|
||||
| 部分关键点失效 | 有合法脸框就接纳;当前缺 76 点时删去完整拓扑,且不标为 held | 接纳前要求足量点、轮廓、有限坐标、有效五官布局和置信度;不合格时可回用上一组有效点 | 当前会在部分失效帧直接关闭瘦脸,目标有完整形状保持路径 |
|
||||
| 框与几何稳定 | 每次重新检测,旧点先映射到当前原始框;没有连续对象框跟踪器 | pin-style 可调用 VNSequenceRequestHandler / VNTrackObjectRequest,坏帧可把旧点映射到可用跟踪框 | 当前框噪声完全进入几何;目标另外维护连续框和上次有效形状 |
|
||||
| 异常姿态与跳点 | 主要判断眼轴翻转;合法有限 76 点一般直接进入混合 | 额外检查眼/鼻/口/下轮廓结构、前后几何兼容及归一化点位跳变的中位数/P90 | 当前会接受点数足够但位置不可靠的帧 |
|
||||
| 同帧检测复用 | 每个请求新建 Vision handler;几何缓存要求 raw 也完全相同才命中 | 人脸检测有按帧时间、输入范围和 tile 范围复用的缓存,并有重试分支 | 当前重复请求可能产生不同 raw 后重新计算;未测得其在用户素材中的发生频率 |
|
||||
| 丢检时的外观支持 | 默认几何可以保持,但皮肤/牙齿/眼睛蒙版仍取 raw 检测 | 本次只完整核对目标的瘦脸主路径,未恢复其全部外观蒙版稳定策略 | 本品已复现几何保持时外观蒙版清零,可能叠加视觉闪烁;不把目标外观路径宣称为已完全对齐 |
|
||||
|
||||
pin-style 的接纳分支复制本帧合格点,保持分支使用旧有效点并尝试框重映射。因此**不能据旧报告把“目标平滑更强”或某个固定混合权重当作这次原因**。应优先恢复它筛掉坏几何、保留有效几何的机制。
|
||||
|
||||
目标跟踪器还有开关与时间管理:静态初始化检查 `MSE18_DISABLE_FACE_THIN_VISION_TRACKER`,通常未设置时启用;已核对初始化汇编的 OR/EOR 写入。跟踪方法包含同帧复用、时间倒退/间隔后的重置、跟踪结果置信度检查和短期保框分支。这里证明默认配置下的可达控制流,没有记录用户宿主内实际环境变量或运行命中次数,不能称为运行验证,也不能仅添加一个 VNTrackObjectRequest 就声称完整复刻。
|
||||
|
||||
## 隔离复现结果
|
||||
|
||||
探针直接链接当前 `PGFaceProcessor.m`,用自造 256×256 图与合成关键点调用实际选择器、变形和蒙版实现。没有使用用户画面、真实人脸点阵或目标运行结果。运行 `zsh scripts/diagnose-tracking.sh` 输出 JSON;它是诊断统计,退出码 0 只表示执行完成。
|
||||
|
||||
1. **76 → 缺 76 → 76,瘦脸中间一帧完全归零。** 三帧一直有输出脸框,点数为 `76/0/76`,held 全为 false。只开瘦脸时,相对原图的变化通道数为 `85835/0/85835`,中间帧像素完全直通。源码入口:`PGFaceProcessor.m` 208–227、308、532–554、645–646。这证明了一个足以造成闪烁的路径;没有测量它在用户视频中的出现率。
|
||||
2. **纯脸框抖动衰减为 0%。** 25fps、20 帧,框的 X 方向交替 ±0.004,框内点保持一致;输入和稳定后的点位步幅均为 0.008,输出/输入振幅比 `1.0`。源码 177–186、196、214–217 的重映射原样继承了框平移。目标对各种轻微框噪声的最终响应尚未做数值对照,不能把此数值直接说成两插件的实测差值。
|
||||
3. **当前点混合在 25/30fps 时采用 90% 新点。** 60fps 为 50%,120fps 为 25%;现有 10ms 用例只检查 30% 新点。掉检后重获还跳过 76 点混合而直接采用 raw。源码 186、211–225、308;现有 `slim_tests.m` 408–410 明确要求重获采用 raw。这解释当前实现为何对扰动敏感,不是目标 2.4.0 权重的证据。
|
||||
4. **空缓存会保留第一次请求顺序的结果。** 先请求 40ms 空帧,再补入 0ms 有效脸,重播 40ms 仍输出 0 脸;按 0→40ms 请求则输出 1 脸。源码 279 的命中直接返回,插入早期帧不会更新后续结果。宿主锁只串行化到达顺序;并发测试只验证安全和重复一致,没有要求不同到达顺序获得相同几何。尚未记录用户宿主实际请求顺序。
|
||||
5. **几何保持不等于美容蒙版保持。** 默认路径掉检时几何脸数仍为 1,colorMask 均值从 `0.3952` 变为 `0`,skinMask 从 `0.2967` 变为 `0`。生产入口强制 singleFace=0,走源码 664–666 的 raw 外观支持;单人 held 外观分支并未在该默认路径使用。
|
||||
6. **多人仍有额外边界。** 默认关联只按防跳区域内距上一框中心最近者选脸;自造交叉可选到陌生人。fastMulti 直接返回 raw,不做当前单主要人脸的保持。此项没有证明用户单人素材发生了换脸,修复时应单列验收。
|
||||
|
||||
原 1901 项回归主要证明单帧图像、几何和接口行为。已有跟随测试检查完全空检测、10ms 扰动与缓存重复安全,没有覆盖“76 点短暂不完整”的连续帧,也没有以常用帧率约束抖动幅度。此前每两秒取一帧、共 11 帧的真实视频检查同样不能替代连续序列稳定性验收。
|
||||
|
||||
## 建议修复顺序与验证要求
|
||||
|
||||
- **先处理部分失效和异常几何。** 在接纳新主脸前检查完整拓扑与五官布局;不合格时进入上一组有效形状的保持/重映射路径。明确区分有效检测时间、输出时间和保持状态,避免仅靠刷新输出时间无限保持。
|
||||
- **再对齐连续框、重获和时间管理。** 结合新版默认可达跟踪链处理同帧、倒退、跳时、正常运动及重获;从转头、遮挡恢复检查形状是否突然跳回 raw。先逐条核对机制,再决定系数,避免用增加滞后来掩盖坏点。
|
||||
- **补齐缓存和外观同步。** 明确同帧结果与新增前帧历史的失效关系、源切换隔离及默认蒙版跟随;以顺序/倒序/重复/多线程请求对照输出。
|
||||
- **用同一段素材做连续帧验收。** 锁定宿主、原始帧率、预览/导出条件和相同单项参数;记录检测有效性、保持原因、框/点扰动与效果开关变化,和目标逐帧对照。单张图正常、自动用例通过都不足以宣布闪烁修复。
|
||||
|
||||
当前素材、宿主和可见参数已确认,并完成469帧独立采样;有效点短暂缺失未在该采样中出现。实现缺口与几何变化已定位,目标与本品的原生同帧输出、源入点映射和大眼贡献仍未分离,尚未认定唯一原因。本次不构建新 APP,不更新安装包或文章。
|
||||
|
||||
## 保留资料
|
||||
|
||||
- [诊断结果](tracking-flicker-20261022/synthetic-results.json)
|
||||
- [目标版本、源码指纹和范围](tracking-flicker-20261022/manifest.json)
|
||||
- [选取的完整 REA Evidence 记录](tracking-flicker-20261022/rea-evidence.json),含原始/规范化结果与提供者限制;为互操作研究资料,不包括目标 APP 或 metallib。
|
||||
- 探针源码 `scripts/diagnose-tracking.m` 与入口 `scripts/diagnose-tracking.sh`。构建依赖与项目一致,需 macOS 的 Core Image/Vision;生成文件位于忽略的 build 下。
|
||||
|
||||
Ghidra 对部分 CGRect、CMTime 和返回寄存器的恢复不完整。报告依据渲染调用关系、完整点门槛、接纳/保持内存分支及初始化汇编作结构判断;未声称所有阈值布尔表达式与目标逐条等价。REA 会话已保存并关闭,证据可离线复查。
|
||||
|
||||
|
||||
## 连续帧诊断恢复与复用
|
||||
|
||||
在项目根执行(先创建 build 目录):
|
||||
|
||||
```sh
|
||||
mkdir -p build/tracking-diagnostics
|
||||
xcrun clang -fobjc-arc -fmodules -mmacosx-version-min=13.0 \
|
||||
-framework Foundation -framework AVFoundation -framework CoreImage \
|
||||
-framework CoreGraphics -framework CoreMedia -framework Metal \
|
||||
-framework Vision -framework ImageIO scripts/inspect-tracking-sequence.m \
|
||||
-o build/tracking-diagnostics/inspect-sequence
|
||||
build/tracking-diagnostics/inspect-sequence '/绝对路径/源素材.mov' \
|
||||
build/tracking-diagnostics/sequence.json 25 1920 18.72
|
||||
```
|
||||
|
||||
最后三个参数是采样帧率、解码最长边与诊断时间偏移;18.72只来自本次所选片段位置,分析其他素材按实际设置。程序不导出图片或完整真实点阵,输出含逐帧标量;本次只提交汇总,详细本地数据保持在 build。用户视频和目标二进制均未随仓库分发,重跑具体素材需要自行提供原文件;二者不是产品构建依赖。源码、合成诊断及本次标量/静态证据均随 Git 保存。
|
||||
|
||||
|
||||
分析与连续帧诊断的可恢复节点为 `a0c5357efd87a63dbee6269d9335e6aa3ba78799`,已推送并读回双远端。从 GitHub 匿名独立克隆核对284个文件的字节/blob/执行位、strict/full fsck,并重新构建合成诊断、逐项复现保存的JSON;产品源码与v1.3.2相同,无LFS/子模块。见[恢复回执](tracking-flicker-20261022/recovery.json)。后续main仅补充恢复说明,不改变已安装版或历史标签。
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"repositoryId": 1428817365,
|
||||
"oldName": "FAMEDaYu/FCP-BeatyGril",
|
||||
"newName": "FAMEDaYu/FCP-BeautyGirl",
|
||||
"url": "https://github.com/FAMEDaYu/FCP-BeautyGirl",
|
||||
"baselineCommit": "cd2e608ec6bb92bb6bb0923e4fb4b7728404c67a",
|
||||
"allBranchAndTagRefsUnchanged": true,
|
||||
"releaseAndAssetIdsUnchanged": true,
|
||||
"githubRemote": "https://github.com/FAMEDaYu/FCP-BeautyGirl.git",
|
||||
"sourceProductUnchanged": true,
|
||||
"date": "2026-10-22",
|
||||
"links": {
|
||||
"redirects": [
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCP-BeatyGril",
|
||||
"new": "https://github.com/FAMEDaYu/FCP-BeautyGirl",
|
||||
"redirectCode": 301,
|
||||
"newURLStatus": 200
|
||||
},
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.3.1",
|
||||
"new": "https://github.com/FAMEDaYu/FCP-BeautyGirl/releases/tag/v1.3.1",
|
||||
"redirectCode": 301,
|
||||
"newURLStatus": 200
|
||||
}
|
||||
],
|
||||
"articleCanonicalLinksVerified": true
|
||||
},
|
||||
"globalRepositoryIndex": {
|
||||
"remote": "https://dayu.media/git/dayu/codex-global-rules.git",
|
||||
"baseline": "8d3558429efd22af8bad49c03060da326cb231d3",
|
||||
"commit": "750b430b75e4ccdf5badae8ee3f88a07144b3a9e",
|
||||
"trackedFilesCompared": 11,
|
||||
"independentCloneAndFsck": true,
|
||||
"changedFile": "REPOSITORIES.md"
|
||||
},
|
||||
"githubReleaseNotes": [
|
||||
{
|
||||
"id": 420500792,
|
||||
"tag": "v1.3.1",
|
||||
"assetsUnchanged": true
|
||||
}
|
||||
],
|
||||
"dayuReleaseNotes": [
|
||||
{
|
||||
"id": 136,
|
||||
"tag": "v1.3.1",
|
||||
"assetsUnchanged": true
|
||||
}
|
||||
],
|
||||
"article": {
|
||||
"id": 15593,
|
||||
"url": "https://dayu.media/15593/",
|
||||
"change": "GitHub repository name/URL only",
|
||||
"downloadCoverSeoAndAccessPreserved": true
|
||||
},
|
||||
"immutableArtifacts": "Existing version tags, notarized APP/PKG and published source ZIP bytes retained; no rebuild or installer upload."
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"remote": "https://github.com/FAMEDaYu/FCP-BeautyGirl.git",
|
||||
"commit": "6a29d52a9ad667665da4acf75017c008fa0a566d",
|
||||
"anonymousClone": true,
|
||||
"trackedFilesCompared": 239,
|
||||
"bytesAndExecutableModesMatched": true,
|
||||
"gitFsckFullStrict": true,
|
||||
"productSourceUnchangedFrom": "cd2e608ec6bb92bb6bb0923e4fb4b7728404c67a",
|
||||
"lfs": false,
|
||||
"submodules": false,
|
||||
"temporaryCloneRemoved": true
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"oldLogin": "FAMEDaYu",
|
||||
"newLogin": "dayumeida",
|
||||
"accountId": 117798680,
|
||||
"profileURL": "https://github.com/dayumeida",
|
||||
"repositories": [
|
||||
{
|
||||
"id": 1428817365,
|
||||
"oldName": "FAMEDaYu/FCP-BeautyGirl",
|
||||
"newName": "dayumeida/FCP-BeautyGirl",
|
||||
"allRefsUnchanged": true,
|
||||
"releasesAndAssetsUnchanged": true
|
||||
},
|
||||
{
|
||||
"id": 904215594,
|
||||
"oldName": "FAMEDaYu/FCPX-",
|
||||
"newName": "dayumeida/FCPX-",
|
||||
"allRefsUnchanged": true,
|
||||
"releasesAndAssetsUnchanged": true
|
||||
}
|
||||
],
|
||||
"localGithubRemote": "https://github.com/dayumeida/FCP-BeautyGirl.git",
|
||||
"date": "2026-10-22",
|
||||
"links": {
|
||||
"redirects": [
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCP-BeautyGirl",
|
||||
"final": "https://github.com/dayumeida/FCP-BeautyGirl",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCP-BeatyGril",
|
||||
"final": "https://github.com/dayumeida/FCP-BeautyGirl",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCP-BeautyGirl/releases/tag/v1.3.1",
|
||||
"final": "https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.1",
|
||||
"status": 200
|
||||
},
|
||||
{
|
||||
"old": "https://github.com/FAMEDaYu/FCPX-",
|
||||
"final": "https://github.com/dayumeida/FCPX-",
|
||||
"status": 200
|
||||
}
|
||||
],
|
||||
"newProfileStatus": 200,
|
||||
"articleLinksVerified": true
|
||||
},
|
||||
"globalRepositoryIndex": {
|
||||
"remote": "https://dayu.media/git/dayu/codex-global-rules.git",
|
||||
"baseline": "750b430b75e4ccdf5badae8ee3f88a07144b3a9e",
|
||||
"commit": "dde7e2ee26eae18627eefda9b956a6aca52354ad",
|
||||
"trackedFilesCompared": 11,
|
||||
"independentCloneAndFsck": true,
|
||||
"changedFile": "REPOSITORIES.md"
|
||||
},
|
||||
"githubReleaseNotes": [
|
||||
{
|
||||
"id": 420500792,
|
||||
"tag": "v1.3.1",
|
||||
"assetsUnchanged": true
|
||||
}
|
||||
],
|
||||
"dayuReleaseNotes": [
|
||||
{
|
||||
"id": 136,
|
||||
"tag": "v1.3.1",
|
||||
"assetsUnchanged": true
|
||||
}
|
||||
],
|
||||
"article": {
|
||||
"id": 15593,
|
||||
"url": "https://dayu.media/15593/",
|
||||
"change": "GitHub owner URL only",
|
||||
"downloadCoverSeoAndAccessPreserved": true
|
||||
},
|
||||
"sourceArtifacts": "No change to product source or APP/PKG/source ZIP bytes. Historical verification evidence retains the prior username."
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"remote": "https://github.com/dayumeida/FCP-BeautyGirl.git",
|
||||
"commit": "2faf7de77929cf7707645ebb38095b03d5729647",
|
||||
"anonymousClone": true,
|
||||
"trackedFilesCompared": 241,
|
||||
"bytesAndExecutableModesMatched": true,
|
||||
"gitFsckFullStrict": true,
|
||||
"productSourceUnchangedFrom": "e47736222d3cbf5edadab26b2a28c82987327043",
|
||||
"lfs": false,
|
||||
"submodules": false,
|
||||
"temporaryCloneRemoved": true
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"url": "https://dayu.media/git/dayu/paintfcp-fxplug/releases/tag/v1.3.1",
|
||||
"tag": "v1.3.1",
|
||||
"uploadAndMetadataReadbackVerified": true,
|
||||
"assets": [
|
||||
{
|
||||
"name": "Dayu-Portrait-1.3.1-source.zip",
|
||||
"bytes": 9682532
|
||||
},
|
||||
{
|
||||
"name": "Dayu-Portrait-1.3.1.pkg",
|
||||
"bytes": 5011286
|
||||
}
|
||||
],
|
||||
"assetByteReadback": "Not verified through the browser download gateway: API token request was redirected to site login. GitHub and article asset bytes were independently verified; installer is also stored in Git and restored from the release tag.",
|
||||
"anonymousAccess": "Site Git gateway continues to require login/membership."
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"tag": "v1.3.1",
|
||||
"commit": "b35b4a5d1ca252d2f83c798613560a768274de3c",
|
||||
"anonymousGitHubClone": true,
|
||||
"trackedFilesCompared": 232,
|
||||
"byteAndExecutableModesMatch": true,
|
||||
"gitFsckFullStrict": true,
|
||||
"productMatchesSignedSource": "7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f",
|
||||
"restoredPkgSignatureAndTicketVerified": true,
|
||||
"lfs": false,
|
||||
"submodules": false
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"url": "https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.3.1",
|
||||
"tag": "v1.3.1",
|
||||
"assets": [
|
||||
{
|
||||
"name": "Dayu-Portrait-1.3.1-source.zip",
|
||||
"bytes": 9682532,
|
||||
"sha256": "7c335f54717a73e710ef484fc9f7b90864211c128a0f217bf170aa092333f228",
|
||||
"anonymousDownloadVerified": true
|
||||
},
|
||||
{
|
||||
"name": "Dayu-Portrait-1.3.1.pkg",
|
||||
"bytes": 5011286,
|
||||
"sha256": "a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927",
|
||||
"anonymousDownloadVerified": true
|
||||
}
|
||||
],
|
||||
"installerSignatureAndTicketVerified": true
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"articleId": 15593,
|
||||
"url": "https://dayu.media/15593/",
|
||||
"status": "publish",
|
||||
"version": "1.3.1",
|
||||
"author": 1,
|
||||
"categories": [
|
||||
3
|
||||
],
|
||||
"featuredMedia": 15595,
|
||||
"free": true,
|
||||
"accessAndCoverPreserved": true,
|
||||
"packageURL": "https://dayu.media/wp-content/uploads/2026/10/1792659519-b628139c96a5fa6.pkg",
|
||||
"packageBytesAndHashVerifiedByPublisher": true,
|
||||
"sourceURL": "https://dayu.media/wp-content/uploads/2026/10/1792659515-d487b0a421aacc6.zip",
|
||||
"frontends": [
|
||||
{
|
||||
"request": "normal URL",
|
||||
"title": "大鱼人像美化 1.3.1|FCP / Motion 免费开源自动美颜插件",
|
||||
"description": "大鱼人像美化是适用于 Final Cut Pro 和 Motion 的免费开源 FxPlug4 插件,1.3.1 修复 V 脸下颌作用区域,并加入微细锐化、五官保护与非肤色区保护。提供 Apple 签名公证 PKG 安装包和源码,安装自动注册,无需激活码,附安装使用及故障排查说明。",
|
||||
"keywords": "大鱼人像美化,FCP美颜插件,Motion磨皮,自动瘦脸,自动跟随,FxPlug4,免费开源",
|
||||
"singleSeoTags": true,
|
||||
"versionAndInstructionsPresent": true,
|
||||
"anonymousPrice": "free; theme requires login to get package"
|
||||
},
|
||||
{
|
||||
"request": "fresh query",
|
||||
"title": "大鱼人像美化 1.3.1|FCP / Motion 免费开源自动美颜插件",
|
||||
"description": "大鱼人像美化是适用于 Final Cut Pro 和 Motion 的免费开源 FxPlug4 插件,1.3.1 修复 V 脸下颌作用区域,并加入微细锐化、五官保护与非肤色区保护。提供 Apple 签名公证 PKG 安装包和源码,安装自动注册,无需激活码,附安装使用及故障排查说明。",
|
||||
"keywords": "大鱼人像美化,FCP美颜插件,Motion磨皮,自动瘦脸,自动跟随,FxPlug4,免费开源",
|
||||
"singleSeoTags": true,
|
||||
"versionAndInstructionsPresent": true,
|
||||
"anonymousPrice": "free; theme requires login to get package"
|
||||
}
|
||||
],
|
||||
"fcpxAppSync": "disabled as before; not requested",
|
||||
"nativeVisualQA": "pending_user"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"sourceCommit": "b35b4a5d1ca252d2f83c798613560a768274de3c",
|
||||
"tag": "v1.3.1",
|
||||
"files": 230,
|
||||
"bytes": 9682532,
|
||||
"sha256": "7c335f54717a73e710ef484fc9f7b90864211c128a0f217bf170aa092333f228",
|
||||
"excludes": [
|
||||
"releases/**/*.pkg"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
Beauty renderer: 57 checks, 0 failures (Metal).
|
||||
2026-10-22 18:30:09.786 face-tests[35177:8446323] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
|
||||
Face processing: 116 checks passed
|
||||
2026-10-22 18:30:23.734 slim-tests[35267:8446747] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
|
||||
PASS: 1033 slim alignment checks; maximum UV oracle error 1.09828022e-05
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"status": "installed_user_qa_pending",
|
||||
"bundleIdentifier": "com.dayu.fcpbeautygirl",
|
||||
"installationPath": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"options": {
|
||||
"waitForHosts": true,
|
||||
"userTests": true
|
||||
},
|
||||
"nativeEffectQA": {
|
||||
"status": "pending_user",
|
||||
"performedByScript": false
|
||||
},
|
||||
"source": {
|
||||
"commit": "767bba8ac11e9bf9268a1e02d1a06d3c120c46aa",
|
||||
"trackedWorktreeChanges": []
|
||||
},
|
||||
"updatedAt": "2026-10-22T10:38:29.383549+00:00",
|
||||
"version": "1.3.2",
|
||||
"build": "17",
|
||||
"stagingSignature": "Executable=/private/tmp/fcp-beautygirl-release/Build/Products/Release/FCP-BeautyGirl.app/Contents/MacOS/FCP-BeautyGirl\nIdentifier=com.dayu.fcpbeautygirl\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=482 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=28f0e84981124d854690d9be80e8ecb7a855ed02\nCandidateCDHashFull sha256=28f0e84981124d854690d9be80e8ecb7a855ed02e3de84009119fc616e22aecd\nHash choices=sha256\nCMSDigest=28f0e84981124d854690d9be80e8ecb7a855ed02e3de84009119fc616e22aecd\nCMSDigestType=2\nCDHash=28f0e84981124d854690d9be80e8ecb7a855ed02\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 18:38:05\nInfo.plist entries=23\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=184\nTotal signatures=1\nChosen signature=1\n",
|
||||
"notarization": {
|
||||
"id": "559eedf0-048f-4d0e-b013-6a187695f2da",
|
||||
"message": "Processing complete",
|
||||
"status": "Accepted"
|
||||
},
|
||||
"signingVerified": true,
|
||||
"stapleValidated": true,
|
||||
"stagingPluginUnregistered": true,
|
||||
"runningHosts": [],
|
||||
"installedSignature": "Executable=/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app/Contents/MacOS/FCP-BeautyGirl\nIdentifier=com.dayu.fcpbeautygirl\nFormat=app bundle with Mach-O universal (x86_64 arm64)\nCodeDirectory v=20500 size=482 flags=0x10000(runtime) hashes=4+7 location=embedded\nHash type=sha256 size=32\nCandidateCDHash sha256=28f0e84981124d854690d9be80e8ecb7a855ed02\nCandidateCDHashFull sha256=28f0e84981124d854690d9be80e8ecb7a855ed02e3de84009119fc616e22aecd\nHash choices=sha256\nCMSDigest=28f0e84981124d854690d9be80e8ecb7a855ed02e3de84009119fc616e22aecd\nCMSDigestType=2\nCDHash=28f0e84981124d854690d9be80e8ecb7a855ed02\nSignature size=8968\nAuthority=Developer ID Application: zhong luo (B3W25FX5H5)\nAuthority=Developer ID Certification Authority\nAuthority=Apple Root CA\nTimestamp=Oct 22, 2026 at 18:38:05\nNotarization Ticket=stapled\nInfo.plist entries=23\nTeamIdentifier=B3W25FX5H5\nRuntime Version=27.0.0\nSealed Resources version=2 rules=13 files=5\nInternal requirements count=1 size=184\nTotal signatures=1\nChosen signature=1\n",
|
||||
"installedSignatureVerified": true,
|
||||
"installedStapleValidated": true,
|
||||
"gatekeeperAccepted": true,
|
||||
"identityMigration": {
|
||||
"legacyInstallationsRemoved": [
|
||||
"/Library/Plug-Ins/FxPlug/beatygril.app"
|
||||
],
|
||||
"filterUUIDPreserved": "FB14B0E6-59B2-4836-916F-CD0C559E9241"
|
||||
},
|
||||
"pluginDiscovery": {
|
||||
"bundleIdentifier": "com.dayu.fcpbeautygirl.fxplug",
|
||||
"formalPath": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app/Contents/PlugIns/FCP-BeautyGirl XPC Service.pluginkit",
|
||||
"output": " com.dayu.fcpbeautygirl.fxplug(1.1)\t6C990AD2-B58E-4C2F-91A4-927849E7AA10\t2026-10-22 10:38:29 +0000\t/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app/Contents/PlugIns/FCP-BeautyGirl XPC Service.pluginkit\n (1 plug-in)\n"
|
||||
},
|
||||
"removedGeneratedPaths": [
|
||||
"/Users/dayu/Documents/PaintFCP/build/delivery/legacy-beatygril.app",
|
||||
"/tmp/fcp-beautygirl-release",
|
||||
"/Users/dayu/Documents/PaintFCP/build/delivery/notarization.zip"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"repository": "https://github.com/dayumeida/FCP-BeautyGirl.git",
|
||||
"anonymousClone": true,
|
||||
"tag": "v1.3.2",
|
||||
"commit": "8a70d38b7cd17e0ea530c5226f2be8c2df4308b3",
|
||||
"trackedFilesByteBlobAndExecutableModeCompared": 271,
|
||||
"resourceEntries": 13,
|
||||
"strictFullFsck": true,
|
||||
"lfs": false,
|
||||
"submodules": false,
|
||||
"xcodeProjectRead": true,
|
||||
"signedProductSourceUnchangedFrom": "767bba8ac11e9bf9268a1e02d1a06d3c120c46aa",
|
||||
"packageSha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"recoveredPackageSignatureTicketAndGatekeeper": true,
|
||||
"temporaryCloneRemoved": true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"remote": "https://dayu.media/git/dayu/codex-global-rules.git",
|
||||
"before": "dde7e2ee26eae18627eefda9b956a6aca52354ad",
|
||||
"commit": "4c3085861e26d34d82973483d0aae636b5fc7487",
|
||||
"remoteRefVerified": true,
|
||||
"independentCloneVerified": true,
|
||||
"filesByteAndModeCompared": 11,
|
||||
"strictFullFsck": true,
|
||||
"temporaryCloneRemoved": true
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
2026-10-22 18:30:11.816 host-tests[35227:8446515] FBBA: creating VNFaceBBoxAligner from VNFaceDetectorRevision2: VNFaceDetectorRevision2
|
||||
Default IOSurface maximum byte difference: 0
|
||||
Alternate destination tag maximum byte difference: 0
|
||||
Anatomy default 0/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
|
||||
Anatomy default 0/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
|
||||
Anatomy default 1/0 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
|
||||
Anatomy default 1/1 max=0 mean=0.0000000 eye=0/0 chin=0 inverted=0
|
||||
Anatomy big-eye 0/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
|
||||
Anatomy big-eye 0/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
|
||||
Anatomy big-eye 1/0 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
|
||||
Anatomy big-eye 1/1 max=2 mean=0.0008917 eye=33510/33880 chin=0 inverted=0
|
||||
Anatomy chin-positive 0/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
|
||||
Anatomy chin-positive 0/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
|
||||
Anatomy chin-positive 1/0 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
|
||||
Anatomy chin-positive 1/1 max=1 mean=0.0001459 eye=0/0 chin=116812 inverted=0
|
||||
Anatomy chin-negative 0/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
|
||||
Anatomy chin-negative 0/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
|
||||
Anatomy chin-negative 1/0 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
|
||||
Anatomy chin-negative 1/1 max=1 mean=0.0000849 eye=0/0 chin=60426 inverted=0
|
||||
Anatomy short-positive 0/0 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
|
||||
Anatomy short-positive 0/1 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
|
||||
Anatomy short-positive 1/0 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
|
||||
Anatomy short-positive 1/1 max=2 mean=0.0011072 eye=0/0 chin=285953 inverted=0
|
||||
Anatomy short-negative 0/0 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
|
||||
Anatomy short-negative 0/1 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
|
||||
Anatomy short-negative 1/0 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
|
||||
Anatomy short-negative 1/1 max=2 mean=0.0008583 eye=0/0 chin=225648 inverted=0
|
||||
Anatomy jaw 0/0 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
|
||||
Anatomy jaw 0/1 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
|
||||
Anatomy jaw 1/0 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
|
||||
Anatomy jaw 1/1 max=1 mean=0.0001974 eye=0/0 chin=12951 inverted=0
|
||||
Anatomy v-face 0/0 max=1 mean=0.0001240 eye=0/0 chin=39246 inverted=0
|
||||
Anatomy v-face 0/1 max=1 mean=0.0001240 eye=0/0 chin=39246 inverted=0
|
||||
Anatomy v-face 1/0 max=1 mean=0.0001240 eye=0/0 chin=39246 inverted=0
|
||||
Anatomy v-face 1/1 max=1 mean=0.0001240 eye=0/0 chin=39246 inverted=0
|
||||
Legacy fallback upright comparison: max=2 mean=0.0010357
|
||||
Host adapter: 370 checks, 0 failures
|
||||
@@ -0,0 +1 @@
|
||||
Inspector: 227 checks, 0 failures
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"installedProduct": {
|
||||
"path": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"bundleId": "com.dayu.fcpbeautygirl",
|
||||
"version": "1.3.2"
|
||||
},
|
||||
"signatureAllArchitecturesVerified": true,
|
||||
"scopedInventory": {
|
||||
"roots": [
|
||||
"/Applications",
|
||||
"/Library/Plug-Ins/FxPlug",
|
||||
"/Users/dayu/Library/Plug-Ins/FxPlug",
|
||||
"/Users/dayu/Documents/PaintFCP",
|
||||
"/Users/dayu/Desktop",
|
||||
"/Users/dayu/Downloads",
|
||||
"/Users/dayu/Library/Developer/Xcode/DerivedData",
|
||||
"/tmp/fcp-beautygirl-release",
|
||||
"/tmp/paintfcp-build-20261021"
|
||||
],
|
||||
"products": [
|
||||
{
|
||||
"path": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"bundleId": "com.dayu.fcpbeautygirl",
|
||||
"version": "1.3.2"
|
||||
}
|
||||
],
|
||||
"errors": [],
|
||||
"scope": "Listed roots only; not all mounted volumes"
|
||||
},
|
||||
"legacyPluginOriginalPathAbsent": true,
|
||||
"filterUUIDPreserved": "FB14B0E6-59B2-4836-916F-CD0C559E9241",
|
||||
"templateBytesUnchanged": true,
|
||||
"nativeOldProjectReopen": "pending_user",
|
||||
"afterPackagingCleanup": {
|
||||
"buildPackageWorkAbsent": true,
|
||||
"spotlightIndexedProductPaths": [
|
||||
{
|
||||
"path": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"bundleId": "com.dayu.fcpbeautygirl"
|
||||
}
|
||||
],
|
||||
"newFormalPluginRegistered": true,
|
||||
"legacyFormalPluginNotRegistered": true,
|
||||
"appSignatureAndTicketRechecked": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
........
|
||||
----------------------------------------------------------------------
|
||||
Ran 8 tests in 2.805s
|
||||
|
||||
OK
|
||||
@@ -0,0 +1,5 @@
|
||||
........
|
||||
----------------------------------------------------------------------
|
||||
Ran 8 tests in 0.029s
|
||||
|
||||
OK
|
||||
@@ -0,0 +1,21 @@
|
||||
2026-10-22 18:30:08.818 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1
|
||||
2026-10-22 18:30:08.826 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,180) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.311 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.8,0.3) setter=(1152,-432) readback=(0.8,0.3) mode=centered-pixels verified=1
|
||||
2026-10-22 18:30:09.311 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.7,0.4) objectBounds=(-1920,-1080,3840,2160) canvas=(152,78) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.359 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.8,0.3) setter=(0.8,0.3) readback=(0.12345,0.87654) mode=normalized verified=0
|
||||
2026-10-22 18:30:09.359 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.75,0.25) setter=(0.75,0.25) readback=(0.75,0.25) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.360 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.75,0.25) objectBounds=(-100,-50,200,100) canvas=(160,60) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.409 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.625,0.375) setter=(0.625,0.375) readback=(0.625,0.375) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.409 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.625,0.375) objectBounds=(-100,-50,200,100) canvas=(240,60) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.457 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.25,0.75) setter=(0.25,0.75) readback=(0.25,0.75) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.457 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(144,180) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.506 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.506 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0,1) objectBounds=(-100,-50,200,100) canvas=(100,140) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.574 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(nan,nan) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.628 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.629 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(inf,nan) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.689 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.690 osc-tests[35208:8446417] PGFaceOSC coordinates selection=(0.25,0.75) objectBounds=(-100,-50,200,100) canvas=(80,nan) surface=320x240 origin=0
|
||||
2026-10-22 18:30:09.742 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
|
||||
2026-10-22 18:30:09.742 osc-tests[35208:8446417] PGFaceOSC point-write desired=(0.5,0.5) setter=(0.5,0.5) readback=(0.5,0.5) mode=normalized verified=1
|
||||
OSC adapter: 98 checks, 0 failures
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"version": "1.3.2",
|
||||
"build": "17",
|
||||
"package": "releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg",
|
||||
"bytes": 4889706,
|
||||
"sha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"sourceApp": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"sourceCommit": "767bba8ac11e9bf9268a1e02d1a06d3c120c46aa",
|
||||
"motionSource": "/Users/dayu/Movies/Motion Templates.localized/Effects.localized/大鱼磨皮瘦脸",
|
||||
"motionFiles": [
|
||||
{
|
||||
"file": "大鱼人像美化/Drop Zone.tiff",
|
||||
"sha256": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
|
||||
"locked": false
|
||||
},
|
||||
{
|
||||
"file": "大鱼人像美化/large.png",
|
||||
"sha256": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
|
||||
"locked": true
|
||||
},
|
||||
{
|
||||
"file": "大鱼人像美化/small.png",
|
||||
"sha256": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5",
|
||||
"locked": true
|
||||
},
|
||||
{
|
||||
"file": "大鱼人像美化/大鱼人像美化.moef",
|
||||
"sha256": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
|
||||
"locked": false
|
||||
}
|
||||
],
|
||||
"packager": "/Applications/PKG工坊.app/Contents/MacOS/PKG工坊",
|
||||
"productMigration": "PKG Forge base plus identity-checked backup/rollback block; final package freshly signed, notarized and stapled",
|
||||
"notarization": {
|
||||
"message": "Processing complete",
|
||||
"id": "4a831775-2317-4372-a4cc-102415657ea3",
|
||||
"status": "Accepted"
|
||||
},
|
||||
"realInstallerExecuted": false
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
/Users/dayu/Documents/PaintFCP/releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg: accepted
|
||||
source=Notarized Developer ID
|
||||
origin=Developer ID Installer: zhong luo (B3W25FX5H5)
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"message": "Processing complete",
|
||||
"id": "4a831775-2317-4372-a4cc-102415657ea3",
|
||||
"status": "Accepted"
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
Package "FCP-BeautyGirl-1.3.2.pkg":
|
||||
Status: signed by a developer certificate issued by Apple for distribution
|
||||
Notarization: trusted by the Apple notary service
|
||||
Signed with a trusted timestamp on: 2026-10-22 10:40:28 +0000
|
||||
Certificate Chain:
|
||||
1. Developer ID Installer: zhong luo (B3W25FX5H5)
|
||||
Expires: 2027-02-01 22:12:15 +0000
|
||||
SHA256 Fingerprint:
|
||||
4D AC CD 04 A5 4C 7E F8 13 13 A2 ED D1 C2 C0 D0 29 EF FA BF 7B 53
|
||||
5A 43 C8 72 4D C4 0A A3 94 34
|
||||
------------------------------------------------------------------------
|
||||
2. Developer ID Certification Authority
|
||||
Expires: 2027-02-01 22:12:15 +0000
|
||||
SHA256 Fingerprint:
|
||||
7A FC 9D 01 A6 2F 03 A2 DE 96 37 93 6D 4A FE 68 09 0D 2D E1 8D 03
|
||||
F2 9C 88 CF B0 B1 BA 63 58 7F
|
||||
------------------------------------------------------------------------
|
||||
3. Apple Root CA
|
||||
Expires: 2035-02-09 21:40:36 +0000
|
||||
SHA256 Fingerprint:
|
||||
B0 B1 73 0E CB C7 FF 45 05 14 2C 49 F1 29 5E 6E DA 6B CA ED 7E 2C
|
||||
68 C5 BE 91 B5 A1 10 01 F0 24
|
||||
@@ -0,0 +1,5 @@
|
||||
productsign: using timestamp authority for signature
|
||||
productsign: signing product with identity "Developer ID Installer: zhong luo (B3W25FX5H5)" from keychain /Users/dayu/Library/Keychains/login.keychain-db
|
||||
productsign: adding certificate "Developer ID Certification Authority"
|
||||
productsign: adding certificate "Apple Root CA"
|
||||
productsign: Wrote signed product archive to /Users/dayu/Documents/PaintFCP/releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg
|
||||
@@ -0,0 +1,3 @@
|
||||
Processing: /Users/dayu/Documents/PaintFCP/releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg
|
||||
Processing: /Users/dayu/Documents/PaintFCP/releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg
|
||||
The staple and validate action worked!
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"package": "releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg",
|
||||
"bytes": 4889706,
|
||||
"sha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"version": "1.3.2",
|
||||
"build": "17",
|
||||
"app_files_compared": 34,
|
||||
"app_byte_and_symlink_equality": true,
|
||||
"template_files": {
|
||||
"大鱼人像美化.moef": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
|
||||
"Drop Zone.tiff": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
|
||||
"large.png": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
|
||||
"small.png": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
|
||||
},
|
||||
"locked_relative_paths": [
|
||||
"大鱼人像美化/large.png",
|
||||
"大鱼人像美化/small.png"
|
||||
],
|
||||
"script_sha256": {
|
||||
"preinstall": "b0562f7705c84a2f34e31df67a4f0d429e60083bab122dad99f56a4b266c0174",
|
||||
"postinstall": "d147ccab1c428659fd2b0ed60e77399d1eb5910d1049dcdcbdbfc88fd3824300"
|
||||
},
|
||||
"isolated_script_tests": [
|
||||
"fresh install",
|
||||
"replace old locked thumbnail",
|
||||
"partial copy failure restores old bytes and locks"
|
||||
],
|
||||
"isolation_changes": [
|
||||
"Console identity/home redirected to task fixture",
|
||||
"chown replaced with true",
|
||||
"FxPlug verification skipped; formal app signature and discovery verified separately"
|
||||
],
|
||||
"real_installer_execution": false,
|
||||
"app_and_template_installed": "APP installed through signed delivery workflow; formal template files matched the specified installed category, not changed by running this PKG",
|
||||
"fonts": "No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed."
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"package": "releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg",
|
||||
"bytes": 4889706,
|
||||
"sha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"version": "1.3.2",
|
||||
"build": "17",
|
||||
"app_files_compared": 34,
|
||||
"app_byte_and_symlink_equality": true,
|
||||
"template_files": {
|
||||
"大鱼人像美化.moef": "e9fa97dc14323d0daa7d3d61b06a78ba4000a70ab9f5e67ebffd750d49df1e15",
|
||||
"Drop Zone.tiff": "a7f8e3a2a431dbb3ce9e777040bb55e701cfe9ab9632e8cbb10359732bc8692e",
|
||||
"large.png": "a02ddb255b1ae255c749bb837a759e2dee1c3b8ffb9bdc1167957761bd5a1b97",
|
||||
"small.png": "1552b838dd88f60dee0795e20aaca652f9c558ecefc93500e895fbff77c2a4d5"
|
||||
},
|
||||
"locked_relative_paths": [
|
||||
"大鱼人像美化/large.png",
|
||||
"大鱼人像美化/small.png"
|
||||
],
|
||||
"script_sha256": {
|
||||
"preinstall": "b0562f7705c84a2f34e31df67a4f0d429e60083bab122dad99f56a4b266c0174",
|
||||
"postinstall": "d147ccab1c428659fd2b0ed60e77399d1eb5910d1049dcdcbdbfc88fd3824300"
|
||||
},
|
||||
"isolated_script_tests": [
|
||||
"fresh install",
|
||||
"replace old locked thumbnail",
|
||||
"partial copy failure restores old bytes and locks"
|
||||
],
|
||||
"isolation_changes": [
|
||||
"Console identity/home redirected to task fixture",
|
||||
"chown replaced with true",
|
||||
"FxPlug verification skipped; formal app signature and discovery verified separately"
|
||||
],
|
||||
"real_installer_execution": false,
|
||||
"app_and_template_installed": "APP installed through signed delivery workflow; formal template files matched the specified installed category, not changed by running this PKG",
|
||||
"fonts": "No editable third-party font dependency; promotional lettering baked into PNG. No optional font ZIP needed."
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
识别到 2 个安装内容:
|
||||
- FCP-BeautyGirl.app
|
||||
类型:FxPlug 插件
|
||||
目录:/Library/Plug-Ins/FxPlug
|
||||
状态:已签名并公证,保留隔离属性,自动验证并修复注册;失败时打开 APP 所在目录
|
||||
- 大鱼磨皮瘦脸
|
||||
类型:FCP 效果
|
||||
目录:~/Movies/Motion Templates.localized/Effects.localized
|
||||
状态:非 APP,保留隔离属性
|
||||
|
||||
识别完成,未生成安装包。
|
||||
@@ -0,0 +1,27 @@
|
||||
识别到 2 个安装内容:
|
||||
- FCP-BeautyGirl.app
|
||||
类型:FxPlug 插件
|
||||
目录:/Library/Plug-Ins/FxPlug
|
||||
状态:已签名并公证,保留隔离属性,自动验证并修复注册;失败时打开 APP 所在目录
|
||||
- 大鱼磨皮瘦脸
|
||||
类型:FCP 效果
|
||||
目录:~/Movies/Motion Templates.localized/Effects.localized
|
||||
状态:非 APP,保留隔离属性
|
||||
|
||||
完成:/Users/dayu/Documents/PaintFCP/build/package-1.3.2/base/FCP-BeautyGirl-1.3.2.pkg
|
||||
|
||||
本次唯一标识:com.dayu.fcppackage.b20261022104001942.tt2yn7vc
|
||||
安装包版本:1.3.2(继承 FCP-BeautyGirl.app)
|
||||
[正在准备内容]
|
||||
正在整理 2 个内容项
|
||||
[正在生成安装包]
|
||||
正在构建组件包
|
||||
[正在签名]
|
||||
正在使用 Developer ID Installer 签名
|
||||
[正在等待 Apple 公证]
|
||||
已提交 Apple,公证通常需要几分钟
|
||||
[正在粘附公证票据]
|
||||
公证已通过,正在粘附票据
|
||||
[正在验证结果]
|
||||
正在检查签名和安装包结构
|
||||
签名、包结构与公证票据验证通过
|
||||
@@ -0,0 +1,63 @@
|
||||
{
|
||||
"status": "verified",
|
||||
"version": "1.3.2",
|
||||
"releaseTag": "v1.3.2",
|
||||
"releaseCommit": "8a70d38b7cd17e0ea530c5226f2be8c2df4308b3",
|
||||
"githubRelease": "https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.2",
|
||||
"dayuRelease": "https://dayu.media/git/dayu/paintfcp-fxplug/releases/tag/v1.3.2",
|
||||
"dayuReleaseAssetNameAndSizeReadback": true,
|
||||
"dayuReleaseDownloadByteReadback": false,
|
||||
"dayuReleaseGateway": "Site login/member gateway retained; not bypassed",
|
||||
"article": "https://dayu.media/15593/",
|
||||
"articleId": 15593,
|
||||
"authorCoverCategoriesTagsAndAccessRulesPreserved": true,
|
||||
"articleCodeBlocks": 1,
|
||||
"downloadChecks": [
|
||||
{
|
||||
"url": "https://github.com/dayumeida/FCP-BeautyGirl/releases/download/v1.3.2/FCP-BeautyGirl-1.3.2-source.zip",
|
||||
"name": "FCP-BeautyGirl-1.3.2-source.zip",
|
||||
"bytes": 9728489,
|
||||
"sha256": "c75a516192375c45e446b3f0170615773ec2bd63b0430c3441a87282ba8b6834",
|
||||
"anonymousByteReadback": true
|
||||
},
|
||||
{
|
||||
"url": "https://github.com/dayumeida/FCP-BeautyGirl/releases/download/v1.3.2/FCP-BeautyGirl-1.3.2.pkg",
|
||||
"name": "FCP-BeautyGirl-1.3.2.pkg",
|
||||
"bytes": 4889706,
|
||||
"sha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"anonymousByteReadback": true
|
||||
},
|
||||
{
|
||||
"role": "package",
|
||||
"url": "https://dayu.media/wp-content/uploads/2026/10/1792666128-1202b0d4fd350d5.pkg",
|
||||
"bytes": 4889706,
|
||||
"sha256": "20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1",
|
||||
"anonymousByteReadback": true
|
||||
},
|
||||
{
|
||||
"role": "source",
|
||||
"url": "https://dayu.media/wp-content/uploads/2026/10/1792666125-4e4f241a6fe317d.zip",
|
||||
"bytes": 9728489,
|
||||
"sha256": "c75a516192375c45e446b3f0170615773ec2bd63b0430c3441a87282ba8b6834",
|
||||
"anonymousByteReadback": true
|
||||
}
|
||||
],
|
||||
"frontends": [
|
||||
{
|
||||
"url": "https://dayu.media/15593/",
|
||||
"versionAndInstallCommand": true,
|
||||
"singleCustomDescriptionAndKeywords": true,
|
||||
"seoTitle": "大鱼人像美化 1.3.2|FCP / Motion 免费开源自动美颜插件",
|
||||
"anonymousFreeAndLoginPromptVisible": true
|
||||
},
|
||||
{
|
||||
"url": "https://dayu.media/15593/?release_check=1792666175",
|
||||
"versionAndInstallCommand": true,
|
||||
"singleCustomDescriptionAndKeywords": true,
|
||||
"seoTitle": "大鱼人像美化 1.3.2|FCP / Motion 免费开源自动美颜插件",
|
||||
"anonymousFreeAndLoginPromptVisible": true
|
||||
}
|
||||
],
|
||||
"testOrderPlaced": false,
|
||||
"nativeOldProjectReopen": "pending_user"
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"sha": "8a70d38b7cd17e0ea530c5226f2be8c2df4308b3",
|
||||
"mainAndBranchAndTagVerifiedBothRemotes": true,
|
||||
"tag": "v1.3.2"
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"baseline": "d1137edd836cc360c53d21c104a06f2435382441",
|
||||
"signedSource": "767bba8ac11e9bf9268a1e02d1a06d3c120c46aa",
|
||||
"renderAndStateFilesCompared": [
|
||||
"PGFaceSelectOSC.m",
|
||||
"PGParameterIDs.h",
|
||||
"PGInspectorState.m",
|
||||
"PGBeautyTypes.h",
|
||||
"PGBeautyRenderer.m",
|
||||
"PGFaceProcessor.h",
|
||||
"FCPBeautyGirlPlugIn.h",
|
||||
"PGInspectorView.m",
|
||||
"main.m",
|
||||
"PGFaceProcessor.m",
|
||||
"PGBeautyRenderer.h",
|
||||
"PGInspectorState.h",
|
||||
"FCPBeautyGirlPlugIn.m",
|
||||
"PGInspectorView.h"
|
||||
],
|
||||
"normalization": "Only entry class/header names, log subsystem and NSError domain differ; pixel and archived-state logic bytes unchanged.",
|
||||
"regressionChecks": 1901,
|
||||
"migrationUnitScenarios": 8,
|
||||
"installerMigrationScenarios": "7 runtime scenarios passed; final package-block check runs after build."
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"tag": "v1.3.2",
|
||||
"commit": "8a70d38b7cd17e0ea530c5226f2be8c2df4308b3",
|
||||
"file": "build/FCP-BeautyGirl-1.3.2-source.zip",
|
||||
"bytes": 9728489,
|
||||
"sha256": "c75a516192375c45e446b3f0170615773ec2bd63b0430c3441a87282ba8b6834",
|
||||
"sourceFileCount": 268,
|
||||
"excluded": [
|
||||
"releases/1.2.0/\u5927\u9c7c\u4eba\u50cf\u7f8e\u5316-1.2.0.pkg",
|
||||
"releases/1.3.1/\u5927\u9c7c\u4eba\u50cf\u7f8e\u5316-1.3.1.pkg",
|
||||
"releases/1.3.2/FCP-BeautyGirl-1.3.2.pkg"
|
||||
]
|
||||
}
|
||||
+26
-22
@@ -2,12 +2,16 @@
|
||||
|
||||
更新时间:2026-10-22,Asia/Shanghai。项目根目录:`/Users/dayu/Documents/PaintFCP`。
|
||||
|
||||
当前正式 APP 为 **1.3.1(16)**,通用 Release、正式签名、Apple公证、票据、Gatekeeper和正式路径注册均已核验,临时APP副本已清理。1901项自动回归及1561项重叠真实帧几何ASan通过,V脸和新磨皮参数的最终宿主视觉仍由用户实测。签名源码 `7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f`;本次PKG由本机PKG工坊CLI打包,包含用户指定已安装的「大鱼磨皮瘦脸」分类及4项模板资源。文章与双远端发行同步状态见本版本回执。
|
||||
当前正式 APP 为 **1.3.2(17)**,工程、APP、插件服务及应用标识统一为 FCP-BeautyGirl。通用 Release、正式签名、Apple 公证、票据、Gatekeeper 和正式路径注册均已核验,旧 APP 与临时副本已清理。签名源码 `767bba8ac11e9bf9268a1e02d1a06d3c120c46aa`,发行标签 `v1.3.2`。1901 项自动回归、8 项 APP 身份迁移、8 项最终安装脚本身份迁移及模板隔离测试通过。滤镜 UUID、参数编号和归档保持原格式;新身份下的旧工程重开与最终原生视觉仍由用户实测。安装包基础由本机 PKG 工坊 CLI 生成,加入身份迁移后重新签名公证,包含指定已安装的「大鱼磨皮瘦脸」分类四项资源。文章 15593、GitHub 与大鱼 Release 已同步 1.3.2,四项包/源码匿名下载及前台 SEO 检查通过。标签完整 SHA `8a70d38b7cd17e0ea530c5226f2be8c2df4308b3`,独立匿名克隆 271 文件和恢复包核验通过;详细边界见本版回执。
|
||||
|
||||
代码由 **OpenAI + Codex 全程编写,站长仅参与调试和测试**。文章和仓库须保留这个表述,不使用“站长原创代码”等说法。免费版本无需账号、激活码或付费授权;“自动注册”指系统插件注册。
|
||||
|
||||
1.2.0 交接整理前,工作区干净,`main`、`origin/main` 与 `github/main` 均为 `189a5d7634aa69db54330c90f8711b05d8e44b10`。这是文档新增前的基线;最新文档节点以 `git log -1` 和远端引用为准。
|
||||
|
||||
## 最新待修问题:瘦脸跟踪闪烁(2026-10-22)
|
||||
|
||||
用户实测同一段素材,本插件有闪烁、目标稳定。本次完成源码/合成诊断和 Downloads 2.4.0 的静态复核,未修改产品源码或安装版。新版单主要人脸的渲染路径为 pin-style 质量筛选、条件连续框跟踪和坏帧保持;原 auto-follow-report 的旧 Applications 版本 temporal 系数不能直接沿用。已复现部分76点缺失导致瘦脸归零、框抖动无衰减、首次请求空帧缓存不随补入前帧修正,以及几何保持时默认外观蒙版清零。已确认当前FCP草帽素材(1080p25、瘦脸1、大眼约0.9、多人关闭):独立469帧均单脸/完整76点,没有触发缺点归零;源5.56–5.76秒几何变化较大,5.72秒raw/稳定后轮廓步幅6.33%/5.24%。这些还含真实运动,原生请求与大眼贡献未分离,不宣称已修复。见[跟踪闪烁对齐分析](analysis/跟踪闪烁对齐分析.md),复现入口 `zsh scripts/diagnose-tracking.sh`;这次不是新发行版,无需重发安装包或文章。
|
||||
|
||||
## 先读和先查
|
||||
|
||||
接手时先查看 `git status --short --branch`、`git remote -v` 和最新提交,确认没有其他聊天的未提交改动。只读核对正式 APP 版本与模板目录,再决定是否需要编译或操作宿主。单纯修改文档不需要重建、重新公证或打开 Motion/FCP。
|
||||
@@ -16,7 +20,7 @@
|
||||
|
||||
| 入口 | 用途 |
|
||||
| --- | --- |
|
||||
| [1.3.1 交付回执](verification/v1.3.1/delivery-receipt.json) | 当前安装版、签名源码、公证、清理及原生视觉待测范围 |
|
||||
| [1.3.2 交付回执](verification/v1.3.2/delivery-receipt.json) | 当前安装版、签名源码、公证、清理及原生视觉待测范围 |
|
||||
| [README](../README.md) | 产品介绍、使用与版本变化 |
|
||||
| [恢复说明](../RECOVERY.md) | 精确源码节点、依赖、远端恢复记录 |
|
||||
| [GitHub 同步说明](GitHub同步说明.md) | 两个远端、公开克隆及 Release 验证 |
|
||||
@@ -30,12 +34,12 @@
|
||||
| 项目 | 当前值 |
|
||||
| --- | --- |
|
||||
| 显示名称 | 大鱼人像美化 |
|
||||
| Xcode 产品名 | `beatygril`,保留现有拼写 |
|
||||
| APP 版本 | `1.3.1` / `16`,arm64 与 x86_64 通用版本 |
|
||||
| 唯一正式 APP | `/Library/Plug-Ins/FxPlug/beatygril.app` |
|
||||
| 主 Bundle ID | `com.dayu.beatygril` |
|
||||
| 嵌套插件 | `Contents/PlugIns/beatygril XPC Service.pluginkit` |
|
||||
| 插件 Bundle ID | `com.dayu.beatygril.fxplug` |
|
||||
| Xcode 产品名 | `FCP-BeautyGirl` |
|
||||
| APP 版本 | `1.3.2` / `17`,arm64 与 x86_64 通用版本 |
|
||||
| 唯一正式 APP | `/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app` |
|
||||
| 主 Bundle ID | `com.dayu.fcpbeautygirl` |
|
||||
| 嵌套插件 | `Contents/PlugIns/FCP-BeautyGirl XPC Service.pluginkit` |
|
||||
| 插件 Bundle ID | `com.dayu.fcpbeautygirl.fxplug` |
|
||||
| 滤镜 UUID | `FB14B0E6-59B2-4836-916F-CD0C559E9241` |
|
||||
| 自定义面板参数 ID | `210` |
|
||||
| FCP 效果分类 | 大鱼磨皮瘦脸 → 大鱼人像美化 |
|
||||
@@ -54,13 +58,13 @@
|
||||
|
||||
## 源码结构
|
||||
|
||||
Xcode 工程:`beatygril/beatygril.xcodeproj`。外层 scheme 为 `Wrapper Application`,插件 target 为 `XPC Service`。
|
||||
Xcode 工程:`FCP-BeautyGirl/FCP-BeautyGirl.xcodeproj`。外层 scheme 为 `FCP-BeautyGirl`,插件 target 为 `FCP-BeautyGirl XPC Service`。
|
||||
|
||||
下表插件文件均位于 `beatygril/beatygril/Plugin/`。
|
||||
下表插件文件均位于 `FCP-BeautyGirl/FCP-BeautyGirl/Plugin/`。
|
||||
|
||||
| 文件或目录 | 职责与修改入口 |
|
||||
| --- | --- |
|
||||
| `beatygrilPlugIn.m` | FxPlug 参数、宿主 action、图像适配、渲染状态与整体混合 |
|
||||
| `FCPBeautyGirlPlugIn.m` | FxPlug 参数、宿主 action、图像适配、渲染状态与整体混合 |
|
||||
| `PGFaceProcessor.m` | Vision 检测、76 点、自动跟随、几何稳定、局部变形和几何蒙版 |
|
||||
| `PGBeautyRenderer.m` | 磨皮、肤色、细节、牙齿和眼睛等外观处理 |
|
||||
| `PGInspectorView.m` | AppKit 卡片、滑杆、数值框、开关、重置和连续提交 |
|
||||
@@ -120,9 +124,9 @@ Xcode 工程:`beatygril/beatygril.xcodeproj`。外层 scheme 为 `Wrapper Appl
|
||||
|
||||
```sh
|
||||
./scripts/test.sh
|
||||
PAINTFCP_HOST_ASAN=1 ./scripts/test-host.sh
|
||||
PAINTFCP_OSC_ASAN=1 ./scripts/test-osc.sh
|
||||
PAINTFCP_INSPECTOR_ASAN=1 ./scripts/test-inspector.sh
|
||||
FCP_BEAUTYGIRL_HOST_ASAN=1 ./scripts/test-host.sh
|
||||
FCP_BEAUTYGIRL_OSC_ASAN=1 ./scripts/test-osc.sh
|
||||
FCP_BEAUTYGIRL_INSPECTOR_ASAN=1 ./scripts/test-inspector.sh
|
||||
python3 scripts/inspector-template.py audit 'Templates/大鱼人像美化/大鱼人像美化.moef'
|
||||
```
|
||||
|
||||
@@ -157,7 +161,7 @@ python3 scripts/inspector-template.py audit 'Templates/大鱼人像美化/大鱼
|
||||
| 资源 | 文件 |
|
||||
| --- | --- |
|
||||
| 项目封面 | `Assets/Artwork/portrait-cover.png` |
|
||||
| APP 说明图 | `beatygril/beatygril/Wrapper Application/Resources/LauncherInfo.png` |
|
||||
| APP 说明图 | `FCP-BeautyGirl/FCP-BeautyGirl/Wrapper Application/Resources/LauncherInfo.png` |
|
||||
| 大缩略图 | `Templates/大鱼人像美化/large.png`,640×360 |
|
||||
| 小缩略图 | `Templates/大鱼人像美化/small.png`,192×108 |
|
||||
| 生成记录 | `docs/design/artwork-manifest.json`、`artwork-prompt.json` |
|
||||
@@ -183,7 +187,7 @@ ls -lO "$HOME/Movies/Motion Templates.localized/Effects.localized/大鱼磨皮
|
||||
python3 scripts/deliver.py
|
||||
```
|
||||
|
||||
脚本获取 `/Users/dayu/.codex/app-delivery-locks/com.dayu.beatygril.lock`,使用固定暂存 `/tmp/paintfcp-build-20261021`,记录到 `build/delivery/`。它构建通用 Release,由内到外签名 Framework、嵌套插件、外层 APP,验证严格签名,提交公证并要求 `Accepted`,粘附并验证票据,等待宿主退出后替换唯一正式路径,检查 Gatekeeper 与 PluginKit。默认停在 `HOST_VALIDATION_PENDING`,完成实际宿主验收及副本盘点后才回车进入清理。
|
||||
脚本同时获取新ID与product.json所列旧ID的共享交付锁,主锁为 `/Users/dayu/.codex/app-delivery-locks/com.dayu.fcpbeautygirl.lock`,使用固定暂存 `/tmp/fcp-beautygirl-release`,记录到 `build/delivery/`。它构建通用 Release,由内到外签名 Framework、嵌套插件、外层 APP,验证严格签名,提交公证并要求 `Accepted`,粘附并验证票据,等待宿主退出后替换唯一正式路径,检查 Gatekeeper 与 PluginKit。默认停在 `HOST_VALIDATION_PENDING`,完成实际宿主验收及副本盘点后才回车进入清理。
|
||||
|
||||
| 选项 | 用途 |
|
||||
| --- | --- |
|
||||
@@ -217,8 +221,8 @@ GitHub Release 下载名为 `Dayu-Portrait-1.2.0.pkg`,字节相同,已匿名
|
||||
|
||||
文章及发布入口:
|
||||
|
||||
- [公开源码仓库](https://github.com/FAMEDaYu/FCP-BeatyGril)
|
||||
- [1.2.0 GitHub Release](https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.2.0)
|
||||
- [公开源码仓库](https://github.com/dayumeida/FCP-BeautyGirl)
|
||||
- [1.2.0 GitHub Release](https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.2.0)
|
||||
- [大鱼站文章 15593](https://dayu.media/15593/)
|
||||
- [大鱼 Git 备份](https://dayu.media/git/dayu/paintfcp-fxplug)
|
||||
|
||||
@@ -233,7 +237,7 @@ GitHub Release 下载名为 `Dayu-Portrait-1.2.0.pkg`,字节相同,已匿名
|
||||
| 本地远端 | 地址 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `origin` | `https://dayu.media/git/dayu/paintfcp-fxplug.git` | 保持为原远端及 main 上游;网站 Git 网关仍要求登录和有效会员 |
|
||||
| `github` | `https://github.com/FAMEDaYu/FCP-BeatyGril.git` | 公开仓库,匿名克隆可用,完整历史和七个标签已保存 |
|
||||
| `github` | `https://github.com/dayumeida/FCP-BeautyGirl.git` | 公开仓库,匿名克隆可用,完整历史和七个标签已保存 |
|
||||
|
||||
本项目没有 LFS 或子模块。不要改写原远端、强推、覆盖现有标签或把双端同步描述成自动定时同步。
|
||||
|
||||
@@ -250,8 +254,8 @@ GitHub Release 下载名为 `Dayu-Portrait-1.2.0.pkg`,字节相同,已匿名
|
||||
恢复正式发行源码可以:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/FAMEDaYu/FCP-BeatyGril.git
|
||||
cd FCP-BeatyGril
|
||||
git clone https://github.com/dayumeida/FCP-BeautyGirl.git
|
||||
cd FCP-BeautyGirl
|
||||
git switch --detach v1.2.0
|
||||
```
|
||||
|
||||
@@ -261,7 +265,7 @@ git switch --detach v1.2.0
|
||||
|
||||
提交和推送使用 `/Users/dayu/.codex/git-backup-locks/` 中的共享互斥锁。锁名为无凭据、转小写并去尾斜线的完整 HTTPS 仓库地址(保留 `.git`)的 SHA-256 加 `.lock`,`owner.json` 记录 PID、cwd、remote;不清理其他仍在工作的持有者。
|
||||
|
||||
本机 GitHub CLI 为 `/opt/homebrew/bin/gh`,本次已由用户登录 `FAMEDaYu`,HTTPS 凭据在钥匙串中。接手时用 `gh auth status` 确认;连接器曾使用其他只读账号,不能用连接器权限推断 CLI 登录失效,也不打印令牌。大鱼仓库管理使用 `dayu-git` CLI,指南在 `/Users/dayu/Documents/dayu-git/README.md` 与 `API.md`。
|
||||
本机 GitHub CLI 为 `/opt/homebrew/bin/gh`,账号已更名为 `dayumeida`(账号ID117798680;CLI钥匙串条目可能仍以旧名标识,以 `gh api user --jq .login` 核对当前身份),HTTPS 凭据在钥匙串中。接手时用 `gh auth status` 确认;连接器曾使用其他只读账号,不能用连接器权限推断 CLI 登录失效,也不打印令牌。大鱼仓库管理使用 `dayu-git` CLI,指南在 `/Users/dayu/Documents/dayu-git/README.md` 与 `API.md`。
|
||||
|
||||
恢复范围仅覆盖已经提交、推送并核验的节点与实际上传的必要资源。用户素材、忽略的 build、私钥不在此范围。大鱼服务器当前只有手动备份,不能据此承诺本机与服务器同时损坏也可恢复。
|
||||
|
||||
|
||||
+21
@@ -145,3 +145,24 @@ Motion:独立普通视频项目,源PTS0、1920×1080/25fps/10秒,媒体通
|
||||
移除 V 脸的脸框近似宽带,改为新版目标的四组下颌到外唇 pin,单项映射为 clamp(V,0,1)×0.065,不叠加旧尺寸增益。无合法76点时直通,图像与四张蒙版同场变形。1901项自动检查通过:57 Beauty、116 Face、1033几何、370 Host ASan、98 OSC ASan、227 Inspector ASan。原失败复现、点位/CPU/AIR证据和未对齐范围见 analysis/V脸下颌区域修复.md。另对 NASA 人像和本机用户视频11帧运行1561项几何ASan专项(含重复基础用例,不相加),通过;用户帧和完整点坐标未上传。正式APP已安装,严格签名/双架构、票据、Gatekeeper、PluginKit正式路径及有界副本扫描通过,用户视觉仍待实测。APP公证Accepted e353b701-2fc2-4fcc-b03e-69af7735400f。
|
||||
|
||||
PKG由本机PKG工坊CLI从正式APP与用户指定已安装的「大鱼磨皮瘦脸」分类发布副本生成,含1个moef、Drop Zone.tiff和两张锁定缩略图。Installer签名、公证Accepted 78105340-306f-4629-8670-772760d4cb9a、票据、Gatekeeper、包内APP34个文件/链接与正式版一致、4模板资源、隔离新装/更新锁图/失败回滚均通过。本次未运行PKG安装器覆盖模板;正式APP通过交付脚本安装,模板保持原用户副本。PKG 5,011,286 bytes,SHA256 a6bb7262c9066e7abca8d1f21eaeaf1ba6a1d0d51b4859d39307aa7d7b0bc927。
|
||||
|
||||
|
||||
1.3.1已发布至GitHub和大鱼Release,origin/github的main、修复分支与v1.3.1标签已同步回读。GitHub两个附件匿名下载哈希、安装包签名及票据通过;匿名独立标签克隆232文件、fsck和恢复包验证通过。文章15593就地更新为1.3.1,主下载PKG与源码ZIP的线上字节哈希一致,作者/封面/分类/免费及会员规则保留,前台正常和新请求的版本/说明/SEO通过。未登录前台仍显示免费及登录获取入口,未进行真实测试订单。大鱼Release只完成附件上传元数据回读,API令牌访问浏览器下载入口被重定向登录,未宣称该附件字节回读通过;必要PKG本体已随Git提交并在独立克隆中恢复。
|
||||
|
||||
|
||||
## 1.3.2(17)统一产品名称、标识与旧安装迁移
|
||||
|
||||
工程、scheme、APP、嵌套插件服务及插件类名统一为 FCP-BeautyGirl / FCPBeautyGirlPlugIn;主 ID `com.dayu.fcpbeautygirl`,插件 ID `com.dayu.fcpbeautygirl.fxplug`。正式签名源码 `767bba8ac11e9bf9268a1e02d1a06d3c120c46aa`,发行标签 v1.3.2 为 `8a70d38b7cd17e0ea530c5226f2be8c2df4308b3`。滤镜 UUID、参数编号和 PGInspectorState 归档未改,渲染源码除名称/日志字符串外与 1.3.1 一致。1901 项自动回归重跑通过;新增 8 项 APP 迁移和 8 项最终 PKG 身份脚本测试,覆盖新装、旧版升级、失败回滚及无关身份保护。原生旧工程重开仍待用户实测,不将静态格式保留等同于原生验收。
|
||||
|
||||
通用 Release 使用固定 Developer ID 团队签名,APP 公证 Accepted `559eedf0-048f-4d0e-b013-6a187695f2da`,票据、严格双架构签名、Gatekeeper 和新 ID 的 PluginKit 正式路径通过。旧 ID 经团队和滤镜 UUID 核对后移出注册位置,成功安装后清理旧 APP 备份。唯一正式路径为 `/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app`;有界目录与现存 Spotlight 产品索引只发现此正式 APP,不声称已扫描全部挂载卷。
|
||||
|
||||
PKG 工坊 CLI 基础包包含指定已安装的「大鱼磨皮瘦脸」分类四项文件;加入本产品身份迁移/回滚段后重新签名、公证 Accepted `4a831775-2317-4372-a4cc-102415657ea3` 并粘附票据。最终包 4,889,706 bytes,SHA256 `20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1`。有效载荷与正式 APP、四项模板一致,模板锁定、更新和失败回滚隔离检查通过;未实际执行本 PKG 安装器。
|
||||
|
||||
origin/github 的 main、工作分支和 v1.3.2 标签已推送并回读。匿名独立 GitHub 克隆核对 271 个文件字节/blob/执行位,strict/full fsck、Xcode 工程读取和恢复出的 PKG 签名/票据/Gatekeeper 通过,无 LFS/子模块。GitHub、大鱼 Release 和文章 15593 已更新;GitHub 与文章的包/源码共四项匿名下载哈希一致,正常及新请求前台的版本、安装命令和三项 SEO 核验通过。作者、封面、分类及免费规则保留,未下订单。大鱼 Release 仅回读附件名称和大小,保留登录网关边界。完整回执在 verification/v1.3.2。
|
||||
|
||||
|
||||
## 1.3.2 跟踪闪烁分析(2026-10-22,尚未修复)
|
||||
|
||||
用户报告目标稳定而本插件闪烁。新目标2.4.0的静态REA复核发现瘦脸单主要人脸改走 pin-style 筛选与保持,条件可达连续对象框跟踪。现有旧版自动跟随报告不能作为该新版主路径完全对齐的依据。直接链接当前产品源码的合成探针确认:76点完整/缺失/完整使变形通道85835/0/85835;纯框抖动输出/输入振幅比1;先请求40ms空帧、再补0ms有效脸后,缓存40ms仍空,与顺序请求不同;默认外观蒙版在几何保持时可清零。这些均为合成诊断,不是用户素材或目标运行统计。
|
||||
|
||||
见 analysis/跟踪闪烁对齐分析.md 和同目录 tracking-flicker-20261022;诊断入口 `zsh scripts/diagnose-tracking.sh`。产品源码与正式1.3.2保持相同,未构建APP、未安装、未重发PKG或文章。已定位当前FCP草帽素材并以项目25fps独立扫描469帧,全部单脸/完整76点、无held/错误,未复现缺点归零;源5.72秒轮廓步幅raw6.33%、稳定后5.24%,仍含真实头动。原生请求与大眼叠加贡献未分离;原1901项回归不代表连续跟踪稳定性已通过。
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"name": "FCP-BeautyGirl",
|
||||
"version": "1.3.2",
|
||||
"build": "17",
|
||||
"bundleIdentifier": "com.dayu.fcpbeautygirl",
|
||||
"pluginName": "FCP-BeautyGirl XPC Service.pluginkit",
|
||||
"pluginBundleIdentifier": "com.dayu.fcpbeautygirl.fxplug",
|
||||
"pluginClass": "FCPBeautyGirlPlugIn",
|
||||
"sourceRoot": "FCP-BeautyGirl",
|
||||
"sourceDirectory": "FCP-BeautyGirl/FCP-BeautyGirl",
|
||||
"xcodeProject": "FCP-BeautyGirl/FCP-BeautyGirl.xcodeproj",
|
||||
"scheme": "FCP-BeautyGirl",
|
||||
"installationPath": "/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app",
|
||||
"filterUUID": "FB14B0E6-59B2-4836-916F-CD0C559E9241",
|
||||
"teamIdentifier": "B3W25FX5H5",
|
||||
"legacyProducts": [
|
||||
{
|
||||
"name": "beatygril",
|
||||
"bundleIdentifier": "com.dayu.beatygril",
|
||||
"pluginName": "beatygril XPC Service.pluginkit",
|
||||
"pluginBundleIdentifier": "com.dayu.beatygril.fxplug",
|
||||
"installationPath": "/Library/Plug-Ins/FxPlug/beatygril.app"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,9 +1,9 @@
|
||||
# 大鱼人像美化 1.2.0(14)
|
||||
|
||||
- 发布文章:https://dayu.media/15593/
|
||||
- 公开源码:https://github.com/FAMEDaYu/FCP-BeatyGril
|
||||
- 公开源码:https://github.com/dayumeida/FCP-BeautyGirl
|
||||
- 大鱼备份:https://dayu.media/git/dayu/paintfcp-fxplug
|
||||
- GitHub Release:https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.2.0
|
||||
- GitHub Release:https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.2.0
|
||||
- 大鱼 Release:https://dayu.media/git/dayu/paintfcp-fxplug/releases/tag/v1.2.0
|
||||
- 标签完整 SHA:3c7261c3a861b9f4704cfb36055d7b500c239dab
|
||||
- 正式 APP 源码:696d5f39b30404ed5d1d4c25f61d17475c7fc91b
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
"title": "大鱼人像美化 1.2.0:FCP / Motion 免费开源自动美颜插件",
|
||||
"slug": "dayu-portrait-beauty",
|
||||
"status": "publish",
|
||||
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"{{media.cover.url}}\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\"/><figcaption>古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><li>磨皮:局部磨皮、全局磨皮与五官保护,强度分别控制。</li><li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li><li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li><li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li><li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li></ul>\n<!-- /wp:list -->\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.2.0(14)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>本次更新加入古风封面与锁定缩略图、免费开源说明页和主 APP 三秒自动退出。人脸处理与面板交互沿用 1.1.2 已验收实现,不需要重新运行手动分析。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\"/></figure>\n<!-- /wp:image -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">常见问题</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>\n<!-- /wp:paragraph -->\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>open '/Library/Plug-Ins/FxPlug/beatygril.app'</code></pre>\n<!-- /wp:code -->\n<!-- wp:paragraph -->\n<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、Line truncated
|
||||
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"{{media.cover.url}}\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\"/><figcaption>古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><li>磨皮:局部磨皮、全局磨皮与五官保护,强度分别控制。</li><li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li><li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li><li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li><li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li></ul>\n<!-- /wp:list -->\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.2.0(14)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>本次更新加入古风封面与锁定缩略图、免费开源说明页和主 APP 三秒自动退出。人脸处理与面板交互沿用 1.1.2 已验收实现,不需要重新运行手动分析。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\"/></figure>\n<!-- /wp:image -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>\n<!-- /wp:paragraph -->\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">常见问题</h2>\n<!-- /wp:heading -->\n<!-- wp:paragraph -->\n<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>\n<!-- /wp:paragraph -->\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>open '/Library/Plug-Ins/FxPlug/beatygril.app'</code></pre>\n<!-- /wp:code -->\n<!-- wp:paragraph -->\n<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、Line truncated
|
||||
"excerpt": "磨皮、美白、瘦脸与自动人脸跟随,原生卡片面板实时预览。免费开源,自动注册,无需激活码;提供签名公证安装包和源码。",
|
||||
"categories": [
|
||||
3
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<h2 class="wp-block-heading">源码与开源许可</h2>
|
||||
<!-- /wp:heading -->
|
||||
<!-- wp:paragraph -->
|
||||
<p>公开源码仓库:<a href="https://github.com/FAMEDaYu/FCP-BeatyGril" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeatyGril</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.2.0" target="_blank" rel="noreferrer noopener">1.2.0 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.2.0 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<p>公开源码仓库:<a href="https://github.com/dayumeida/FCP-BeautyGirl" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeautyGirl</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.2.0" target="_blank" rel="noreferrer noopener">1.2.0 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.2.0 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<!-- wp:paragraph -->
|
||||
<p>项目代码按仓库中的 MIT 许可文件提供,源码包含 Xcode 工程、Objective-C / Metal 实现、模板及构建与验证说明。Apple SDK、运行框架及样本按各自许可使用,详见源码中的 LICENSE 和 THIRD_PARTY_NOTICES.md。自行编译需要 Xcode 与 FxPlug SDK;证书和签名私钥不包含在源码中。</p>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
修复V脸作用区域,改为四组实际下颌轮廓到外唇的局部采样;同时包含1.3.0的微细锐化、连续五官保护与非肤色区保护。1901项自动回归通过,另有1561项重叠真实帧几何ASan检查;新效果在原生宿主中的最终视觉仍待用户结合素材实测。
|
||||
|
||||
- 文章:https://dayu.media/15593/
|
||||
- GitHub:https://github.com/FAMEDaYu/FCP-BeatyGril
|
||||
- GitHub:https://github.com/dayumeida/FCP-BeautyGirl
|
||||
- 大鱼备份:https://dayu.media/git/dayu/paintfcp-fxplug
|
||||
- 发布标签:v1.3.1
|
||||
- 正式APP源码:7fa3298e022946e77dfd8cfba1bb5ff2c2a6361f
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"title": "大鱼人像美化 1.3.1:FCP / Motion 免费开源自动美颜插件",
|
||||
"status": "publish",
|
||||
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\" /><figcaption class=\"wp-element-caption\">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"className\":\"wp-block-list\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.3.1(16)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>1.3.1 修复 V 脸影响眼区的问题,改为沿实际下颌轮廓进行局部调整;同时包含 1.3.0 新增的微细锐化、连续五官保护和非肤色区保护。两项保护默认 100%,支持旧工程参数。1901 项自动检查通过,另有真实帧几何检查;新参数及 V 脸在原生宿主中的最终视觉效果仍需结合素材实测。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>\n<!-- /wpLine truncated
|
||||
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\" /><figcaption class=\"wp-element-caption\">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"className\":\"wp-block-list\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.3.1(16)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>1.3.1 修复 V 脸影响眼区的问题,改为沿实际下颌轮廓进行局部调整;同时包含 1.3.0 新增的微细锐化、连续五官保护和非肤色区保护。两项保护默认 100%,支持旧工程参数。1901 项自动检查通过,另有真实帧几何检查;新参数及 V 脸在原生宿主中的最终视觉效果仍需结合素材实测。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>\n<!-- /wpLine truncated
|
||||
"excerpt": "1.3.1 修复 V 脸下颌作用区域,新增微细锐化、五官保护与非肤色区保护。免费开源,提供签名公证安装包及源码。",
|
||||
"resource": {
|
||||
"cao_status": true,
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
<!-- wp:paragraph -->
|
||||
<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<!-- wp:paragraph -->
|
||||
<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"sizeSlug":"full"} -->
|
||||
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png" alt="大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜" /><figcaption class="wp-element-caption">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">可以做什么</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:list {"className":"wp-block-list"} -->
|
||||
<ul class="wp-block-list"><!-- wp:list-item -->
|
||||
<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>
|
||||
<!-- /wp:list-item --></ul>
|
||||
<!-- /wp:list -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">版本与下载</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>当前版本 <strong>1.3.1(16)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>1.3.1 修复 V 脸影响眼区的问题,改为沿实际下颌轮廓进行局部调整;同时包含 1.3.0 新增的微细锐化、连续五官保护和非肤色区保护。两项保护默认 100%,支持旧工程参数。1901 项自动检查通过,另有真实帧几何检查;新参数及 V 脸在原生宿主中的最终视觉效果仍需结合素材实测。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">安装</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/beatygril.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"sizeSlug":"full"} -->
|
||||
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png" alt="主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出" /></figure>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">使用</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">常见问题</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:code -->
|
||||
<pre class="wp-block-code"><code>open '/Library/Plug-Ins/FxPlug/beatygril.app'</code></pre>
|
||||
<!-- /wp:code -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、宿主版本及安装包完整性;不要只复制单个 .moef 文件,配套程序与 Drop Zone.tiff 也需要保留。当前仅提供上述一个效果模板。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">源码与开源许可</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>公开源码仓库:<a href="https://github.com/dayumeida/FCP-BeautyGirl" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeautyGirl</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.1" target="_blank" rel="noreferrer noopener">1.3.1 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="https://dayu.media/wp-content/uploads/2026/10/1792659515-d487b0a421aacc6.zip">1.3.1 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>项目代码按仓库中的 MIT 许可文件提供,源码包含 Xcode 工程、Objective-C / Metal 实现、模板及构建与验证说明。Apple SDK、运行框架及样本按各自许可使用,详见源码中的 LICENSE 和 THIRD_PARTY_NOTICES.md。自行编译需要 Xcode 与 FxPlug SDK;证书和签名私钥不包含在源码中。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"id":15597,"sizeSlug":"large","linkDestination":"none"} -->
|
||||
<figure class="wp-block-image size-large"><img src="https://dayu.media/wp-content/uploads/2026/10/1792605142-78805a221a988e7-359x1024.png" alt="" class="wp-image-15597" /></figure>
|
||||
<!-- /wp:image -->
|
||||
@@ -100,7 +100,7 @@
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>公开源码仓库:<a href="https://github.com/FAMEDaYu/FCP-BeatyGril" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeatyGril</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/FAMEDaYu/FCP-BeatyGril/releases/tag/v1.3.1" target="_blank" rel="noreferrer noopener">1.3.1 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.3.1 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<p>公开源码仓库:<a href="https://github.com/dayumeida/FCP-BeautyGirl" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeautyGirl</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.1" target="_blank" rel="noreferrer noopener">1.3.1 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.3.1 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
|
||||
二进制文件未显示。
@@ -0,0 +1,19 @@
|
||||
# FCP-BeautyGirl · 大鱼人像美化 1.3.2(17)
|
||||
|
||||
统一工程、APP、插件服务、源码类名和应用标识的拼写。主 Bundle ID 为 `com.dayu.fcpbeautygirl`,插件 ID 为 `com.dayu.fcpbeautygirl.fxplug`,唯一正式安装路径为 `/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app`。
|
||||
|
||||
安装器核对旧版的 Bundle ID、签名团队和滤镜 UUID 后迁移旧 APP;失败时恢复旧版,避免新旧服务并存。滤镜 UUID、参数编号和面板归档保留,渲染逻辑沿用 1.3.1。1901 项自动回归、8 项 APP 迁移测试、8 项安装器身份迁移测试,以及模板初装、更新与失败回滚隔离检查通过。更名后的旧工程重开与原生画面仍需用户实测。
|
||||
|
||||
- 文章:https://dayu.media/15593/
|
||||
- GitHub:https://github.com/dayumeida/FCP-BeautyGirl
|
||||
- 大鱼备份:https://dayu.media/git/dayu/paintfcp-fxplug
|
||||
- 发布标签:v1.3.2
|
||||
- 正式 APP 签名源码:767bba8ac11e9bf9268a1e02d1a06d3c120c46aa
|
||||
- APP 公证:Accepted 559eedf0-048f-4d0e-b013-6a187695f2da
|
||||
- PKG 公证:Accepted 4a831775-2317-4372-a4cc-102415657ea3
|
||||
- PKG:FCP-BeautyGirl-1.3.2.pkg,4,889,706 bytes
|
||||
- SHA-256:20a88dacf68cc8812f5af86cfe94c1c0614414a68a019eaeac7ca9d078165ae1
|
||||
|
||||
本机 PKG 工坊 CLI 生成基础包,加入本产品的旧身份迁移与回滚段后,对最终包重新签名、公证和粘附票据。包含用户指定的「大鱼磨皮瘦脸」分类:大鱼人像美化.moef、Drop Zone.tiff、large.png 和 small.png。有效载荷与正式 APP、四个模板文件一致;恢复两张缩略图的锁定。签名、公证票据、Gatekeeper 和隔离安装脚本核验通过,未实际运行本 PKG 安装器;本机 APP 已通过正式交付流程安装。
|
||||
|
||||
安装前保存并退出 Final Cut Pro 和 Motion。Final Cut Pro 在「效果 → 大鱼磨皮瘦脸 → 大鱼人像美化」中使用。免费开源,无需激活码。代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。Apple SDK 及相关资源遵循各自许可。
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
"title": "大鱼人像美化 1.3.2:FCP / Motion 免费开源自动美颜插件",
|
||||
"status": "publish",
|
||||
"content": "<!-- wp:paragraph -->\n<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>\n<!-- /wp:paragraph -->\n<!-- wp:paragraph -->\n<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png\" alt=\"大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜\" /><figcaption class=\"wp-element-caption\">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">可以做什么</h2>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"className\":\"wp-block-list\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">版本与下载</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>当前版本 <strong>1.3.2(17)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>1.3.2 将工程、APP 与应用标识统一为 FCP-BeautyGirl;安装器会核对身份并迁移旧版程序,保留原滤镜 UUID 和参数存储格式。此版本沿用 1.3.1 的 V 脸下颌修复、微细锐化、连续五官保护和非肤色区保护。1901 项自动回归及安装迁移检查通过;本次更名后的旧工程重开与原生画面仍需结合实际素材检查。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">安装</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"sizeSlug\":\"full\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png\" alt=\"主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出\" /></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">使用</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观Line truncated
|
||||
"excerpt": "1.3.2 将工程、APP 与应用 ID 统一为 FCP-BeautyGirl,安装自动迁移旧版。保留 V 脸下颌修复和磨皮参数,提供免费开源源码及签名公证安装包。",
|
||||
"seo": {
|
||||
"title": {
|
||||
"enabled": true,
|
||||
"value": "大鱼人像美化 1.3.2|FCP / Motion 免费开源自动美颜插件"
|
||||
},
|
||||
"description": {
|
||||
"enabled": true,
|
||||
"value": "大鱼人像美化是适用于 Final Cut Pro 和 Motion 的免费开源 FxPlug4 插件。1.3.2 将工程、APP 和应用 ID 统一为 FCP-BeautyGirl,自动迁移旧版;保留 V 脸下颌修复及磨皮保护参数。提供 Apple 签名公证安装包和源码,无需激活码,附安装使用说明。"
|
||||
},
|
||||
"keywords": {
|
||||
"enabled": true,
|
||||
"value": "大鱼人像美化,FCP美颜插件,Motion磨皮,自动瘦脸,自动跟随,FxPlug4,免费开源"
|
||||
}
|
||||
},
|
||||
"resource": {
|
||||
"cao_info": [
|
||||
{
|
||||
"title": "版本",
|
||||
"desc": "1.3.2(17)"
|
||||
},
|
||||
{
|
||||
"title": "宿主",
|
||||
"desc": "Final Cut Pro / Motion"
|
||||
},
|
||||
{
|
||||
"title": "系统",
|
||||
"desc": "macOS 13 或更高版本"
|
||||
},
|
||||
{
|
||||
"title": "架构",
|
||||
"desc": "Apple Silicon / Intel"
|
||||
},
|
||||
{
|
||||
"title": "授权",
|
||||
"desc": "免费开源,无需激活码"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
<!-- wp:paragraph -->
|
||||
<p>大鱼人像美化是一款适用于 Final Cut Pro 与 Motion 的免费开源人像插件,把磨皮、美白和脸型调整放进同一块原生卡片面板。插件会识别当前画面中的人脸并自动跟随,无需先点击分析;你可以按素材需要调整强度,拖动滑杆时持续查看效果。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
<!-- wp:paragraph -->
|
||||
<p><strong>代码由 OpenAI + Codex 全程编写,站长仅参与调试和测试。</strong></p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"sizeSlug":"full"} -->
|
||||
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604750-357ca780597c39f.png" alt="大鱼人像美化古风宣传封面,展示自动瘦脸、自动跟随与自动美颜" /><figcaption class="wp-element-caption">古风宣传插画;面部线条用于示意瘦脸与跟随功能。</figcaption></figure>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">可以做什么</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:list {"className":"wp-block-list"} -->
|
||||
<ul class="wp-block-list"><!-- wp:list-item -->
|
||||
<li>磨皮:磨皮程度、微细锐化、五官保护和非肤色区保护分别调节;全局磨皮与锐化保留在更多设置。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>美白:肤色预设、肤色亮度、皮肤色相和牙齿美白。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>脸型:瘦脸、大眼、短脸、窄脸、下巴、V 脸、下颌骨、颧骨与小头调整。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>自动跟随:默认跟随主要人脸,也提供多人模式、防跳脸范围与检测框预览。</li>
|
||||
<!-- /wp:list-item -->
|
||||
|
||||
<!-- wp:list-item -->
|
||||
<li>实时预览:滑杆、数值、单项开关和重置集中在同一面板,便于反复对比。</li>
|
||||
<!-- /wp:list-item --></ul>
|
||||
<!-- /wp:list -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>自动识别负责定位处理区域,效果强度由你控制。建议先从较小的数值开始;多人交叉、严重遮挡和极端侧脸的结果需要结合具体素材检查。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">版本与下载</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>当前版本 <strong>1.3.2(17)</strong>,支持 macOS 13 或更高版本,包含 Apple Silicon 与 Intel 两种架构。下载包包含 FxPlug4 程序和一个配套 FCP 效果模板。APP 与 PKG 均已完成 Developer ID 正式签名、Apple 公证和票据粘附;安装包为所有用户免费资源。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>1.3.2 将工程、APP 与应用标识统一为 FCP-BeautyGirl;安装器会核对身份并迁移旧版程序,保留原滤镜 UUID 和参数存储格式。此版本沿用 1.3.1 的 V 脸下颌修复、微细锐化、连续五官保护和非肤色区保护。1901 项自动回归及安装迁移检查通过;本次更名后的旧工程重开与原生画面仍需结合实际素材检查。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">安装</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>安装前先保存工作并退出 Final Cut Pro 和 Motion,安装期间保持关闭。运行本页提供的 PKG,按安装器提示完成安装;它会把程序安装到 <code>/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app</code>,把配套效果安装到当前登录用户的 Motion Templates 目录,并自动验证和修复系统插件注册。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>本插件免费开源,<strong>无需激活码、付费注册或账号授权</strong>。主 APP 打开时显示说明图,窗口显示三秒后自动退出;宿主中的滤镜由独立服务运行。安装器还会重新锁定两张缩略图,避免被宿主自动替换。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"sizeSlug":"full"} -->
|
||||
<figure class="wp-block-image size-full"><img src="https://dayu.media/wp-content/uploads/2026/10/1792604743-1c99c2ba53c7614.png" alt="主程序说明页:免费开源,自动注册,无需激活码,启动三秒后自动退出" /></figure>
|
||||
<!-- /wp:image -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">使用</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>Final Cut Pro:打开<strong>效果</strong>浏览器,找到<strong>大鱼磨皮瘦脸</strong>分类,将<strong>大鱼人像美化</strong>添加到人像片段。Motion:在原生滤镜资源库的<strong>大鱼</strong>分类中选择<strong>大鱼人像美化</strong>。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>在检查器中按需调节磨皮、美白和脸型。每项左侧的眼睛可暂时停用该项,数值会保留;右侧回转箭头用于重置。人脸会随画面自动更新,开启检测框预览可以检查跟随位置。多人模式建议先用短片段观察稳定性。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">常见问题</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>如果效果没有出现或显示红色警告,先退出 Final Cut Pro 和 Motion,再打开一次主 APP,等待其自动退出,然后重新启动宿主。可在“终端”执行下面这条命令:</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:code -->
|
||||
<pre class="wp-block-code"><code>open '/Library/Plug-Ins/FxPlug/FCP-BeautyGirl.app'</code></pre>
|
||||
<!-- /wp:code -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>该流程可重新触发系统注册,并不能解决所有报错。仍异常时请核对 macOS、宿主版本及安装包完整性;不要只复制单个 .moef 文件,配套程序与 Drop Zone.tiff 也需要保留。当前仅提供上述一个效果模板。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:heading -->
|
||||
<h2 class="wp-block-heading">源码与开源许可</h2>
|
||||
<!-- /wp:heading -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>公开源码仓库:<a href="https://github.com/dayumeida/FCP-BeautyGirl" target="_blank" rel="noreferrer noopener">GitHub · FCP-BeautyGirl</a>,可直接浏览源码、完整提交历史和版本标签。<a href="https://github.com/dayumeida/FCP-BeautyGirl/releases/tag/v1.3.2" target="_blank" rel="noreferrer noopener">1.3.2 Release</a> 提供正式签名公证安装包。大鱼站仓库作为备份保留:<a href="https://dayu.media/git/dayu/paintfcp-fxplug" target="_blank" rel="noreferrer noopener">paintfcp-fxplug</a>(该入口仍受站点登录与会员网关限制)。也可下载 <a href="{{source_url}}">1.3.2 源码快照 ZIP</a>,源码与安装包均免费提供。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:paragraph -->
|
||||
<p>项目代码按仓库中的 MIT 许可文件提供,源码包含 Xcode 工程、Objective-C / Metal 实现、模板及构建与验证说明。Apple SDK、运行框架及样本按各自许可使用,详见源码中的 LICENSE 和 THIRD_PARTY_NOTICES.md。自行编译需要 Xcode 与 FxPlug SDK;证书和签名私钥不包含在源码中。</p>
|
||||
<!-- /wp:paragraph -->
|
||||
|
||||
<!-- wp:image {"id":15597,"sizeSlug":"large","linkDestination":"none"} -->
|
||||
<figure class="wp-block-image size-large"><img src="https://dayu.media/wp-content/uploads/2026/10/1792605142-78805a221a988e7-359x1024.png" alt="" class="wp-image-15597" /></figure>
|
||||
<!-- /wp:image -->
|
||||
+20
-18
@@ -3,26 +3,24 @@
|
||||
The final prompt keeps the lock held while native-host validation is performed.
|
||||
"""
|
||||
import argparse, datetime, json, os, pathlib, plistlib, re, shutil, subprocess, sys, time
|
||||
from product_identity import PRODUCT, LegacyMigration, delivery_locks, validate_app
|
||||
root=pathlib.Path(__file__).resolve().parent.parent
|
||||
parser=argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--wait-for-hosts',action='store_true',help='After notarization, retain the delivery lock and wait for Motion/FCP to exit naturally before installing; never control or quit either host.')
|
||||
parser.add_argument('--user-tests',action='store_true',help='After non-UI installed-app verification, record native effect QA as pending user testing and clean known generated copies without the interactive validation prompt.')
|
||||
parser.add_argument('--resume-prepared',action='store_true',help='Resume an already Accepted and stapled staged app after checking its recorded signature, version and unchanged product source.')
|
||||
args=parser.parse_args()
|
||||
bundle_id='com.dayu.beatygril'
|
||||
lock=pathlib.Path('/Users/dayu/.codex/app-delivery-locks')/(bundle_id+'.lock')
|
||||
lock.parent.mkdir(parents=True,exist_ok=True)
|
||||
try:lock.mkdir()
|
||||
except FileExistsError:raise SystemExit('Delivery lock occupied; inspect owner.json and the owner process')
|
||||
(lock/'owner.json').write_text(json.dumps({'pid':os.getpid(),'cwd':str(root),'bundle_id':bundle_id}))
|
||||
staging=pathlib.Path('/tmp/paintfcp-build-20261021')
|
||||
bundle_id=PRODUCT['bundleIdentifier']
|
||||
locks=delivery_locks();locks.__enter__()
|
||||
staging=pathlib.Path('/tmp/fcp-beautygirl-release')
|
||||
logs=root/'build'/'delivery';logs.mkdir(parents=True,exist_ok=True)
|
||||
app=staging/'Build/Products/Release/beatygril.app'
|
||||
installed=pathlib.Path('/Library/Plug-Ins/FxPlug/beatygril.app')
|
||||
app=staging/'Build/Products/Release'/(PRODUCT['name']+'.app')
|
||||
installed=pathlib.Path(PRODUCT['installationPath'])
|
||||
archive=logs/'notarization.zip'
|
||||
identity='Developer ID Application: zhong luo (B3W25FX5H5)'
|
||||
keychain='/Users/dayu/Library/Keychains/login.keychain-db'
|
||||
previous=logs/'previous-beatygril.app'
|
||||
previous=logs/'previous-FCP-BeautyGirl.app'
|
||||
migration=LegacyMigration(logs)
|
||||
receipt_path=logs/'delivery-receipt.json'
|
||||
receipt={'status':'preparing','bundleIdentifier':bundle_id,'installationPath':str(installed),
|
||||
'options':{'waitForHosts':args.wait_for_hosts,'userTests':args.user_tests},
|
||||
@@ -80,7 +78,7 @@ def cleanup_known_products():
|
||||
try:
|
||||
delivery_source={'commit':run(['git','rev-parse','HEAD']).strip(),
|
||||
'trackedWorktreeChanges':run(['git','status','--porcelain','--untracked-files=no']).splitlines()}
|
||||
plugin=app/'Contents/PlugIns/beatygril XPC Service.pluginkit'
|
||||
plugin=app/'Contents/PlugIns'/PRODUCT['pluginName']
|
||||
if args.resume_prepared:
|
||||
old_receipt=json.loads(receipt_path.read_text())
|
||||
result=old_receipt.get('notarization',{})
|
||||
@@ -94,7 +92,7 @@ try:
|
||||
if not expected or not actual or expected.group(1)!=actual.group(1):raise RuntimeError('Prepared signature hash changed')
|
||||
if info.get('CFBundleShortVersionString')!=old_receipt.get('version') or info.get('CFBundleVersion')!=old_receipt.get('build'):raise RuntimeError('Prepared version changed')
|
||||
source_commit=old_receipt.get('source',{}).get('commit')
|
||||
if not source_commit or run(['git','diff',source_commit,'--','beatygril']).strip():raise RuntimeError('Product source changed since prepared build')
|
||||
if not source_commit or run(['git','diff',source_commit,'--',PRODUCT['sourceRoot'],'product.json']).strip():raise RuntimeError('Product source changed since prepared build')
|
||||
receipt.update(old_receipt);receipt.pop('failure',None)
|
||||
receipt['resumedBy']=delivery_source
|
||||
receipt['options']={'waitForHosts':args.wait_for_hosts,'userTests':args.user_tests,'resumePrepared':True}
|
||||
@@ -107,14 +105,14 @@ try:
|
||||
identities=run(['security','find-identity','-v','-p','codesigning',keychain])
|
||||
if identity not in identities:raise RuntimeError('Valid Developer ID Application identity is unavailable')
|
||||
print('Building universal Release…',flush=True)
|
||||
run(['xcodebuild','-project','beatygril/beatygril.xcodeproj','-scheme','Wrapper Application','-configuration','Release','-derivedDataPath',str(staging),'-destination','generic/platform=macOS','build'],logs/'build.log')
|
||||
run(['xcodebuild','-project',PRODUCT['xcodeProject'],'-scheme',PRODUCT['scheme'],'-configuration','Release','-derivedDataPath',str(staging),'-destination','generic/platform=macOS','build'],logs/'build.log')
|
||||
# Xcode can register a fresh build. Remove this known generated path before
|
||||
# lengthy signing/notarization while a user may still be testing the old app.
|
||||
unregister_generated_plugin(plugin)
|
||||
for framework in sorted((plugin/'Contents/Frameworks').glob('*.framework')):
|
||||
run(['codesign','--force','--timestamp','--options','runtime','--sign',identity,str(framework)])
|
||||
run(['codesign','--force','--timestamp','--options','runtime','--sign',identity,str(plugin)])
|
||||
run(['codesign','--force','--timestamp','--options','runtime','--entitlements',str(root/'beatygril/beatygril/Wrapper Application/SandboxEntitlements.entitlements'),'--sign',identity,str(app)])
|
||||
run(['codesign','--force','--timestamp','--options','runtime','--entitlements',str(root/PRODUCT['sourceDirectory']/'Wrapper Application/SandboxEntitlements.entitlements'),'--sign',identity,str(app)])
|
||||
run(['codesign','--verify','--deep','--strict',str(app)])
|
||||
info=require_product(app)
|
||||
receipt['version']=info.get('CFBundleShortVersionString');receipt['build']=info.get('CFBundleVersion')
|
||||
@@ -148,6 +146,8 @@ try:
|
||||
if installed.exists():
|
||||
shutil.move(str(installed),str(previous))
|
||||
try:
|
||||
validate_app(app,bundle_id)
|
||||
migration.relocate(unregister_generated_plugin)
|
||||
shutil.copytree(app,installed,symlinks=True)
|
||||
run(['codesign','--verify','--deep','--strict',str(installed)])
|
||||
run(['xcrun','stapler','validate',str(installed)])
|
||||
@@ -156,21 +156,23 @@ try:
|
||||
signature=subprocess.run(['codesign','-dvvv',str(installed)],capture_output=True,text=True,check=True).stderr
|
||||
if info.get('CFBundleIdentifier')!=bundle_id or 'TeamIdentifier=B3W25FX5H5' not in signature:raise RuntimeError('Installed app identity mismatch')
|
||||
(logs/'installed-signature.txt').write_text(signature)
|
||||
run(['pluginkit','-a',str(installed/'Contents/PlugIns/beatygril XPC Service.pluginkit')])
|
||||
run(['pluginkit','-a',str(installed/'Contents/PlugIns'/PRODUCT['pluginName'])])
|
||||
# Xcode may register its build product. Only the installed plugin should
|
||||
# be discoverable while native host validation is in progress.
|
||||
unregister_generated_plugin(plugin)
|
||||
installed_plugin=installed/'Contents/PlugIns/beatygril XPC Service.pluginkit'
|
||||
installed_plugin=installed/'Contents/PlugIns'/PRODUCT['pluginName']
|
||||
plugin_info=plistlib.loads((installed_plugin/'Contents/Info.plist').read_bytes())
|
||||
discovered=run(['pluginkit','-m','-A','-D','-v','-i',plugin_info['CFBundleIdentifier']])
|
||||
if str(installed_plugin) not in discovered:raise RuntimeError('PluginKit did not report the formal installed plug-in path')
|
||||
(logs/'installed-discovery.txt').write_text(discovered)
|
||||
save_receipt('installed',installedSignature=signature,installedSignatureVerified=True,
|
||||
installedStapleValidated=True,gatekeeperAccepted=True,
|
||||
identityMigration={'legacyInstallationsRemoved':[str(source) for legacy,source,backup in migration.moved], 'filterUUIDPreserved':PRODUCT['filterUUID']},
|
||||
pluginDiscovery={'bundleIdentifier':plugin_info['CFBundleIdentifier'],'formalPath':str(installed_plugin),'output':discovered})
|
||||
except Exception:
|
||||
if installed.exists():shutil.rmtree(installed)
|
||||
if previous.exists():shutil.move(str(previous),str(installed))
|
||||
migration.rollback(lambda path:run(['pluginkit','-a',str(path)]))
|
||||
raise
|
||||
print(json.dumps({'status':'installed','path':str(installed),'notarization':result}),flush=True)
|
||||
if args.user_tests:
|
||||
@@ -179,11 +181,11 @@ try:
|
||||
input('HOST_VALIDATION_PENDING: press Return only after host verification and duplicate inventory.\n')
|
||||
receipt['nativeEffectQA']={'status':'operator_confirmed','performedByScript':False}
|
||||
# Only this task’s known generated product copies are removed.
|
||||
removed=cleanup_known_products()
|
||||
removed=migration.cleanup()+cleanup_known_products()
|
||||
save_receipt('installed_user_qa_pending' if args.user_tests else 'complete',removedGeneratedPaths=removed)
|
||||
print('Delivery staging and notarization archive cleaned.',flush=True)
|
||||
except BaseException as error:
|
||||
save_receipt('failed',failure={'type':type(error).__name__,'message':str(error)})
|
||||
raise
|
||||
finally:
|
||||
(lock/'owner.json').unlink();lock.rmdir()
|
||||
locks.__exit__(None,None,None)
|
||||
@@ -0,0 +1,100 @@
|
||||
#import <Foundation/Foundation.h>
|
||||
#import <CoreImage/CoreImage.h>
|
||||
#import "PGFaceProcessor.h"
|
||||
#include <math.h>
|
||||
|
||||
@interface PGRealtimeFaceTracker : NSObject
|
||||
- (NSDictionary *)resultForGeometry:(NSArray *)raw settings:(PGBeautySettings)s time:(CMTime)time extent:(CGRect)extent;
|
||||
@end
|
||||
@interface PGFaceProcessor (ProbeWarp)
|
||||
- (CIImage *)warpImage:(CIImage *)image geometry:(NSArray *)geometry settings:(PGBeautySettings)s extent:(CGRect)extent;
|
||||
- (NSArray<VNFaceObservation *> *)observationsInImage:(CIImage *)image settings:(PGBeautySettings)s error:(NSError **)error;
|
||||
@end
|
||||
@interface ProbeFaceProcessor : PGFaceProcessor
|
||||
@property (nonatomic,copy) NSArray<VNFaceObservation *> *authoredDetections;
|
||||
@end
|
||||
@implementation ProbeFaceProcessor
|
||||
- (NSArray<VNFaceObservation *> *)observationsInImage:(CIImage *)image settings:(PGBeautySettings)s error:(NSError **)error {return self.authoredDetections?:@[];}
|
||||
@end
|
||||
|
||||
static NSDictionary *Geometry(CGRect box, double localJitter, BOOL has76) {
|
||||
NSMutableDictionary *g=[@{@"box":@[@(box.origin.x),@(box.origin.y),@(box.size.width),@(box.size.height)]} mutableCopy];
|
||||
for(NSString *name in @[@"leftEye",@"rightEye",@"leftBrow",@"rightBrow",@"nose",@"lips",@"mouth",@"contour"]){
|
||||
double x=[name isEqual:@"rightEye"]?.7:.3;
|
||||
g[name]=@[@[@(box.origin.x+(x+localJitter)*box.size.width),@(box.origin.y+.65*box.size.height)]];
|
||||
}
|
||||
if(has76){
|
||||
NSMutableArray *p=[NSMutableArray new];
|
||||
for(NSUInteger i=0;i<76;i++)[p addObject:@[@.5,@.5]];
|
||||
p[6]=@[@.34,@.65];p[13]=@[@.66,@.65];
|
||||
p[46]=@[@.5,@.68];p[47]=@[@.5,@.60];p[48]=@[@.5,@.52];p[49]=@[@.5,@.45];p[52]=@[@.5,@.42];
|
||||
p[29]=@[@.5,@.39];p[36]=@[@.54,@.36];p[37]=@[@.5,@.35];p[38]=@[@.46,@.36];
|
||||
p[26]=@[@.42,@.40];p[34]=@[@.58,@.40];p[35]=@[@.57,@.36];p[39]=@[@.43,@.36];
|
||||
for(NSUInteger i=0;i<17;i++){double t=M_PI+M_PI*i/16;p[59+i]=@[@(.5+.29*cos(t)),@(.65+.43*sin(t))];}
|
||||
for(NSUInteger i=0;i<76;i++)p[i]=@[@(box.origin.x+([p[i][0] doubleValue]+localJitter)*box.size.width),@(box.origin.y+[p[i][1] doubleValue]*box.size.height)];
|
||||
g[@"points76"]=p;
|
||||
}
|
||||
return g;
|
||||
}
|
||||
static NSDictionary *Live(PGRealtimeFaceTracker *t,NSArray *g,PGBeautySettings s,int64_t tick){return[t resultForGeometry:g settings:s time:CMTimeMake(tick,1000) extent:CGRectMake(0,0,256,256)];}
|
||||
static double PointX(NSDictionary *r){return[r[@"output"][0][@"points76"][69][0] doubleValue];}
|
||||
static NSData *Pixels(CIContext *context,CIImage *image){
|
||||
CGRect e=image.extent;NSUInteger w=e.size.width,h=e.size.height;NSMutableData *d=[NSMutableData dataWithLength:w*h*4*sizeof(float)];
|
||||
[context render:image toBitmap:d.mutableBytes rowBytes:w*4*sizeof(float) bounds:e format:kCIFormatRGBAf colorSpace:NULL];return d;
|
||||
}
|
||||
static NSDictionary *Difference(NSData *a,NSData *b){
|
||||
const float *x=a.bytes,*y=b.bytes;NSUInteger n=a.length/sizeof(float),changed=0;double maximum=0,sum=0;
|
||||
for(NSUInteger i=0;i<n;i++){double v=fabs(x[i]-y[i]);sum+=v;maximum=fmax(maximum,v);if(v>1e-6)changed++;}
|
||||
return@{@"maxChannelDifference":@(maximum),@"meanChannelDifference":@(sum/n),@"changedChannelsAbove1e_6":@(changed)};
|
||||
}
|
||||
static double MeanRed(CIContext *context,CIImage *image){NSData *d=Pixels(context,image);const float *p=d.bytes;NSUInteger n=d.length/(4*sizeof(float));double sum=0;for(NSUInteger i=0;i<n;i++)sum+=p[4*i];return sum/n;}
|
||||
static CIImage *SyntheticPattern(void){
|
||||
NSMutableData *d=[NSMutableData dataWithLength:256*256*4*sizeof(float)];float *p=d.mutableBytes;
|
||||
for(NSUInteger y=0;y<256;y++)for(NSUInteger x=0;x<256;x++){NSUInteger i=4*(y*256+x);p[i]=x/255.;p[i+1]=y/255.;p[i+2]=((x/5+y/5)%2)*.9+.05;p[i+3]=1;}
|
||||
return[CIImage imageWithBitmapData:d bytesPerRow:256*4*sizeof(float) size:CGSizeMake(256,256) format:kCIFormatRGBAf colorSpace:NULL];
|
||||
}
|
||||
int main(void){@autoreleasepool{
|
||||
PGBeautySettings s=PGBeautyDefaults();s.faceThin=1;
|
||||
CGRect b=CGRectMake(.15,.15,.7,.65);NSDictionary *good=Geometry(b,0,YES),*missing=Geometry(b,0,NO);
|
||||
PGRealtimeFaceTracker *topology=[PGRealtimeFaceTracker new];NSMutableArray *counts=[NSMutableArray new],*held=[NSMutableArray new],*diffs=[NSMutableArray new];
|
||||
PGFaceProcessor *processor=[PGFaceProcessor new];CIContext *context=[CIContext contextWithOptions:nil];CIImage *image=SyntheticPattern();NSData *original=Pixels(context,image);
|
||||
NSArray *inputs=@[@[good],@[missing],@[good]];
|
||||
for(NSUInteger i=0;i<inputs.count;i++){
|
||||
NSDictionary *r=Live(topology,inputs[i],s,i*40);NSArray *output=r[@"output"];
|
||||
[counts addObject:@([output[0][@"points76"] count])];[held addObject:r[@"held"]];
|
||||
CIImage *warped=[processor warpImage:image geometry:output settings:s extent:image.extent];
|
||||
[diffs addObject:Difference(original,Pixels(context,warped))];
|
||||
}
|
||||
NSMutableArray *rawX=[NSMutableArray new],*outX=[NSMutableArray new];PGRealtimeFaceTracker *jitter=[PGRealtimeFaceTracker new];
|
||||
for(NSUInteger i=0;i<20;i++){
|
||||
double dx=(i%2?.004:-.004);CGRect moved=b;moved.origin.x+=dx;NSDictionary *g=Geometry(moved,0,YES),*r=Live(jitter,@[g],s,i*40);
|
||||
[rawX addObject:g[@"points76"][69][0]];[outX addObject:@(PointX(r))];
|
||||
}
|
||||
double rawAmplitude=0,outAmplitude=0,maxError=0;for(NSUInteger i=1;i<rawX.count;i++){rawAmplitude=fmax(rawAmplitude,fabs([rawX[i] doubleValue]-[rawX[i-1] doubleValue]));outAmplitude=fmax(outAmplitude,fabs([outX[i] doubleValue]-[outX[i-1] doubleValue]));maxError=fmax(maxError,fabs([rawX[i] doubleValue]-[outX[i] doubleValue]));}
|
||||
PGRealtimeFaceTracker *late=[PGRealtimeFaceTracker new];NSDictionary *lateFirst=Live(late,@[],s,40);Live(late,@[good],s,0);NSDictionary *lateReplay=Live(late,@[],s,40);
|
||||
PGRealtimeFaceTracker *ordered=[PGRealtimeFaceTracker new];Live(ordered,@[good],s,0);NSDictionary *ordered40=Live(ordered,@[],s,40);
|
||||
PGRealtimeFaceTracker *reacquired=[PGRealtimeFaceTracker new];Live(reacquired,@[good],s,0);Live(reacquired,@[],s,40);NSDictionary *shift=Geometry(b,.04,YES),*r80=Live(reacquired,@[shift],s,80);
|
||||
PGRealtimeFaceTracker *continuous=[PGRealtimeFaceTracker new];Live(continuous,@[good],s,0);NSDictionary *continuous80=Live(continuous,@[shift],s,80);
|
||||
NSMutableArray *weights=[NSMutableArray new];for(NSNumber *fps in @[@25,@30,@60,@120]){
|
||||
PGRealtimeFaceTracker *t=[PGRealtimeFaceTracker new];Live(t,@[good],s,0);
|
||||
NSDictionary *r=[t resultForGeometry:@[shift] settings:s time:CMTimeMake(1,fps.intValue) extent:CGRectMake(0,0,256,256)];
|
||||
double before=[good[@"points76"][69][0] doubleValue],after=[shift[@"points76"][69][0] doubleValue];
|
||||
[weights addObject:@{@"fps":fps,@"currentLandmarkWeight":@((PointX(r)-before)/(after-before))}];
|
||||
}
|
||||
ProbeFaceProcessor *drop=[ProbeFaceProcessor new];PGBeautySettings defaultSettings=PGBeautyDefaults();
|
||||
drop.authoredDetections=@[[VNFaceObservation faceObservationWithRequestRevision:VNDetectFaceLandmarksRequestRevision3 boundingBox:b roll:nil yaw:nil pitch:nil]];
|
||||
PGFaceFrame *detected=[drop processImage:image settings:defaultSettings time:kCMTimeZero error:nil];
|
||||
drop.authoredDetections=@[];PGFaceFrame *lost=[drop processImage:image settings:defaultSettings time:CMTimeMake(1,25) error:nil];
|
||||
PGRealtimeFaceTracker *crossing=[PGRealtimeFaceTracker new];NSDictionary *initialA=Geometry(CGRectMake(.2,.25,.25,.5),0,YES);
|
||||
Live(crossing,@[initialA],s,0);NSDictionary *movingA=Geometry(CGRectMake(.30,.25,.25,.5),.04,YES),*strangerB=Geometry(CGRectMake(.21,.25,.25,.5),-.04,YES);
|
||||
NSDictionary *crossed=Live(crossing,@[movingA,strangerB],s,40);
|
||||
NSDictionary *report=@{@"scope":@"Authored synthetic geometry and image only; actual current PGFaceProcessor implementation linked; no target binary or user media.",
|
||||
@"topologyValidMissingValid":@{@"points76Counts":counts,@"held":held,@"pixelDifferencesFromUnwarpedInput":diffs},
|
||||
@"pureBBoxTranslationJitter":@{@"frames":@20,@"fps":@25,@"rawStepNormalized":@(rawAmplitude),@"outputStepNormalized":@(outAmplitude),@"outputOverRawAmplitude":@(outAmplitude/rawAmplitude),@"maximumOutputVsRawPointError":@(maxError)},
|
||||
@"outOfOrderCachedMissingFrame":@{@"initial40OutputFaces":@([lateFirst[@"output"] count]),@"replay40AfterAdding0OutputFaces":@([lateReplay[@"output"] count]),@"ordered0Then40OutputFaces":@([ordered40[@"output"] count])},
|
||||
@"reacquisition":@{@"reacquiredPoint69x":@(PointX(r80)),@"rawPoint69x":shift[@"points76"][69][0],@"continuousPoint69x":@(PointX(continuous80))},
|
||||
@"defaultAppearanceOnDetectionLoss":@{@"geometryFacesBefore":@(detected.deformationGeometry.count),@"geometryFacesAfter":@(lost.deformationGeometry.count),@"meanColorMaskBefore":@(MeanRed(context,detected.colorMask)),@"meanColorMaskAfter":@(MeanRed(context,lost.colorMask)),@"meanSkinMaskBefore":@(MeanRed(context,detected.skinMask)),@"meanSkinMaskAfter":@(MeanRed(context,lost.skinMask))},
|
||||
@"authoredTwoFaceCrossing":@{@"rawIndex0":@"same authored identity A moved by .10",@"rawIndex1":@"different authored identity B moved within .01 of old center",@"selectedRawIndex":crossed[@"index"]},
|
||||
@"landmarkWeightsByFrameRate":weights};
|
||||
NSData *json=[NSJSONSerialization dataWithJSONObject:report options:NSJSONWritingPrettyPrinted|NSJSONWritingSortedKeys error:nil];fwrite(json.bytes,1,json.length,stdout);fputc('\n',stdout);
|
||||
}return 0;}
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/zsh
|
||||
# Diagnostic statistics for authored inputs; a zero exit is not a stability pass.
|
||||
set -euo pipefail
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
WORK="$ROOT/build/tracking-diagnostics"
|
||||
mkdir -p "$WORK"
|
||||
xcrun clang -fobjc-arc -fmodules -Wall -Wextra -Wno-unused-parameter \
|
||||
-DCI_SILENCE_GL_DEPRECATION -mmacosx-version-min=13.0 \
|
||||
-I "$ROOT/FCP-BeautyGirl/FCP-BeautyGirl/Plugin" \
|
||||
-framework Foundation -framework CoreImage -framework CoreGraphics \
|
||||
-framework CoreMedia -framework Metal -framework Vision -framework ImageIO \
|
||||
"$ROOT/FCP-BeautyGirl/FCP-BeautyGirl/Plugin/PGFaceProcessor.m" \
|
||||
"$ROOT/scripts/diagnose-tracking.m" -o "$WORK/tracking-probe"
|
||||
"$WORK/tracking-probe"
|
||||
@@ -0,0 +1,109 @@
|
||||
// Offline diagnostics: actual detector/tracker, scalar statistics only.
|
||||
// No image, full landmark array, host edit, or reference execution is produced.
|
||||
#import <AVFoundation/AVFoundation.h>
|
||||
#import "../FCP-BeautyGirl/FCP-BeautyGirl/Plugin/PGFaceProcessor.m"
|
||||
|
||||
static double ShapeRMS(NSDictionary *a, NSDictionary *b, NSUInteger first, NSUInteger last) {
|
||||
NSArray *x=a[@"points76"], *y=b[@"points76"];
|
||||
if(x.count!=76 || y.count!=76) return NAN;
|
||||
CGRect old=PGArrayRect(a[@"box"]), current=PGArrayRect(b[@"box"]);
|
||||
if(!PGValidRect(old)||!PGValidRect(current)) return NAN;
|
||||
double sum=0;
|
||||
for(NSUInteger i=first;i<=last;i++) {
|
||||
CGPoint p=PGRemapPoint(x[i],old,current);
|
||||
double dx=(p.x-[y[i][0] doubleValue])/current.size.width;
|
||||
double dy=(p.y-[y[i][1] doubleValue])/current.size.height;
|
||||
sum+=dx*dx+dy*dy;
|
||||
}
|
||||
return sqrt(sum/(last-first+1));
|
||||
}
|
||||
static id NumberOrNull(double x) {return isfinite(x)?@(x):NSNull.null;}
|
||||
static double EyeRMS(NSDictionary *a, NSDictionary *b) {
|
||||
CGRect old=PGArrayRect(a[@"box"]), current=PGArrayRect(b[@"box"]);
|
||||
if(!PGValidRect(old)||!PGValidRect(current))return NAN;
|
||||
double sum=0;NSUInteger n=0;
|
||||
for(NSString *key in @[@"leftEye",@"rightEye"]) {
|
||||
NSArray *x=a[key],*y=b[key];if(!x.count||x.count!=y.count)return NAN;
|
||||
for(NSUInteger i=0;i<x.count;i++) {
|
||||
CGPoint p=PGRemapPoint(x[i],old,current);
|
||||
double dx=(p.x-[y[i][0] doubleValue])/current.size.width;
|
||||
double dy=(p.y-[y[i][1] doubleValue])/current.size.height;
|
||||
sum+=dx*dx+dy*dy;n++;
|
||||
}
|
||||
}
|
||||
return n?sqrt(sum/n):NAN;
|
||||
}
|
||||
|
||||
int main(int argc,const char *argv[]) {@autoreleasepool {
|
||||
if(argc!=6) {fprintf(stderr,"usage: inspect-tracking-sequence <video> <output.json> <fps> <decode-longest> <timeline-offset-seconds>\n");return 2;}
|
||||
NSString *path=@(argv[1]), *output=@(argv[2]);
|
||||
int fps=atoi(argv[3]), longest=atoi(argv[4]);double offset=atof(argv[5]);
|
||||
if(fps<1||fps>120||longest<128||longest>4096||!isfinite(offset))return 2;
|
||||
AVURLAsset *asset=[AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:path] options:nil];
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
|
||||
double duration=CMTimeGetSeconds(asset.duration);
|
||||
AVAssetTrack *video=[[asset tracksWithMediaType:AVMediaTypeVideo] firstObject];
|
||||
if(!video||!isfinite(duration)||duration<=0)return 2;
|
||||
double nominal=video.nominalFrameRate;
|
||||
AVAssetImageGenerator *generator=[[AVAssetImageGenerator alloc] initWithAsset:asset];
|
||||
generator.appliesPreferredTrackTransform=YES;generator.maximumSize=CGSizeMake(longest,longest);
|
||||
generator.requestedTimeToleranceBefore=kCMTimeZero;generator.requestedTimeToleranceAfter=kCMTimeZero;
|
||||
PGFaceProcessor *detector=[PGFaceProcessor new];PGRealtimeFaceTracker *tracker=[PGRealtimeFaceTracker new];
|
||||
PGBeautySettings settings=PGBeautyDefaults();settings.singleFace=0;settings.trackingEnabled=0;
|
||||
settings.fastMultiFace=0;settings.faceThin=1;settings.faceBigEye=.9035486629353234;
|
||||
NSMutableArray *rows=[NSMutableArray new];NSDictionary *priorRaw=nil,*priorOutput=nil;
|
||||
NSUInteger empty=0,partial=0,held=0,low=0,errors=0,multiple=0,invalidOutput=0,duplicateSourceFrames=0;
|
||||
CMTime previousActual=kCMTimeInvalid;NSUInteger width=0,height=0;
|
||||
for(int frame=0;frame<(int)ceil(duration*fps);frame++) {@autoreleasepool {
|
||||
double requested=(double)frame/fps;if(requested>=duration)break;
|
||||
NSError *error=nil;CMTime actual=kCMTimeInvalid;
|
||||
CGImageRef cg=[generator copyCGImageAtTime:CMTimeMakeWithSeconds(requested,60000) actualTime:&actual error:&error];
|
||||
if(!cg){errors++;fprintf(stderr,"decode failed at %.3f: %s\n",requested,error.localizedDescription.UTF8String);continue;}
|
||||
if(CMTIME_IS_VALID(previousActual)&&CMTimeCompare(previousActual,actual)==0)duplicateSourceFrames++;
|
||||
previousActual=actual;width=CGImageGetWidth(cg);height=CGImageGetHeight(cg);
|
||||
CIImage *image=[CIImage imageWithCGImage:cg];
|
||||
NSArray<VNFaceObservation *> *observations=[detector observationsInImage:image settings:settings error:&error];
|
||||
if(!observations)errors++;
|
||||
NSMutableArray *raw=[NSMutableArray new],*faces=[NSMutableArray new];
|
||||
for(VNFaceObservation *face in observations)if(PGValidRect(face.boundingBox)&&raw.count<16){[raw addObject:PGGeometry(face)];[faces addObject:face];}
|
||||
CMTime time=CMTimeAdd(CMTimeMake(frame,fps),CMTimeMakeWithSeconds(offset,60000));
|
||||
NSDictionary *r=[tracker resultForGeometry:raw settings:settings time:time extent:image.extent];
|
||||
NSInteger index=[r[@"index"] integerValue];NSDictionary *current=(index>=0&&(NSUInteger)index<raw.count)?raw[index]:nil;
|
||||
VNFaceObservation *face=(index>=0&&(NSUInteger)index<faces.count)?faces[index]:nil;
|
||||
NSDictionary *stable=[r[@"output"] firstObject];
|
||||
double confidence=face.landmarks?face.landmarks.confidence:NAN;
|
||||
if(!raw.count)empty++;if(raw.count>1)multiple++;
|
||||
if(current&&[current[@"points76"] count]!=76)partial++;
|
||||
if(stable&&[stable[@"points76"] count]!=76)invalidOutput++;
|
||||
if([r[@"held"] boolValue])held++;
|
||||
if(isfinite(confidence)&&confidence<.55)low++;
|
||||
CGRect old=PGArrayRect(priorRaw[@"box"]),box=PGArrayRect(current[@"box"]);
|
||||
double centerStep=NAN,sizeStep=NAN;
|
||||
if(PGValidRect(old)&&PGValidRect(box)){
|
||||
centerStep=hypot(CGRectGetMidX(old)-CGRectGetMidX(box),CGRectGetMidY(old)-CGRectGetMidY(box));
|
||||
sizeStep=MAX(fabs(box.size.width/old.size.width-1),fabs(box.size.height/old.size.height-1));
|
||||
}
|
||||
NSMutableDictionary *row=[@{@"frame":@(frame),@"requestedSeconds":@(requested),@"actualSeconds":@(CMTimeGetSeconds(actual)),
|
||||
@"faceCount":@(raw.count),@"points76Count":@([current[@"points76"] count]),@"held":r[@"held"],
|
||||
@"landmarkConfidence":NumberOrNull(confidence),@"faceConfidence":NumberOrNull(face?face.confidence:NAN),
|
||||
@"rawContourShapeStep":NumberOrNull(ShapeRMS(priorRaw,current,59,75)),
|
||||
@"outputContourShapeStep":NumberOrNull(ShapeRMS(priorOutput,stable,59,75)),
|
||||
@"rawAllShapeStep":NumberOrNull(ShapeRMS(priorRaw,current,0,75)),
|
||||
@"outputAllShapeStep":NumberOrNull(ShapeRMS(priorOutput,stable,0,75)),
|
||||
@"rawEyeShapeStep":NumberOrNull(EyeRMS(priorRaw,current)),
|
||||
@"bboxCenterStep":NumberOrNull(centerStep),@"bboxRelativeSizeStep":NumberOrNull(sizeStep)} mutableCopy];
|
||||
[rows addObject:row];priorRaw=current;priorOutput=stable;CGImageRelease(cg);
|
||||
if(frame%50==0)fprintf(stderr,"inspected %d/%d frames\n",frame,(int)ceil(duration*fps));
|
||||
}}
|
||||
#pragma clang diagnostic pop
|
||||
NSArray *keys=@[@"rawContourShapeStep",@"outputContourShapeStep",@"rawAllShapeStep",@"outputAllShapeStep",@"rawEyeShapeStep",@"bboxCenterStep",@"bboxRelativeSizeStep",@"landmarkConfidence"];
|
||||
NSMutableDictionary *stats=[NSMutableDictionary new];
|
||||
for(NSString *key in keys){NSMutableArray *values=[NSMutableArray new];for(NSDictionary *row in rows)if([row[key] isKindOfClass:NSNumber.class])[values addObject:row[key]];[values sortUsingSelector:@selector(compare:)];if(values.count){stats[key]=@{@"n":@(values.count),@"min":values.firstObject,@"median":values[values.count/2],@"p95":values[(NSUInteger)floor((values.count-1)*.95)],@"max":values.lastObject};}}
|
||||
NSArray *ranked=[rows sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *a,NSDictionary *b){double x=[a[@"rawContourShapeStep"] isKindOfClass:NSNumber.class]?[a[@"rawContourShapeStep"] doubleValue]:-1;double y=[b[@"rawContourShapeStep"] isKindOfClass:NSNumber.class]?[b[@"rawContourShapeStep"] doubleValue]:-1;return x>y?NSOrderedAscending:(x<y?NSOrderedDescending:NSOrderedSame);}];
|
||||
NSDictionary *summary=@{@"sourceBasename":path.lastPathComponent,@"durationSeconds":@(duration),@"nominalSourceFPS":@(nominal),@"samplingFPS":@(fps),@"decodedSize":@[@(width),@(height)],@"timelineOffsetSeconds":@(offset),@"frames":@(rows.count),@"emptyDetectionFrames":@(empty),@"partial76Frames":@(partial),@"heldFrames":@(held),@"outputWithout76Frames":@(invalidOutput),@"landmarkConfidenceBelow055Frames":@(low),@"multipleFaceFrames":@(multiple),@"decodeOrVisionErrors":@(errors),@"duplicateSourceFramePairs":@(duplicateSourceFrames),@"statistics":stats,@"largestContourChanges":[ranked subarrayWithRange:NSMakeRange(0,MIN(12,ranked.count))],@"scope":@"Independent offline decoding and the current production detector/tracker; not FCP render logs or target execution. Shape steps remove previous bbox translation/scale, but still include actual pose/expression changes."};
|
||||
NSDictionary *report=@{@"summary":summary,@"scalarFrames":rows};NSData *data=[NSJSONSerialization dataWithJSONObject:report options:NSJSONWritingPrettyPrinted|NSJSONWritingSortedKeys error:nil];
|
||||
if(!data||![data writeToFile:output atomically:YES])return 1;
|
||||
NSData *print=[NSJSONSerialization dataWithJSONObject:summary options:NSJSONWritingPrettyPrinted|NSJSONWritingSortedKeys error:nil];fwrite(print.bytes,1,print.length,stdout);fputc('\n',stdout);
|
||||
return 0;
|
||||
}}
|
||||
@@ -0,0 +1,83 @@
|
||||
"""Add this product's reversible identity migration to PKG Forge's postinstall."""
|
||||
from product_identity import PRODUCT
|
||||
|
||||
def inject_migration(post, product=PRODUCT):
|
||||
legacy, = product['legacyProducts']
|
||||
block = r'''
|
||||
# FCP-BeautyGirl identity migration. Payload and template work are already complete.
|
||||
BG_NEW_APP="${TARGET_VOLUME%/}@@NEW_PATH@@"
|
||||
BG_OLD_APP="${TARGET_VOLUME%/}@@OLD_PATH@@"
|
||||
BG_BACKUP_DIR=""
|
||||
BG_OLD_MOVED=0
|
||||
bg_validate_identity() {
|
||||
local app="$1" expected="$2" plugin="$3" actual signature uuid
|
||||
[[ -d "$app" && ! -L "$app" ]] || return 1
|
||||
actual="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$app/Contents/Info.plist")" || return 1
|
||||
[[ "$actual" == "$expected" ]] || return 1
|
||||
/usr/bin/codesign --verify --all-architectures --deep --strict "$app" || return 1
|
||||
signature="$(/usr/bin/codesign -dvvv "$app" 2>&1)" || return 1
|
||||
[[ "$signature" == *'TeamIdentifier=@@TEAM@@'* ]] || return 1
|
||||
uuid="$(/usr/libexec/PlistBuddy -c 'Print :ProPlugPlugInList:0:uuid' "$app/Contents/PlugIns/$plugin/Contents/Info.plist")" || return 1
|
||||
[[ "$uuid" == '@@UUID@@' ]]
|
||||
}
|
||||
bg_unregister_identity() {
|
||||
# Both bootstrap session and Unix identity belong to the desktop user.
|
||||
/bin/launchctl asuser "$CONSOLE_UID" /usr/bin/sudo -u "$CONSOLE_USER" /usr/bin/pluginkit -r "$1" >/dev/null 2>&1 || true
|
||||
}
|
||||
bg_rollback_identity() {
|
||||
local result=$?
|
||||
trap - EXIT
|
||||
if (( result != 0 && BG_OLD_MOVED )); then
|
||||
bg_validate_identity "$BG_NEW_APP" '@@NEW_ID@@' '@@NEW_PLUGIN@@' || {
|
||||
/bin/echo "新 APP 身份已变化,旧版保留在 $BG_BACKUP_DIR" >&2
|
||||
exit "$result"
|
||||
}
|
||||
bg_unregister_identity "$BG_NEW_APP/Contents/PlugIns/@@NEW_PLUGIN@@"
|
||||
/bin/rm -rf "$BG_NEW_APP"
|
||||
/bin/mv "$BG_BACKUP_DIR/@@OLD_NAME@@.app" "$BG_OLD_APP"
|
||||
/bin/rmdir "$BG_BACKUP_DIR"
|
||||
fx_verify_app "$BG_OLD_APP" 0 'Contents/PlugIns/@@OLD_PLUGIN@@' '@@OLD_PLUGIN_ID@@' '1.1' || true
|
||||
fi
|
||||
exit "$result"
|
||||
}
|
||||
bg_finish_identity() {
|
||||
if (( BG_OLD_MOVED )); then
|
||||
bg_validate_identity "$BG_BACKUP_DIR/@@OLD_NAME@@.app" '@@OLD_ID@@' '@@OLD_PLUGIN@@'
|
||||
/bin/rm -rf "$BG_BACKUP_DIR/@@OLD_NAME@@.app"
|
||||
/bin/rmdir "$BG_BACKUP_DIR"
|
||||
fi
|
||||
trap - EXIT
|
||||
}
|
||||
bg_validate_identity "$BG_NEW_APP" '@@NEW_ID@@' '@@NEW_PLUGIN@@' || {
|
||||
/bin/echo '新版 APP 签名或身份验证失败,未迁移旧版。' >&2
|
||||
exit 1
|
||||
}
|
||||
if [[ -e "$BG_OLD_APP" || -L "$BG_OLD_APP" ]]; then
|
||||
bg_validate_identity "$BG_OLD_APP" '@@OLD_ID@@' '@@OLD_PLUGIN@@' || {
|
||||
/bin/echo '旧路径的 APP 身份不属于本产品,未移动或删除。' >&2
|
||||
exit 1
|
||||
}
|
||||
BG_RECOVERY_ROOT="${TARGET_VOLUME%/}/Library/Application Support/@@NAME@@/Migration"
|
||||
/bin/mkdir -p "$BG_RECOVERY_ROOT"
|
||||
BG_BACKUP_DIR="$(/usr/bin/mktemp -d "$BG_RECOVERY_ROOT/.upgrade-XXXXXXXX")"
|
||||
bg_unregister_identity "$BG_OLD_APP/Contents/PlugIns/@@OLD_PLUGIN@@"
|
||||
/bin/mv "$BG_OLD_APP" "$BG_BACKUP_DIR/@@OLD_NAME@@.app"
|
||||
BG_OLD_MOVED=1
|
||||
fi
|
||||
trap bg_rollback_identity EXIT
|
||||
'''
|
||||
values = {'NEW_PATH': product['installationPath'], 'OLD_PATH': legacy['installationPath'],
|
||||
'NEW_ID': product['bundleIdentifier'], 'OLD_ID': legacy['bundleIdentifier'],
|
||||
'NEW_PLUGIN': product['pluginName'], 'OLD_PLUGIN': legacy['pluginName'],
|
||||
'OLD_PLUGIN_ID': legacy['pluginBundleIdentifier'], 'OLD_NAME': legacy['name'],
|
||||
'NAME': product['name'], 'TEAM': product['teamIdentifier'], 'UUID': product['filterUUID']}
|
||||
for key, value in values.items():
|
||||
if any(c in value for c in ['"', "'", '\n', '$', '`']):
|
||||
raise ValueError('Unsafe installer identity value: ' + key)
|
||||
block = block.replace('@@' + key + '@@', value)
|
||||
marker = '\ntrap - EXIT\nfx_verify_app '
|
||||
if post.count(marker) != 1 or not post.rstrip().endswith('exit 0'):
|
||||
raise ValueError('Unexpected PKG Forge postinstall structure')
|
||||
post = post.replace(marker, '\ntrap - EXIT\n' + block + '\nfx_verify_app ', 1)
|
||||
end = post.rfind('exit 0')
|
||||
return post[:end] + 'bg_finish_identity\n' + post[end:]
|
||||
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Package the installed product with local PKG Forge, then sign/notarize its migration update."""
|
||||
import argparse, datetime, hashlib, json, os, pathlib, plistlib, shutil, subprocess, sys
|
||||
from installer_identity import inject_migration
|
||||
from product_identity import PRODUCT, ROOT, delivery_locks, validate_app
|
||||
|
||||
def run(args, log=None, env=None):
|
||||
result = subprocess.run(args, cwd=ROOT, text=True, capture_output=True, env=env)
|
||||
if log:
|
||||
pathlib.Path(log).write_text(result.stdout + result.stderr)
|
||||
result.check_returncode()
|
||||
return result.stdout
|
||||
|
||||
version = PRODUCT['version']
|
||||
work = ROOT / 'build' / ('package-' + version)
|
||||
release = ROOT / 'releases' / version
|
||||
proof = ROOT / 'docs/verification' / ('v' + version)
|
||||
package_name = PRODUCT['name'] + '-' + version + '.pkg'
|
||||
final = release / package_name
|
||||
keychain = '/Users/dayu/Library/Keychains/login.keychain-db'
|
||||
installer_identity = 'Developer ID Installer: zhong luo (B3W25FX5H5)'
|
||||
cli = '/Applications/PKG工坊.app/Contents/MacOS/PKG工坊'
|
||||
source_template = pathlib.Path('/Users/dayu/Movies/Motion Templates.localized/Effects.localized/大鱼磨皮瘦脸')
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--verify-existing', action='store_true', help='Resume verification of the already Accepted, stapled final package without rebuilding or resubmitting it.')
|
||||
args = parser.parse_args()
|
||||
|
||||
with delivery_locks():
|
||||
if not args.verify_existing:
|
||||
if work.exists() or final.exists():
|
||||
raise SystemExit('Packaging work or final package already exists; inspect before retrying')
|
||||
work.mkdir(parents=True)
|
||||
release.mkdir(parents=True, exist_ok=True)
|
||||
proof.mkdir(parents=True, exist_ok=True)
|
||||
formal = pathlib.Path(PRODUCT['installationPath'])
|
||||
info = validate_app(formal, PRODUCT['bundleIdentifier'])
|
||||
assert info['CFBundleShortVersionString'] == version and info['CFBundleVersion'] == PRODUCT['build']
|
||||
assert installer_identity in run(['security', 'find-identity', '-v', '-p', 'basic', keychain])
|
||||
template = work / 'input/大鱼磨皮瘦脸'
|
||||
manifest = []
|
||||
for source in sorted(source_template.rglob('*')):
|
||||
if source.is_file() and source.name != '.DS_Store':
|
||||
target = template / source.relative_to(source_template)
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.copyfile(source, target)
|
||||
if source.stat().st_flags & 2:
|
||||
run(['chflags', 'uchg', str(target)])
|
||||
manifest.append({'file': str(source.relative_to(source_template)), 'sha256': hashlib.sha256(source.read_bytes()).hexdigest(), 'locked': bool(source.stat().st_flags & 2)})
|
||||
assert len(manifest) == 4 and len(list(template.rglob('*.moef'))) == 1
|
||||
base = work / 'base' / package_name
|
||||
base.parent.mkdir()
|
||||
print('PKG Forge: generating signed/notarized base installer from the formal APP and installed Motion category.', flush=True)
|
||||
run([cli, 'inspect', str(formal), str(template)], proof / 'pkgforge-inspect.txt')
|
||||
run([cli, 'package', '--name', PRODUCT['name'], '--version', version, '--identifier-prefix', 'com.dayu.fcppackage', '--signing-identity', installer_identity, '--notary-profile', 'codex-dayu-notary-B3W25FX5H5', '--keychain', keychain, '--output', str(base), str(formal), str(template)], proof / 'pkgforge.txt')
|
||||
run(['pkgutil', '--check-signature', str(base)])
|
||||
run(['xcrun', 'stapler', 'validate', str(base)])
|
||||
expanded = work / 'expanded'
|
||||
run(['pkgutil', '--expand', str(base), str(expanded)])
|
||||
script = expanded / 'Payload.pkg/Scripts/postinstall'
|
||||
script.write_text(inject_migration(script.read_text()))
|
||||
run(['/bin/zsh', '-n', str(script)])
|
||||
# PKG Forge owns the payload/template/update scripts. Only the product's
|
||||
# identity migration is added, then the complete result is signed afresh.
|
||||
unsigned = work / 'migration-unsigned.pkg'
|
||||
run(['pkgutil', '--flatten', str(expanded), str(unsigned)])
|
||||
run(['productsign', '--sign', installer_identity, '--keychain', keychain, '--timestamp', str(unsigned), str(final)], proof / 'pkg-signing.txt')
|
||||
print('Submitting the final migration installer to Apple notarization.', flush=True)
|
||||
result = json.loads(run(['xcrun', 'notarytool', 'submit', str(final), '--keychain-profile', 'codex-dayu-notary-B3W25FX5H5', '--keychain', keychain, '--wait', '--output-format', 'json']))
|
||||
(proof / 'pkg-notarization.json').write_text(json.dumps(result, indent=2) + '\n')
|
||||
if result.get('status') != 'Accepted':
|
||||
raise RuntimeError('Final migration package notarization was not Accepted')
|
||||
run(['xcrun', 'stapler', 'staple', str(final)], proof / 'pkg-staple.txt')
|
||||
run(['xcrun', 'stapler', 'validate', str(final)])
|
||||
run(['pkgutil', '--check-signature', str(final)], proof / 'pkg-signature.txt')
|
||||
run(['spctl', '-a', '-vv', '-t', 'install', str(final)], proof / 'pkg-gatekeeper.txt')
|
||||
else:
|
||||
if not work.exists() or not final.exists():
|
||||
raise RuntimeError('No prepared package to verify')
|
||||
formal = pathlib.Path(PRODUCT['installationPath'])
|
||||
info = validate_app(formal, PRODUCT['bundleIdentifier'])
|
||||
assert info['CFBundleShortVersionString'] == version and info['CFBundleVersion'] == PRODUCT['build']
|
||||
result = json.loads((proof / 'pkg-notarization.json').read_text())
|
||||
assert result['status'] == 'Accepted'
|
||||
run(['xcrun', 'stapler', 'validate', str(final)])
|
||||
run(['pkgutil', '--check-signature', str(final)])
|
||||
run(['spctl', '-a', '-vv', '-t', 'install', str(final)])
|
||||
template = work / 'input/大鱼磨皮瘦脸'
|
||||
manifest = [{'file': str(p.relative_to(template)), 'sha256': hashlib.sha256(p.read_bytes()).hexdigest(), 'locked': bool(p.stat().st_flags & 2)} for p in sorted(template.rglob('*')) if p.is_file()]
|
||||
assert len(manifest) == 4
|
||||
full = work / 'full'
|
||||
try:
|
||||
run(['pkgutil', '--expand-full', str(final), str(full)])
|
||||
run([sys.executable, 'scripts/verify-release-package.py', '--version', version, '--build', PRODUCT['build'], '--expanded', str(full), '--fixture', 'build/pkg-isolation-' + version], proof / 'pkg-verification-output.txt')
|
||||
env = dict(os.environ, FCP_BEAUTYGIRL_POSTINSTALL=str(full / 'Payload.pkg/Scripts/postinstall'))
|
||||
run([sys.executable, 'tests/installer_identity_tests.py'], proof / 'installer-tests.txt', env=env)
|
||||
finally:
|
||||
if full.exists():
|
||||
run(['chflags', '-R', 'nouchg', str(full)])
|
||||
shutil.rmtree(full)
|
||||
receipt = {'status': 'verified', 'version': version, 'build': PRODUCT['build'], 'package': str(final.relative_to(ROOT)), 'bytes': final.stat().st_size, 'sha256': hashlib.sha256(final.read_bytes()).hexdigest(), 'sourceApp': str(formal), 'sourceCommit': json.loads((ROOT / 'build/delivery/delivery-receipt.json').read_text())['source']['commit'], 'motionSource': str(source_template), 'motionFiles': manifest, 'packager': cli, 'productMigration': 'PKG Forge base plus identity-checked backup/rollback block; final package freshly signed, notarized and stapled', 'notarization': result, 'realInstallerExecuted': False}
|
||||
(proof / 'pkg-delivery.json').write_text(json.dumps(receipt, ensure_ascii=False, indent=2) + '\n')
|
||||
run(['chflags', '-R', 'nouchg', str(work)])
|
||||
shutil.rmtree(work)
|
||||
print(json.dumps(receipt, ensure_ascii=False), flush=True)
|
||||
@@ -0,0 +1,81 @@
|
||||
"""Shared product identity and reversible, identity-checked legacy APP migration."""
|
||||
import contextlib, json, os, pathlib, plistlib, shutil, subprocess
|
||||
|
||||
ROOT = pathlib.Path(__file__).resolve().parent.parent
|
||||
PRODUCT = json.loads((ROOT / 'product.json').read_text())
|
||||
|
||||
def validate_app(path, bundle_id, team=PRODUCT['teamIdentifier']):
|
||||
path = pathlib.Path(path)
|
||||
info = plistlib.loads((path / 'Contents/Info.plist').read_bytes())
|
||||
if info.get('CFBundleIdentifier') != bundle_id:
|
||||
raise RuntimeError('APP identity mismatch: ' + str(path))
|
||||
subprocess.run(['codesign', '--verify', '--all-architectures', '--deep', '--strict', str(path)], check=True, capture_output=True)
|
||||
signature = subprocess.run(['codesign', '-dvvv', str(path)], check=True, text=True, capture_output=True).stderr
|
||||
if ('TeamIdentifier=' + team) not in signature:
|
||||
raise RuntimeError('APP signing team mismatch: ' + str(path))
|
||||
plugins = list((path / 'Contents/PlugIns').glob('*.pluginkit'))
|
||||
if not any(PRODUCT['filterUUID'] in [p.get('uuid') for p in plistlib.loads((plugin / 'Contents/Info.plist').read_bytes()).get('ProPlugPlugInList', [])] for plugin in plugins):
|
||||
raise RuntimeError('APP does not contain this product filter UUID: ' + str(path))
|
||||
return info
|
||||
|
||||
@contextlib.contextmanager
|
||||
def delivery_locks(product=PRODUCT):
|
||||
"""Hold both old and new identity locks throughout an identity migration."""
|
||||
base = pathlib.Path('/Users/dayu/.codex/app-delivery-locks')
|
||||
base.mkdir(parents=True, exist_ok=True)
|
||||
held = []
|
||||
try:
|
||||
for bundle_id in sorted({product['bundleIdentifier']} | {p['bundleIdentifier'] for p in product.get('legacyProducts', [])}):
|
||||
lock = base / (bundle_id + '.lock')
|
||||
lock.mkdir()
|
||||
held.append(lock)
|
||||
(lock / 'owner.json').write_text(json.dumps({'pid': os.getpid(), 'cwd': str(ROOT), 'bundle_id': bundle_id, 'product': product['name']}))
|
||||
yield
|
||||
finally:
|
||||
for lock in reversed(held):
|
||||
(lock / 'owner.json').unlink(missing_ok=True)
|
||||
lock.rmdir()
|
||||
|
||||
class LegacyMigration:
|
||||
def __init__(self, backup_root, *, product=PRODUCT, volume=pathlib.Path('/'), verifier=validate_app):
|
||||
self.product, self.backup_root, self.verifier = product, pathlib.Path(backup_root), verifier
|
||||
self.volume, self.moved = pathlib.Path(volume), []
|
||||
|
||||
def candidates(self):
|
||||
result = []
|
||||
for legacy in self.product.get('legacyProducts', []):
|
||||
source = self.volume / pathlib.Path(legacy['installationPath']).relative_to('/')
|
||||
if source.exists():
|
||||
self.verifier(source, legacy['bundleIdentifier'])
|
||||
backup = self.backup_root / ('legacy-' + legacy['name'] + '.app')
|
||||
if backup.exists():
|
||||
raise RuntimeError('Legacy recovery copy already exists: ' + str(backup))
|
||||
result.append((legacy, source, backup))
|
||||
return result
|
||||
|
||||
def relocate(self, unregister):
|
||||
# Validate every candidate before moving any of them.
|
||||
for legacy, source, backup in self.candidates():
|
||||
self.verifier(source, legacy['bundleIdentifier'])
|
||||
unregister(source / 'Contents/PlugIns' / legacy['pluginName'])
|
||||
backup.parent.mkdir(parents=True, exist_ok=True)
|
||||
shutil.move(str(source), str(backup))
|
||||
self.moved.append((legacy, source, backup))
|
||||
|
||||
def rollback(self, register):
|
||||
for legacy, source, backup in reversed(self.moved):
|
||||
if source.exists():
|
||||
raise RuntimeError('Refusing to overwrite a new APP during rollback: ' + str(source))
|
||||
self.verifier(backup, legacy['bundleIdentifier'])
|
||||
shutil.move(str(backup), str(source))
|
||||
register(source / 'Contents/PlugIns' / legacy['pluginName'])
|
||||
self.moved.clear()
|
||||
|
||||
def cleanup(self):
|
||||
removed = []
|
||||
for legacy, source, backup in self.moved:
|
||||
self.verifier(backup, legacy['bundleIdentifier'])
|
||||
shutil.rmtree(backup)
|
||||
removed.append(str(backup))
|
||||
self.moved.clear()
|
||||
return removed
|
||||
@@ -38,7 +38,7 @@ with zipfile.ZipFile(source_zip) as z:
|
||||
assert z.testzip() is None and any(n.endswith('/Wrapper Application/AppDelegate.m') for n in z.namelist())
|
||||
status=request('/dayu-publisher/v1/status');assert status['can_publish'] and status['can_upload'] and 'seo' in status['fields']
|
||||
source=upload('source',ROOT/'build/Dayu-Portrait-1.2.0-source.zip','application/zip')
|
||||
card=upload('card',ROOT/'beatygril/beatygril/Wrapper Application/Resources/LauncherInfo.png','image/png')
|
||||
card=upload('card',ROOT/'FCP-BeautyGirl/FCP-BeautyGirl/Wrapper Application/Resources/LauncherInfo.png','image/png')
|
||||
content=(ROOT/'releases/1.2.0/article.html').read_text().replace('{{source_url}}',html.escape(source['url'],quote=True)).replace('{{card_url}}',html.escape(card['url'],quote=True))
|
||||
seo={
|
||||
'title':{'enabled':True,'value':'大鱼人像美化 1.2.0|FCP / Motion 免费开源自动美颜插件'},
|
||||
|
||||
+4
-4
@@ -1,13 +1,13 @@
|
||||
#!/bin/zsh
|
||||
set -euo pipefail
|
||||
cd "${0:A:h:h}"
|
||||
output_dir=$(mktemp -d /tmp/paintfcp-host-tests.XXXXXX)
|
||||
output_dir=$(mktemp -d /tmp/fcp-beautygirl-host-tests.XXXXXX)
|
||||
trap 'rm -rf "$output_dir"' EXIT
|
||||
plugin_dir="$PWD/beatygril/beatygril/Plugin"
|
||||
plugin_dir="$PWD/FCP-BeautyGirl/FCP-BeautyGirl/Plugin"
|
||||
sdk_frameworks=/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks
|
||||
runtime_frameworks=/Library/Developer/Frameworks
|
||||
compiler_extra=()
|
||||
if [[ "${PAINTFCP_HOST_ASAN:-0}" == 1 ]]; then
|
||||
if [[ "${FCP_BEAUTYGIRL_HOST_ASAN:-0}" == 1 ]]; then
|
||||
compiler_extra=(-fsanitize=address -g)
|
||||
fi
|
||||
xcrun clang "${compiler_extra[@]}" -fobjc-arc -fmodules -Wall -Wextra -Wno-unused-parameter \
|
||||
@@ -16,7 +16,7 @@ xcrun clang "${compiler_extra[@]}" -fobjc-arc -fmodules -Wall -Wextra -Wno-unuse
|
||||
-Wl,-rpath,"$runtime_frameworks" \
|
||||
"$plugin_dir/PGBeautyRenderer.m" "$plugin_dir/PGFaceProcessor.m" \
|
||||
"$plugin_dir/PGInspectorState.m" "$plugin_dir/PGInspectorView.m" \
|
||||
"$plugin_dir/beatygrilPlugIn.m" tests/host_adapter_tests.m \
|
||||
"$plugin_dir/FCPBeautyGirlPlugIn.m" tests/host_adapter_tests.m \
|
||||
-framework Foundation -framework AppKit -framework CoreImage -framework CoreGraphics \
|
||||
-framework CoreMedia -framework CoreVideo -framework IOSurface -framework Metal \
|
||||
-framework Vision -framework ImageIO -framework FxPlug -framework PluginManager \
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
#!/bin/zsh
|
||||
set -euo pipefail
|
||||
cd "${0:A:h:h}"
|
||||
output_dir=$(mktemp -d /tmp/paintfcp-inspector-tests.XXXXXX)
|
||||
output_dir=$(mktemp -d /tmp/fcp-beautygirl-inspector-tests.XXXXXX)
|
||||
trap 'rm -rf "$output_dir"' EXIT
|
||||
plugin_dir="$PWD/beatygril/beatygril/Plugin"
|
||||
plugin_dir="$PWD/FCP-BeautyGirl/FCP-BeautyGirl/Plugin"
|
||||
compiler_extra=()
|
||||
if [[ "${PAINTFCP_INSPECTOR_ASAN:-0}" == 1 ]]; then
|
||||
if [[ "${FCP_BEAUTYGIRL_INSPECTOR_ASAN:-0}" == 1 ]]; then
|
||||
compiler_extra=(-fsanitize=address -g)
|
||||
fi
|
||||
python3 scripts/inspector-template.py audit 'Templates/大鱼人像美化/大鱼人像美化.moef' \
|
||||
@@ -16,7 +16,7 @@ xcrun clang "${compiler_extra[@]}" -fobjc-arc -fmodules -Wall -Wextra -Wno-unuse
|
||||
-Wl,-rpath,/Library/Developer/Frameworks \
|
||||
"$plugin_dir/PGBeautyRenderer.m" "$plugin_dir/PGFaceProcessor.m" \
|
||||
"$plugin_dir/PGInspectorState.m" "$plugin_dir/PGInspectorView.m" \
|
||||
"$plugin_dir/beatygrilPlugIn.m" tests/inspector_tests.m \
|
||||
"$plugin_dir/FCPBeautyGirlPlugIn.m" tests/inspector_tests.m \
|
||||
-framework Foundation -framework AppKit -framework CoreImage -framework CoreGraphics \
|
||||
-framework CoreMedia -framework CoreVideo -framework IOSurface -framework Metal \
|
||||
-framework Vision -framework ImageIO -framework FxPlug -framework PluginManager \
|
||||
|
||||
+3
-3
@@ -1,13 +1,13 @@
|
||||
#!/bin/zsh
|
||||
set -euo pipefail
|
||||
cd "${0:A:h:h}"
|
||||
output_dir=$(mktemp -d /tmp/paintfcp-osc-tests.XXXXXX)
|
||||
output_dir=$(mktemp -d /tmp/fcp-beautygirl-osc-tests.XXXXXX)
|
||||
trap 'rm -rf "$output_dir"' EXIT
|
||||
plugin_dir="$PWD/beatygril/beatygril/Plugin"
|
||||
plugin_dir="$PWD/FCP-BeautyGirl/FCP-BeautyGirl/Plugin"
|
||||
sdk_frameworks=/Library/Developer/SDKs/FxPlug.sdk/Library/Frameworks
|
||||
runtime_frameworks=/Library/Developer/Frameworks
|
||||
compiler_extra=()
|
||||
if [[ "${PAINTFCP_OSC_ASAN:-0}" == 1 ]]; then
|
||||
if [[ "${FCP_BEAUTYGIRL_OSC_ASAN:-0}" == 1 ]]; then
|
||||
compiler_extra=(-fsanitize=address -g)
|
||||
fi
|
||||
xcrun clang "${compiler_extra[@]}" -fobjc-arc -fmodules -Wall -Wextra -Wno-unused-parameter \
|
||||
|
||||
+2
-2
@@ -1,9 +1,9 @@
|
||||
#!/bin/zsh
|
||||
set -euo pipefail
|
||||
cd "${0:A:h:h}"
|
||||
output_dir=$(mktemp -d /tmp/paintfcp-tests.XXXXXX)
|
||||
output_dir=$(mktemp -d /tmp/fcp-beautygirl-tests.XXXXXX)
|
||||
trap 'rm -rf "$output_dir"' EXIT
|
||||
plugin_dir="$PWD/beatygril/beatygril/Plugin"
|
||||
plugin_dir="$PWD/FCP-BeautyGirl/FCP-BeautyGirl/Plugin"
|
||||
common=(-fobjc-arc -fmodules -Wall -Wextra -Wno-unused-parameter -DCI_SILENCE_GL_DEPRECATION -mmacosx-version-min=13.0 -I "$plugin_dir" -framework Foundation -framework CoreImage -framework CoreGraphics -framework CoreMedia -framework Metal -framework Vision -framework ImageIO)
|
||||
xcrun clang "${common[@]}" "$plugin_dir/PGBeautyRenderer.m" tests/beauty_render_tests.m -o "$output_dir/beauty-tests"
|
||||
"$output_dir/beauty-tests"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
Only --publish performs writes. Credentials stay in memory and go only to Dayu.
|
||||
"""
|
||||
import argparse, base64, hashlib, html, json, pathlib, ssl, subprocess, urllib.parse, urllib.request, uuid, zipfile
|
||||
from product_identity import PRODUCT
|
||||
|
||||
parser = argparse.ArgumentParser(description=__doc__)
|
||||
parser.add_argument('--version', required=True)
|
||||
@@ -49,8 +50,8 @@ if not args.publish:
|
||||
raise SystemExit(0)
|
||||
baseline = json.loads((work / 'article-before.json').read_text())['article']
|
||||
payload = json.loads((release / 'article-payload.json').read_text())
|
||||
package = release / ('大鱼人像美化-' + args.version + '.pkg')
|
||||
source = root / 'build' / ('Dayu-Portrait-' + args.version + '-source.zip')
|
||||
package = release / (PRODUCT['name'] + '-' + args.version + '.pkg')
|
||||
source = root / 'build' / (PRODUCT['name'] + '-' + args.version + '-source.zip')
|
||||
with zipfile.ZipFile(source) as z:
|
||||
assert z.testzip() is None and any(n.endswith('/Wrapper Application/AppDelegate.m') for n in z.namelist())
|
||||
assert not any(n.endswith(('.app', '.pkg', '.p12', '.key', '.env')) for n in z.namelist())
|
||||
@@ -77,7 +78,7 @@ assert '{{' not in payload['content']
|
||||
if not state.get('response'):
|
||||
boundary = 'DayuRelease' + state['idempotencyKey'].replace('-', '')
|
||||
parts = []
|
||||
for name, data, filename, mime in [('payload', json.dumps(payload, ensure_ascii=False).encode(), None, 'application/json'), ('package', package.read_bytes(), 'Dayu-Portrait-' + args.version + '.pkg', 'application/octet-stream')]:
|
||||
for name, data, filename, mime in [('payload', json.dumps(payload, ensure_ascii=False).encode(), None, 'application/json'), ('package', package.read_bytes(), package.name, 'application/octet-stream')]:
|
||||
head = '--' + boundary + '\r\nContent-Disposition: form-data; name="' + name + '"'
|
||||
if filename:
|
||||
head += '; filename="' + filename + '"'
|
||||
|
||||
已加载 100/105 个文件。由于本次变更涉及的文件过多,其余文件未显示。
显示更多
在新工单中引用
屏蔽一个用户