Skip to content

feat: Alpha2beta#166

Merged
mkdir700 merged 12 commits intobetafrom
alpha2beta
Sep 14, 2025
Merged

feat: Alpha2beta#166
mkdir700 merged 12 commits intobetafrom
alpha2beta

Conversation

@mkdir700
Copy link
Owner

@mkdir700 mkdir700 commented Sep 14, 2025

Summary by CodeRabbit

  • New Features
    • FFmpeg management: new Plugins settings page with download/uninstall, progress, warmup, path validation, and auto-prompt on need.
  • Improvements
    • Windows builds add ARM64 support; slimmer app bundle.
    • Native title bar on Windows/Linux; refined macOS title bar.
    • Simplified update dialog; improved video file relocation.
    • Smoother seeking with subtitle cue sync; reduced log noise.
    • Global removal of button shadows; navbar spacing simplified.
  • Localization
    • Extensive EN/ZH updates for FFmpeg, player errors, search, home, and shortcuts.
  • Shortcuts
    • Removed subtitle display mode shortcuts.
  • Chores
    • New workflow to mirror releases to GitCode.

mkdir700 and others added 12 commits September 14, 2025 14:22
…#152)

- Remove detail parameter from system MessageBox to prevent window overflow
- Display only essential update information with version number
- Direct users to Settings > About page for full release notes
- Remove unused formatReleaseNotes method and ReleaseNoteInfo interface

Fixes issue where long release notes caused system dialog to overflow screen height, hiding the Install button.
Remove all keyboard shortcuts for subtitle display modes:
- subtitle_mode_none (Cmd/Ctrl+1)
- subtitle_mode_original (Cmd/Ctrl+2)
- subtitle_mode_translated (Cmd/Ctrl+3)
- subtitle_mode_bilingual (Cmd/Ctrl+4)

Changes:
- Remove shortcut configurations from DEFAULT_SHORTCUTS
- Remove shortcut handlers from usePlayerShortcuts hook
- Remove i18n label references
- Clean up unused imports and fix formatting

