PowerPress Podcasting plugin by Blubrry - Version 7.0.4

Version Description

  • Released on 2/18/2017
  • NOTE: There is no urgency to update to this version unless you can benefit from the new import options, top level iTunes category options, or bug fixes listed.
  • Playlist player bug fix: When ids="" are specified, episodes are now listed in the order entered rather than by date. (Thanks Zach Herbert for bringing to our attention!)
  • Updated the powerpress_subscribe shortcode to include the latest iTunes button in svg format and added the iTunes small badge. Use attribute itunes_badge="true" to display iTunes badge.
  • Changed import feed code to use the current author ID rather than hard coded to 1. (Thanks @tund3r for the bug fix!)
  • Import feed for libsyn updated. (Thanks @tund3r for the code fix!)
  • Import feed advanced option "Remove query strings from media URLs" added. (Thanks @tund3r!)
  • Fixed rare PHP Notice unserialize() on line 3094 error that may happen if the podcast episode serialized data is not present. (Thanks @hmseb for pointing out the notice to us!)
  • Added colon ":" to list of characters that can be in a valid media URL. (Thanks AfterBuzzTV.com! for the heads up!)
  • Fixed notice message that can appear when using the media objects with the powerpress shortcode. (Thanks @srumery for reporting the problem!)
  • Fixed issue with dashboard failing to load in some cases due to news feed being blocked by web server. (Thanks Jacob K. for helping us debug the problem!)
  • iTunes categories with subcategories are no longer strictly enforced. If you want to select "Art" without selecting a sub category you now can. Selecting a category with a sub category is still optimal.
  • Added ability to import a podcast feed to a post type podcast feed or to a podcast channel.
  • Added ability to set the post status when importing a podcast feed. (Thanks @hgetrost for the feature suggestion!)
  • Added compatibility with the Custom Post Widget plugin. (Thanks @aparentdesign for letting us know about the problem)
  • Fixed bug where ogg audio was not using the correct audio player. (Thanks @joeress for letting us know about the bug)
  • Fixed bug with import not matching episode media URLs correctly. (Thanks @hgetrost for bringing to our attention)
Download this release

Release Info

Developer amandato
Plugin Icon 128x128 PowerPress Podcasting plugin by Blubrry
Version 7.0.4
Comparing to
See all releases

Code changes from version 7.0.3 to 7.0.4

feed-podcast.php CHANGED
@@ -150,7 +150,7 @@ echo '<?xml version="1.0" encoding="'.get_option('blog_charset').'"?'.'>'."\n";
150
  <?php } // end else strlen( $post->post_content ) <= 0 ?>
151
  <?php } // end else no rss_use_excerpt ?>
152
  <?php
153
- }
154
  else // If feed maximizer on
155
  {
156
  ?>
150
  <?php } // end else strlen( $post->post_content ) <= 0 ?>
151
  <?php } // end else no rss_use_excerpt ?>
152
  <?php
153
+ } // feed maximizer off
154
  else // If feed maximizer on
155
  {
156
  ?>
powerpress-player.php CHANGED
@@ -519,6 +519,8 @@ function powerpressplayer_player_audio($content, $media_url, $EpisodeData = arra
519
  return $content; // Ogg is handled as video
520
  }
521
  case 'oga': {
 
 
522
  if( !isset($Settings['player']) )
523
  $Settings['player'] = 'mediaelement-audio';
524
 
@@ -790,12 +792,16 @@ function powerpressplayer_mediaobjects($type, $content, $media_url, $EpisodeData
790
 
791
  //var_dump($EpisodeData);
792
  $post_title = get_the_title();
793
- if( !empty($post_title) )
794
  $addhtml .= '<meta itemprop="name" content="'. htmlspecialchars($post_title) .'" />'.PHP_EOL_WEB;
 
 
795
  $addhtml .= '<meta itemprop="encodingFormat" content="'. powerpress_get_contenttype($media_url) .'" />'.PHP_EOL_WEB;
796
- $addhtml .= '<meta itemprop="duration" content="'. powerpress_iso8601_duration($EpisodeData['duration']) .'" />'.PHP_EOL_WEB; // http://en.wikipedia.org/wiki/ISO_8601#Durations
797
- if( !empty($EpisodeData['subtitle']) )
798
- {
 
 
799
  $addhtml .= '<meta itemprop="description" content="'. htmlspecialchars($EpisodeData['subtitle']) .'" />'.PHP_EOL_WEB;
800
  }
801
  else
@@ -1463,58 +1469,6 @@ function powerpressplayer_build_mediaelementaudio($media_url, $EpisodeData=array
1463
  return $content;
1464
  }
1465
 
1466
- /*
1467
- HTTML 5 Mobile Player
1468
- */
1469
- function powerpressplayer_build_html5mobile($media_url, $EpisodeData)
1470
- {
1471
- $content = '';
1472
- $html5 = true;
1473
- // Special logic, we need to check if we're dealing with Android 2.2 or older, in which case we don't want to use HTML5 audio/video due to controls bug
1474
- if( preg_match('/android ([\d\.]+)/i', $_SERVER['HTTP_USER_AGENT'], $matches) )
1475
- {
1476
- if( !empty($matches[1]) && version_compare($matches[1], "2.3") < 0 )
1477
- $html5 = false;
1478
- }
1479
-
1480
- $extension = powerpressplayer_get_extension($media_url);
1481
- switch( $extension )
1482
- {
1483
- case 'mp4':
1484
- case 'webm':
1485
- case 'm4v':
1486
- case 'ogg':
1487
- case 'ogv': {
1488
- // Video
1489
- $Settings = get_option('powerpress_general');
1490
-
1491
- // MEJS is not ready for mobile, using native HTML5 performs more efficiently at this point. Someday though we will be able to use MEJS for mobile.
1492
- if( $html5 && !empty($Settings['video_player']) && $Settings['video_player'] == 'mediaelement-video' )
1493
- $content .= powerpressplayer_build_mediaelementvideo($media_url, $EpisodeData);
1494
- else if( $html5 )
1495
- $content .= powerpressplayer_build_html5video($media_url, $EpisodeData);
1496
- else
1497
- $content .= powerpressplayer_build_playimage($media_url, $EpisodeData, true);
1498
- }; break;
1499
- case 'mp3':
1500
- case 'm4a':
1501
- case 'oga': {
1502
- // Audio
1503
- $Settings = get_option('powerpress_general');
1504
-
1505
- // MEJS is not ready for mobile, using native HTML5 performs more efficiently at this point. Someday though we will be able to use MEJS for mobile.
1506
- if( $html5 && !empty($Settings['player']) && $Settings['player'] == 'mediaelement-audio' )
1507
- $content .= powerpressplayer_build_mediaelementaudio($media_url, $EpisodeData);
1508
- else if( $html5 )
1509
- $content .= powerpressplayer_build_html5audio($media_url, $EpisodeData);
1510
- else
1511
- $content .= powerpressplayer_build_playimageaudio($media_url, true);
1512
- }; break;
1513
- }
1514
-
1515
- return $content;
1516
- }
1517
-
1518
 
1519
  function powerpressplayer_build_playimage($media_url, $EpisodeData = array(), $include_div = false)
1520
  {
519
  return $content; // Ogg is handled as video
520
  }
521
  case 'oga': {
522
+
523
+ $Settings = get_option('powerpress_general');
524
  if( !isset($Settings['player']) )
525
  $Settings['player'] = 'mediaelement-audio';
526
 
792
 
793
  //var_dump($EpisodeData);
794
  $post_title = get_the_title();
795
+ if( !empty($post_title) ) {
796
  $addhtml .= '<meta itemprop="name" content="'. htmlspecialchars($post_title) .'" />'.PHP_EOL_WEB;
797
+ }
798
+
799
  $addhtml .= '<meta itemprop="encodingFormat" content="'. powerpress_get_contenttype($media_url) .'" />'.PHP_EOL_WEB;
800
+ if( !empty($EpisodeData['duration']) ) {
801
+ $addhtml .= '<meta itemprop="duration" content="'. powerpress_iso8601_duration($EpisodeData['duration']) .'" />'.PHP_EOL_WEB; // http://en.wikipedia.org/wiki/ISO_8601#Durations
802
+ }
803
+
804
+ if( !empty($EpisodeData['subtitle']) ) {
805
  $addhtml .= '<meta itemprop="description" content="'. htmlspecialchars($EpisodeData['subtitle']) .'" />'.PHP_EOL_WEB;
806
  }
807
  else
1469
  return $content;
1470
  }
1471
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1472
 
1473
  function powerpressplayer_build_playimage($media_url, $EpisodeData = array(), $include_div = false)
1474
  {
powerpress-playlist.php CHANGED
@@ -160,11 +160,11 @@ function powerpress_playlist_episodes($args)
160
  $query .= "AND tr.term_taxonomy_id = '". $TaxonomyObj->term_taxonomy_id ."' ";
161
  }
162
 
 
163
  if( !empty( $args['ids'] ) ) {
164
  // First santity check make sure we are only working with numbers....
165
  if( preg_match('/^[0-9,\s]*$/', $args['ids']) ) {
166
  $ids = explode(',', preg_replace('/(\s)/', '', $args['ids']) );
167
- $for_query = '';
168
  while( list($index,$id) = each($ids) ) {
169
  if( empty($id) )
170
  continue;
@@ -180,7 +180,11 @@ function powerpress_playlist_episodes($args)
180
  }
181
 
182
  $query .= "GROUP BY p.ID ";
183
- $query .= "ORDER BY p.post_date DESC ";
 
 
 
 
184
  $query .= "LIMIT 0, %d";
185
 
186
  $query = $wpdb->prepare($query, ($args['slug'] == 'podcast'?'enclosure': '_'.$args['slug'].':enclosure'), $args['post_type'], $args['limit'] );
160
  $query .= "AND tr.term_taxonomy_id = '". $TaxonomyObj->term_taxonomy_id ."' ";
161
  }
162
 
163
+ $for_query = '';
164
  if( !empty( $args['ids'] ) ) {
165
  // First santity check make sure we are only working with numbers....
166
  if( preg_match('/^[0-9,\s]*$/', $args['ids']) ) {
167
  $ids = explode(',', preg_replace('/(\s)/', '', $args['ids']) );
 
168
  while( list($index,$id) = each($ids) ) {
169
  if( empty($id) )
170
  continue;
180
  }
181
 
182
  $query .= "GROUP BY p.ID ";
183
+ if( !empty($for_query) ) {
184
+ $query .= "ORDER BY FIELD('id', $for_query) ";
185
+ } else {
186
+ $query .= "ORDER BY p.post_date DESC ";
187
+ }
188
  $query .= "LIMIT 0, %d";
189
 
190
  $query = $wpdb->prepare($query, ($args['slug'] == 'podcast'?'enclosure': '_'.$args['slug'].':enclosure'), $args['post_type'], $args['limit'] );
powerpress-subscribe.php CHANGED
@@ -455,7 +455,18 @@ function powerpress_subscribe_shortcode( $attr ) {
455
  $html .= '';
456
  $html .='<a href="';
457
  $html .= esc_url($Settings['itunes_url']);
458
- $html .= '" target="itunes_store" style="display:inline-block;overflow:hidden;background:url(https://linkmaker.itunes.apple.com/htmlResources/assets/en_us/images/web/linkmaker/badge_subscribe-lrg.png) no-repeat;width:135px;height:40px;}"></a>';
 
 
 
 
 
 
 
 
 
 
 
459
  $html .= '</div>';
460
  return $html;
461
  }
455
  $html .= '';
456
  $html .='<a href="';
457
  $html .= esc_url($Settings['itunes_url']);
458
+ $html .= '" style="display:inline-block;overflow:hidden;background:url(https://linkmaker.itunes.apple.com/images/badges/en-us/badge_itunes-lrg.svg) no-repeat;width:165px;height:40px;"></a>';
459
+ $html .= '</div>';
460
+ return $html;
461
+ }
462
+
463
+ if( !empty($attr['itunes_badge']) && !empty($Settings['itunes_url']) )
464
+ {
465
+ $html = '<div>';
466
+ $html .= '';
467
+ $html .='<a href="';
468
+ $html .= esc_url($Settings['itunes_url']);
469
+ $html .= '" style="display:inline-block;overflow:hidden;background:url(https://linkmaker.itunes.apple.com/images/badges/en-us/badge_itunes-sm.svg) no-repeat;width:80px;height:15px;"></a>';
470
  $html .= '</div>';
471
  return $html;
472
  }
powerpress.php CHANGED
@@ -3,24 +3,24 @@
3
  Plugin Name: Blubrry PowerPress
4
  Plugin URI: http://create.blubrry.com/resources/powerpress/
5
  Description: <a href="http://create.blubrry.com/resources/powerpress/" target="_blank">Blubrry PowerPress</a> is the No. 1 Podcasting plugin for WordPress. Developed by podcasters for podcasters; features include Simple and Advanced modes, multiple audio/video player options, subscribe to podcast tools, podcast SEO features, and more! Fully supports iTunes, Google Play, Stitcher, and Blubrry Podcasting directories, as well as all podcast applications and clients.
6
- Version: 7.0.3
7
  Author: Blubrry
8
  Author URI: http://www.blubrry.com/
9
  Requires at least: 3.6
10
- Tested up to: 4.6.1
11
  Text Domain: powerpress
12
  Change Log:
13
  Please see readme.txt for detailed change log.
14
 
15
  Contributors:
16
- Angelo Mandato, CIO RawVoice - Plugin founder, architect and lead developer
17
  See readme.txt for full list of contributors.
18
 
19
  Credits:
20
  getID3(), License: GPL 2.0+ by James Heinrich <info [at] getid3.org> http://www.getid3.org
21
  Note: getid3.php analyze() function modified to prevent redundant filesize() function call.
22
 
23
- Copyright 2008-2016 RawVoice Inc. (http://www.rawvoice.com)
24
 
25
  License: GPL (http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt)
26
 
@@ -32,7 +32,7 @@ if( !function_exists('add_action') )
32
  die("access denied.");
33
 
34
  // WP_PLUGIN_DIR (REMEMBER TO USE THIS DEFINE IF NEEDED)
35
- define('POWERPRESS_VERSION', '7.0.3' );
36
 
37
  // Translation support:
38
  if ( !defined('POWERPRESS_ABSPATH') )
@@ -174,6 +174,10 @@ function powerpress_content($content)
174
  {
175
  return $content; // We don't want to do anything to this excerpt content in this call either...
176
  }
 
 
 
 
177
 
178
 
179
  if( !isset($GeneralSettings['custom_feeds']) )
@@ -906,7 +910,7 @@ function powerpress_rss2_item()
906
  }
907
  }
908
 
909
- if( empty($summary) ) { // Backwards compatbility with PodPress, the excerpt is used as the itunes summary if set
910
  $summary = powerpress_get_the_exerpt( true, !empty($General['feed_action_hook']) ); // Will call powerpress_get_the_content(true) if the excerpt does not exist
911
  }
912
 
@@ -2827,6 +2831,40 @@ function powerpress_add_redirect_url($MediaURL, $EpisodeData = false) // $channe
2827
  }
2828
  }
2829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2830
  // Allow other apps to update the redirects
2831
  $Redirects = apply_filters('powerpress_redirects', $Redirects, $EpisodeData);
2832
 
@@ -2864,7 +2902,17 @@ function powerpress_add_redirect_url($MediaURL, $EpisodeData = false) // $channe
2864
  //if( !in_array($RedirectDomain, $ValidRedirectDomains) )
2865
  // continue; // Not a valid domain so lets not add it
2866
 
2867
- if( !strstr($NewURL, $RedirectClean) )
 
 
 
 
 
 
 
 
 
 
2868
  $NewURL = $URLScheme. $RedirectClean . str_replace($URLScheme, '', $NewURL);
2869
  }
2870
  }
