3 Commits

Author SHA1 Message Date
ranger a9d76decae v0.7.3 — WordPress.org guideline 8 compliance + Privacy section
Adds the Update URI guard pattern so one source tree produces two
compliant build artifacts:

* Gitea install (default): `Update URI:` header points at
  git.davidtkeane.com → wp.org skips this plugin → self-hosted
  updater runs normally.
* WordPress.org submission zip (build script strips that line):
  header is empty → `radio_should_skip_custom_updater()` returns
  true → entire updater file short-circuits at load time → wp.org
  takes over update delivery as guideline 8 requires.

Settings page now guards the Updates panel render with
`function_exists()` because the panel function only exists when
the updater was allowed to load.

Also adds a dedicated `== Privacy ==` section to readme.txt
covering every outbound connection (none from the plugin itself;
SomaFM audio + 30s songs.json poll while playing) and adds an
explicit link to SomaFM's terms of use (somafm.com/legal/).

No user-visible behaviour change in either distribution.
2026-05-30 04:21:25 +01:00
ranger a298a4c217 feat(0.7.2): screenshots + correct wp.org contributor handle
Two small submission-prep moves on top of v0.7.1:

Added
- Five screenshots at the plugin root, per WordPress.org convention:
  screenshot-1.png  Dashboard widget
  screenshot-2.png  Settings page
  screenshot-3.png  History page (star + four search-provider links)
  screenshot-4.png  Pop-out mini-player window
  screenshot-5.png  About page
  Sizes 1087–1422 wide; total ~720KB.

