Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 8 additions & 16 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ jobs:
- uses: actions/setup-node@v7.0.0
with:
node-version: "22"
- name: Validate shared Microsoft Store and Google Play descriptions
- name: Validate shared Microsoft Store and Google Play listings and images
run: |
node --test scripts/tests/store_listings.test.mjs scripts/tests/google_play_listings.test.mjs
node scripts/store_listings.mjs > store-listings-preview.json
- uses: actions/upload-artifact@v7.0.1
with:
name: store-listings-en-vi
name: store-listings
path: store-listings-preview.json

# Generate release notes from commits
Expand Down Expand Up @@ -455,7 +455,7 @@ jobs:
name: windows-msix
path: ${{ env.PROJECT_DIR }}/build/windows/msix/*.msix

- name: Create Partner Center submission archive
- name: Locate MSIX for Partner Center submission
shell: pwsh
run: |
$version = "${{ needs.generate-release-notes.outputs.version_name }}"
Expand All @@ -465,20 +465,11 @@ jobs:
throw "MSIX package not found in ${{ env.PROJECT_DIR }}/build/windows/msix"
}

$stageDir = Join-Path $env:RUNNER_TEMP "msix-store-submit"
New-Item -ItemType Directory -Force -Path $stageDir | Out-Null
# partner_center_msix.mjs builds the submission ZIP (package + listing images).
"PARTNER_CENTER_PACKAGE_PATH=$($source.FullName)" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"PARTNER_CENTER_PACKAGE_FILE_NAME=CBFileHub-$version-$msixVersion.msix" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

$packageFileName = "CBFileHub-$version-$msixVersion.msix"
$storePackagePath = Join-Path $stageDir $packageFileName
Copy-Item -LiteralPath $source.FullName -Destination $storePackagePath -Force

$archivePath = Join-Path $env:RUNNER_TEMP "CBFileHub-$version-$msixVersion-store.zip"
Compress-Archive -LiteralPath $storePackagePath -DestinationPath $archivePath -Force

"PARTNER_CENTER_PACKAGE_ARCHIVE=$archivePath" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
"PARTNER_CENTER_PACKAGE_FILE_NAME=$packageFileName" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append

- name: Submit MSIX to Microsoft Store for automatic publishing
- name: Submit MSIX, listings and images to Microsoft Store for automatic publishing
shell: bash
env:
PARTNER_CENTER_TENANT_ID: ${{ secrets.PARTNER_CENTER_TENANT_ID }}
Expand All @@ -490,6 +481,7 @@ jobs:
PARTNER_CENTER_COMMIT_SUBMISSION: "true"
PARTNER_CENTER_TARGET_PUBLISH_MODE: "Immediate"
run: |
# Waits for Partner Center to finish processing the commit and fails on CommitFailed.
SUBMISSION_ID="$(node scripts/partner_center_msix.mjs submit)"
echo "Partner Center submission committed for automatic publishing after certification: $SUBMISSION_ID"

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ Generate promotional artwork from the captured screenshots:
python scripts\make_promo_images.py
```

The generated artwork is written to `screenshots/promo/desktop/`, `screenshots/promo/mobile/`, `screenshots/promo/tablet7/`, and the matching Vietnamese folders under `screenshots/promo/vi/`.
The generated artwork is written to `screenshots/promo/desktop/`, `screenshots/promo/mobile/`, `screenshots/promo/tablet7/`, the matching Vietnamese folders under `screenshots/promo/vi/`, Turkish and Chinese desktop promos under `screenshots/promo/tr/` and `screenshots/promo/zh/`, and the text-free Microsoft Store hero art in `screenshots/promo/store/`. Use `--desktop-only --languages tr,zh` to regenerate only some languages.

Render the English/Vietnamese Torrent dialog images with sample data from `cb_file_manager/`:

Expand All @@ -459,7 +459,7 @@ This opt-in widget capture writes `screenshots/features/torrents/en/` and `vi/`.

### Microsoft Store and Google Play descriptions

Both stores use the same concise English/Vietnamese descriptions in [`store/listings/`](store/listings/). Edit each language's `.txt` once; its bullet points also generate Microsoft Store features. The sibling `.json` holds the short description and Google Play language code. CI checks character limits and uploads a `store-listings-en-vi` preview. MSIX submissions apply the text in Partner Center; AAB submissions include it in the same Google Play edit as the app bundle. See the [content guide](store/README.md).
Both stores use the same concise descriptions in [`store/listings/`](store/listings/), one per app language (English, Vietnamese, Turkish, Simplified Chinese). Edit each language's `.txt` once; its bullet points also generate Microsoft Store features. The sibling `.json` holds the short description, Google Play language code and the Microsoft Store screenshots/hero art. CI checks text limits and image sizes and uploads a `store-listings` preview. MSIX submissions apply the text and images in Partner Center; AAB submissions include the text in the same Google Play edit as the app bundle. See the [content guide](store/README.md).

## Testing

Expand Down
2 changes: 1 addition & 1 deletion README.vi.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,4 @@ flutter test --no-pub tool/capture_torrent_screenshots_test.dart --dart-define=C

αΊ’nh được ghi vΓ o `screenshots/features/torrents/en/` vΓ  `vi/`; luα»“ng nΓ y dα»±ng widget, khΓ΄ng mở α»©ng dα»₯ng desktop hay đọc thΖ° viện torrent cα»§a người dΓΉng.

Microsoft Store vΓ  Google Play dΓΉng chung mΓ΄ tαΊ£ ngαΊ―n gọn tiαΊΏng Anh/Việt tαΊ‘i [`store/listings/`](store/listings/). Chỉ cαΊ§n sα»­a file `.txt` cα»§a tα»«ng ngΓ΄n ngα»―; cΓ‘c dΓ²ng gαΊ‘ch Δ‘αΊ§u dΓ²ng cΕ©ng tαΊ‘o danh sΓ‘ch tΓ­nh nΔƒng cho Microsoft Store. File `.json` bΓͺn cαΊ‘nh chα»©a mΓ΄ tαΊ£ ngαΊ―n vΓ  mΓ£ ngΓ΄n ngα»― Google Play. CI kiểm tra giα»›i hαΊ‘n kΓ½ tα»±, tαΊ‘o artifact `store-listings-en-vi`, rα»“i cαΊ­p nhαΊ­t nα»™i dung khi submit MSIX/AAB. Xem [hΖ°α»›ng dαΊ«n nα»™i dung](store/README.md).
Microsoft Store vΓ  Google Play dΓΉng chung mΓ΄ tαΊ£ ngαΊ―n gọn tαΊ‘i [`store/listings/`](store/listings/), mα»—i ngΓ΄n ngα»― cα»§a app mα»™t bα»™ (Anh, Việt, Thα»• NhΔ© Kα»³, Trung giαΊ£n thể). Chỉ cαΊ§n sα»­a file `.txt` cα»§a tα»«ng ngΓ΄n ngα»―; cΓ‘c dΓ²ng gαΊ‘ch Δ‘αΊ§u dΓ²ng cΕ©ng tαΊ‘o danh sΓ‘ch tΓ­nh nΔƒng cho Microsoft Store. File `.json` bΓͺn cαΊ‘nh chα»©a mΓ΄ tαΊ£ ngαΊ―n, mΓ£ ngΓ΄n ngα»― Google Play vΓ  danh sΓ‘ch αΊ£nh chα»₯p/hero art cho Microsoft Store. CI kiểm tra giα»›i hαΊ‘n kΓ½ tα»± vΓ  kΓ­ch thΖ°α»›c αΊ£nh, tαΊ‘o artifact `store-listings`, rα»“i cαΊ­p nhαΊ­t nα»™i dung (vΓ  αΊ£nh vα»›i MSIX) khi submit MSIX/AAB. Xem [hΖ°α»›ng dαΊ«n nα»™i dung](store/README.md).
2 changes: 2 additions & 0 deletions cb_file_manager/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -214,3 +214,5 @@ msix_config:
capabilities: internetClient, privateNetworkClientServer
file_extension: .torrent
protocol_activation: magnet
# UI languages; must match the Store listings in store/listings/.
languages: en-us, vi-vn, tr-tr, zh-cn
70 changes: 45 additions & 25 deletions docs/guides/02-microsoft-store-submission-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,12 +55,13 @@ Push a release tag or run the release workflow manually.

The pipeline will:

1. Validate the checked-in English/Vietnamese listing text and run mocked submission tests
2. Upload `store-listings-en-vi`, a shared JSON preview of the exact text for Microsoft Store and Google Play
3. Restore the `.pfx` from `MSIX_CERT_BASE64`, build and sign the Windows MSIX
4. Upload the `.msix` as the `windows-msix` artifact and prepare its submission archive
5. Update the Store draft's `en-us` and `vi-vn` descriptions/features and upload the package
6. Commit for certification with `targetPublishMode: Immediate`; Microsoft Store publishes automatically after approval
1. Validate the checked-in listing text and images (`en-us`, `vi-vn`, `tr-tr`, `zh-cn`) and run mocked submission tests
2. Upload `store-listings`, a shared JSON preview of the exact text and images for Microsoft Store and Google Play
3. Restore the `.pfx` from `MSIX_CERT_BASE64`, build and sign the Windows MSIX (its manifest declares the same four languages)
4. Upload the `.msix` as the `windows-msix` artifact
5. Update every listing's description, features, screenshots and hero art, then upload one ZIP with the package and any changed images
6. Commit for certification with `targetPublishMode: Immediate` and wait until Partner Center has processed the commit; the job fails on `CommitFailed` and prints Partner Center's errors/warnings
7. Microsoft Store publishes automatically after certification (this can take up to a few business days; the public listing keeps the old text and images until then)

The release workflow always sets `PARTNER_CENTER_COMMIT_SUBMISSION=true` and
`PARTNER_CENTER_TARGET_PUBLISH_MODE=Immediate`. Repository variables with those
Expand Down Expand Up @@ -102,36 +103,55 @@ For a local MSIX build submitted manually in Partner Center:
4. Complete store listing fields
5. Submit for certification

## 6. Maintain English and Vietnamese Descriptions
## 6. Maintain Listing Text and Images

Microsoft Store and Google Play share these version-controlled descriptions:
Microsoft Store and Google Play share these version-controlled listings, one per
app UI language:

| Language | Full description and feature bullets | Short description / locale metadata |
| Language | Full description and feature bullets | Short description / locale / images |
|---|---|---|
| English (`en-us`) | [`store/listings/en-us.txt`](../../store/listings/en-us.txt) | [`en-us.json`](../../store/listings/en-us.json) |
| Vietnamese (`vi-vn`) | [`store/listings/vi-vn.txt`](../../store/listings/vi-vn.txt) | [`vi-vn.json`](../../store/listings/vi-vn.json) |
| Turkish (`tr-tr`) | [`store/listings/tr-tr.txt`](../../store/listings/tr-tr.txt) | [`tr-tr.json`](../../store/listings/tr-tr.json) |
| Simplified Chinese (`zh-cn`) | [`store/listings/zh-cn.txt`](../../store/listings/zh-cn.txt) | [`zh-cn.json`](../../store/listings/zh-cn.json) |

Keep both languages concise and aligned. Lines beginning with `- ` generate
Keep all languages concise and aligned. Lines beginning with `- ` generate
Microsoft Store's features automatically, so feature text is maintained once.
The `.json` files hold `descriptionFile`, `shortDescription` and
`googlePlayLanguage`; product capabilities and platform limits live in the `.txt`.
The `.json` files hold `descriptionFile`, `shortDescription`,
`googlePlayLanguage` and `microsoftStoreImages`; product capabilities and
platform limits live in the `.txt`. The same locales are declared in the MSIX
manifest (`msix_config.languages`), so Partner Center lists them as supported
package languages; a test keeps both lists identical.

`scripts/store_listings.mjs` validates required locales, shared description length
(1–4,000 characters), short descriptions (1–80 characters), and feature bullets
(1–20 entries, at most 200 characters each). The shared limit fits
[Google Play](https://support.google.com/googleplay/android-developer/answer/9859152?hl=en)
and Microsoft Store. `scripts/partner_center_msix.mjs submit` validates the text before
authenticating or modifying a draft, then merges only `description` and `features`
into `listings[locale].baseListing`. The data shape follows the
(1–4,000 characters), short descriptions (1–80 characters), feature bullets
(1–20 entries, at most 200 characters each) and images (PNG type, dimensions per
image type, count, 50 MB, 200-character captions). `scripts/partner_center_msix.mjs submit`
validates everything before authenticating or modifying a draft, then merges
`description`, `features` and the managed `images` into
`listings[locale].baseListing`. The data shape follows the
[Microsoft Store submission API](https://learn.microsoft.com/en-us/windows/uwp/monetize/manage-app-submissions).

Existing titles, images, policy/support URLs, terms, release notes, platform
overrides and unrelated languages remain intact. If Vietnamese is new, its
listing is seeded from the existing English Store metadata before applying the
Vietnamese text. An initial Store listing with a registered title must already
Images are managed per image type: for each type listed in a locale's
`microsoftStoreImages` (by default `Screenshot` and `PromotionalArt16x9`), the
existing images of that type are marked `PendingDelete` and the checked-in ones
are added as `PendingUpload`, in order. Uploaded file names contain a content
hash, so when Partner Center still reports the same files nothing is re-uploaded.
Image types not listed (for example a manually uploaded `Icon` or Xbox art) stay
untouched. Set `PARTNER_CENTER_UPDATE_IMAGES=false` to update only text.

Existing titles, policy/support URLs, terms, release notes, platform overrides
and unrelated languages remain intact. A new language listing is seeded from the
existing English Store metadata (without English images) before applying its
text and images. An initial Store listing with a registered title must already
exist. `PARTNER_CENTER_LISTINGS_DIR` can select another content directory; release
CI explicitly uses `store/listings`.

After the commit, the script polls the submission status
(`PARTNER_CENTER_COMMIT_POLL_SECONDS`, default 30;
`PARTNER_CENTER_COMMIT_TIMEOUT_SECONDS`, default 1800). `CommitFailed` fails the
job with Partner Center's error list; a timeout only emits a warning.

Preview and test locally from the repository root without Store credentials or
network requests:

Expand All @@ -141,8 +161,8 @@ node --test scripts/tests/store_listings.test.mjs scripts/tests/google_play_list
```

PR/push CI validates the content. Release jobs wait for the same checks and
upload a `store-listings-en-vi` preview containing payloads for both stores.
Google Play's AAB job prepares an uncommitted edit with both descriptions and
upload a `store-listings` preview containing payloads for both stores.
Google Play's AAB job prepares an uncommitted edit with every description and
passes its ID to `upload-google-play`; that action uploads the AAB and commits
the descriptions with the release. Failed updates/uploads discard the edit.
Internal app sharing skips listing updates because it has no store release edit.
Expand All @@ -167,4 +187,4 @@ flutter test --no-pub tool/capture_torrent_screenshots_test.dart --dart-define=C

This is an opt-in widget renderer. It does not launch the Windows app, scan user
data, contact trackers or download payloads. README screenshots are independent
of existing Store image assets, which this description update preserves.
of the Store images, which come from `screenshots/promo/` (see section 6).
Binary file added screenshots/promo/desktop/11_torrent_library.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/desktop/12_tag_assignment.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/store/hero_16x9.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/tr/desktop/08_etiket_agaci.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/tr/desktop/12_etiketleme.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/vi/desktop/12_gan_tag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/02_tuku.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/04_ai_sousuo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/05_ai_shenhe.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/06_ai_duihua.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/08_biaoqian_shu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/10_cipan_qingli.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added screenshots/promo/zh/desktop/11_zhongzi_ku.png
Loading
Loading