beatsaber-pricing/README.md

68 lines
3.3 KiB
Markdown

# Beat Saber Custom Mapping Pricing
A modern, responsive, configuration-driven pricing calculator for Beat Saber custom mapping commissions. Simply paste a YouTube URL and the tool automatically grabs the actual duration to exactly calculate standard and fractional pricing dynamically.
It outputs a pre-filled PayPal.Me link with the final cost and an itemized order note tracking the requested map and selected options!
## Features
* **YouTube Ingestion:** Invisible IFrame API queries the video and extracts exact duration down to the second.
* **Exact Fractional Pricing:** `(Base Price Per Minute + Selected Extras Per Minute) / 60 * Total Seconds`
* **Included Difficulty Logic:** Your Base Price always accounts for exactly 1 included difficulty. When a user selects their "Base Difficulty", it is prevented from being added as an "Extra" paid difficulty.
* **Smart Discounts:** Support for Percentages, Flat Total, and Flat Base discounts using easy URL query parameters.
* **Glassmorphism Aesthetic:** Animated, glowing neon red and blue UI styling without external bloated CSS frameworks.
* **Fully Configured by JSON:** You do not need to rewrite HTML to change descriptions, names, social links, or complex pricing logic.
## How to Set Up
Due to browser CORS permissions, the system cannot fetch the localized `config.json` configuration file simply by double-clicking `index.html`. It must be run on a local HTTP server or hosted on an active website.
**To run locally for testing:**
```bash
python3 -m http.server 8000
```
Then visit `http://localhost:8000` in your browser.
## Configuration Options (`config.json`)
All primary values are declared inside `config.json`:
```json
{
"site": {
"headerTitle": "Your custom title",
"introText": "Your custom introduction rules/text",
"bottomText": "Your custom footer disclaimer text",
"socialLinks": [
{
"icon": "fa-brands fa-discord", // FontAwesome CSS classes
"url": "https://discord.com",
"label": "Discord"
}
],
"paypalUser": "YourPaypalMeUsername" // E.g., paypal.me/Joetastic
},
"pricing": {
"basePricePerMinute": 15, // The $ rate per minute of mapping
"difficulties": [...], // Available difficulties options
"lighting": [...], // Available lighting tiers
"addons": [...] // Misc options
}
}
```
*For Difficulties, Lighting, and Addons, each object accepts:*
* `id`: The programmatic reference ID
* `name`: The user-facing display name
* `description`: The subtext beneath the option in the UI
* `price`: The cost of the extra. Note: For Difficulties, this price is per *minute*. It is added to the base rate *before* the duration calculation happens.
## Applying Custom Discounts (`?discount=`)
You can generate special links to automatically apply discounts when users load the page. It will prominently display a green banner explaining the discount to the user and recalculate the final cost before creating the tracked PayPal link.
* `?discount_pct=20` Takes **20% Off** the final calculated total cost.
* `?discount_total=10` Takes a flat **$10.00 Off** the final calculated total cost.
* `?discount_base=5` Deducts **$5.00** from your standard `basePricePerMinute` configuration *before* any duration or extras logic is calculated.
**Example Link:**
```
http://localhost:8000/?discount_pct=15
```