@@ -3091,7 +3139,7 @@ function powerpress_get_enclosure_data($post_id, $feed_slug = 'podcast', $raw_da
3091
 
3092
  if( $Serialized )
3093
  {
3094
- $ExtraData = unserialize($Serialized);
3095
  if( $ExtraData && is_array($ExtraData) )
3096
  {
3097
  while( list($key,$value) = each($ExtraData) ) {
@@ -3442,6 +3490,28 @@ function powerpress_in_wp_head()
3442
  }
3443
  return false;
3444
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3445
  /*
3446
  End Helper Functions
3447
  */
3
  Plugin Name: Blubrry PowerPress
4
  Plugin URI: http://create.blubrry.com/resources/powerpress/
5
  Description: <a href="http://create.blubrry.com/resources/powerpress/" target="_blank">Blubrry PowerPress</a> is the No. 1 Podcasting plugin for WordPress. Developed by podcasters for podcasters; features include Simple and Advanced modes, multiple audio/video player options, subscribe to podcast tools, podcast SEO features, and more! Fully supports iTunes, Google Play, Stitcher, and Blubrry Podcasting directories, as well as all podcast applications and clients.
6
+ Version: 7.0.4
7
  Author: Blubrry
8
  Author URI: http://www.blubrry.com/
9
  Requires at least: 3.6
10
+ Tested up to: 4.7.3
11
  Text Domain: powerpress
12
  Change Log:
13
  Please see readme.txt for detailed change log.
14
 
15
  Contributors:
16
+ Angelo Mandato, CIO Blubrry - Plugin founder, architect and lead developer
17
  See readme.txt for full list of contributors.
18
 
19
  Credits:
20
  getID3(), License: GPL 2.0+ by James Heinrich <info [at] getid3.org> http://www.getid3.org
21
  Note: getid3.php analyze() function modified to prevent redundant filesize() function call.
22
 
23
+ Copyright 2008-2017 Blubrry (http://www.blubrry.com)
24
 
25
  License: GPL (http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt)
26
 
32
  die("access denied.");
33
 
34
  // WP_PLUGIN_DIR (REMEMBER TO USE THIS DEFINE IF NEEDED)
35
+ define('POWERPRESS_VERSION', '7.0.4 beta' );
36
 
37
  // Translation support:
38
  if ( !defined('POWERPRESS_ABSPATH') )
174
  {
175
  return $content; // We don't want to do anything to this excerpt content in this call either...
176
  }
177
+ else if( class_exists('custom_post_widget') && powerpress_in_custom_post_widget() )
178
+ {
179
+ return $content; // Custom Post Widget compatibility
180
+ }
181
 
182
 
183
  if( !isset($GeneralSettings['custom_feeds']) )
910
  }
911
  }
912
 
913
+ if( empty($summary) ) { // Backwards compatibility with PodPress, the excerpt is used as the itunes summary if set
914
  $summary = powerpress_get_the_exerpt( true, !empty($General['feed_action_hook']) ); // Will call powerpress_get_the_content(true) if the excerpt does not exist
915
  }
916
 
2831
  }
2832
  }
2833
 
2834
+ if( !empty($GeneralSettings['taxonomy_podcasting']) ) // Taxonomy Podcasting
2835
+ {
2836
+ $PowerPressTaxonomies = get_option('powerpress_taxonomy_podcasting');
2837
+ if( !empty($PowerPressTaxonomies) )
2838
+ {
2839
+ $terms = get_terms();
2840
+ $ttid_found = 0;
2841
+ $TaxonomySettings = false;
2842
+
2843
+ while( list($index,$termObj) = each($terms) )
2844
+ {
2845
+ // Skip the default taxonomies
2846
+ if( $termObj->taxonomy == 'category' || $termObj->taxonomy == 'link_category' || $termObj->taxonomy == 'post_tag' || $termObj->taxonomy == 'nav_menu' )
2847
+ continue;
2848
+
2849
+ if( !empty($PowerPressTaxonomies[ $termObj->term_taxonomy_id ]) )
2850
+ {
2851
+ $ttid_found = $termObj->term_taxonomy_id;
2852
+
2853
+ $TaxonomySettings = get_option('powerpress_taxonomy_'.$ttid_found);
2854
+ // Found it???
2855
+ if( !empty($TaxonomySettings['redirect']) )
2856
+ {
2857
+ $Redirects['redirect0'] = $TaxonomySettings['redirect'];
2858
+ $Redirects['redirect1'] = '';
2859
+ $Redirects['redirect2'] = '';
2860
+ $Redirects['redirect3'] = '';
2861
+ break;
2862
+ }
2863
+ }
2864
+ }
2865
+ }
2866
+ }
2867
+
2868
  // Allow other apps to update the redirects
2869
  $Redirects = apply_filters('powerpress_redirects', $Redirects, $EpisodeData);
2870
 
2902
  //if( !in_array($RedirectDomain, $ValidRedirectDomains) )
2903
  // continue; // Not a valid domain so lets not add it
2904
 
2905
+ // Make sure we are no longer doubling up on media.blubrry.com or media.rawvoice.com redirects
2906
+ //if( ($RedirectDomain == 'media.blubrry.com'||$RedirectDomain == 'media.rawvoice.com') && strstr($NewURL, '/'.$RedirectDomain.'/') )
2907
+ //{
2908
+ // // Strip the media.blubrry.com/XXX/x/ or media.blubrry.com/xxx/ from the URL since we will be replacing it
2909
+ // if( preg_match('/^(.*\/)media\.(?:blubrry|rawvoice)\.com\/[a-zA-Z0-9_-]{2,60}\/([a-zA-Z0-9]\/)?(.*)$/', $NewURL, $matches) )
2910
+ // {
2911
+ // $NewURL = $matches[1].$matches[3];
2912
+ // }
2913
+ //}
2914
+
2915
+ if( !strstr($NewURL, $RedirectClean) ) // If the redirect is not already added...
2916
  $NewURL = $URLScheme. $RedirectClean . str_replace($URLScheme, '', $NewURL);
2917
  }
2918
  }
3139
 
3140
  if( $Serialized )