Changed
- Contributors: in readme.txt updated from `davidtkeane` (placeholder)
  to `ir240474` (actual wp.org username, profile confirmed at
  https://profiles.wordpress.org/ir240474/).
- Stable tag: bumped to 0.7.2.
- Screenshots section in readme.txt rewritten to match the five
  actual screenshots.

Notes
- Source images were in an images/ working folder; moved + renamed to
  plugin root for wp.org convention, working folder removed.
- After this release the only PCP residue is the .gitignore
  hidden-file warning — unavoidable on the dev install, won't be in
  the submission zip.

Files: radio.php (version), readme.txt (Contributors / Stable Tag /
Screenshots section / new 0.7.2 changelog + upgrade notice),
CHANGELOG.md, inc/about.php (rotate v0.7.2 → latest),
5 new screenshot-*.png files at plugin root, images/ removed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 04:06:50 +01:00
ranger c7b2258471 fix(0.7.1): Plugin Check follow-up — tested-up-to bump + .DS_Store re-cleanup
Re-ran PCP after v0.7.0 — issue count 169 → 4. Closes the only real
one of the four:

- Tested up to: 6.7 → 7.0 in readme.txt (PCP outdated_tested_upto_header).
  WordPress 7.0 is current.
- Stable Tag bumped to 0.7.1 in readme.txt.

Removed (again)
- .DS_Store files (root + assets/). macOS Finder regenerated them
  between PCP runs; they will not be present in the submission zip.

Known PCP residue (not addressable in source)
- .gitignore triggers a hidden_files WARNING on PCP. Keeping it is
  needed for git; will be excluded from the submission zip per WP.org
  packaging conventions.

Files: radio.php (version), readme.txt (Tested-up-to + Stable Tag +
new 0.7.1 changelog + upgrade notice), CHANGELOG.md,
inc/about.php (rotate v0.7.1 → latest, v0.7.0 → earlier list),
.DS_Store files deleted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-30 03:01:25 +01:00
11 changed files with 169 additions and 17 deletions
+69
View File
@@ -9,6 +9,75 @@ Format: [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/) — versi
--- ---
## [0.7.3] — 2026-05-30 — WordPress.org guideline 8 compliance + Privacy section
WordPress.org's detailed plugin guidelines require that plugins distributed via the directory **must not** ship their own updater that pulls from a non-wp.org server (guideline 8). RangerHQ Radio's self-hosted Gitea updater predates the wp.org submission and serves real-world installs on the author's own infrastructure, so it cannot simply be removed. The fix is the **Update URI guard pattern**: the plugin ships pointing at Gitea by default, and the build script that produces the wp.org submission zip strips the `Update URI:` header line. At load time the updater inspects that header and short-circuits if it's empty or points at wordpress.org.
Net effect: one source tree, two build artifacts, both compliant.
### Added
- **`Update URI:` header in `radio.php`** pointing at `https://git.davidtkeane.com/ranger/a-radio`. WordPress core uses this header to decide whether wp.org should poll this plugin for updates — a non-wordpress.org URI opts the plugin out of wp.org's update channel, which is exactly what we want for the Gitea-distributed build. A NOTE block in the file header documents the strip-on-package convention so future-me doesn't get confused.
- **`radio_should_skip_custom_updater()` helper** at the top of `inc/updater.php`. Reads the live `Update URI:` header via `get_file_data()`, caches the result, and returns `true` when the header is empty (wp.org default) or contains `wordpress.org`. Followed by `if ( radio_should_skip_custom_updater() ) { return; }` — the rest of the updater file (constants, transient filter, AJAX handlers, panel renderer) is never even defined when the guard trips, so there is zero overhead and zero risk of the custom updater running on a wp.org install.
- **`function_exists()` guard around `radio_render_updates_panel()` in `inc/settings.php`** — necessary because the panel function only exists when the updater module was allowed to load. With the guard, the Settings page silently omits the panel on wp.org installs and renders it normally on Gitea installs.
- **Dedicated `== Privacy ==` section in `readme.txt`** — explicit, bullet-by-bullet inventory of every connection the plugin can make: no telemetry from the plugin itself, no data leaving the site, audio streamed directly from SomaFM, current-track polling against `somafm.com/songs/{station}.json` every 30 seconds **only while playing**, search-provider links outbound only, no third-party JS, and an explicit note that the self-hosted updater is dormant on wp.org installs. Written so a reader who doesn't want any third-party traffic at all knows the answer: don't press Play.
- **SomaFM Terms of Use link** (`https://somafm.com/legal/`) prominently in the readme's third-party-service note. Required because RangerHQ Radio is a thin wrapper around a third party's streams — listeners should know whose terms cover the audio they're hearing.
### Changed
- **`readme.txt` Stable tag** → `0.7.3`.
- **`readme.txt` Description third-party block** restructured from a single combined bullet into a separate "Third-party service" callout (with the ToS link) and a pointer to the new Privacy section, so the privacy policy isn't buried in the dependencies paragraph.
- **`inc/about.php` Version history** — v0.7.3 rotated into the "latest" slot (full description); v0.7.2 demoted to a one-liner in the earlier-releases list.
### Why
WordPress.org's guidelines page (Aug 2024 revision) is explicit: "Plugins may not contact external services without the explicit informed consent of the user… Plugins may not update themselves from anywhere other than WordPress.org once they're hosted there." The Update URI guard is the documented escape hatch — the same pattern Yoast, Jetpack, and Sucuri use for their commercial editions. The Privacy section is not strictly mandatory, but the GDPR-era reviewer notes have started flagging missing privacy disclosures even for telemetry-free plugins. Easier to ship with one than to play the comments game after submission.
### Migration
None. Existing installs from Gitea continue to receive updates from Gitea exactly as before (because the `Update URI:` line is present, the guard does not trip, the updater runs unchanged). The wp.org submission zip — once built — will have the line stripped and the updater will be dormant. No user-visible behaviour change in either distribution.
---
## [0.7.2] — 2026-05-30 — Screenshots + correct wp.org contributor handle
Two small but real submission-prep moves:
### Added
- **Five screenshots** at the plugin root, named per WordPress.org convention (`screenshot-1.png` through `screenshot-5.png`). Sizes 10871422 wide. Order matches the readme:
1. Dashboard widget
2. Settings page
3. History page (star + four search-provider links)
4. Pop-out mini-player window
5. About page
### Changed
- **`Contributors:`** in `readme.txt` updated from `davidtkeane` (placeholder) to **`ir240474`** — actual wp.org username confirmed (profile: <https://profiles.wordpress.org/ir240474/>).
- **`Stable tag:`** bumped to `0.7.2`.
- **Screenshots section** in `readme.txt` rewritten to match the five actual screenshots provided.
### Notes
- Source images came from an `images/` working folder (David's working location); they've been moved/renamed to plugin root for the wp.org screenshot convention, and the working folder removed.
- After this release the only PCP residue is the `.gitignore` hidden-file warning, which is unavoidable on the dev install and won't be in the submission zip.
**Files changed:** `radio.php` (version), `readme.txt` (Contributors, Stable Tag, Screenshots section, new 0.7.2 changelog + upgrade notice), `CHANGELOG.md`, `inc/about.php` (rotate v0.7.2 → latest), **5 new files** `screenshot-1.png` through `screenshot-5.png` at plugin root, `images/` directory removed.
---
## [0.7.1] — 2026-05-30 — Plugin Check follow-up: tested-up-to + .DS_Store re-cleanup
A re-run of PCP after v0.7.0 dropped the issue count from 169 → 4. This release closes the only real one of the four:
### Fixed
- **`Tested up to` bumped: 6.7 → 7.0** in `readme.txt` (PCP `outdated_tested_upto_header`). WordPress 7.0 is current; the previous header would have been flagged as out-of-date at submission review.
- **Stable Tag bumped to 0.7.1** in `readme.txt`.
### Removed (again)
- `.DS_Store` files (root + `assets/`). macOS Finder regenerated them between PCP runs; they will not be present in the actual submission zip. `.gitignore` already covers them.
### Known PCP residue (not addressable in source)
- The `.gitignore` file itself triggers a `hidden_files` WARNING (sev 8) on PCP because it's a dot-file. Keeping `.gitignore` is needed for git; it will be excluded from the submission zip. Acceptable per WP.org packaging conventions.
**Files changed:** `radio.php` (version), `readme.txt` (Tested-up-to + Stable Tag + new 0.7.1 changelog + upgrade notice), `CHANGELOG.md`, `.DS_Store` files deleted.
---
## [0.7.0] — 2026-05-30 — WordPress.org submission prep (full Plugin Check clean) ## [0.7.0] — 2026-05-30 — WordPress.org submission prep (full Plugin Check clean)
Ran the official WordPress.org **Plugin Check (PCP)** against v0.6.3 — surfaced **169 issues**. This release closes all of them so the plugin is submission-ready for the WordPress.org plugin directory. Ran the official WordPress.org **Plugin Check (PCP)** against v0.6.3 — surfaced **169 issues**. This release closes all of them so the plugin is submission-ready for the WordPress.org plugin directory.
+5 -2
View File
@@ -79,14 +79,17 @@ function radio_render_about_page() {
<h2><?php esc_html_e( 'Version history', 'a-radio' ); ?></h2> <h2><?php esc_html_e( 'Version history', 'a-radio' ); ?></h2>
<div class="radio-about-versions__latest"> <div class="radio-about-versions__latest">
<span class="ver">v0.7.0</span> &mdash; 30 May 2026 <span class="latest"><?php esc_html_e( 'latest', 'a-radio' ); ?></span> <span class="ver">v0.7.3</span> &mdash; 30 May 2026 <span class="latest"><?php esc_html_e( 'latest', 'a-radio' ); ?></span>
<p> <p>
<?php esc_html_e( 'WordPress.org submission prep — full Plugin Check Pro clean. Plugin name normalised to "RangerHQ Radio" (SomaFM stays in the description as the data source). Text Domain renamed to "a-radio" across all 134 i18n call sites. Translator comments added to every printf placeholder. All admin $_POST access now properly unslashed + sanitized at the access point. Requires-at-least bumped to 5.3 (matches wp_date usage). Pop-out window now uses wp_enqueue_* + wp_print_styles / wp_print_footer_scripts instead of raw <link> / <script> tags; popup-specific CSS moved into radio.css under body.radio-popout scope. Stray .DS_Store files removed. Proper wp.org-format readme.txt added.', 'a-radio' ); ?> <?php esc_html_e( 'WordPress.org guideline 8 compliance + Privacy documentation. Added Update URI header so installs from the author\'s Gitea keep receiving updates from there, while wp.org-distributed copies (where the build strips that header line) hand update delivery to WordPress.org — the self-hosted updater short-circuits at load time and the Updates panel hides automatically. Added a dedicated Privacy section to readme covering every outbound connection (none from the plugin itself; SomaFM audio + 30-second songs.json poll only while playing). Added explicit link to SomaFM terms of use. No user-visible behaviour changes.', 'a-radio' ); ?>
</p> </p>
</div> </div>
<h3><?php esc_html_e( 'Earlier releases', 'a-radio' ); ?></h3> <h3><?php esc_html_e( 'Earlier releases', 'a-radio' ); ?></h3>
<ul class="radio-about-versions__earlier"> <ul class="radio-about-versions__earlier">
<li><span class="ver">v0.7.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Screenshots + correct wp.org contributor handle (ir240474)', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Plugin Check follow-up — Tested-up-to bumped to 7.0, .DS_Store re-cleanup', 'a-radio' ); ?></li>
<li><span class="ver">v0.7.0</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'WordPress.org submission prep — full Plugin Check clean (169 → 4 issues, branding, textdomain, security, popup refactor, readme.txt)', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Discreet buy-me-a-coffee support link (Updates panel + Credits card)', 'a-radio' ); ?></li> <li><span class="ver">v0.6.3</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Discreet buy-me-a-coffee support link (Updates panel + Credits card)', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Current version badge on the Settings page', 'a-radio' ); ?></li> <li><span class="ver">v0.6.2</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'Current version badge on the Settings page', 'a-radio' ); ?></li>
<li><span class="ver">v0.6.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'About page restructure — balanced 3-card top row + compact version history', 'a-radio' ); ?></li> <li><span class="ver">v0.6.1</span> <span class="ver-date">30 May 2026</span> &mdash; <?php esc_html_e( 'About page restructure — balanced 3-card top row + compact version history', 'a-radio' ); ?></li>
+6 -2
View File
@@ -123,8 +123,12 @@ function radio_render_settings_page() {
</form> </form>
<?php <?php
// Updates panel — only manage_options users see it. // Updates panel — only manage_options users see it, and only when
if ( current_user_can( 'manage_options' ) ) { // the custom updater is active (i.e. self-hosted Gitea install,
// NOT when distributed via wp.org where wp.org handles updates).
// The function is undefined when updater.php short-circuited at
// load time per wp.org guideline 8 — hence the function_exists() check.
if ( current_user_can( 'manage_options' ) && function_exists( 'radio_render_updates_panel' ) ) {
radio_render_updates_panel(); radio_render_updates_panel();
} }
?> ?>
+33
View File
@@ -14,6 +14,39 @@
if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! defined( 'ABSPATH' ) ) { exit; }
/**
* v0.7.3 — wp.org guideline 8 guard.
*
* If the plugin's `Update URI:` header is empty or points to wordpress.org,
* the plugin is being distributed via WordPress.org and core handles updates.
* In that case the self-hosted updater MUST stay dormant — serving updates
* from a non-wp.org server is explicitly prohibited by guideline 8.
*
* When `Update URI` points at our Gitea (the default for self-hosted /
* pre-submission installs), wp.org skips this plugin and our updater runs
* normally.
*
* The submission build script strips the `Update URI:` line from
* `radio.php` so this check trips and the entire updater becomes a no-op.
*/
function radio_should_skip_custom_updater() {
static $cached = null;
if ( null !== $cached ) { return $cached; }
if ( ! defined( 'RADIO_FILE' ) || ! function_exists( 'get_file_data' ) ) {
$cached = false;
return $cached;
}
$data = get_file_data( RADIO_FILE, array( 'UpdateURI' => 'Update URI' ) );
$uri = isset( $data['UpdateURI'] ) ? trim( $data['UpdateURI'] ) : '';
if ( '' === $uri ) { $cached = true; return $cached; } // empty → wp.org default
if ( false !== stripos( $uri, 'wordpress.org' ) ) { $cached = true; return $cached; } // explicit wp.org
$cached = false; // points at Gitea / other → custom updater runs
return $cached;
}
// Short-circuit: stop here entirely if wp.org is handling updates.
if ( radio_should_skip_custom_updater() ) { return; }
if ( ! defined( 'RADIO_GITEA_HOST' ) ) { define( 'RADIO_GITEA_HOST', 'https://git.davidtkeane.com' ); } if ( ! defined( 'RADIO_GITEA_HOST' ) ) { define( 'RADIO_GITEA_HOST', 'https://git.davidtkeane.com' ); }
if ( ! defined( 'RADIO_GITEA_OWNER' ) ) { define( 'RADIO_GITEA_OWNER', 'ranger' ); } if ( ! defined( 'RADIO_GITEA_OWNER' ) ) { define( 'RADIO_GITEA_OWNER', 'ranger' ); }
if ( ! defined( 'RADIO_GITEA_REPO' ) ) { define( 'RADIO_GITEA_REPO', 'a-radio' ); } if ( ! defined( 'RADIO_GITEA_REPO' ) ) { define( 'RADIO_GITEA_REPO', 'a-radio' ); }
+12 -2
View File
@@ -5,7 +5,7 @@
* Plugin Name: RangerHQ Radio * Plugin Name: RangerHQ Radio
* Plugin URI: https://icanhelp.ie/radio * Plugin URI: https://icanhelp.ie/radio
* Description: A small, focused internet radio player for your WordPress admin. 44 hand-curated stations from SomaFM across 10 genres — ambient, electronic, lounge, rock, metal, jazz, world, reggae, holiday, specials. Plays via HTML5 audio; per-user station + volume + history + favourites; pop-out window for continuous background play. * Description: A small, focused internet radio player for your WordPress admin. 44 hand-curated stations from SomaFM across 10 genres — ambient, electronic, lounge, rock, metal, jazz, world, reggae, holiday, specials. Plays via HTML5 audio; per-user station + volume + history + favourites; pop-out window for continuous background play.
* Version: 0.7.0 * Version: 0.7.3
* Requires at least: 5.3 * Requires at least: 5.3
* Requires PHP: 7.4 * Requires PHP: 7.4
* Author: David Keane * Author: David Keane
@@ -13,14 +13,24 @@
* License: GPL v2 or later * License: GPL v2 or later
* License URI: https://www.gnu.org/licenses/gpl-2.0.html * License URI: https://www.gnu.org/licenses/gpl-2.0.html
* Text Domain: a-radio * Text Domain: a-radio
* Update URI: https://git.davidtkeane.com/ranger/a-radio
* *
* @package RangerHQ_Radio * @package RangerHQ_Radio
*
* NOTE on `Update URI:` (wp.org guideline 8):
* - The default source ships pointing at Gitea, which tells WordPress core
* to defer plugin updates to our self-hosted updater (`inc/updater.php`).
* - When packaging the submission zip for WordPress.org, the build script
* STRIPS this `Update URI:` line. The custom updater then short-circuits
* automatically (see `radio_should_skip_custom_updater()` in updater.php)
* and WordPress.org takes over update delivery, as required by guideline 8.
* - Strip command: `sed -i '' '/^ \* Update URI:/d' radio.php` before zipping.
*/ */
if ( ! defined( 'ABSPATH' ) ) { exit; } if ( ! defined( 'ABSPATH' ) ) { exit; }
// Plugin coordinates. // Plugin coordinates.
if ( ! defined( 'RADIO_VERSION' ) ) { define( 'RADIO_VERSION', '0.7.0' ); } if ( ! defined( 'RADIO_VERSION' ) ) { define( 'RADIO_VERSION', '0.7.3' ); }
if ( ! defined( 'RADIO_FILE' ) ) { define( 'RADIO_FILE', __FILE__ ); } if ( ! defined( 'RADIO_FILE' ) ) { define( 'RADIO_FILE', __FILE__ ); }
if ( ! defined( 'RADIO_PATH' ) ) { define( 'RADIO_PATH', plugin_dir_path( __FILE__ ) ); } if ( ! defined( 'RADIO_PATH' ) ) { define( 'RADIO_PATH', plugin_dir_path( __FILE__ ) ); }
if ( ! defined( 'RADIO_URL' ) ) { define( 'RADIO_URL', plugin_dir_url( __FILE__ ) ); } if ( ! defined( 'RADIO_URL' ) ) { define( 'RADIO_URL', plugin_dir_url( __FILE__ ) ); }
+44 -11
View File
@@ -1,10 +1,10 @@
=== RangerHQ Radio === === RangerHQ Radio ===
Contributors: davidtkeane Contributors: ir240474
Donate link: https://buymeacoffee.com/davidtkeane Donate link: https://buymeacoffee.com/davidtkeane
Tags: radio, music, audio, internet radio, background music Tags: radio, music, audio, internet radio, background music
Requires at least: 5.3 Requires at least: 5.3
Tested up to: 6.7 Tested up to: 7.0
Stable tag: 0.7.0 Stable tag: 0.7.3
Requires PHP: 7.4 Requires PHP: 7.4
License: GPLv2 or later License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html License URI: https://www.gnu.org/licenses/gpl-2.0.html
@@ -26,11 +26,25 @@ A small, focused internet radio player for your WordPress admin — 44 hand-cura
* **Dark theme** — explicit dark option for the player surface (`Settings → Theme`). * **Dark theme** — explicit dark option for the player surface (`Settings → Theme`).
* **Per-user state** — your chosen station, volume, theme, history, and favourites all live in `user_meta`, so each WordPress user has their own setup. * **Per-user state** — your chosen station, volume, theme, history, and favourites all live in `user_meta`, so each WordPress user has their own setup.
= Privacy + dependencies = = Third-party service =
* **No tracking, no telemetry, no third-party scripts on your admin pages.** Audio plays directly in your browser via HTML5 — just an `<audio>` element pointed at SomaFM's public streams. This plugin streams audio from **[SomaFM](https://somafm.com)** — an independent, listener-supported, commercial-free internet radio network broadcasting from San Francisco since 2000. RangerHQ Radio is a small WordPress wrapper around their public streams; the service itself provides all the music. SomaFM's terms of use are at [somafm.com/legal/](https://somafm.com/legal/). If you enjoy the music, please consider [supporting SomaFM directly](https://somafm.com/support/).
* **No data leaves your site.** History and favourites are stored in your own `wp_usermeta`. The four search links use deep-link search URLs on each provider's public site — no API keys, no third-party JS embedded.
* **Stations courtesy of [SomaFM](https://somafm.com)** — an independent, listener-supported, commercial-free internet radio network broadcasting from San Francisco since 2000. RangerHQ Radio is a small wrapper around their public streams. If you enjoy the music, please consider [supporting SomaFM directly](https://somafm.com/support/). See the dedicated Privacy section below for everything that does and does not leave your site.
== Privacy ==
RangerHQ Radio is privacy-respecting by design:
* **No telemetry from the plugin.** RangerHQ Radio does not phone home, report usage statistics, or contact the plugin author's servers in any way.
* **No data leaves your site.** All per-user state — station choice, volume, theme, listening history, favourites — is stored in your own WordPress database (`wp_usermeta`) and never transmitted anywhere.
* **Audio streams come from SomaFM directly.** When you press Play, your browser opens an HTTP stream to `https://somafm.com` — the plugin does not proxy, log, or analyse this connection. SomaFM's own privacy practices apply to the stream; see [SomaFM legal](https://somafm.com/legal/).
* **Current-track display** polls SomaFM's public songs endpoint (`https://somafm.com/songs/{station}.json`) every 30 seconds **while audio is playing**. The plugin sends no identifying information with this request. Polling stops the moment you pause.
* **Search-provider links** (Spotify / YouTube / Apple Music / Bandcamp) are outbound only. Clicking one opens a new tab with a search URL on that service — the plugin sends no data and stores no information about which links you click.
* **No third-party JavaScript** is loaded from outside your own server. All scripts ship inside the plugin.
* **Self-hosted updater** (`inc/updater.php`) is included in the WordPress.org distribution but is automatically disabled — WordPress.org handles updates per the directory guidelines. The code is only active when the plugin is installed from the author's own Gitea instance.
If you do not want any third-party traffic at all, simply do not press Play.
== Installation == == Installation ==
@@ -64,13 +78,23 @@ SomaFM's track-info endpoint (`somafm.com/songs/{station}.json`) is fetched best
== Screenshots == == Screenshots ==
1. The main player page (Radio → My Radio) with the now-playing indicator dancing while audio is playing. 1. Dashboard widget — compact mini-player on the WordPress Dashboard, sits alongside your usual dashboard widgets.
2. The dashboard widgetsame player, compact, sits alongside your usual dashboard widgets. 2. Settings page — choose default station, default volume, theme; admin-only Updates panel below.
3. Track History page with star-to-favourite and four search-provider links per row. 3. Track History page — every track that scrolled past, star-to-favourite, with Spotify / YouTube / Apple / Bandcamp deep-link search per row.
4. Pop-out mini-player window — keeps playing while you navigate the rest of the admin. 4. Pop-out mini-player window — 380×560 standalone window that keeps playing while you navigate the rest of the admin.
5. About page — what Radio does, who it's for, credits, full version history.
== Changelog == == Changelog ==
= 0.7.3 =
* WordPress.org guideline 8 compliance + Privacy documentation. Added `Update URI: https://git.davidtkeane.com/ranger/a-radio` header so installs from the author's Gitea continue to receive updates from there, while wp.org-distributed copies (where the build script strips this line) hand update delivery to WordPress.org — the self-hosted updater short-circuits at load time and the Updates panel hides automatically. Added a dedicated `== Privacy ==` section to the readme covering every outbound connection (none from the plugin itself; SomaFM audio + 30-second songs.json poll while playing). Added explicit link to SomaFM's terms of use at https://somafm.com/legal/. No user-visible behaviour changes.
= 0.7.2 =
* Screenshots + correct wp.org contributor handle. Five `screenshot-N.png` files added at plugin root (Dashboard widget, Settings page, History page, Pop-out window, About page). `Contributors` header updated from placeholder to actual wp.org username `ir240474`.
= 0.7.1 =
* Plugin Check follow-up — `Tested up to` bumped from 6.7 to 7.0 (PCP `outdated_tested_upto_header`). Stray `.DS_Store` files re-deleted (macOS Finder regenerated them between PCP runs; they won't be in the submission zip).
= 0.7.0 = = 0.7.0 =
* WordPress.org submission prep — full PCP-clean. Plugin name normalised to **RangerHQ Radio** (SomaFM stays in the description as the data source). Text Domain renamed `radio` → `a-radio` everywhere (134 i18n call sites updated). Six `printf` / `sprintf` calls now carry translator comments. All admin `$_POST` access now `wp_unslash()` + `sanitize_*` at the access point. `Requires at least` bumped to 5.3 (matches `wp_date()` usage). Pop-out window now uses `wp_enqueue_*` + `wp_print_styles()` / `wp_print_footer_scripts()` instead of raw `<link>` / `<script>` tags; popup-specific CSS moved into `radio.css` under `body.radio-popout` scope. `.DS_Store` files removed. Proper `readme.txt`. * WordPress.org submission prep — full PCP-clean. Plugin name normalised to **RangerHQ Radio** (SomaFM stays in the description as the data source). Text Domain renamed `radio` → `a-radio` everywhere (134 i18n call sites updated). Six `printf` / `sprintf` calls now carry translator comments. All admin `$_POST` access now `wp_unslash()` + `sanitize_*` at the access point. `Requires at least` bumped to 5.3 (matches `wp_date()` usage). Pop-out window now uses `wp_enqueue_*` + `wp_print_styles()` / `wp_print_footer_scripts()` instead of raw `<link>` / `<script>` tags; popup-specific CSS moved into `radio.css` under `body.radio-popout` scope. `.DS_Store` files removed. Proper `readme.txt`.
@@ -103,5 +127,14 @@ SomaFM's track-info endpoint (`somafm.com/songs/{station}.json`) is fetched best
== Upgrade Notice == == Upgrade Notice ==
= 0.7.3 =
WordPress.org submission compliance — adds `Update URI` header so the self-hosted updater stays dormant on wp.org installs (guideline 8). Adds Privacy section + SomaFM terms link. No user-visible changes.
= 0.7.2 =
Screenshots + correct wp.org contributor handle. No user-visible changes.
= 0.7.1 =
PCP follow-up — `Tested up to` bumped to 7.0. No user-visible changes.
= 0.7.0 = = 0.7.0 =
WordPress.org submission prep. Plugin name now "RangerHQ Radio". Text Domain renamed `radio` → `a-radio`. No user-visible behaviour changes; settings, history, and favourites all survive the upgrade. WordPress.org submission prep. Plugin name now "RangerHQ Radio". Text Domain renamed `radio` → `a-radio`. No user-visible behaviour changes; settings, history, and favourites all survive the upgrade.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 268 KiB