feat: Initial release v0.1.0

WP FediStream - Stream music over ActivityPub

Features:
- Custom post types: Artist, Album, Track, Playlist
- Custom taxonomies: Genre, Mood, License
- User roles: Artist, Label
- Admin dashboard with statistics
- Frontend templates and shortcodes
- Audio player with queue management
- ActivityPub integration with actor support
- WooCommerce product types for albums/tracks
- User library with favorites and history
- Notification system (in-app and email)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-28 23:23:05 +01:00
commit 4a5d7b9f4d
91 changed files with 22750 additions and 0 deletions

View File

@@ -0,0 +1,308 @@
<?php
/**
* User roles and capabilities.
*
* @package WP_FediStream
*/
namespace WP_FediStream\Roles;
// Prevent direct file access.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Capabilities class.
*
* Handles custom user roles and capabilities.
*/
class Capabilities {
/**
* Post type capabilities.
*
* @var array
*/
private const POST_TYPE_CAPS = array(
'fedistream_artist' => array(
'edit_post' => 'edit_fedistream_artist',
'read_post' => 'read_fedistream_artist',
'delete_post' => 'delete_fedistream_artist',
'edit_posts' => 'edit_fedistream_artists',
'edit_others_posts' => 'edit_others_fedistream_artists',
'publish_posts' => 'publish_fedistream_artists',
'read_private_posts' => 'read_private_fedistream_artists',
),
'fedistream_album' => array(
'edit_post' => 'edit_fedistream_album',
'read_post' => 'read_fedistream_album',
'delete_post' => 'delete_fedistream_album',
'edit_posts' => 'edit_fedistream_albums',
'edit_others_posts' => 'edit_others_fedistream_albums',
'publish_posts' => 'publish_fedistream_albums',
'read_private_posts' => 'read_private_fedistream_albums',
),
'fedistream_track' => array(
'edit_post' => 'edit_fedistream_track',
'read_post' => 'read_fedistream_track',
'delete_post' => 'delete_fedistream_track',
'edit_posts' => 'edit_fedistream_tracks',
'edit_others_posts' => 'edit_others_fedistream_tracks',
'publish_posts' => 'publish_fedistream_tracks',
'read_private_posts' => 'read_private_fedistream_tracks',
),
'fedistream_playlist' => array(
'edit_post' => 'edit_fedistream_playlist',
'read_post' => 'read_fedistream_playlist',
'delete_post' => 'delete_fedistream_playlist',
'edit_posts' => 'edit_fedistream_playlists',
'edit_others_posts' => 'edit_others_fedistream_playlists',
'publish_posts' => 'publish_fedistream_playlists',
'read_private_posts' => 'read_private_fedistream_playlists',
),
);
/**
* Taxonomy capabilities.
*
* @var array
*/
private const TAXONOMY_CAPS = array(
'manage_fedistream_genres',
'manage_fedistream_moods',
'manage_fedistream_licenses',
);
/**
* Custom capabilities.
*
* @var array
*/
private const CUSTOM_CAPS = array(
'view_fedistream_stats',
'manage_fedistream_settings',
);
/**
* Get all custom capabilities.
*
* @return array Array of all custom capabilities.
*/
public static function get_all_capabilities(): array {
$caps = array();
// Post type capabilities.
foreach ( self::POST_TYPE_CAPS as $post_type_caps ) {
$caps = array_merge( $caps, array_values( $post_type_caps ) );
}
// Delete capabilities.
$caps[] = 'delete_fedistream_artists';
$caps[] = 'delete_others_fedistream_artists';
$caps[] = 'delete_published_fedistream_artists';
$caps[] = 'delete_private_fedistream_artists';
$caps[] = 'delete_fedistream_albums';
$caps[] = 'delete_others_fedistream_albums';
$caps[] = 'delete_published_fedistream_albums';
$caps[] = 'delete_private_fedistream_albums';
$caps[] = 'delete_fedistream_tracks';
$caps[] = 'delete_others_fedistream_tracks';
$caps[] = 'delete_published_fedistream_tracks';
$caps[] = 'delete_private_fedistream_tracks';
$caps[] = 'delete_fedistream_playlists';
$caps[] = 'delete_others_fedistream_playlists';
$caps[] = 'delete_published_fedistream_playlists';
$caps[] = 'delete_private_fedistream_playlists';
// Taxonomy capabilities.
$caps = array_merge( $caps, self::TAXONOMY_CAPS );
// Custom capabilities.
$caps = array_merge( $caps, self::CUSTOM_CAPS );
return array_unique( $caps );
}
/**
* Get Artist role capabilities.
*
* @return array Array of capabilities for the Artist role.
*/
public static function get_artist_capabilities(): array {
return array(
// Core WordPress.
'read' => true,
'upload_files' => true,
// Own artists.
'edit_fedistream_artists' => true,
'edit_published_fedistream_artists' => true,
'publish_fedistream_artists' => true,
'delete_fedistream_artists' => true,
'delete_published_fedistream_artists' => true,
// Own albums.
'edit_fedistream_albums' => true,
'edit_published_fedistream_albums' => true,
'publish_fedistream_albums' => true,
'delete_fedistream_albums' => true,
'delete_published_fedistream_albums' => true,
// Own tracks.
'edit_fedistream_tracks' => true,
'edit_published_fedistream_tracks' => true,
'publish_fedistream_tracks' => true,
'delete_fedistream_tracks' => true,
'delete_published_fedistream_tracks' => true,
// Own playlists.
'edit_fedistream_playlists' => true,
'edit_published_fedistream_playlists' => true,
'publish_fedistream_playlists' => true,
'delete_fedistream_playlists' => true,
'delete_published_fedistream_playlists' => true,
// View stats.
'view_fedistream_stats' => true,
);
}
/**
* Get Label role capabilities.
*
* @return array Array of capabilities for the Label role.
*/
public static function get_label_capabilities(): array {
$caps = self::get_artist_capabilities();
// Add label-specific capabilities.
$label_caps = array(
// Manage others' content.
'edit_others_fedistream_artists' => true,
'edit_others_fedistream_albums' => true,
'edit_others_fedistream_tracks' => true,
'edit_others_fedistream_playlists' => true,
'delete_others_fedistream_artists' => true,
'delete_others_fedistream_albums' => true,
'delete_others_fedistream_tracks' => true,
'delete_others_fedistream_playlists' => true,
'read_private_fedistream_artists' => true,
'read_private_fedistream_albums' => true,
'read_private_fedistream_tracks' => true,
'read_private_fedistream_playlists' => true,
'delete_private_fedistream_artists' => true,
'delete_private_fedistream_albums' => true,
'delete_private_fedistream_tracks' => true,
'delete_private_fedistream_playlists' => true,
// Manage taxonomies.
'manage_fedistream_genres' => true,
'manage_fedistream_moods' => true,
'manage_fedistream_licenses' => true,
// View stats.
'view_fedistream_stats' => true,
);
return array_merge( $caps, $label_caps );
}
/**
* Add custom roles.
*
* @return void
*/
public static function add_roles(): void {
// Remove existing roles first to ensure clean slate.
remove_role( 'fedistream_artist' );
remove_role( 'fedistream_label' );
// Add Artist role.
add_role(
'fedistream_artist',
__( 'FediStream Artist', 'wp-fedistream' ),
self::get_artist_capabilities()
);
// Add Label role.
add_role(
'fedistream_label',
__( 'FediStream Label', 'wp-fedistream' ),
self::get_label_capabilities()
);
}
/**
* Remove custom roles.
*
* @return void
*/
public static function remove_roles(): void {
remove_role( 'fedistream_artist' );
remove_role( 'fedistream_label' );
}
/**
* Add capabilities to administrator role.
*
* @return void
*/
public static function add_admin_capabilities(): void {
$admin = get_role( 'administrator' );
if ( ! $admin ) {
return;
}
// Add all custom capabilities.
$all_caps = self::get_all_capabilities();
foreach ( $all_caps as $cap ) {
$admin->add_cap( $cap );
}
// Add management capability.
$admin->add_cap( 'manage_fedistream_settings' );
}
/**
* Remove capabilities from administrator role.
*
* @return void
*/
public static function remove_admin_capabilities(): void {
$admin = get_role( 'administrator' );
if ( ! $admin ) {
return;
}
// Remove all custom capabilities.
$all_caps = self::get_all_capabilities();
foreach ( $all_caps as $cap ) {
$admin->remove_cap( $cap );
}
$admin->remove_cap( 'manage_fedistream_settings' );
}
/**
* Install roles and capabilities.
*
* @return void
*/
public static function install(): void {
self::add_roles();
self::add_admin_capabilities();
}
/**
* Uninstall roles and capabilities.
*
* @return void
*/
public static function uninstall(): void {
self::remove_roles();
self::remove_admin_capabilities();
}
}