3141
  {
3142
+ $ExtraData = @unserialize($Serialized);
3143
  if( $ExtraData && is_array($ExtraData) )
3144
  {
3145
  while( list($key,$value) = each($ExtraData) ) {
3490
  }
3491
  return false;
3492
  }
3493
+
3494
+ function powerpress_in_custom_post_widget()
3495
+ {
3496
+ if( !class_exists('custom_post_widget') )
3497
+ return false;
3498
+
3499
+ $e = new Exception();
3500
+ $trace = $e->getTrace();
3501
+
3502
+ if( !empty($trace) ) {
3503
+ //var_dump($trace);
3504
+ while( list($index,$call) = each($trace) ) {
3505
+ if( isset($call['function']) ) {
3506
+ // Which calls should we not add the player and links...
3507
+ switch( $call['function'] ) {
3508
+ case 'custom_post_widget_shortcode': return true; break;
3509
+ }
3510
+ }
3511
+ }
3512
+ }
3513
+ return false;
3514
+ }
3515
  /*
3516
  End Helper Functions
3517
  */
powerpressadmin-dashboard.php CHANGED
@@ -45,12 +45,12 @@ function powerpress_get_news($feed_url, $limit=10)
45
 
46
  // If the feed was erroneously
47
  if ( !$rss_items ) {
48
- $md5 = md5( $this->feed );
49
  delete_transient( 'feed_' . $md5 );
50
  delete_transient( 'feed_mod_' . $md5 );
51
  $rss->__destruct();
52
  unset($rss);
53
- $rss = fetch_feed( $this->feed );
54
  $rss_items = $rss->get_items( 0, $rss->get_item_quantity( $num ) );
55
  $rss->__destruct();
56
  unset($rss);
45
 
46
  // If the feed was erroneously
47
  if ( !$rss_items ) {
48
+ $md5 = md5( $feed_url ); // This is from simple-pie, look at member variable ->cache_name_function
49
  delete_transient( 'feed_' . $md5 );
50
  delete_transient( 'feed_mod_' . $md5 );
51
  $rss->__destruct();
52
  unset($rss);
53
+ $rss = fetch_feed( $feed_url );
54
  $rss_items = $rss->get_items( 0, $rss->get_item_quantity( $num ) );
55
  $rss->__destruct();
56
  unset($rss);
powerpressadmin-editfeed.php CHANGED
@@ -3,19 +3,6 @@
3
  if( !function_exists('add_action') )
4
  die("access denied.");
5
 
6
- function powerpress_categories_strict($Categories, $Selected)
7
- {
8
- $Return = $Categories;
9
- $StrictArray = array('01-00', '02-00', '04-00', '05-00', '06-00', '07-00', '11-00', '12-00', '13-00', '14-00', '15-00');
10
- while( list($index,$remove) = each($StrictArray) )
11
- {
12
- if( $Selected == $remove )
13
- continue;
14
- unset($Return[ $remove ]);
15
- }
16
- return $Return;
17
- }
18
-
19
  function powerpress_languages()
20
  {
21
  // List copied from PodPress:
@@ -863,8 +850,7 @@ $Categories = powerpress_itunes_categories(true);
863
 
864
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
865
 
866
- $UseCategories = powerpress_categories_strict($Categories, $FeedSettings['itunes_cat_1']);
867
- while( list($value,$desc) = each($UseCategories) )
868
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_1']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
869
 
870
  reset($Categories);
@@ -895,8 +881,7 @@ reset($Categories);
895
 
896
 
897
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
898
- $UseCategories = powerpress_categories_strict($Categories, $FeedSettings['itunes_cat_2']);
899
- while( list($value,$desc) = each($UseCategories) )
900
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_2']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
901
 
902
  reset($Categories);
@@ -921,8 +906,7 @@ reset($Categories);
921
  <?php
922
 
923
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
924
- $UseCategories = powerpress_categories_strict($Categories, $FeedSettings['itunes_cat_3']);
925
- while( list($value,$desc) = each($UseCategories) )
926
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_3']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
927
 
928
  reset($Categories);
3
  if( !function_exists('add_action') )
4
  die("access denied.");
5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  function powerpress_languages()
7
  {
8
  // List copied from PodPress:
850
 
851
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
852
 
853
+ while( list($value,$desc) = each($Categories) )
 
854
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_1']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
855
 
856
  reset($Categories);
881
 
882
 
883
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
884
+ while( list($value,$desc) = each($Categories) )
 
885
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_2']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
886
 
887
  reset($Categories);
906
  <?php
907
 
908
  echo '<option value="">'. __('Select Category', 'powerpress') .'</option>';
909
+ while( list($value,$desc) = each($Categories) )
 
910
  echo "\t<option value=\"$value\"". ($FeedSettings['itunes_cat_3']==$value?' selected':''). ">".htmlspecialchars($desc)."</option>\n";
911
 
912
  reset($Categories);
powerpressadmin-rss-import.php CHANGED
@@ -89,11 +89,12 @@ class PowerPress_RSS_Podcast_Import extends WP_Importer {
89
 
90
  <p><?php echo __('The following tool will import your podcast episodes to this website.', 'powerpress'); ?></p>
91
 
92
- <form enctype="multipart/form-data" action="" method="post" name="blogroll">
93
  <?php wp_nonce_field('import-powerpress-rss') ?>
94
 
95
  <div style="width: 70%; margin: auto; height: 8em;">
96
  <input type="hidden" name="step" value="1" />
 
97
  <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo wp_max_upload_size(); ?>" />
98
  <div style="width: 48%;" class="alignleft">
99
  <h3><label for="podcast_feed_url"><?php _e('Podcast Feed URL:', 'powerpress'); ?></label></h3>
@@ -163,36 +164,129 @@ class PowerPress_RSS_Podcast_Import extends WP_Importer {
163
  </div>
164
  </div>
165
  </div>
166
-
167
- <!-- coming soon -->
168
- <!--
 
 
 
 
 
 
 
 
 
 
169
  <div class="ppi-option">
170
- <label><input type="radio" name="import_to" id="import_to_channel" value="channel" /> <?php echo __('Podcast Channel feed', 'powerpress'); ?></label>
171
- <div style="margin: 10px 0 10px 24px;">
172
- <label for="channel"><?php echo __('Channel', 'powerpress'); ?></label> &nbsp; <?php
173
- wp_dropdown_categories(array('show_option_none' => __( '&mdash; Select &mdash;' ), 'option_none_value' => '', 'hide_empty' => 0, 'id'=>'category', 'name' => 'category', 'orderby' => 'name', 'selected' => '', 'hierarchical' => true));
174
- ?>
175
- </div>
176
- <div style="margin: 10px 0 10px 24px;">
177
- <label><input type="checkbox" name="import_overwrite_program_info_channel" value="1"> <?php echo __('Import program information', 'powerpress'); ?></label>
 
 
 
 
 
 
 
 
 
 
 
 
 
178
  </div>
179
- <div style="margin: 10px 0 10px 24px;">
180
- <label><input type="checkbox" name="import_itunes_image_channel" value="1"> <?php echo __('Import iTunes artwork', 'powerpress'); ?></label>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  </div>
182
  </div>
183
- -->
184
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
185
 
186
- <div>
187
- <?php
188
- //$Settings = get_option('powerpress_general');
189
- /*
190
- if( !empty($Settings['blubrry_auth']) ) { ?>
191
- <label><input type="checkbox" name="migrate_to_blubrry" value="1" checked /> <?php echo __('Migrate Media files to Blubrry Podcast Hosting account', 'powerpress'); ?></label>
192
- <?php } else { ?>
193
- <label><input type="checkbox" name="migrate_to_blubrry" value="1" /> <?php echo __('Migrate Media files to Blubrry Podcast Hosting account', 'powerpress'); ?></label> <a title="<?php echo esc_attr(__('Blubrry Podcast Hosting', 'powerpress')); ?>" href="<?php echo admin_url('admin.php'); ?>?action=powerpress-jquery-hosting&amp;KeepThis=true&amp;TB_iframe=true&amp;modal=false&amp;width=800&amp;height=400" target="_blank" class="thickbox"><?php echo __('Learn More', 'powerpress'); ?></a>
194
- <?php }
195
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  ?>
197
  </div>
198
  <div class="ppi-option">
@@ -235,13 +329,7 @@ jQuery(document).ready( function() {
235
 
236
  //-->
237
  </script>
238
-
239
- <div class="ppi-option">
240
-
241
- </div>
242
-
243
  <h3><a href="#" class="pp-expand-section"><?php echo __('Advanced Options', 'powerpress'); ?></a></h3>
244
-
245
  <div style="margin-left: 24px; display: none;">
246
  <div class="ppi-option">
247
  <label><input type="checkbox" name="NULL" value="1" checked disabled> <?php echo __('Match episode by GUID (required)', 'powerpress'); ?></label>
@@ -258,12 +346,27 @@ jQuery(document).ready( function() {
258
  <div class="ppi-option">
259
  <label><input type="checkbox" name="import_blog_posts" value="1" > <?php echo __('Include blog posts', 'powerpress'); ?></label>
260
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  <div class="ppi-option">
262
  <label for="import_item_limit"><?php echo __('Item limit', 'powerpress'); ?></label> &nbsp;
263
  <input type="text" name="import_item_limit" id="import_item_limit" class="small-text" value="" /> (<?php echo __('leave blank for no limit', 'powerpress'); ?>)
264
  </div>
265
-
266
-
267
  </div>
268
  <?php submit_button( __('Import Podcast', 'powerpress' ), 'button-blubrry'); ?>
269
  </div>
@@ -274,7 +377,6 @@ jQuery(document).ready( function() {
274
 
275
  var import_type = jQuery("input[name='import_to']:checked").val()
276
  jQuery('#import-to-'+import_type).show();
277
- //alert(import_type);
278
  jQuery("input[name='import_to']").change( function(e) {
279
  jQuery('.import-to').hide(400);
280
  jQuery('#import-to-'+jQuery(this).val() ).show(400);
@@ -294,11 +396,24 @@ jQuery(document).ready( function() {
294
  return '<' . strtolower( $matches[1] );
295
  }
296
 
297
- function import_program_info($channel, $overwrite=false, $download_itunes_image=false, $category_id = '', $feed_slug ='') {
298
  $Feed = get_option('powerpress_feed_podcast' );
299
  if( empty($Feed) )
300
  $Feed = get_option('powerpress_feed');
301
 
 
 
 
 
 
 
 
 
 
 
 
 
 
302
  $NewSettings = array();
303
 
304
  $matches = array();
@@ -504,7 +619,7 @@ jQuery(document).ready( function() {
504
 
505
  if( !empty($NewSettings) )
506
  {
507
- if( empty($category_id) && empty($feed_slug) ) {
508
  // Save here..
509
  if( get_option('powerpress_feed_podcast') ) { // If the settings were moved to the podcast channels feature...
510
  powerpress_save_settings($NewSettings, 'powerpress_feed_podcast' ); // save a copy here if that is the case.
@@ -530,9 +645,12 @@ jQuery(document).ready( function() {
530
 
531
  powerpress_save_settings($NewSettings);
532
  }
 
 
533
  } else if ( !empty($feed_slug) ) {
534
-
535
- powerpress_save_settings($NewSettings, 'powerpress_feed_'.$feed_slug ); // save a copy here if that is the case.
 
536
  }
537
 
538
 
@@ -576,7 +694,7 @@ jQuery(document).ready( function() {
576
  }
577
  }
578
 
579
- function import_item($post, $MatchFilter, $import_blog_posts=false, $category_strict='', $feed_slug='') {
580
  global $wpdb;
581
  $this->m_item_pos++;
582
 
@@ -612,7 +730,6 @@ jQuery(document).ready( function() {
612
  }
613
 
614
  // GUID has to be last, as we will use the media URL as the guid as a last resort
615
-
616
  $guid = false;
617
  if( preg_match('|<guid.*?>(.*?)</guid>|is', $post, $matches) )
618
  $guid = $this->_sanatize_tag_value( $matches[1] );
@@ -620,8 +737,12 @@ jQuery(document).ready( function() {
620
  $guid = $enclosure['url'];
621
 
622
  $media_url = '';
623
- if( !empty($enclosure['url']) )
 
 
 
624
  $media_url = $enclosure['url'];
 
625
 
626
  $post_date_gmt = false;
627
  if( preg_match('|<pubdate>(.*?)</pubdate>|is', $post, $matches) ) {
@@ -690,16 +811,39 @@ jQuery(document).ready( function() {
690
  $post_content = str_replace('<br>', '<br />', $post_content);
691
  $post_content = str_replace('<hr>', '<hr />', $post_content);
692
 
693
- $post_author = 1;
694
- $post_status = 'publish';
695
 
696
  // Save this episode to the database...
697
  $post_to_save = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_status', 'guid', 'categories', 'enclosure');
 
 
 
 
 
698
  $this->m_item_inserted_count++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
699
  echo '<span style="color: green; font-weight: bold;">';
700
  echo sprintf(__('<i>%s</i> imported.', 'powerpress'), htmlspecialchars($post_title) );
701
  echo '</span>';
702
- $post_id = $this->_import_post_to_db($post_to_save);
 
 
703
 
704
  // Category strict
705
  if( !empty($category_strict) )
@@ -707,6 +851,12 @@ jQuery(document).ready( function() {
707
  wp_set_post_categories( $post_id, array($category_strict), true );
708
  }
709
 
 
 
 
 
 
 
710
  return ( $post_id > 0 );
711
  }
712
 
@@ -725,14 +875,62 @@ jQuery(document).ready( function() {
725
  return $value;
726
  }
727
 
728
- function import_episodes($MatchFilter, $import_blog_posts=false, $import_item_limit=0, $category='', $feed_slug='') {
729
  global $wpdb;
730
  @set_time_limit(60*15); // Give it 15 minutes
731
  $this->m_item_pos = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
732
 
733
  $item_count = substr_count( $this->m_content, '<item>');
734
  $item_count += substr_count( $this->m_content, '<ITEM>');
735
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
736
  echo '<hr />';
737
  echo '<p><strong>';
738
  echo __('Importing Episodes...', 'powerpress');
@@ -761,7 +959,7 @@ jQuery(document).ready( function() {
761
  echo '<li>';
762
  $new_start = $item_start_pos + mb_strlen('<item>');
763
  $item_content = mb_substr($this->m_content, $new_start, $item_end_pos - $new_start);
764
- $this->import_item($item_content, $MatchFilter, $import_blog_posts, $category, $feed_slug);
765
  echo '</li>';
766
 
767
  // Extra stop just in case...
@@ -807,13 +1005,74 @@ jQuery(document).ready( function() {
807
 
808
  $import_blog_posts = (!empty($_POST['import_blog_posts'])?true:false);
809
  $import_item_limit = (!empty($_POST['import_item_limit'])?intval($_POST['import_item_limit']):0);
810
- $category = (!empty($_POST['category'])?intval($_POST['category']):0);
811
- $feed_slug = (!empty($_POST['feed_slug'])?intval($_POST['feed_slug']):0);
812
- $import_ = (!empty($_POST['import_item_limit'])?intval($_POST['import_item_limit']):0);
 
 
 
 
 
813
  $import_to = 'default';
814
  if( !empty($_POST['import_to']) && $_POST['import_to'] != 'default' )
815
  $import_to = $_POST['import_to'];
 
 
816
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
817
 
818
  // First import program info...
819
  if( preg_match('/^(.*)<item>/is', $this->m_content, $matches) )
@@ -833,10 +1092,20 @@ jQuery(document).ready( function() {
833
  $import_itunes_image = (!empty($_POST['import_itunes_image_channel'])?true:false);
834
  if( $overwrite_program_info || $import_itunes_image )
835
  $this->import_program_info($matches[1], $overwrite_program_info, $import_itunes_image, false, $feed_slug);
 
 
 
 
 
 
 
 
 
 
836
  }
837
  }
838
 
839
- $this->import_episodes($MatchFilter, $import_blog_posts, $import_item_limit, $category, $feed_slug);
840
 
841
  $migrated_to_blubrry = false;
842
  if( !empty($_POST['migrate_to_blubrry']) && !empty($GLOBALS['pp_migrate_media_urls']) ) {
@@ -912,7 +1181,6 @@ jQuery(document).ready( function() {
912
  else if( !empty($_GET['step']) )
913
  $this->m_step = intval($_GET['step']);
914
 
915
-
916
  // Drop back down a step if not setup for hosting...
917
  if( !empty($_POST['migrate_to_blubrry']) ) {
918
  $Settings = get_option('powerpress_general');
@@ -1017,7 +1285,7 @@ jQuery(document).ready( function() {
1017
  {
1018
  global $wpdb;
1019
 
1020
- $meta_key = 'podcast';
1021
  if( !empty($feed_slug) && $feed_slug != 'podcast' )
1022
  $meta_key = '_'. $feed_slug .':enclosure';
1023
 
@@ -1081,7 +1349,7 @@ jQuery(document).ready( function() {
1081
  return 0;
1082
  }
1083
 
1084
- function _import_post_to_db($post)
1085
  {
1086
  extract($post);
1087
  $post_id = wp_insert_post($post);
@@ -1091,7 +1359,7 @@ jQuery(document).ready( function() {
1091
  _e('Couldn&#8217;t get post ID', 'powerpress');
1092
  return false;
1093
  }
1094
-
1095
  if (0 != count($categories))
1096
  wp_create_categories($categories, $post_id);
1097
 
@@ -1124,7 +1392,12 @@ jQuery(document).ready( function() {
1124
 
1125
  if( !empty($serialize) )
1126
  $encstring .= "\n". serialize( $serialize );
1127
- $meta_id = add_post_meta($post_id, 'enclosure', $encstring, true);
 
 
 
 
 
1128
  if( $meta_id ) {
1129
  if( empty($GLOBALS['pp_migrate_media_urls']) )
1130
  $GLOBALS['pp_migrate_media_urls'] = array();
@@ -1184,7 +1457,6 @@ jQuery(document).ready( function() {
1184
  $enclosure['block'] = 1;
1185
  }
1186
 
1187
- // <itunes:image href="http://example.com/podcasts/everything/AllAboutEverything.jpg" />
1188
  if( preg_match('/<itunes:image[^h]*href="(.*?)".*(\/>|>.*<\/itunes:image>)/i', $post, $matches) )
1189
  {
1190
  $enclosure['itunes_image'] = html_entity_decode( trim( $matches[1] ) );
89
 
90
  <p><?php echo __('The following tool will import your podcast episodes to this website.', 'powerpress'); ?></p>
91
 
92
+ <form enctype="multipart/form-data" action="" method="post" name="import-podcast-feed">
93
  <?php wp_nonce_field('import-powerpress-rss') ?>
94
 
95
  <div style="width: 70%; margin: auto; height: 8em;">
96
  <input type="hidden" name="step" value="1" />
97
+ <input type="hidden" name="import" value="<?php echo( !empty($_REQUEST['import']) ? htmlspecialchars($_REQUEST['import']) : ''); ?>" />
98
  <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo wp_max_upload_size(); ?>" />
99
  <div style="width: 48%;" class="alignleft">
100
  <h3><label for="podcast_feed_url"><?php _e('Podcast Feed URL:', 'powerpress'); ?></label></h3>
164
  </div>
165
  </div>
166
  </div>
167
+ <?php
168
+
169
+ if( !empty($General['channels']) )
170
+ {
171
+ // List rall of teh podcast channel feeds
172
+ $Feeds = array();
173
+ if( isset($General['custom_feeds']) )
174
+ $Feeds = $General['custom_feeds'];
175
+ if( isset($General['custom_feeds']['podcast']) )
176
+ unset($General['custom_feeds']['podcast']);
177
+ if( !empty($Feeds) )
178
+ {
179
+ ?>
180
  <div class="ppi-option">
181
+ <label><input type="radio" name="import_to" id="import_to_channel" value="channel" /> <?php echo __('Podcast Channel feed', 'powerpress'); ?></label><br />
182
+ <div class="import-to" id="import-to-channel" style="display: none;">
183
+ <div style="margin: 10px 0 10px 24px;">
184
+ <select id="feed_slug" name="feed_slug" class="large-input">
185
+ <option value=""><?php echo __('Select Channel feed', 'powerpress'); ?></option>
186
+ <?php
187
+
188
+ asort($Feeds, SORT_STRING); // Sort feeds
189
+ while( list($feed_slug, $feed_title) = each($Feeds) ) {
190
+
191
+ echo "\t<option value=\"$feed_slug\">$feed_title ($feed_slug)</option>\n";
192
+ }
193
+ ?>
194
+ </select>
195
+ </div>
196
+ <div style="margin: 10px 0 10px 24px;">
197
+ <label><input type="checkbox" name="import_overwrite_program_info_channel" value="1"> <?php echo __('Import program information', 'powerpress'); ?></label>
198
+ </div>
199
+ <div style="margin: 10px 0 10px 24px;">
200
+ <label><input type="checkbox" name="import_itunes_image_channel" value="1"> <?php echo __('Import iTunes artwork', 'powerpress'); ?></label>
201
+ </div>
202
  </div>
203
+ </div>
204
+ <?php
205
+ }
206
+ } // end podcast channel
207
+
208
+ if( !empty($General['posttype_podcasting']) )
209
+ {
210
+ ?>
211
+ <div class="ppi-option">
212
+ <label><input type="radio" name="import_to" id="import_to_post_type" value="post_type" /> <?php echo __('Podcast Post Type feed', 'powerpress'); ?></label>
213
+ <div class="import-to" id="import-to-post_type" style="display: none;">
214
+ <div style="margin: 10px 0 10px 24px;">
215
+ <label for="post_type"><?php echo __('Post type', 'powerpress'); ?></label> &nbsp;
216
+ <input type="text" name="post_type" id="post_type" class="medium-text" value="" />
217
+ </div>
218
+ <div style="margin: 10px 0 10px 24px;">
219
+ <label for="post_type_feed_slug"><?php echo __('Feed slug', 'powerpress'); ?></label> &nbsp;
220
+ <input type="text" name="post_type_feed_slug" id="post_type_feed_slug" class="medium-text" value="" />
221
+ </div>
222
+ <div style="margin: 10px 0 10px 24px;">
223
+ <label><input type="checkbox" name="import_overwrite_program_info_post_type" value="1"> <?php echo __('Import program information', 'powerpress'); ?></label>
224
+ </div>
225
+ <div style="margin: 10px 0 10px 24px;">
226
+ <label><input type="checkbox" name="import_itunes_image_post_type" value="1"> <?php echo __('Import iTunes artwork', 'powerpress'); ?></label>
227
+ </div>
228
  </div>
229
  </div>
230
+ <?php
231
+ } // end post type
232
+
233
+ if( !empty($General['taxonomy_podcasting']) )
234
+ {
235
+ $PowerPressTaxonomies = get_option('powerpress_taxonomy_podcasting');
236
+ if( empty($PowerPressTaxonomies) )
237
+ $PowerPressTaxonomies = array();
238
+
239
+ ?>
240
+ <div class="ppi-option">
241
+ <label><input type="radio" name="import_to" id="import_to_taxonomy" value="taxonomy" /> <?php echo __('Podcast Taxonomy feed', 'powerpress'); ?></label>
242
+ <div class="import-to" id="import-to-taxonomy" style="display: none;">
243
+ <div style="margin: 10px 0 10px 24px;">
244
+ <?php
245
+
246
+ if( !empty($PowerPressTaxonomies) ) { // If taxonomy podcasting feeds exist..
247
+
248
+ global $wpdb;
249
+ $tt_ids = '';
250
+
251
+ $SelectOptions = array();
252
+ while( list($tt_id, $null) = each($PowerPressTaxonomies) ) {
253
+ if( !empty($tt_ids) )
254
+ $tt_ids .= ',';
255
+ $tt_ids .= $tt_id;
256
+
257
+ $term = get_term_by('term_taxonomy_id', $tt_id);
258
+ if( is_wp_error($term) )
259
+ continue;
260
+ $SelectOptions[ $tt_id ] = sprintf('%s (%s)', $term->name, $term->slug);
261
+ }
262
 
263
+ ?>
264
+ <select id="podcast_ttid" name="podcast_ttid" style="min-width: 240px;" class="postform">
265
+ <option value=""><?php echo __('Select Taxonomy Podcast', ''); ?></option>
266
+ <?php
267
+
268
+ while( list($tt_id, $label) = each($SelectOptions) )
269
+ {
270
+ echo "\t<option value=\"$tt_id\">". htmlspecialchars($label). "</option>\n";
271
+ }
272
+
273
+ ?>
274
+ </select>
275
+ </div>
276
+ <div style="margin: 10px 0 10px 24px;">
277
+ <label><input type="checkbox" name="import_overwrite_program_info_taxonomy" value="1"> <?php echo __('Import program information', 'powerpress'); ?></label>
278
+ </div>
279
+ <div style="margin: 10px 0 10px 24px;">
280
+ <label><input type="checkbox" name="import_itunes_image_taxonomy" value="1"> <?php echo __('Import iTunes artwork', 'powerpress'); ?></label>
281
+ </div>
282
+ <?php } else { // else no taxonomy feeds have been created yet ?>
283
+ <div style="margin: 10px 0 10px 24px;">
284
+ <label><?php echo __('Please create a taxonomy podcast to continue.', 'powerpress'); ?></label>
285
+ </div>
286
+ <?php } ?>
287
+ </div>
288
+ <?php
289
+ } // End if taxonomy podcasting enabled
290
  ?>
291
  </div>
292
  <div class="ppi-option">
329
 
330
  //-->
331
  </script>
 
 
 
 
 
332
  <h3><a href="#" class="pp-expand-section"><?php echo __('Advanced Options', 'powerpress'); ?></a></h3>
 
333
  <div style="margin-left: 24px; display: none;">
334
  <div class="ppi-option">
335
  <label><input type="checkbox" name="NULL" value="1" checked disabled> <?php echo __('Match episode by GUID (required)', 'powerpress'); ?></label>
346
  <div class="ppi-option">
347
  <label><input type="checkbox" name="import_blog_posts" value="1" > <?php echo __('Include blog posts', 'powerpress'); ?></label>
348
  </div>
349
+ <div class="ppi-option">
350
+ <input type="hidden" name="remove_query_string" value="0" />
351
+ <label><input type="checkbox" name="remove_query_string" value="1" <?php if( !empty($_REQUEST['import']) && $_REQUEST['import'] == 'powerpress-libsyn-rss-podcast' ) {
352
+ echo 'checked disabled'; } ?> > <?php echo __('Remove query strings from media URLs', 'powerpress'); ?></label>
353
+ </div>
354
+ <div class="ppi-option">
355
+ <label for="import_post_status"><?php echo __('Post Status', 'powerpress'); ?></label> &nbsp;
356
+ <select id="import_post_status" name="import_post_status" class="medium-text">
357
+ <?php
358
+ $post_statuses = get_post_statuses();
359
+ while( list($post_status_slug, $post_status_label) = each($post_statuses) ) {
360
+
361
+ echo "\t<option value=\"$post_status_slug\"". ($post_status_slug=='publish'?' selected':'') .">". htmlspecialchars("$post_status_label ($post_status_slug)") . "</option>\n";
362
+ }
363
+ ?>
364
+ </select>
365
+ </div>
366
  <div class="ppi-option">
367
  <label for="import_item_limit"><?php echo __('Item limit', 'powerpress'); ?></label> &nbsp;
368
  <input type="text" name="import_item_limit" id="import_item_limit" class="small-text" value="" /> (<?php echo __('leave blank for no limit', 'powerpress'); ?>)
369
  </div>
 
 
370
  </div>
371
  <?php submit_button( __('Import Podcast', 'powerpress' ), 'button-blubrry'); ?>
372
  </div>
377
 
378
  var import_type = jQuery("input[name='import_to']:checked").val()
379
  jQuery('#import-to-'+import_type).show();
 
380
  jQuery("input[name='import_to']").change( function(e) {
381
  jQuery('.import-to').hide(400);
382
  jQuery('#import-to-'+jQuery(this).val() ).show(400);
396
  return '<' . strtolower( $matches[1] );
397
  }
398
 
399
+ function import_program_info($channel, $overwrite=false, $download_itunes_image=false, $category_id = '', $feed_slug ='', $post_type = '', $ttid = '') {
400
  $Feed = get_option('powerpress_feed_podcast' );
401
  if( empty($Feed) )
402
  $Feed = get_option('powerpress_feed');
403
 
404
+ if( !empty($category_id) ) {
405
+ $Feed = get_option('powerpress_cat_feed_'.$category_id);
406
+ } else if( !empty($post_type) ) {
407
+ // TODO
408
+ } else if( !empty($feed_slug) ) {
409
+ $Feed = get_option('powerpress_feed_'.$feed_slug);
410
+ } else if( !empty($ttid) ) {
411
+ $Feed = get_option('powerpress_taxonomy_'.$ttid);
412
+ }
413
+
414
+ if( empty($Feed) ) // Fix the situation where the empty value is not an array so we do not have notice messages
415
+ $Feed = array();
416
+
417
  $NewSettings = array();
418
 
419
  $matches = array();
619
 
620
  if( !empty($NewSettings) )
621
  {
622
+ if( empty($category_id) && empty($feed_slug) && empty($post_type) && empty($ttid) ) {
623
  // Save here..
624
  if( get_option('powerpress_feed_podcast') ) { // If the settings were moved to the podcast channels feature...
625
  powerpress_save_settings($NewSettings, 'powerpress_feed_podcast' ); // save a copy here if that is the case.
645
 
646
  powerpress_save_settings($NewSettings);
647
  }
648
+ } else if ( !empty($post_type) ) {
649
+ // TODO
650
  } else if ( !empty($feed_slug) ) {
651
+ powerpress_save_settings($NewSettings, 'powerpress_feed_'.$feed_slug );
652
+ } else if ( !empty($ttid) ) {
653
+ powerpress_save_settings($NewSettings, 'powerpress_taxonomy_'. $ttid );
654
  }
655
 
656
 
694
  }
695
  }
696
 
697
+ function import_item($post, $MatchFilter, $import_blog_posts=false, $category_strict='', $feed_slug='', $post_type = '', $taxonomy = '', $term = '', $remove_query_string = false, $post_status = 'publish') {
698
  global $wpdb;
699
  $this->m_item_pos++;
700
 
730
  }
731
 
732
  // GUID has to be last, as we will use the media URL as the guid as a last resort
 
733
  $guid = false;
734
  if( preg_match('|<guid.*?>(.*?)</guid>|is', $post, $matches) )
735
  $guid = $this->_sanatize_tag_value( $matches[1] );
737
  $guid = $enclosure['url'];
738
 
739
  $media_url = '';
740
+ if( !empty($enclosure['url']) ) {
741
+ if( !empty($remove_query_string) && !empty($enclosure['url']) && strstr($enclosure['url'], '?') ) {
742
+ $enclosure['url'] = strtok($enclosure['url'],'?'); //Tund3r: added for libsyn
743
+ }
744
  $media_url = $enclosure['url'];
745
+ }
746
 
747
  $post_date_gmt = false;
748
  if( preg_match('|<pubdate>(.*?)</pubdate>|is', $post, $matches) ) {
811
  $post_content = str_replace('<br>', '<br />', $post_content);
812
  $post_content = str_replace('<hr>', '<hr />', $post_content);
813
 
814
+ $post_author = get_current_user_id();
 
815
 
816
  // Save this episode to the database...
817
  $post_to_save = compact('post_author', 'post_date', 'post_date_gmt', 'post_content', 'post_title', 'post_status', 'guid', 'categories', 'enclosure');
818
+
819
+ if( !empty($post_type) ) // If the post should go into a custom post type...
820
+ {
821
+ $post_to_save['post_type'] = $post_type;
822
+ }
823
  $this->m_item_inserted_count++;
824
+
825
+ $post_id = $this->_import_post_to_db($post_to_save, $feed_slug);
826
+ if( empty($post_id) ) {
827
+ echo '<span style="color: red; font-weight: bold;">';
828
+ echo sprintf(__('<i>%s</i> import failed.', 'powerpress'), htmlspecialchars($post_title) );
829
+ echo '</span>';
830
+ return false;
831
+ }
832
+
833
+ if ( is_wp_error( $post_id ) ) {
834
+
835
+ echo '<span style="color: red; font-weight: bold;">';
836
+ echo sprintf(__('<i>%s</i> import failed: ' , 'powerpress'), htmlspecialchars($post_title) );
837
+ echo '</span>';
838
+ return false;
839
+ }
840
+
841
  echo '<span style="color: green; font-weight: bold;">';
842
  echo sprintf(__('<i>%s</i> imported.', 'powerpress'), htmlspecialchars($post_title) );
843
  echo '</span>';
844
+
845
+ // Display a link to the blog post
846
+ echo ' <a href="'. get_permalink($post_id) .'" target="_blank"><i class="wp-menu-image dashicons-before dashicons-admin-links"></i></a>';
847
 
848
  // Category strict
849
  if( !empty($category_strict) )
851
  wp_set_post_categories( $post_id, array($category_strict), true );
852
  }
853
 
854
+ // Set specific taxonomy term to this post
855
+ if( !empty($taxonomy) && !empty($term) )
856
+ {
857
+ wp_set_post_terms( $post_id, array($term), $taxonomy, true );
858
+ }
859
+
860
  return ( $post_id > 0 );
861
  }
862
 
875
  return $value;
876
  }
877
 
878
+ function import_episodes($MatchFilter, $import_blog_posts=false, $import_item_limit=0, $category='', $feed_slug='', $post_type = '', $ttid = '', $remove_query_string = false, $post_status='publish') {
879
  global $wpdb;
880
  @set_time_limit(60*15); // Give it 15 minutes
881
  $this->m_item_pos = 0;
882
+ $taxonomy = '';
883
+ $term = '';
884
+ if( $ttid )
885
+ {
886
+ $TaxTermObj = get_term_by('term_taxonomy_id', $ttid);
887
+ if( $TaxTermObj )
888
+ {
889
+ $term = $TaxTermObj->name;
890
+ $taxonomy = $TaxTermObj->taxonomy;
891
+ // Now get the post type if the taxonomy, which may not be "post"...
892
+ $TaxonomyObj = get_taxonomy($taxonomy);
893
+ // Set the post type to import into
894
+ if( !empty($TaxonomyObj->object_type[0]) && $TaxonomyObj->object_type[0] != 'post' ) {
895
+ $post_type = $TaxonomyObj->object_type[0];
896
+ }
897
+ // We should use the term's ID rather than it's name
898
+ if( !empty($TaxonomyObj->hierarchical) ) {
899
+ $term = intval($TaxTermObj->term_id);
900
+ }
901
+ }
902
+ else
903
+ {
904
+ // Do not go any further, there is an error here!
905
+ echo '<p><strong>';
906
+ echo __('Error, unable to locate term taxonomy.', 'powerpress');
907
+ echo '</strong></p>';
908
+ return;
909
+ }
910
+ }
911
 
912
  $item_count = substr_count( $this->m_content, '<item>');
913
  $item_count += substr_count( $this->m_content, '<ITEM>');
914
 
915
+ echo '<h3>Diagnostic information</h3>';
916
+ echo '<ul>';
917
+ if( !empty($ttid) )
918
+ echo sprintf( '<li>Taxonomy Term ID: %s</li>', $ttid);
919
+ if( !empty($taxonomy) )
920
+ echo sprintf( '<li>Taxonomy: %s</li>', $taxonomy);
921
+ if( !empty($term) )
922
+ echo sprintf( '<li>Taxonomy Term: %s</li>', $term);
923
+ if( !empty($post_type) )
924
+ echo sprintf( '<li>Post Type: %s</li>', $post_type);
925
+ if( !empty($feed_slug) )
926
+ echo sprintf( '<li>Feed Slug: %s</li>', $feed_slug);
927
+ if( !empty($category) )
928
+ echo sprintf( '<li>Category: %s</li>', $category);
929
+
930
+ echo sprintf( '<li>Remove query string: %s</li>', ( !empty($remove_query_string)?'true':'false') );
931
+
932
+ echo '</ul>';
933
+
934
  echo '<hr />';
935
  echo '<p><strong>';
936
  echo __('Importing Episodes...', 'powerpress');
959
  echo '<li>';
960
  $new_start = $item_start_pos + mb_strlen('<item>');
961
  $item_content = mb_substr($this->m_content, $new_start, $item_end_pos - $new_start);
962
+ $this->import_item($item_content, $MatchFilter, $import_blog_posts, $category, $feed_slug, $post_type, $taxonomy, $term, $remove_query_string, $post_status);
963
  echo '</li>';
964
 
965
  // Extra stop just in case...
1005
 
1006
  $import_blog_posts = (!empty($_POST['import_blog_posts'])?true:false);
1007
  $import_item_limit = (!empty($_POST['import_item_limit'])?intval($_POST['import_item_limit']):0);
1008
+ $remove_query_string = (!empty($_POST['remove_query_string'])?true:false);
1009
+ $post_status = ( !empty($_POST['import_post_status']) ? $_POST['import_post_status']: 'publish' );
1010
+ $category = (!empty($_POST['category'])?intval($_POST['category']):'');
1011
+ $feed_slug = (!empty($_POST['feed_slug'])?($_POST['feed_slug']):'');
1012
+ $post_type = (!empty($_POST['post_type'])?($_POST['post_type']):'');
1013
+ $post_type_feed_slug = (!empty($_POST['post_type_feed_slug'])?($_POST['post_type_feed_slug']):'');
1014
+ $ttid = (!empty($_POST['podcast_ttid'])?intval($_POST['podcast_ttid']):'');
1015
+ //$import_ = (!empty($_POST['import_item_limit'])?intval($_POST['import_item_limit']):0);
1016
  $import_to = 'default';
1017
  if( !empty($_POST['import_to']) && $_POST['import_to'] != 'default' )
1018
  $import_to = $_POST['import_to'];
1019
+ if( !empty($_REQUEST['import']) && $_REQUEST['import'] == 'powerpress-libsyn-rss-podcast' )
1020
+ $remove_query_string = true;
1021
 
1022
+ // Set the correct parameters going in...
1023
+ switch( $import_to )
1024
+ {
1025
+ case 'category': {
1026
+ $feed_slug = '';
1027
+ $post_type = '';
1028
+ $ttid = '';
1029
+ if( empty($category) ) {
1030
+ echo '<p>No category selected.</p>';
1031
+ return;
1032
+ }
1033
+ }; break;
1034
+ case 'channel': {
1035
+ $category = '';
1036
+ $post_type = '';
1037
+ $ttid = '';
1038
+ if( empty($feed_slug) ) {
1039
+ echo '<p>No podcast channel selected.</p>';
1040
+ return;
1041
+ }
1042
+ }; break;
1043
+ case 'post_type': {
1044
+ $category = '';
1045
+ $feed_slug = $post_type_feed_slug;
1046
+ $ttid = '';
1047
+
1048
+ if( empty($feed_slug) ) {
1049
+ echo '<p>No feed slug specified.</p>';
1050
+ return;
1051
+ }
1052
+ if( empty($post_type) ) {
1053
+ echo '<p>No post type specified.</p>';
1054
+ return;
1055
+ }
1056
+ }; break;
1057
+ case 'taxonomy': {
1058
+ $category = '';
1059
+ $feed_slug = '';
1060
+ $post_type = '';
1061
+
1062
+ if( empty($ttid) ) {
1063
+ echo '<p>No taxonomy podcast selected.</p>';
1064
+ return;
1065
+ }
1066
+
1067
+ }; break;
1068
+ case 'default':
1069
+ default: {
1070
+ $category = '';
1071
+ $feed_slug = '';
1072
+ $post_type = '';
1073
+ $ttid = '';
1074
+ }; break;
1075
+ }
1076
 
1077
  // First import program info...
1078
  if( preg_match('/^(.*)<item>/is', $this->m_content, $matches) )
1092
  $import_itunes_image = (!empty($_POST['import_itunes_image_channel'])?true:false);
1093
  if( $overwrite_program_info || $import_itunes_image )
1094
  $this->import_program_info($matches[1], $overwrite_program_info, $import_itunes_image, false, $feed_slug);
1095
+ } else if( $import_to == 'post_type' ) {
1096
+ $overwrite_program_info = (!empty($_POST['import_overwrite_program_info_post_type'])?true:false);
1097
+ $import_itunes_image = (!empty($_POST['import_itunes_image_post_type'])?true:false);
1098
+ if( $overwrite_program_info || $import_itunes_image )
1099
+ $this->import_program_info($matches[1], $overwrite_program_info, $import_itunes_image, false, $feed_slug, $post_type);
1100
+ } else if( $import_to == 'taxonomy' ) {
1101
+ $overwrite_program_info = (!empty($_POST['import_overwrite_program_info_taxonomy'])?true:false);
1102
+ $import_itunes_image = (!empty($_POST['import_itunes_image_taxonomy'])?true:false);
1103
+ if( $overwrite_program_info || $import_itunes_image )
1104
+ $this->import_program_info($matches[1], $overwrite_program_info, $import_itunes_image, false, false, false, $ttid);
1105
  }
1106
  }
1107
 
1108
+ $this->import_episodes($MatchFilter, $import_blog_posts, $import_item_limit, $category, $feed_slug, $post_type, $ttid, $remove_query_string, $post_status);
1109
 
1110
  $migrated_to_blubrry = false;
1111
  if( !empty($_POST['migrate_to_blubrry']) && !empty($GLOBALS['pp_migrate_media_urls']) ) {
1181
  else if( !empty($_GET['step']) )
1182
  $this->m_step = intval($_GET['step']);
1183
 
 
1184
  // Drop back down a step if not setup for hosting...
1185
  if( !empty($_POST['migrate_to_blubrry']) ) {
1186
  $Settings = get_option('powerpress_general');
1285
  {
1286
  global $wpdb;
1287
 
1288
+ $meta_key = 'enclosure';
1289
  if( !empty($feed_slug) && $feed_slug != 'podcast' )
1290
  $meta_key = '_'. $feed_slug .':enclosure';
1291
 
1349
  return 0;
1350
  }
1351
 
1352
+ function _import_post_to_db($post, $feed_slug = '')
1353
  {
1354
  extract($post);
1355
  $post_id = wp_insert_post($post);
1359
  _e('Couldn&#8217;t get post ID', 'powerpress');
1360
  return false;
1361
  }
1362
+
1363
  if (0 != count($categories))
1364
  wp_create_categories($categories, $post_id);
1365
 
1392
 
1393
  if( !empty($serialize) )
1394
  $encstring .= "\n". serialize( $serialize );
1395
+
1396
+ if( empty($feed_slug) || $feed_slug == 'podcast' ) // 'podcast' == $feed_slug || '' == $feed_slug
1397
+ $meta_id = add_post_meta($post_id, 'enclosure', $encstring, true);
1398
+ else
1399
+ $meta_id = add_post_meta($post_id, '_'. $feed_slug .':enclosure', $encstring, true);
1400
+
1401
  if( $meta_id ) {
1402
  if( empty($GLOBALS['pp_migrate_media_urls']) )
1403
  $GLOBALS['pp_migrate_media_urls'] = array();
1457
  $enclosure['block'] = 1;
1458
  }
1459
 
 
1460
  if( preg_match('/<itunes:image[^h]*href="(.*?)".*(\/>|>.*<\/itunes:image>)/i', $post, $matches) )
1461
  {
1462
  $enclosure['itunes_image'] = html_entity_decode( trim( $matches[1] ) );
powerpressadmin-taxonomyfeeds.php CHANGED
@@ -29,9 +29,15 @@ function powerpress_admin_taxonomyfeeds()
29
  }
30
  .column-name {
31
  width: 30%;
 
 
 
 
 
32
  }
33
  .column-feed-slug {
34
  width: 15%;
 
35
  }
36
  .column-episode-count {
37
  width: 15%;
29
  }
30
  .column-name {
31
  width: 30%;
32
+ min-width: 60px;
33
+ }
34
+ .column-taxonomy {
35
+ width: 15%;
36
+ min-width: 60px;
37
  }
38
  .column-feed-slug {
39
  width: 15%;
40
+ min-width: 60px;
41
  }
42
  .column-episode-count {
43
  width: 15%;
powerpressadmin.php CHANGED
@@ -1373,7 +1373,10 @@ function powerpress_admin_notices()
1373
  $errors = get_option('powerpress_errors');
1374
  if( $errors )
1375
  {
1376
- delete_option('powerpress_errors');
 
 
 
1377
 
1378
  while( list($null, $error) = each($errors) )
1379
  {
@@ -1618,7 +1621,7 @@ function powerpress_admin_menu()
1618
  add_meta_box('powerpress-podcast', __('Podcast Episode', 'powerpress'), 'powerpress_meta_box', $page_type, 'normal');
1619
  }
1620
 
1621
- $post_types = array('post'); // Only apply to default posts
1622
  if( empty($Powerpress['posttype_podcasting']) )
1623
  $post_types = powerpress_admin_get_post_types('post'); // Get pages by capability type
1624
  }
@@ -2429,7 +2432,7 @@ function powerpress_check_url(url)
2429
  jQuery( '#'+DestDiv ).addClass("error");
2430
  jQuery( '#'+DestDiv ).removeClass("updated");
2431
 
2432
- var validChars = ':0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-_.';
2433
 
2434
  for( var x = 0; x < url.length; x++ )
2435
  {
1373
  $errors = get_option('powerpress_errors');
1374
  if( $errors )
1375
  {
1376
+ if( !delete_option('powerpress_errors') ) {
1377
+ // If for some reason we cannot delete this record, maybe we can at least update it with a blank value...
1378
+ update_option('powerpress_errors', '');
1379
+ }
1380
 
1381
  while( list($null, $error) = each($errors) )
1382
  {
1621
  add_meta_box('powerpress-podcast', __('Podcast Episode', 'powerpress'), 'powerpress_meta_box', $page_type, 'normal');
1622
  }
1623
 
1624
+ $post_types = array('post'); // Only apply to default posts if post type podcasting is disabled
1625
  if( empty($Powerpress['posttype_podcasting']) )
1626
  $post_types = powerpress_admin_get_post_types('post'); // Get pages by capability type
1627
  }
2432
  jQuery( '#'+DestDiv ).addClass("error");
2433
  jQuery( '#'+DestDiv ).removeClass("updated");
2434
 
2435
+ var validChars = ':0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/-_.:';
2436
 
2437
  for( var x = 0; x < url.length; x++ )
2438
  {
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
- === Blubrry PowerPress Podcasting plugin ===
2
  Contributors: amandato, blubrry
3
- Tags: powerpress, podcasting, podcast, podcaster, itunes, google play music, google play, enclosure, professional, apple, apple tv, ipad, iphone, soundcloud, squarespace, youtube, viddler, ustream, podcasting, audio, video, rss2, feed, player, media, rss, mp3, music, embed, feedburner, statistics, stats, flv, flash, id3, episodes, blubrry, mp4, m4v, wordpressmu, mu, wordpress mu, multisite, multi site, mediacaster, post, plugin, posts, simple, social, dashboard, TSG, Buzzsprout, MTR, WP-boxCast, CastMyBlog, tgs podcasting, simple podcasting, seriously simple podcasting, seriously-simple-podcasting, serious, seriously, ssp, podlove, podcast.de, clammr, clammr radio, audio player, stitcher, tunein, show, shows, series, docs, documentation, support, free, add-ons, extensions, addons, libsyn, libsyn-podcasting, podbean, podomatic, spreaker
4
  Requires at least: 3.6
5
- Tested up to: 4.6.1
6
- Stable tag: 7.0.3
7
  Donate link: https://www.patreon.com/blubrry?ty=h
8
  License: GPLv2 or later
9
 
@@ -11,10 +11,12 @@ No. 1 Podcasting plugin for WordPress, with simple & advanced modes, players, su
11
 
12
  == Description ==
13
 
14
- PowerPress is the No. 1 Podcasting plugin for WordPress. Developed by podcasters for podcasters; features include Simple and Advanced modes, multiple audio/video player options, subscribe to podcast tools, podcast SEO features, and more! Fully supports iTunes, Google Play, Stitcher, TuneIn and Blubrry Podcasting directories, as well as all podcast applications and clients.
15
 
16
  [youtube https://www.youtube.com/watch?v=twqKrVehY3o]
17
 
 
 
18
  = Simple Mode =
19
  If you are just getting started or feel overwelmed with all the settings and options, switch to Simple mode! PowerPress's Simple Mode will walk you through getting started in 3 easy steps.
20
 
@@ -36,9 +38,6 @@ When you're ready you can switch to Advanced mode to tap into all the options pr
36
  - *Media Statistics: Get FREE Blubrry Media Statistics from your WordPress dashboard.
37
  - Multi-languages and locales: See [PowerPress in your language](http://create.blubrry.com/resources/powerpress/powerpress-language/) for details.
38
 
39
- = Includes Full Google Play Music Support! =
40
- Blubrry PowerPress 6.1+ fully supports Google Play Music podcast directory. Upgrade to PowerPress 6.1 then submit your podcast to [Google Play Music](http://g.co/podcastportal).
41
-
42
  = Includes Full iTunes Support! =
43
  Blubrry PowerPress fully supports iTunes, which is required for podcasting. PowerPress comes with the following iTunes specific features:
44
 
@@ -48,12 +47,15 @@ Blubrry PowerPress fully supports iTunes, which is required for podcasting. Powe
48
  * iTunes podcasting: Fully supported, including the latest [Apple iTunes podcasting specifications](http://www.powerpresspodcast.com/2012/05/10/itunes-podcasting-specifications-changed-may-2012-what-that-means-for-podcasting/).
49
  * Feed Episode Maximizer: Increase the number of episodes viewed on iTunes while decreasing the byte size of your feeds.
50
 
 
 
 
51
  = Integrated Media Players =
52
  Blubrry PowerPress includes extensive Web player options to display your podcast audio and video in your Web pages.
53
 
54
- * Audio players: Pick from MediaElement.js, native HTML5 audio or 1 Pixel Out Player.
55
- * Video players: Pick from MediaElement.js, native HTML5 video or VideoJS.
56
- * Post positioning: Position player above or below your content.
57
  * [Player shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/shortcode/): Place the player exactly where you want by adding the `[powerpress]` shortcode directly into your post content.
58
  * [Playlist player shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/powerpress-playlist-shortcode/): Include a playlist of your latest podcast episodes utilizing the `[powerpress_playlist]` shortcode in any page or post.
59
  * Embeds: Add embeds from sites such as YouTube.
@@ -65,11 +67,11 @@ Blubrry PowerPress includes extensive Web player options to display your podcast
65
  A Blubrry PowerPress exclusive, podcast subscribe tools help you convert Web visitors into podcast subscribers. Subscribe options include:
66
 
67
  * [Subscribe page](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/subscribe-page/): Instantly create a subscribe page with simplified instructions on how to subscribe to your podcast using the PowerPress subscribe page shortcode.
68
- * [Subscribe page shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/powerpress-subscribe-shortcode/): Add the `[powerpress_subscribe]` shortcode to include a mobile-device optimized subscribe embed in any post or page that includes buttons to subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), [Subscribe by Email](http://www.subscribebyemail.com), Stitcher, via RSS, and an special textbox to easily copy and paste your podcast feed into any podcast application.
69
- * Subscribe sidebar widget: Mobile device optimized sidebar buttons to subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), Stitcher, subscribe by RSS, and a "more subscribe options" button linked to your podcast's subscribe page.
70
  * Subscribe links: Subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), subscribe by RSS and a link to your custom subscribe page below every player.
71
  * Retina enabled: Subscribe button images optimized for high resolution displays including Apple Retina displays.
72
- * Responsive: Subscribe tools are designed for any screen and optimized for touch screens by providing custom buttons that are at minimum 48 pixels in height.
73
 
74
  = Integrates with Blubrry's Services =
75
  Make your life easier by adding our FREE or paid media hosting and statistics services to streamline your podcast productivity.
@@ -78,9 +80,10 @@ Make your life easier by adding our FREE or paid media hosting and statistics se
78
  * Publish Blubrry hosted media directly from your blog.
79
  * View Blubrry hosting usage quota from your blog.
80
  * Configure how Blubrry writes media (ID3) tags within PowerPress settings.
81
- * Migrate all of your media to your Blubrry [Podcast Media Hosting](http://create.blubrry.com/resources/podcast-media-hosting/) account with just a couple clicks.
 
82
 
83
- The Blubrry basic statistics service is FREE. Our [Premium Statistics Service](https://secure.blubrry.com/podcast-statistics-premium/), which includes [RawVoice Certified Statistics](http://create.blubrry.com/resources/podcast-media-download-statistics/rawvoice-certified/), U.S. downloads, trending and exporting, is available for $5 month. Blubrry [Media Hosting](https://secure.blubrry.com/podcast-publishing-premium-with-hosting/) packages start at $12.
84
 
85
 
86
  = Advanced Features for those who need more =
@@ -108,6 +111,9 @@ Please see detailed instructions for migrating from [PodPress](http://create.blu
108
 
109
  Note: Advanced settings such as settings for podcast categories will need to be recreated in PowerPress.
110
 
 
 
 
111
  = PowerPress in your Language =
112
 
113
  [PowerPress is available in a number of languages](http://create.blubrry.com/resources/powerpress/powerpress-language/). Starting with PowerPress 7.0, translations will be managed through [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/powerpress/) making translations easier to setup and update.
@@ -211,21 +217,41 @@ To install Blubrry PowerPress manually, follow these steps:
211
  == Screenshots ==
212
  1. PowerPress's Simple Mode will walk you through setting up your podcast in 3 easy steps.
213
  2. Just like blogging, podcasting utilizes blog posting features with the addition of a podcast episode box. Yes, podcasting is that simple!
214
- 3. PowerPress comes with a built-in subscribe sidebar widget to help your audience subscribe to your podcast.
215
- 4. PowerPress comes with an editable subscribe page builder with a subscribe embed tool to help your web visitors subscribe.
216
- 5. PowerPress's Advanced Mode settings let you dig in as deep as you want to with every possible setting for podcasting at your fingertips.
217
- 6. PowerPress incorporates the built-in WordPress media players into your blog posts and pages.
 
218
 
219
 
220
  == Changelog ==
221
 
222
  = Next Major Release Announcements =
223
- * Facebook Instant Articles for podcasting coming in PowerPress 7.1 release!
224
- * PowerPress 7.1 will be released in 1-2 weeks. Beta testers expect an email early next week.
225
  * We are looking for beta testers! If you would like to beta test future versions of PowerPress, please [contact us](http://www.blubrry.com/contact.php) with your name and email.
226
 
227
- = Become a PowerPress Patron! =
228
- Help support your favorite podcasting plugin via Patreon. [Visit Blubrry's Patreon page](https://www.patreon.com/blubrry?ty=h)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
 
230
  = 7.0.3 =
231
  * Released 9/13/2016
@@ -517,7 +543,7 @@ Please visit the [PowerPress Version History](http://create.blubrry.com/resource
517
  ATTENTION: The 1 pixel out audio player will be removed from PowerPress 7.1.
518
 
519
  == Contributors ==
520
- Angelo Mandato, CIO [RawVoice](http://www.rawvoice.com) - Plugin founder, architect and lead developer
521
 
522
  Pat McSweeny, PHP Developer - Developed initial version (v0.1.0) of plugin
523
 
1
+ === PowerPress Podcasting plugin by Blubrry ===
2
  Contributors: amandato, blubrry
3
+ Tags: podcasting, podcast, podcaster, powerpress, itunes, google play music, google play, enclosure, professional, apple, apple tv, ipad, iphone, soundcloud, squarespace, youtube, viddler, ustream, podcasting, audio, video, rss2, feed, player, media, rss, mp3, music, embed, feedburner, statistics, stats, flv, flash, id3, episodes, blubrry, mp4, m4v, wordpressmu, mu, wordpress mu, multisite, multi site, mediacaster, post, plugin, posts, simple, social, dashboard, TSG, Buzzsprout, MTR, WP-boxCast, CastMyBlog, tgs podcasting, simple podcasting, seriously simple podcasting, seriously-simple-podcasting, serious, seriously, ssp, podlove, podcast.de, clammr, clammr radio, audio player, stitcher, tunein, show, shows, series, docs, documentation, support, free, add-ons, extensions, addons, libsyn, libsyn-podcasting, podbean, podomatic, spreaker
4
  Requires at least: 3.6
5
+ Tested up to: 4.7.3
6
+ Stable tag: 7.0.4
7
  Donate link: https://www.patreon.com/blubrry?ty=h
8
  License: GPLv2 or later
9
 
11
 
12
  == Description ==
13
 
14
+ No. 1 Podcasting plugin for WordPress, with simple & advanced modes, players, subscribe tools, and more!
15
 
16
  [youtube https://www.youtube.com/watch?v=twqKrVehY3o]
17
 
18
+ Developed by podcasters for podcasters; features include Simple and Advanced modes, multiple audio/video player options, subscribe to podcast page embeds and sidebar widgets, podcasting SEO features, and more! Fully supports iTunes, Google Play, Stitcher, TuneIn and Blubrry Podcasting directories, as well as all podcast applications and clients.
19
+
20
  = Simple Mode =
21
  If you are just getting started or feel overwelmed with all the settings and options, switch to Simple mode! PowerPress's Simple Mode will walk you through getting started in 3 easy steps.
22
 
38
  - *Media Statistics: Get FREE Blubrry Media Statistics from your WordPress dashboard.
39
  - Multi-languages and locales: See [PowerPress in your language](http://create.blubrry.com/resources/powerpress/powerpress-language/) for details.
40
 
 
 
 
41
  = Includes Full iTunes Support! =
42
  Blubrry PowerPress fully supports iTunes, which is required for podcasting. PowerPress comes with the following iTunes specific features:
43
 
47
  * iTunes podcasting: Fully supported, including the latest [Apple iTunes podcasting specifications](http://www.powerpresspodcast.com/2012/05/10/itunes-podcasting-specifications-changed-may-2012-what-that-means-for-podcasting/).
48
  * Feed Episode Maximizer: Increase the number of episodes viewed on iTunes while decreasing the byte size of your feeds.
49
 
50
+ = Includes Full Google Play Music Support! =
51
+ Blubrry PowerPress 6.1+ fully supports Google Play Music podcast directory.
52
+
53
  = Integrated Media Players =
54
  Blubrry PowerPress includes extensive Web player options to display your podcast audio and video in your Web pages.
55
 
56
+ * Audio players: Pick from Blubrry's Media Player, MediaElement.js, or the native HTML5 audio player.
57
+ * Video players: Pick from MediaElement.js, VideoJS, or the native HTML5 video player.
58
+ * Positioning: Position player above or below your content.
59
  * [Player shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/shortcode/): Place the player exactly where you want by adding the `[powerpress]` shortcode directly into your post content.
60
  * [Playlist player shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/powerpress-playlist-shortcode/): Include a playlist of your latest podcast episodes utilizing the `[powerpress_playlist]` shortcode in any page or post.
61
  * Embeds: Add embeds from sites such as YouTube.
67
  A Blubrry PowerPress exclusive, podcast subscribe tools help you convert Web visitors into podcast subscribers. Subscribe options include:
68
 
69
  * [Subscribe page](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/subscribe-page/): Instantly create a subscribe page with simplified instructions on how to subscribe to your podcast using the PowerPress subscribe page shortcode.
70
+ * [Subscribe page shortcode](http://create.blubrry.com/resources/powerpress/advanced-tools-and-options/powerpress-subscribe-shortcode/): Add the `[powerpress_subscribe]` shortcode to include a mobile-device optimized subscribe embed in any post or page that includes buttons to subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), [Subscribe by Email](http://www.subscribebyemail.com), Stitcher, tuneIn, via RSS, and an special textbox to easily copy and paste your podcast feed into any podcast application.
71
+ * Subscribe sidebar widget: Mobile device optimized sidebar buttons to subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), Stitcher, tuneIn, subscribe by RSS, and a "more subscribe options" button linked to your podcast's subscribe page.
72
  * Subscribe links: Subscribe on iTunes, [Subscribe on Android](http://www.subscribeonandroid.com), subscribe by RSS and a link to your custom subscribe page below every player.
73
  * Retina enabled: Subscribe button images optimized for high resolution displays including Apple Retina displays.
74
+ * Responsive: Subscribe tools are designed for any screen and optimized for touch screens by providing custom buttons that are indrustry standard 48 pixels in height optimized for touch screen use.
75
 
76
  = Integrates with Blubrry's Services =
77
  Make your life easier by adding our FREE or paid media hosting and statistics services to streamline your podcast productivity.
80
  * Publish Blubrry hosted media directly from your blog.
81
  * View Blubrry hosting usage quota from your blog.
82
  * Configure how Blubrry writes media (ID3) tags within PowerPress settings.
83
+ * Post your podcast to Twitter, Facebook, and YouTube.
84
+ * Migrate all of your media at no additional cost to your Blubrry [Podcast Media Hosting](http://create.blubrry.com/resources/podcast-media-hosting/) account with just a couple clicks.
85
 
86
+ The Blubrry basic statistics service is FREE. Our [Premium Statistics Service](https://secure.blubrry.com/podcast-statistics-premium/), which includes [Blubrry Certified Statistics](http://create.blubrry.com/resources/podcast-media-download-statistics/rawvoice-certified/), U.S. downloads, trending and exporting, is available for $5 month. Blubrry [Media Hosting](https://secure.blubrry.com/podcast-publishing-premium-with-hosting/) packages start at $12.
87
 
88
 
89
  = Advanced Features for those who need more =
111
 
112
  Note: Advanced settings such as settings for podcast categories will need to be recreated in PowerPress.
113
 
114
+ = Migrating from another service such as LibSyn, PodBeam, SoundCloud, or Squarespace? =
115
+ Importing your podcast feed into PowerPress is super easy! Simply paste in your RSS feed URL into the PowerPress feed import tool and click import. RSS feed import works with any podcast service and includes additional options for importing from LibSyn, PodBeam, SoundCloud, and Squarespace. You can optionally migrate your media to your Blubrry Podcast Hosting account with only a couple simple clicks.
116
+
117
  = PowerPress in your Language =
118
 
119
  [PowerPress is available in a number of languages](http://create.blubrry.com/resources/powerpress/powerpress-language/). Starting with PowerPress 7.0, translations will be managed through [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/powerpress/) making translations easier to setup and update.
217
  == Screenshots ==
218
  1. PowerPress's Simple Mode will walk you through setting up your podcast in 3 easy steps.
219
  2. Just like blogging, podcasting utilizes blog posting features with the addition of a podcast episode box. Yes, podcasting is that simple!
220
+ 3. PowerPress integrates seamlessly with Blubrry Podcast Hosting's exclusive player.
221
+ 4. PowerPress comes with a built-in subscribe sidebar widget to help your audience subscribe to your podcast.
222
+ 5. PowerPress comes with an editable subscribe page builder with a subscribe embed tool to help your web visitors subscribe.
223
+ 6. PowerPress's Advanced Mode settings let you dig in as deep as you want to with every possible setting for podcasting at your fingertips.
224
+ 7. PowerPress incorporates the built-in WordPress media players into your blog posts and pages.
225
 
226
 
227
  == Changelog ==
228
 
229
  = Next Major Release Announcements =
230
+ * Facebook Instant Articles for podcasting coming in next release!
 
231
  * We are looking for beta testers! If you would like to beta test future versions of PowerPress, please [contact us](http://www.blubrry.com/contact.php) with your name and email.
232
 
233
+ = Fan of PowerPress and want to show your support? =
234
+ If you are a fan of PowerPress, we would greatly appreciate it if you could take a moment and [leave us a review on WordPress.org](https://wordpress.org/support/plugin/powerpress/reviews/?rate=5#new-post). Your support is greatly appreciated!
235
+
236
+ = 7.0.4 =
237
+ * Released on 2/18/2017
238
+ * NOTE: There is no urgency to update to this version unless you can benefit from the new import options, top level iTunes category options, or bug fixes listed.
239
+ * Playlist player bug fix: When ids="" are specified, episodes are now listed in the order entered rather than by date. (Thanks Zach Herbert for bringing to our attention!)
240
+ * Updated the `powerpress_subscribe` shortcode to include the latest iTunes button in svg format and added the iTunes small badge. Use attribute itunes_badge="true" to display iTunes badge.
241
+ * Changed import feed code to use the current author ID rather than hard coded to 1. (Thanks @tund3r for the bug fix!)
242
+ * Import feed for libsyn updated. (Thanks @tund3r for the code fix!)
243
+ * Import feed advanced option "Remove query strings from media URLs" added. (Thanks @tund3r!)
244
+ * Fixed rare PHP Notice unserialize() on line 3094 error that may happen if the podcast episode serialized data is not present. (Thanks @hmseb for pointing out the notice to us!)
245
+ * Added colon ":" to list of characters that can be in a valid media URL. (Thanks AfterBuzzTV.com! for the heads up!)
246
+ * Fixed notice message that can appear when using the media objects with the powerpress shortcode. (Thanks @srumery for reporting the problem!)
247
+ * Fixed issue with dashboard failing to load in some cases due to news feed being blocked by web server. (Thanks Jacob K. for helping us debug the problem!)
248
+ * iTunes categories with subcategories are no longer strictly enforced. If you want to select "Art" without selecting a sub category you now can. Selecting a category with a sub category is still optimal.
249
+ * Added ability to import a podcast feed to a post type podcast feed or to a podcast channel.
250
+ * Added ability to set the post status when importing a podcast feed. (Thanks @hgetrost for the feature suggestion!)
251
+ * Added compatibility with the [Custom Post Widget](https://wordpress.org/plugins/custom-post-widget/) plugin. (Thanks @aparentdesign for letting us know about the problem)
252
+ * Fixed bug where ogg audio was not using the correct audio player. (Thanks @joeress for letting us know about the bug)
253
+ * Fixed bug with import not matching episode media URLs correctly. (Thanks @hgetrost for bringing to our attention)
254
+
255
 
256
  = 7.0.3 =
257
  * Released 9/13/2016
543
  ATTENTION: The 1 pixel out audio player will be removed from PowerPress 7.1.
544
 
545
  == Contributors ==
546
+ Angelo Mandato, CIO [Blubrry](http://www.blubrry.com) - Plugin founder, architect and lead developer
547
 
548
  Pat McSweeny, PHP Developer - Developed initial version (v0.1.0) of plugin
549