Users can still change subtitle display modes through the UI interface.
…ncy logging (#156)

- Reduce Logger export history from 10k to 1k entries and add automatic cleanup
- Implement lightweight serialization to replace deep serialization
- Add sampling strategy for high-frequency logs (time_update, MediaClock events)
- Disable export history completely in production environment
- Optimize MediaClock logging with 5-10% sampling for duplicates and debug messages
- Reduce PlayerOrchestrator trace buffer from 200 to 50 entries
- Remove high-frequency onTimeUpdate silly logs
- Implement stricter production log levels (WARN+ for renderer, ERROR+ for main process)

This should significantly reduce memory pressure from logger-related objects
as identified in Chrome DevTools memory analysis.
…e state sync (#153)

* fix(subtitle): resolve overlay pause/seek update delays with immediate state sync

- Add immediate store updates in PlayerOrchestrator during seek/jumpToCue
- Implement UserSeeking state in PlayerSettingsSaver to prevent conflicts
- Ensure subtitle overlay UI responds instantly to user interactions
- Maintain data consistency during user-initiated time changes

* Update src/renderer/src/pages/player/engine/PlayerOrchestrator.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update src/renderer/src/services/PlayerSettingsSaver.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* fix(player): resolve seeking event mismatch causing duplicate subtitle jumps

- Add missing mediaClock.startSeeking() call in PlayerOrchestrator.onSeeking()
- Fix SeekEventCoordinator state inconsistency between start/end seeking events
- Eliminate 'Ignoring seeked without active seeking' warnings in console
- Ensure proper event sequence for both paused and playing states
- All 66 player engine tests pass with TypeScript and lint validation

Resolves issue where users needed to press subtitle buttons twice in paused state.

* refactor(player): Use destroyOnHidden instead of destoryOnClose.

* fix(player): prevent SubtitleSyncStrategy from overriding user subtitle jumps

- Lock subtitle state machine for 2 seconds after user subtitle jump
- Prevent SubtitleSyncStrategy from immediately overriding user selection
- Add automatic unlock mechanism to restore normal subtitle sync behavior
- Ensure 'goToNextSubtitle' respects user intent in paused state
- Fix seeking event coordination in PlayerOrchestrator.onSeeking()

Resolves the core issue where clicking to jump to a subtitle would
be immediately overridden by the subtitle sync strategy, requiring
users to click twice to achieve their intended jump.

* fix(subtitle): eliminate subtitle content flickering during jumps

- Add activeCueIndex to PlayerState and StateUpdater interface
- Sync PlayerOrchestrator's activeCueIndex to store on updates
- Modify useSubtitleEngine to prioritize store's activeCueIndex over time-based calculation
- Ensure SubtitleContent component uses authoritative subtitle index
- Fix initial activeCueIndex synchronization on StateUpdater connection

Resolves flickering where subtitle content would briefly show wrong subtitle
before displaying the correct one during user-initiated subtitle jumps.

* fix(subtitle): eliminate subtitle overlay flickering during jumps

- Add smart tolerance mechanism to useSubtitleOverlay shouldShow calculation
- Display overlay when currentTime is within 2 seconds of subtitle start time
- Handles user jump delays while preserving smooth normal playback behavior
- Fixes flickering issue where overlay would briefly hide during subtitle navigation

Closes final flickering issue in subtitle navigation system.

* fix(subtitle): resolve overlay flickering through index priority and data stabilization

- Add stable subtitle data memoization in useSubtitleOverlay to prevent unnecessary re-renders
- Prioritize currentIndex over time-based checks in shouldShow calculation
- Reorder PlayerOrchestrator lock sequence to ensure SubtitleLockFSM is active during updateContext
- Implement granular dependency tracking for subtitle content changes

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
…anagement (#155)

* feat(ffmpeg): implement dynamic FFmpeg download system with runtime management

- Remove static FFmpeg bundling from build configuration
- Add FFmpegDownloadService for cross-platform binary management
- Implement automatic platform detection (Windows/macOS/Linux, x64/ARM64)
- Add IPC channels for download progress monitoring and control
- Integrate download service with existing FFmpegService architecture
- Update build scripts to remove prebuild FFmpeg requirements
- Add comprehensive test coverage for download functionality

Changes:
- electron-builder.yml: Remove extraResources FFmpeg bundling
- package.json: Remove prebuild FFmpeg download from release scripts
- FFmpegDownloadService.ts: New service with download/extract/management capabilities
- FFmpegService.ts: Enhanced with download service integration and fallback logic
- IpcChannel.ts: Add 9 new channels for download operations
- ipc.ts: Register download service handlers for renderer communication
- preload/index.ts: Expose download APIs to renderer process
- useVideoFileSelect.ts: Updated to work with dynamic FFmpeg detection

This implementation enables on-demand FFmpeg installation, reducing app bundle
size by ~200MB while maintaining cross-platform compatibility and user experience.
The system gracefully falls back to bundled → downloaded → system FFmpeg.

* feat(settings): implement FFmpeg settings UI with download management

- Add new FFmpegSettings component with status indicator and download controls
- Remove deprecated FFmpeg build plugin from electron.vite.config.ts
- Enhance IndicatorLight component with proper CSS-in-JS animation syntax
- Add comprehensive i18n support for FFmpeg management (en-us, zh-cn)
- Remove box-shadow from ant-btn components for cleaner UI appearance
- Integrate FFmpeg settings into main SettingsPage navigation

Changes:
- FFmpegSettings.tsx: Complete UI implementation with download progress, path validation, and status management
- electron.vite.config.ts: Remove build-time FFmpeg download plugin (shift to runtime approach)
- IndicatorLight.tsx: Fix styled-components animation with proper css helper
- i18n locales: Add 61 new translation keys for FFmpeg settings UI
- ant.scss: Remove button shadows for consistent design system
- SettingsPage.tsx: Add FFmpeg settings tab integration

This implements the frontend interface for the dynamic FFmpeg download system,
providing users with a comprehensive management UI for FFmpeg installation,
status monitoring, and path configuration.

* feat(ffmpeg): implement FFmpeg guidance dialog for enhanced user experience

Add comprehensive FFmpeg download guidance system that transforms technical errors
into user-friendly guidance with seamless navigation to settings and auto-download.

**Components Added:**
- FFmpegDownloadPrompt: Full-featured guidance dialog with benefits, effort info, and actions
- Comprehensive internationalization support (zh-CN, en-US)

**Hook Enhancements:**
- useVideoFileSelect: Extended with FFmpeg prompt state management
- Replaced technical error throwing with guided dialog display
- Enhanced error detection for FFmpeg missing scenarios

**Integration Updates:**
- HomePage: State management for prompt visibility and component integration
- EmptyState/VideoAddButton: Bidirectional state communication with parent
- HeaderNavbar: Props forwarding for prompt handler

**Features:**
- Benefits explanation (compatibility, performance, reliability)
- Installation effort communication
- Auto-navigation to settings with download trigger
- Seamless integration with existing video file selection workflow
- Graceful error handling with user-centric messaging

**Technical Details:**
- Styled-components with theme variables and CSS custom properties
- Modal-based UI with responsive design and accessibility
- State management across component hierarchy
- URL parameter-based auto-download triggering
- Comprehensive TypeScript interfaces

Transforms "视频处理组件未安装" technical errors into guided user experience
that educates users about FFmpeg benefits and provides immediate resolution path.

* test: fix FFmpegService mock for dynamic download system

- Add getDownloadService method to FFmpegService mock
- Include all FFmpegDownloadService interface methods in mock
- Fix 43 failing test cases caused by missing mock method
- All 554 test cases now pass successfully

Resolves test failures introduced by FFmpeg dynamic download system implementation.

* test: fix cross-platform FFmpeg executable name test

- Update test to handle platform-specific executable names (ffmpeg vs ffmpeg.exe)
- Fix Windows CI test failure where test expected 'ffmpeg' but got 'ffmpeg.exe'
- Test now correctly validates system FFmpeg fallback behavior on all platforms
- Maintains test coverage while supporting cross-platform compatibility

Resolves Windows CI test failure in FFmpegService integration tests.
- Add arm64 architecture support for Windows NSIS installer target
- Add arm64 architecture support for Windows Portable target
- Align Windows build targets with existing macOS and Linux ARM64 support
- Enable native ARM64 builds for Windows on ARM devices

This change allows the application to run natively on Windows ARM64 devices,
providing better performance and compatibility for users with ARM-based Windows machines.
- Configure Windows and Linux to use native system title bars instead of custom titleBarOverlay
- Remove excessive padding-right in Navbar component (140px for Windows, 120px for Linux)
- Maintain custom title bar for macOS with traffic light buttons integration
- Update ThemeService to only apply titleBarOverlay changes to macOS windows
- Simplify Navbar styling to use consistent 12px padding across all platforms

This change eliminates the spacing issue in the Windows header area and provides
a more native user experience on Windows and Linux platforms.

Fixes the header spacing issue reported for Windows platform.
…elease (#160)

- Remove pre-release-check.ts script with version validation and Git status checks
- Remove release.ts script with interactive version selection and build automation
- Remove rename-artifacts.ts script with platform-specific file renaming logic
- Remove version-manager.ts script with semver version bumping functionality
- Clean up package.json scripts: remove version:*, release:*, and related commands
- Retain semantic-release configuration and migrate:* database commands
- Transition from custom release tooling to standardized semantic-release workflow

The removed scripts provided manual release management including:
- Interactive version type selection (patch/minor/major/prerelease/beta)
- Git status validation and commit automation
- Cross-platform artifact renaming (Windows/macOS/Linux)
- Build orchestration and publishing workflows

This refactoring simplifies the release process by adopting semantic-release
as the single source of truth for version management and automated publishing,
reducing maintenance overhead and improving consistency with modern CI/CD practices.
- Replace find() with filter() + sort() to get the latest matching release
- Increase API request limit from 8 to 20 releases for better coverage
- Add proper sorting by published_at timestamp to ensure latest version
- Enhance logging for better debugging of version detection process

Fixes issue where alpha.10 was not detected due to find() returning
the first match instead of the latest published version.
When users relocate a missing video file through the error recovery dialog,
the new file path is now properly saved to the database instead of only
updating local state. This ensures the relocated path persists across
app sessions, eliminating the need to relocate files repeatedly.

Changes:
- Update handleFileRelocate to fetch video record and file ID
- Call db.files.updateFile() to persist new path to database
- Maintain existing local state updates for immediate UI response
- Add comprehensive error handling and logging

Fixes issue where video file relocation was temporary and required
repeated user action on subsequent app launches.
* feat(ffmpeg): add China mirror support for FFmpeg downloads

- Add IP-based region detection using ipinfo.io API
- Support China mainland, Hong Kong, Macau, Taiwan regions
- Add dedicated China mirror URLs from gitcode.com
- Implement automatic fallback from China to global mirrors
- Add comprehensive test coverage for new functionality
- Default to China mirror on detection failure for better UX

Breaking change: Service now defaults to China mirror for
better performance in Chinese regions

* fix(test): remove unused parameter in FFmpegDownloadService test

- Fix TypeScript error TS6133 for unused 'url' parameter
- Replace unused 'url' with underscore in mock implementation
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Sep 14, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

Adds a GitHub Actions workflow to sync releases to GitCode. Overhauls FFmpeg integration with downloadable binaries, IPC channels, preload APIs, renderer UI/settings, and tests. Streamlines builds (remove FFmpeg bundling, refine packaging) and removes legacy release/version tooling. Enhances player seek/subtitle synchronization and logging, updates updater logic, and minor UI tweaks.

Changes

Cohort / File(s) Summary
CI: GitCode Release Sync
.github/workflows/sync-release-to-gitcode.yml, scripts/upload-assets.js
New workflow to mirror releases to GitCode with dry-run, branch/tag sync, release create/update, and asset uploads via a new Node uploader (concurrency/retries).
Build & Packaging
electron-builder.yml, electron.vite.config.ts, package.json
Add Win ARM64 targets, set icon/artifact name, tighten file inclusions; remove FFmpeg resource bundling and download plugin; prune release/version scripts and prebuild hooks.
Release Tooling Removal
scripts/pre-release-check.ts, scripts/release.ts, scripts/rename-artifacts.ts, scripts/version-manager.ts
Remove custom CLI tools for versioning, releasing, and artifact renaming.
IPC Surface Expansion (FFmpeg/MediaInfo)
packages/shared/IpcChannel.ts, src/main/ipc.ts, src/preload/index.ts
Add FFmpeg info, autodetect/download, and download-management channels; expose corresponding preload APIs.
FFmpeg Core Services
src/main/services/FFmpegDownloadService.ts, src/main/services/FFmpegService.ts
Add cross-platform FFmpeg download service with mirrors/region-detect, progress/cancel/cleanup; integrate into FFmpegService with info/query, autodetect, and improved execution handling.
FFmpeg Tests
src/main/services/__tests__/FFmpegDownloadService.test.ts, src/main/services/__tests__/FFmpegService.integration.test.ts, src/main/__tests__/ipc.database.test.ts
New unit/integration tests for download service and FFmpegService; extend mocks with download service API.
Renderer FFmpeg UI & Flow
src/renderer/src/pages/settings/FFmpegSettings.tsx, src/renderer/src/components/FFmpegDownloadPrompt.tsx, src/renderer/src/hooks/useVideoFileSelect.ts, src/renderer/src/pages/home/... (HeaderNavbar.tsx, HomePage.tsx, EmptyState.tsx, VideoAddButton.tsx)
Add FFmpeg settings page (status, path, download/uninstall, warmup); new download prompt; hook gains prompt state; home page/components wire prompt visibility and auto-download navigation.
i18n Updates (FFmpeg & UI)
src/renderer/src/i18n/locales/en-us.json, src/renderer/src/i18n/locales/zh-cn.json, src/renderer/src/i18n/label.ts
Add FFmpeg plugin management strings and new shortcut labels; restructure zh-CN UI blocks; remove subtitle mode shortcut labels from mapping.
Player Subtitle Sync & Seeking
src/renderer/src/pages/player/engine/PlayerOrchestrator.ts, src/renderer/src/pages/player/hooks/usePlayerEngine.ts, src/renderer/src/state/stores/player.store.ts, src/renderer/src/services/PlayerSettingsLoader.ts, src/renderer/src/services/PlayerSettingsSaver.ts, src/renderer/src/pages/player/hooks/useSubtitleEngine.ts
Introduce activeCueIndex propagation via StateUpdater/store; prioritize external cue index in subtitle engine; add user-seeking mode to pause autosave; initialize runtime state.
Player/UI Misc
src/renderer/src/pages/player/PlayerPage.tsx, src/renderer/src/pages/player/components/VideoErrorRecovery.tsx, src/renderer/src/pages/player/engine/MediaClock.ts, src/renderer/src/pages/player/engine/intent/IntentStrategyManager.ts
Implement DB-backed file relocate; modal unmount behavior change; sample verbose logs; remove a debug log.
App Updater
src/main/services/AppUpdater.ts
Fetch more releases, select latest matching prerelease by sort, simplify update dialog (no formatted release notes).
Window/Theme
src/main/services/WindowService.ts, src/main/services/ThemeService.ts
Platform-specific title bar: custom on macOS, system on Win/Linux; limit overlay updates to macOS.
Settings Routing
src/renderer/src/pages/settings/SettingsPage.tsx
Add “Plugins” section and route to FFmpegSettings.
UI Styling Tweaks
src/renderer/src/assets/styles/ant.scss, src/renderer/src/components/IndicatorLight.tsx, src/renderer/src/components/app/Navbar.tsx
Remove Ant button shadow; refactor pulsing CSS; fix navbar right padding to 12px.
Logging System
src/renderer/src/services/Logger.ts
Adjust default levels by env; memory-aware export history with sampling/cleanup; lighter serialization.
Shortcuts Data
src/renderer/src/infrastructure/constants/shortcuts.const.ts, src/renderer/src/pages/player/hooks/usePlayerShortcuts.ts
Remove subtitle mode shortcuts and related handling.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Renderer as Renderer (FFmpegSettings/Prompt)
  participant Preload as Preload (window.api)
  participant Main as Main (FFmpegService)
  participant DL as FFmpegDownloadService
  participant Net as Network/Mirror
  participant FS as Filesystem

  User->>Renderer: Open Plugins/FFmpeg or trigger Prompt
  Renderer->>Preload: ffmpeg.getInfo()
  Preload->>Main: Ipc Ffmpeg_GetInfo
  Main-->>Preload: {path,isDownloaded,isSystemFFmpeg,needsDownload,version?}
  Preload-->>Renderer: Status

  alt Needs download
    User->>Renderer: Click Download
    Renderer->>Preload: ffmpeg.download.download()
    Preload->>Main: Ipc FfmpegDownload_Download
    Main->>DL: downloadFFmpeg(onProgress)
    DL->>Net: Fetch archive (mirror autodetect/fallback)
    DL->>FS: Write temp, extract, install, set perms
    loop Progress polling
      Renderer->>Preload: ffmpeg.download.getProgress()
      Preload->>Main: Ipc FfmpegDownload_GetProgress
      Main-->>Preload: Progress
      Preload-->>Renderer: Progress
    end
    DL-->>Main: Completed (true)
    Main-->>Preload: Result
    Preload-->>Renderer: Done
    Renderer->>Preload: ffmpeg.warmup()
    Preload->>Main: Ipc warmup (execute probe)
    Main-->>Preload: Warmup result
    Preload-->>Renderer: Updated status
  else Already available
    Renderer-->>User: Show Installed/System status
  end
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

codex

Poem

A rabbit taps the build with gentle paws,
FFmpeg hops in, fetched without a pause.
Subtitles sync, a cue-indexed dance,
Logs grow quiet, giving frames a chance.
Releases mirror moonlight’s gleam,
Plugins bloom—our burrow’s dream. 🐇✨

✨ Finishing touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch alpha2beta

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b17fe10 and bdf6620.

📒 Files selected for processing (48)
  • .github/workflows/sync-release-to-gitcode.yml (1 hunks)
  • electron-builder.yml (1 hunks)
  • electron.vite.config.ts (0 hunks)
  • package.json (1 hunks)
  • packages/shared/IpcChannel.ts (1 hunks)
  • scripts/pre-release-check.ts (0 hunks)
  • scripts/release.ts (0 hunks)
  • scripts/rename-artifacts.ts (0 hunks)
  • scripts/upload-assets.js (1 hunks)
  • scripts/version-manager.ts (0 hunks)
  • src/main/__tests__/ipc.database.test.ts (1 hunks)
  • src/main/ipc.ts (1 hunks)
  • src/main/services/AppUpdater.ts (3 hunks)
  • src/main/services/FFmpegDownloadService.ts (1 hunks)
  • src/main/services/FFmpegService.ts (7 hunks)
  • src/main/services/ThemeService.ts (2 hunks)
  • src/main/services/WindowService.ts (2 hunks)
  • src/main/services/__tests__/FFmpegDownloadService.test.ts (1 hunks)
  • src/main/services/__tests__/FFmpegService.integration.test.ts (1 hunks)
  • src/preload/index.ts (1 hunks)
  • src/renderer/src/assets/styles/ant.scss (1 hunks)
  • src/renderer/src/components/FFmpegDownloadPrompt.tsx (1 hunks)
  • src/renderer/src/components/IndicatorLight.tsx (2 hunks)
  • src/renderer/src/components/app/Navbar.tsx (1 hunks)
  • src/renderer/src/hooks/useVideoFileSelect.ts (4 hunks)
  • src/renderer/src/i18n/label.ts (0 hunks)
  • src/renderer/src/i18n/locales/en-us.json (2 hunks)
  • src/renderer/src/i18n/locales/zh-cn.json (6 hunks)
  • src/renderer/src/infrastructure/constants/shortcuts.const.ts (0 hunks)
  • src/renderer/src/pages/home/EmptyState.tsx (1 hunks)
  • src/renderer/src/pages/home/HeaderNavbar.tsx (2 hunks)
  • src/renderer/src/pages/home/HomePage.tsx (5 hunks)
  • src/renderer/src/pages/home/VideoAddButton.tsx (1 hunks)
  • src/renderer/src/pages/player/PlayerPage.tsx (2 hunks)
  • src/renderer/src/pages/player/components/VideoErrorRecovery.tsx (1 hunks)
  • src/renderer/src/pages/player/engine/MediaClock.ts (3 hunks)
  • src/renderer/src/pages/player/engine/PlayerOrchestrator.ts (9 hunks)
  • src/renderer/src/pages/player/engine/intent/IntentStrategyManager.ts (0 hunks)
  • src/renderer/src/pages/player/hooks/usePlayerEngine.ts (1 hunks)
  • src/renderer/src/pages/player/hooks/usePlayerShortcuts.ts (1 hunks)
  • src/renderer/src/pages/player/hooks/useSubtitleEngine.ts (2 hunks)
  • src/renderer/src/pages/player/hooks/useSubtitleOverlay.ts (2 hunks)
  • src/renderer/src/pages/settings/FFmpegSettings.tsx (1 hunks)
  • src/renderer/src/pages/settings/SettingsPage.tsx (3 hunks)
  • src/renderer/src/services/Logger.ts (4 hunks)
  • src/renderer/src/services/PlayerSettingsLoader.ts (2 hunks)
  • src/renderer/src/services/PlayerSettingsSaver.ts (3 hunks)
  • src/renderer/src/state/stores/player.store.ts (4 hunks)

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@mkdir700 mkdir700 merged commit 45fbe0a into beta Sep 14, 2025
4 of 5 checks passed
@mkdir700 mkdir700 deleted the alpha2beta branch September 14, 2025 06:24
@coderabbitai coderabbitai bot mentioned this pull request Sep 16, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant