120 lines
4.1 KiB
Go
120 lines
4.1 KiB
Go
|
|
//go:build llm_script
|
|||
|
|
|
|||
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"regexp"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
defaultBytedanceCodingPlanURL = "https://developer.volcengine.com/articles/7574419773204004906"
|
|||
|
|
defaultBytedanceCodingPlanNotice = "https://developer.volcengine.com/articles/7604465649330749490"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func parseBytedanceSubscriptionCatalog(pricingRaw string, noticeRaw string) ([]subscriptionImportRecord, error) {
|
|||
|
|
publishedAt, known := publishedAtFromText(firstNonEmptyText(pricingRaw, noticeRaw))
|
|||
|
|
liteSection := sliceSection(pricingRaw, "Lite 套餐", "Pro 套餐")
|
|||
|
|
proSection := sliceSection(pricingRaw, "Pro 套餐", "")
|
|||
|
|
if strings.TrimSpace(liteSection) == "" || strings.TrimSpace(proSection) == "" {
|
|||
|
|
return nil, fmt.Errorf("unexpected bytedance coding plan sections")
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
promoNote := "新用户首购优惠。"
|
|||
|
|
if strings.Contains(noticeRaw, "每日 10:30") {
|
|||
|
|
promoNote = "新用户首购优惠,每日 10:30 限量开放。"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
records := make([]subscriptionImportRecord, 0, 4)
|
|||
|
|
for _, tierSection := range []struct {
|
|||
|
|
Tier string
|
|||
|
|
Content string
|
|||
|
|
}{
|
|||
|
|
{Tier: "Lite", Content: liteSection},
|
|||
|
|
{Tier: "Pro", Content: proSection},
|
|||
|
|
} {
|
|||
|
|
tier := tierSection.Tier
|
|||
|
|
section := strings.TrimSpace(tierSection.Content)
|
|||
|
|
lines := strings.Split(section, "\n")
|
|||
|
|
scene := ""
|
|||
|
|
for _, line := range lines {
|
|||
|
|
line = strings.TrimSpace(line)
|
|||
|
|
if line != "" {
|
|||
|
|
scene = line
|
|||
|
|
break
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
pricePattern := regexp.MustCompile(`([\d.]+)\s+元\s+([\d.]+)\s+元/月`)
|
|||
|
|
priceMatch := pricePattern.FindStringSubmatch(section)
|
|||
|
|
if len(priceMatch) != 3 {
|
|||
|
|
return nil, fmt.Errorf("missing bytedance %s prices", tier)
|
|||
|
|
}
|
|||
|
|
quotaPattern := regexp.MustCompile(`每月约\s+([\d,]+)\s+次请求`)
|
|||
|
|
quotaMatch := quotaPattern.FindStringSubmatch(section)
|
|||
|
|
if len(quotaMatch) != 2 {
|
|||
|
|
return nil, fmt.Errorf("missing bytedance %s monthly quota", tier)
|
|||
|
|
}
|
|||
|
|
promoPrice := mustParseSubscriptionPrice(priceMatch[1])
|
|||
|
|
standardPrice := mustParseSubscriptionPrice(priceMatch[2])
|
|||
|
|
monthlyQuota := mustParseSubscriptionInt64(quotaMatch[1])
|
|||
|
|
tierCode := strings.ToLower(tier)
|
|||
|
|
|
|||
|
|
records = append(records, subscriptionImportRecord{
|
|||
|
|
ProviderName: "ByteDance",
|
|||
|
|
ProviderNameCn: "字节跳动",
|
|||
|
|
ProviderCountry: "CN",
|
|||
|
|
ProviderWebsite: "https://www.volcengine.com",
|
|||
|
|
OperatorName: "ByteDance Volcano",
|
|||
|
|
OperatorNameCn: "火山引擎",
|
|||
|
|
OperatorCountry: "CN",
|
|||
|
|
OperatorWebsite: "https://developer.volcengine.com",
|
|||
|
|
OperatorType: "cloud",
|
|||
|
|
PlanFamily: "coding_plan",
|
|||
|
|
PlanCode: "bytedance-coding-plan-" + tierCode,
|
|||
|
|
PlanName: "方舟 Coding Plan " + tier,
|
|||
|
|
Tier: tier,
|
|||
|
|
BillingCycle: "monthly",
|
|||
|
|
Currency: "CNY",
|
|||
|
|
ListPrice: standardPrice,
|
|||
|
|
PriceUnit: "CNY/month",
|
|||
|
|
QuotaValue: monthlyQuota,
|
|||
|
|
QuotaUnit: "requests/month",
|
|||
|
|
PlanScope: "方舟 Coding Plan",
|
|||
|
|
SourceURL: defaultBytedanceCodingPlanURL,
|
|||
|
|
PublishedAt: publishedAt,
|
|||
|
|
EffectiveDate: effectiveDateFromPublishedAt(publishedAt),
|
|||
|
|
Notes: scene + ";续费标准价。",
|
|||
|
|
PublishedAtKnown: known,
|
|||
|
|
})
|
|||
|
|
records = append(records, subscriptionImportRecord{
|
|||
|
|
ProviderName: "ByteDance",
|
|||
|
|
ProviderNameCn: "字节跳动",
|
|||
|
|
ProviderCountry: "CN",
|
|||
|
|
ProviderWebsite: "https://www.volcengine.com",
|
|||
|
|
OperatorName: "ByteDance Volcano",
|
|||
|
|
OperatorNameCn: "火山引擎",
|
|||
|
|
OperatorCountry: "CN",
|
|||
|
|
OperatorWebsite: "https://developer.volcengine.com",
|
|||
|
|
OperatorType: "cloud",
|
|||
|
|
PlanFamily: "coding_plan",
|
|||
|
|
PlanCode: "bytedance-coding-plan-" + tierCode + "-first-month",
|
|||
|
|
PlanName: "方舟 Coding Plan " + tier + " 首月活动版",
|
|||
|
|
Tier: tier + " Promo",
|
|||
|
|
BillingCycle: "monthly",
|
|||
|
|
Currency: "CNY",
|
|||
|
|
ListPrice: promoPrice,
|
|||
|
|
PriceUnit: "CNY/month",
|
|||
|
|
QuotaValue: monthlyQuota,
|
|||
|
|
QuotaUnit: "requests/month",
|
|||
|
|
PlanScope: "方舟 Coding Plan",
|
|||
|
|
SourceURL: defaultBytedanceCodingPlanURL,
|
|||
|
|
PublishedAt: publishedAt,
|
|||
|
|
EffectiveDate: effectiveDateFromPublishedAt(publishedAt),
|
|||
|
|
Notes: scene + ";" + promoNote,
|
|||
|
|
PublishedAtKnown: known,
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
return records, nil
|
|||
|
|
}
|