Compare commits

..

No commits in common. "20fe32af527b0d338e9921ffd17107000a8128c8" and "01654209c699deaea267c9e11e95d97e79505234" have entirely different histories.

928 changed files with 29428 additions and 18983 deletions

View file

@ -26,4 +26,5 @@ SOFTWARE.
This project bundles `.proto` files derived from This project bundles `.proto` files derived from
[greyshirtguy/ProPresenter7-Proto](https://github.com/greyshirtguy/ProPresenter7-Proto) [greyshirtguy/ProPresenter7-Proto](https://github.com/greyshirtguy/ProPresenter7-Proto)
(v7.16.2), which is also distributed under the MIT License. (Proto 19beta, dumped from ProPresenter v19 beta build 318767123, plus a few
retained extras), which is also distributed under the MIT License.

View file

@ -1,10 +1,10 @@
# ProPresenter 7 PHP API # ProPresenter 7 PHP Library
> A PHP library to **read, modify, and generate** [ProPresenter 7](https://renewedvision.com/propresenter/) files — songs, playlists, bundles, themes, and global library files. > A PHP library to **read, modify, and generate** [ProPresenter 7](https://renewedvision.com/propresenter/) files — songs, playlists, bundles, themes, and global library files.
[![PHP Version](https://img.shields.io/badge/php-%5E8.4-777bb4.svg)](https://www.php.net/) [![PHP Version](https://img.shields.io/badge/php-%5E8.4-777bb4.svg)](https://www.php.net/)
[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Tests](https://img.shields.io/badge/tests-370%20passing-brightgreen.svg)](#development) [![Tests](https://img.shields.io/badge/tests-369%20passing-brightgreen.svg)](#development)
[![Built on Protocol Buffers](https://img.shields.io/badge/format-protobuf-4285F4.svg)](https://protobuf.dev/) [![Built on Protocol Buffers](https://img.shields.io/badge/format-protobuf-4285F4.svg)](https://protobuf.dev/)
ProPresenter 7 stores its data in protobuf-encoded binary files (with ZIP wrappers for playlists and bundles). This library decodes those formats into idiomatic PHP objects, lets you modify them, and writes them back out — with full round-trip fidelity for global library files and verified compatibility with PP7 for songs and bundles. ProPresenter 7 stores its data in protobuf-encoded binary files (with ZIP wrappers for playlists and bundles). This library decodes those formats into idiomatic PHP objects, lets you modify them, and writes them back out — with full round-trip fidelity for global library files and verified compatibility with PP7 for songs and bundles.
@ -68,7 +68,7 @@ ProPresenter 7 stores its data in protobuf-encoded binary files (with ZIP wrappe
- **ZIP64 repair** — automatically fixes ProPresenter's 98-byte ZIP64 header bug on read. - **ZIP64 repair** — automatically fixes ProPresenter's 98-byte ZIP64 header bug on read.
- **Generate from scratch** — build complete `.pro` and `.proplaylist` files programmatically with media references. - **Generate from scratch** — build complete `.pro` and `.proplaylist` files programmatically with media references.
- **18 CLI tools** — quickly inspect any ProPresenter file from the command line. - **18 CLI tools** — quickly inspect any ProPresenter file from the command line.
- **370 tests, 9,200+ assertions** — verified against 169 real-world reference songs from production worship environments. - **369 tests, 1,300+ assertions** — covering all readers, writers, generators, and round-trip fidelity against a synthetic test corpus.
- **Comprehensive docs** — every API and binary format is documented in [`doc/`](doc/). - **Comprehensive docs** — every API and binary format is documented in [`doc/`](doc/).
--- ---
@ -84,14 +84,14 @@ ProPresenter 7 stores its data in protobuf-encoded binary files (with ZIP wrappe
## Installation ## Installation
```bash ```bash
composer require bussnet/propresenter7-php-api composer require bussnet/propresenter7-php-lib
``` ```
Or clone the repository to develop locally: Or clone the repository to develop locally:
```bash ```bash
git clone https://github.com/bussnet/propresenter7-php-api.git git clone https://github.com/bussnet/propresenter7-php-lib.git
cd propresenter7-php-api cd propresenter7-php-lib
composer install composer install
``` ```
@ -410,8 +410,8 @@ Looking for something specific? Use the keyword index: [doc/keywords.md](doc/key
├── bin/ # 18 CLI tools (parse-*.php scripts) ├── bin/ # 18 CLI tools (parse-*.php scripts)
├── src/ # PHP source (wrappers, readers, writers, generators) ├── src/ # PHP source (wrappers, readers, writers, generators)
├── generated/ # Auto-generated protobuf PHP classes (Rv\Data\…) ├── generated/ # Auto-generated protobuf PHP classes (Rv\Data\…)
├── proto/ # Vendored .proto files (greyshirtguy/ProPresenter7-Proto v7.16.2) ├── proto/ # Vendored .proto files (greyshirtguy/ProPresenter7-Proto, Proto 19beta + extras)
├── tests/ # PHPUnit test suite (370 tests) ├── tests/ # PHPUnit test suite (369 tests)
├── doc/ ├── doc/
│ ├── INDEX.md # Documentation entry point │ ├── INDEX.md # Documentation entry point
│ ├── keywords.md # Keyword search index │ ├── keywords.md # Keyword search index
@ -460,14 +460,14 @@ You should see:
```text ```text
PHPUnit 11.5.55 by Sebastian Bergmann and contributors. PHPUnit 11.5.55 by Sebastian Bergmann and contributors.
OK (370 tests, 9200 assertions) OK (369 tests, 1298 assertions)
``` ```
The test suite includes: The test suite includes:
- **Unit tests** — every wrapper class - **Unit tests** — every wrapper class
- **Integration tests** — readers + writers round-tripping reference files - **Integration tests** — readers + writers round-tripping reference files
- **Mass validation** — parses 169 real-world `.pro` songs (`tests/MassValidationTest.php`) - **Mass validation** — parses every `.pro` fixture in `doc/reference_samples/all-songs/` (`tests/MassValidationTest.php`)
- **Binary fidelity tests** — verifies byte-perfect round-trips for global library files - **Binary fidelity tests** — verifies byte-perfect round-trips for global library files
### Reference samples ### Reference samples
@ -510,7 +510,7 @@ Contributions are welcome! Please:
This project is released under the [MIT License](LICENSE). This project is released under the [MIT License](LICENSE).
The bundled `.proto` files in [`proto/`](proto/) are derived from [greyshirtguy/ProPresenter7-Proto](https://github.com/greyshirtguy/ProPresenter7-Proto) v7.16.2, also distributed under the MIT License. The bundled `.proto` files in [`proto/`](proto/) are derived from [greyshirtguy/ProPresenter7-Proto](https://github.com/greyshirtguy/ProPresenter7-Proto), Proto 19beta (dumped from ProPresenter v19 beta build 318767123) plus a few extras (`calendar`, `keyMappings`, plus three legacy analytics protos retained from the 7.16.2 set), also distributed under the MIT License.
--- ---

View file

@ -1,5 +1,5 @@
{ {
"name": "bussnet/propresenter7-php-api", "name": "bussnet/propresenter7-php-lib",
"description": "PHP library to read, modify, and generate ProPresenter 7 files (.pro songs, .proplaylist, .probundle, themes, and global library files).", "description": "PHP library to read, modify, and generate ProPresenter 7 files (.pro songs, .proplaylist, .probundle, themes, and global library files).",
"type": "library", "type": "library",
"license": "MIT", "license": "MIT",
@ -16,10 +16,10 @@
"proplaylist", "proplaylist",
"probundle" "probundle"
], ],
"homepage": "https://github.com/bussnet/propresenter7-php-api", "homepage": "https://github.com/bussnet/propresenter7-php-lib",
"support": { "support": {
"issues": "https://github.com/bussnet/propresenter7-php-api/issues", "issues": "https://github.com/bussnet/propresenter7-php-lib/issues",
"source": "https://github.com/bussnet/propresenter7-php-api" "source": "https://github.com/bussnet/propresenter7-php-lib"
}, },
"authors": [ "authors": [
{ {

View file

@ -1,6 +1,6 @@
# ProPresenter 7 PHP API — Documentation # ProPresenter 7 PHP Library — Documentation
> Comprehensive reference for the [ProPresenter 7 PHP API](../README.md) library. > Comprehensive reference for the [ProPresenter 7 PHP Library](../README.md).
> >
> Each document is self-contained — open the one that matches your task. If you don't know which to load, search [keywords.md](keywords.md) or scan the table below. > Each document is self-contained — open the one that matches your task. If you don't know which to load, search [keywords.md](keywords.md) or scan the table below.

View file

@ -2,7 +2,7 @@
**Version:** 1.0 **Version:** 1.0
**Target Audience:** AI agents, automated parsers, developers **Target Audience:** AI agents, automated parsers, developers
**Proto Source:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT License) **Proto Source:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT License)
--- ---
@ -13,7 +13,7 @@
- **Container Format:** Standard ZIP archive (PKZIP 2.0+, default deflate compression) - **Container Format:** Standard ZIP archive (PKZIP 2.0+, default deflate compression)
- **Binary Format:** Protocol Buffers (Google protobuf v3) for the embedded `.pro` file - **Binary Format:** Protocol Buffers (Google protobuf v3) for the embedded `.pro` file
- **Top-level Message:** `rv.data.Presentation` (defined in `presentation.proto`) - **Top-level Message:** `rv.data.Presentation` (defined in `presentation.proto`)
- **Proto Definitions:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT) - **Proto Definitions:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT)
- **Predecessor:** Pro6 `.pro6x` format - **Predecessor:** Pro6 `.pro6x` format
### Container Structure ### Container Structure
@ -98,7 +98,7 @@ Both `url` and `image.file.localUrl` use the same structure.
PP7's own exports and standalone `.pro` files use absolute `file:///` URLs with filesystem-based root mappings: PP7's own exports and standalone `.pro` files use absolute `file:///` URLs with filesystem-based root mappings:
``` ```
URL.absolute_string = "file:///Users/thorsten/Downloads/pp-test/Media/background.png" URL.absolute_string = "file:///Users/me/Downloads/pp-test/Media/background.png"
URL.local.root = ROOT_USER_DOWNLOADS (4) URL.local.root = ROOT_USER_DOWNLOADS (4)
URL.local.path = "pp-test/Media/background.png" URL.local.path = "pp-test/Media/background.png"
URL.platform = PLATFORM_MACOS URL.platform = PLATFORM_MACOS

View file

@ -2,7 +2,7 @@
**Version:** 1.0 **Version:** 1.0
**Target Audience:** AI agents, automated parsers, developers **Target Audience:** AI agents, automated parsers, developers
**Proto Source:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT License) **Proto Source:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT License)
--- ---
@ -14,7 +14,7 @@
- **Compression:** Store only (no deflate compression) - **Compression:** Store only (no deflate compression)
- **Binary Format:** Protocol Buffers (Google protobuf v3) - **Binary Format:** Protocol Buffers (Google protobuf v3)
- **Top-level Message:** `rv.data.Playlist` (defined in `playlist.proto`) - **Top-level Message:** `rv.data.Playlist` (defined in `playlist.proto`)
- **Proto Definitions:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT) - **Proto Definitions:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT)
### Container Structure ### Container Structure
- **Archive Type:** ZIP64 with store compression (compression method 0) - **Archive Type:** ZIP64 with store compression (compression method 0)

View file

@ -2,7 +2,7 @@
**Version:** 1.1 **Version:** 1.1
**Target Audience:** AI agents, automated parsers, developers **Target Audience:** AI agents, automated parsers, developers
**Proto Source:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT License) **Proto Source:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT License)
--- ---
@ -12,7 +12,7 @@
- **Extension:** `.pro` - **Extension:** `.pro`
- **Binary Format:** Protocol Buffers (Google protobuf v3) - **Binary Format:** Protocol Buffers (Google protobuf v3)
- **Top-level Message:** `rv.data.Presentation` (defined in `presentation.proto`) - **Top-level Message:** `rv.data.Presentation` (defined in `presentation.proto`)
- **Proto Definitions:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT) - **Proto Definitions:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT)
### Known Limitations ### Known Limitations
- **Binary Fidelity:** Round-trip decode→encode fails on all reference files. Proto definitions are incomplete; unknown fields are lost during serialization. - **Binary Fidelity:** Round-trip decode→encode fails on all reference files. Proto definitions are incomplete; unknown fields are lost during serialization.

View file

@ -3,9 +3,10 @@
## Decisions Made ## Decisions Made
### Proto Version Choice ### Proto Version Choice
- **Decision**: Use greyshirtguy/ProPresenter7-Proto v7.16.2 - **Decision**: Use greyshirtguy/ProPresenter7-Proto, Proto 19beta (dumped from ProPresenter v19 beta build 318767123)
- **Reason**: Field numbers match Test.pro raw decode perfectly - **Reason**: Latest available proto schema; field numbers compatible with our reference files; covers new ProPresenter 19 features
- **Source**: Metis analysis + typed decode validation in T2 - **Retained extras**: `calendar.proto`, `keyMappings.proto` (not present in 19beta upstream but extracted from PP binaries to support our `parse-calendar` and `parse-key-mappings` tools); `analyticsCapture/Update/WHMStore.proto` retained from the prior 7.16.2 set for backward compatibility
- **History**: Originally adopted v7.16.2 (Metis analysis + typed decode validation in T2); upgraded to Proto 19beta on 2026-05-04
### RTF Handling ### RTF Handling
- **Getters**: Plain text only (via RtfExtractor) - **Getters**: Plain text only (via RtfExtractor)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more