Compare commits

...

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

923 changed files with 18509 additions and 28954 deletions

View file

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

View file

@ -1,10 +1,10 @@
# ProPresenter 7 PHP Library
# ProPresenter 7 PHP API
> 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/)
[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
[![Tests](https://img.shields.io/badge/tests-369%20passing-brightgreen.svg)](#development)
[![Tests](https://img.shields.io/badge/tests-370%20passing-brightgreen.svg)](#development)
[![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.
@ -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.
- **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.
- **369 tests, 1,300+ assertions** — covering all readers, writers, generators, and round-trip fidelity against a synthetic test corpus.
- **370 tests, 9,200+ assertions** — verified against 169 real-world reference songs from production worship environments.
- **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
```bash
composer require bussnet/propresenter7-php-lib
composer require bussnet/propresenter7-php-api
```
Or clone the repository to develop locally:
```bash
git clone https://github.com/bussnet/propresenter7-php-lib.git
cd propresenter7-php-lib
git clone https://github.com/bussnet/propresenter7-php-api.git
cd propresenter7-php-api
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)
├── src/ # PHP source (wrappers, readers, writers, generators)
├── generated/ # Auto-generated protobuf PHP classes (Rv\Data\…)
├── proto/ # Vendored .proto files (greyshirtguy/ProPresenter7-Proto, Proto 19beta + extras)
├── tests/ # PHPUnit test suite (369 tests)
├── proto/ # Vendored .proto files (greyshirtguy/ProPresenter7-Proto v7.16.2)
├── tests/ # PHPUnit test suite (370 tests)
├── doc/
│ ├── INDEX.md # Documentation entry point
│ ├── keywords.md # Keyword search index
@ -460,14 +460,14 @@ You should see:
```text
PHPUnit 11.5.55 by Sebastian Bergmann and contributors.
OK (369 tests, 1298 assertions)
OK (370 tests, 9200 assertions)
```
The test suite includes:
- **Unit tests** — every wrapper class
- **Integration tests** — readers + writers round-tripping reference files
- **Mass validation** — parses every `.pro` fixture in `doc/reference_samples/all-songs/` (`tests/MassValidationTest.php`)
- **Mass validation** — parses 169 real-world `.pro` songs (`tests/MassValidationTest.php`)
- **Binary fidelity tests** — verifies byte-perfect round-trips for global library files
### Reference samples
@ -510,7 +510,7 @@ Contributions are welcome! Please:
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), 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.
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.
---

View file

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

View file

@ -1,6 +1,6 @@
# ProPresenter 7 PHP Library — Documentation
# ProPresenter 7 PHP API — Documentation
> Comprehensive reference for the [ProPresenter 7 PHP Library](../README.md).
> Comprehensive reference for the [ProPresenter 7 PHP API](../README.md) library.
>
> 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
**Target Audience:** AI agents, automated parsers, developers
**Proto Source:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT License)
**Proto Source:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT License)
---
@ -13,7 +13,7 @@
- **Container Format:** Standard ZIP archive (PKZIP 2.0+, default deflate compression)
- **Binary Format:** Protocol Buffers (Google protobuf v3) for the embedded `.pro` file
- **Top-level Message:** `rv.data.Presentation` (defined in `presentation.proto`)
- **Proto Definitions:** greyshirtguy/ProPresenter7-Proto Proto 19beta (MIT)
- **Proto Definitions:** greyshirtguy/ProPresenter7-Proto v7.16.2 (MIT)
- **Predecessor:** Pro6 `.pro6x` format
### 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:
```
URL.absolute_string = "file:///Users/me/Downloads/pp-test/Media/background.png"
URL.absolute_string = "file:///Users/thorsten/Downloads/pp-test/Media/background.png"
URL.local.root = ROOT_USER_DOWNLOADS (4)
URL.local.path = "pp-test/Media/background.png"
URL.platform = PLATFORM_MACOS

View file

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

View file

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

View file

@ -3,10 +3,9 @@
## Decisions Made
### Proto Version Choice
- **Decision**: Use greyshirtguy/ProPresenter7-Proto, Proto 19beta (dumped from ProPresenter v19 beta build 318767123)
- **Reason**: Latest available proto schema; field numbers compatible with our reference files; covers new ProPresenter 19 features
- **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
- **Decision**: Use greyshirtguy/ProPresenter7-Proto v7.16.2
- **Reason**: Field numbers match Test.pro raw decode perfectly
- **Source**: Metis analysis + typed decode validation in T2
### RTF Handling
- **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.

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.

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.

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.

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.

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