function activate_for_current_blog() { Model\Feed::build(); Model\FileType::build(); Model\EpisodeAsset::build(); Model\MediaFile::build(); Model\Show::build(); Model\Episode::build(); Model\Release::build(); if (!Model\FileType::has_entries()) { $default_types = array(array('name' => 'MP3 Audio', 'type' => 'audio', 'mime_type' => 'audio/mpeg', 'extension' => 'mp3'), array('name' => 'BitTorrent (MP3 Audio)', 'type' => 'audio', 'mime_type' => 'application/x-bittorrent', 'extension' => 'mp3.torrent'), array('name' => 'MPEG-1 Video', 'type' => 'video', 'mime_type' => 'video/mpeg', 'extension' => 'mpg'), array('name' => 'MPEG-4 AAC Audio', 'type' => 'audio', 'mime_type' => 'audio/mp4', 'extension' => 'm4a'), array('name' => 'MPEG-4 ALAC Audio', 'type' => 'audio', 'mime_type' => 'audio/mp4', 'extension' => 'm4a'), array('name' => 'MPEG-4 Video', 'type' => 'video', 'mime_type' => 'video/mp4', 'extension' => 'm4v'), array('name' => 'Ogg Vorbis Audio', 'type' => 'audio', 'mime_type' => 'audio/ogg', 'extension' => 'oga'), array('name' => 'Ogg Vorbis Audio', 'type' => 'audio', 'mime_type' => 'audio/ogg', 'extension' => 'ogg'), array('name' => 'Ogg Theora Video', 'type' => 'video', 'mime_type' => 'video/ogg', 'extension' => 'ogv'), array('name' => 'WebM Audio', 'type' => 'audio', 'mime_type' => 'audio/webm', 'extension' => 'webm'), array('name' => 'WebM Video', 'type' => 'video', 'mime_type' => 'video/webm', 'extension' => 'webm'), array('name' => 'FLAC Audio', 'type' => 'audio', 'mime_type' => 'audio/flac', 'extension' => 'flac'), array('name' => 'Opus Audio', 'type' => 'audio', 'mime_type' => 'audio/opus', 'extension' => 'opus'), array('name' => 'Matroska Audio', 'type' => 'audio', 'mime_type' => 'audio/x-matroska', 'extension' => 'mka'), array('name' => 'Matroska Video', 'type' => 'video', 'mime_type' => 'video/x-matroska', 'extension' => 'mkv'), array('name' => 'Matroska Video', 'type' => 'video', 'mime_type' => 'video/x-matroska', 'extension' => 'mkv'), array('name' => 'PDF Document', 'type' => 'ebook', 'mime_type' => 'application/pdf', 'extension' => 'pdf'), array('name' => 'ePub Document', 'type' => 'ebook', 'mime_type' => 'application/epub+zip', 'extension' => 'epub'), array('name' => 'PNG Image', 'type' => 'image', 'mime_type' => 'image/png', 'extension' => 'png'), array('name' => 'JPEG Image', 'type' => 'image', 'mime_type' => 'image/jpeg', 'extension' => 'jpg'), array('name' => 'mp4chaps Chapter File', 'type' => 'chapters', 'mime_type' => 'text/plain', 'extension' => 'txt')); foreach ($default_types as $file_type) { $f = new Model\FileType(); foreach ($file_type as $key => $value) { $f->{$key} = $value; } $f->save(); } } $default_modules = array('podlove_web_player', 'episode_assistant', 'open_graph'); foreach ($default_modules as $module) { \Podlove\Modules\Base::activate($module); } }
function activate_for_current_blog() { Model\Feed::build(); Model\FileType::build(); Model\EpisodeAsset::build(); Model\MediaFile::build(); Model\Episode::build(); Model\Template::build(); Model\DownloadIntent::build(); Model\DownloadIntentClean::build(); Model\UserAgent::build(); Model\GeoArea::build(); Model\GeoAreaName::build(); \podlove_init_capabilities(); if (!Model\FileType::has_entries()) { $default_types = array(array('name' => 'MP3 Audio', 'type' => 'audio', 'mime_type' => 'audio/mpeg', 'extension' => 'mp3'), array('name' => 'BitTorrent (MP3 Audio)', 'type' => 'audio', 'mime_type' => 'application/x-bittorrent', 'extension' => 'mp3.torrent'), array('name' => 'MPEG-1 Video', 'type' => 'video', 'mime_type' => 'video/mpeg', 'extension' => 'mpg'), array('name' => 'MPEG-4 AAC Audio', 'type' => 'audio', 'mime_type' => 'audio/mp4', 'extension' => 'm4a'), array('name' => 'MPEG-4 ALAC Audio', 'type' => 'audio', 'mime_type' => 'audio/mp4', 'extension' => 'm4a'), array('name' => 'MPEG-4 Video', 'type' => 'video', 'mime_type' => 'video/mp4', 'extension' => 'mp4'), array('name' => 'M4V Video (Apple)', 'type' => 'video', 'mime_type' => 'video/x-m4v', 'extension' => 'm4v'), array('name' => 'Ogg Vorbis Audio', 'type' => 'audio', 'mime_type' => 'audio/ogg', 'extension' => 'oga'), array('name' => 'Ogg Vorbis Audio', 'type' => 'audio', 'mime_type' => 'audio/ogg', 'extension' => 'ogg'), array('name' => 'Ogg Theora Video', 'type' => 'video', 'mime_type' => 'video/ogg', 'extension' => 'ogv'), array('name' => 'WebM Audio', 'type' => 'audio', 'mime_type' => 'audio/webm', 'extension' => 'webm'), array('name' => 'WebM Video', 'type' => 'video', 'mime_type' => 'video/webm', 'extension' => 'webm'), array('name' => 'FLAC Audio', 'type' => 'audio', 'mime_type' => 'audio/flac', 'extension' => 'flac'), array('name' => 'Opus Audio', 'type' => 'audio', 'mime_type' => 'audio/ogg;codecs=opus', 'extension' => 'opus'), array('name' => 'Matroska Audio', 'type' => 'audio', 'mime_type' => 'audio/x-matroska', 'extension' => 'mka'), array('name' => 'Matroska Video', 'type' => 'video', 'mime_type' => 'video/x-matroska', 'extension' => 'mkv'), array('name' => 'PDF Document', 'type' => 'ebook', 'mime_type' => 'application/pdf', 'extension' => 'pdf'), array('name' => 'ePub Document', 'type' => 'ebook', 'mime_type' => 'application/epub+zip', 'extension' => 'epub'), array('name' => 'PNG Image', 'type' => 'image', 'mime_type' => 'image/png', 'extension' => 'png'), array('name' => 'JPEG Image', 'type' => 'image', 'mime_type' => 'image/jpeg', 'extension' => 'jpg'), array('name' => 'mp4chaps Chapter File', 'type' => 'chapters', 'mime_type' => 'text/plain', 'extension' => 'chapters.txt'), array('name' => 'Podlove Simple Chapters', 'type' => 'chapters', 'mime_type' => 'application/xml', 'extension' => 'psc'), array('name' => 'Subrip Captions', 'type' => 'captions', 'mime_type' => 'application/x-subrip', 'extension' => 'srt'), array('name' => 'WebVTT Captions', 'type' => 'captions', 'mime_type' => 'text/vtt', 'extension' => 'vtt'), array('name' => 'Auphonic Production Description', 'type' => 'metadata', 'mime_type' => 'application/json', 'extension' => 'json')); foreach ($default_types as $file_type) { $f = new Model\FileType(); foreach ($file_type as $key => $value) { $f->{$key} = $value; } $f->save(); } } $podcast = Model\Podcast::get(); if (!$podcast->limit_items) { $podcast->limit_items = Model\Feed::ITEMS_NO_LIMIT; } $podcast->save(); // required for all module hooks to fire correctly add_option('podlove_active_modules', []); // set default modules $default_modules = array('logging', 'podlove_web_player', 'open_graph', 'asset_validation', 'oembed', 'feed_validation', 'import_export', 'subscribe_button'); foreach ($default_modules as $module) { \Podlove\Modules\Base::activate($module); } // set default expert settings $settings = get_option('podlove', array()); if ($settings === array()) { $settings = array('merge_episodes' => 'on', 'hide_wp_feed_discovery' => 'off', 'use_post_permastruct' => 'on', 'episode_archive' => 'on', 'episode_archive_slug' => '/podcast/', 'custom_episode_slug' => '/podcast/%podcast%/'); update_option('podlove', $settings); } // set default template if (!($template = Model\Template::find_one_by_property('title', 'default'))) { $template = new Model\Template(); $template->title = 'default'; $template->content = <<<EOT {% if not is_feed() %} \t{# display web player for episode #} \t{{ episode.player }} \t \t{# display download menu for episode #} \t{% include "@core/shortcode/downloads-select.twig" %} {% endif %} EOT; $template->save(); $assignment = Model\TemplateAssignment::get_instance(); $assignment->top = $template->id; $assignment->save(); } }
/** * Find and run migration for given version number. * * @todo move migrations into separate files * * @param int $version */ function run_migrations_for_version($version) { global $wpdb; switch ($version) { case 2: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `chapters` TEXT AFTER `cover_art`', \Podlove\Model\Release::table_name()); $wpdb->query($sql); break; case 3: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `format` VARCHAR(255) AFTER `slug`', \Podlove\Model\Feed::table_name()); $wpdb->query($sql); break; case 4: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `title` VARCHAR(255) AFTER `id`', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); break; case 5: \Podlove\Modules\Base::activate('podlove_web_player'); break; case 6: // title column is "int" for some people. this migration fixes that $sql = sprintf('SHOW COLUMNS FROM `wp_podlove_medialocation` WHERE Field = "title"', \Podlove\Model\EpisodeAsset::table_name()); $row = $wpdb->get_row($sql); if (strtolower(substr($row->Type, 0, 3)) === 'int') { $wpdb->query(sprintf('UPDATE `%s` SET title = NULL', \Podlove\Model\EpisodeAsset::table_name())); $wpdb->query(sprintf('ALTER TABLE `%s` MODIFY COLUMN `title` VARCHAR(255)', \Podlove\Model\EpisodeAsset::table_name())); } break; case 7: // move language from feed to show $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `language` VARCHAR(255) AFTER `summary`', \Podlove\Model\Show::table_name()); $wpdb->query($sql); $sql = sprintf('ALTER TABLE `%s` DROP COLUMN `language`', \Podlove\Model\Feed::table_name()); $wpdb->query($sql); break; case 8: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `supports_cover_art` INT', \Podlove\Model\Show::table_name()); $wpdb->query($sql); break; case 9: // huge architecture migration // assume first show will be blueprint for the podcast $show = $wpdb->get_row(sprintf('SELECT * FROM %s LIMIT 1', $wpdb->prefix . 'podlove_show'), ARRAY_A); $show_id = $show['id']; // On my local machine the migration runs twice. // This is a quick fix. caveat: someone who has no show defined // will need to uninstall the plugin. That seems acceptable. if (!$show_id) { return; } // all releases of this show will be converted to episodes $releases = $wpdb->get_results(sprintf(' SELECT E.post_id, R.episode_id, R.active, R.enable, R.slug, R.duration, R.cover_art, R.chapters FROM %s R INNER JOIN %s E ON R.episode_id = E.id WHERE R.show_id = "%s" ', $wpdb->prefix . 'podlove_release', $wpdb->prefix . 'podlove_episode', $show_id), ARRAY_A); // write show settings to podcast $podcast = \Podlove\Model\Podcast::get_instance(); foreach ($show as $key => $value) { $podcast->{$key} = $value; } $podcast->save(); // rebuild show table \Podlove\Model\Show::destroy(); \Podlove\Model\Show::build(); // rebuild episodes table \Podlove\Model\Episode::destroy(); \Podlove\Model\Episode::build(); foreach ($releases as $release) { $episode = new \Podlove\Model\Episode(); foreach ($release as $key => $value) { if (!in_array($key, array('episode_id'))) { $episode->{$key} = $value; } } $episode->save(); } // clean feed table $sql = sprintf('DELETE FROM `%s` WHERE `show_id` != "%s"', \Podlove\Model\Feed::table_name(), $show_id); $wpdb->query($sql); $sql = sprintf('ALTER TABLE `%s` DROP COLUMN `show_id`', \Podlove\Model\Feed::table_name()); $wpdb->query($sql); // fix mediafile table $sql = sprintf('ALTER TABLE `%s` CHANGE `release_id` `episode_id` INT', \Podlove\Model\MediaFile::table_name()); $wpdb->query($sql); // remove suffix $sql = sprintf('ALTER TABLE `%s` DROP COLUMN `suffix`', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); // add more default formats $default_formats = array(array('name' => 'PDF Document', 'type' => 'ebook', 'mime_type' => 'application/pdf', 'extension' => 'pdf'), array('name' => 'ePub Document', 'type' => 'ebook', 'mime_type' => 'application/epub+zip', 'extension' => 'epub'), array('name' => 'PNG Image', 'type' => 'image', 'mime_type' => 'image/png', 'extension' => 'png'), array('name' => 'JPEG Image', 'type' => 'image', 'mime_type' => 'image/jpeg', 'extension' => 'jpg')); foreach ($default_formats as $format) { $f = new Model\FileType(); foreach ($format as $key => $value) { $f->{$key} = $value; } $f->save(); } // update assistant $assistant = \Podlove\Modules\EpisodeAssistant\Episode_Assistant::instance(); $template = $assistant->get_module_option('title_template'); $template = str_replace('%show_slug%', '%podcast_slug%', $template); $assistant->update_module_option('title_template', $template); // update media locations $media_locations = \Podlove\Model\EpisodeAsset::all(); foreach ($media_locations as $media_location) { $media_location->url_template = str_replace('%suffix%', '', $media_location->url_template); $media_location->save(); } break; case 10: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `summary` TEXT', \Podlove\Model\Episode::table_name()); $wpdb->query($sql); break; case 11: $sql = sprintf('ALTER TABLE `%s` ADD COLUMN `downloadable` INT', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); break; case 12: $sql = sprintf('UPDATE `%s` SET `downloadable` = 1', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); break; case 13: $opus = array('name' => 'Opus Audio', 'type' => 'audio', 'mime_type' => 'audio/opus', 'extension' => 'opus'); $f = new \Podlove\Model\FileType(); foreach ($opus as $key => $value) { $f->{$key} = $value; } $f->save(); break; case 14: $sql = sprintf('ALTER TABLE `%s` RENAME TO `%s`', $wpdb->prefix . 'podlove_medialocation', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); break; case 15: $sql = sprintf('ALTER TABLE `%s` CHANGE `media_location_id` `episode_asset_id` INT', \Podlove\Model\MediaFile::table_name()); $wpdb->query($sql); break; case 16: $sql = sprintf('ALTER TABLE `%s` CHANGE `media_location_id` `episode_asset_id` INT', \Podlove\Model\Feed::table_name()); $wpdb->query($sql); break; case 17: $sql = sprintf('ALTER TABLE `%s` RENAME TO `%s`', $wpdb->prefix . 'podlove_mediaformat', \Podlove\Model\FileType::table_name()); $wpdb->query($sql); break; case 18: $sql = sprintf('ALTER TABLE `%s` CHANGE `media_format_id` `file_type_id` INT', \Podlove\Model\EpisodeAsset::table_name()); $wpdb->query($sql); break; } }