Index: anon-upload-template.php
===================================================================
--- anon-upload-template.php	(revision 7134)
+++ anon-upload-template.php	(working copy)
@@ -61,6 +61,7 @@
 
 	.video-upload p {
 		margin: 16px 0;
+		overflow: auto;
 	}
 
 	.video-upload h3 {
@@ -214,6 +215,9 @@
 		case 13:
 			$message = "Error: please leave the first field empty. (It helps us know you're not a spammer.)";
 			break;
+		case 14:
+			$message = "Error: please enter a valid WordPress.org username for the producer, or leave the field empty.";
+			break;
 	}
 	$message = '<div class="error"><p>' . $message . '</p></div>';
 } elseif ( !empty($_REQUEST['success']) ) {
@@ -314,8 +318,8 @@
 	</div>
 
 	<p>
-		<label for="wptv_video_producer"><?php esc_html_e( 'Video producer' ); ?></label>
-		<input type="text" id="wptv_video_producer" name="wptv_video_producer" value="" />
+		<label for="wptv_producer_username"><?php esc_html_e( 'Producer WordPress.org Username' ); ?></label>
+		<input type="text" id="wptv_producer_username" name="wptv_producer_username" value="" />
 	</p>
 	<p>
 		<label for="wptv_speakers"><?php esc_html_e( 'Speakers' ); ?></label>
Index: functions.php
===================================================================
--- functions.php	(revision 7133)
+++ functions.php	(working copy)
@@ -164,6 +164,7 @@
 		global $post;
 
 		$slides_url = get_post_meta( $post->ID, '_wptv_slides_url', true );
+		$producer_username = get_post_meta( $post->ID, '_wptv_producer_username', true );
 		wp_nonce_field( 'edit-video-info', 'video_info_metabox_nonce' );
 
 		?>
@@ -173,6 +174,10 @@
 			<input type="text" class="widefat" id="wptv-slides-url" name="_wptv_slides_url" value="<?php echo esc_url( $slides_url ); ?>" />
 		</p>
 
+		<p>
+			<label for="wptv-producer-username">Producer's WordPress.org Username</label>
+			<input type="text" class="widefat" id="wptv-producer-username" name="_wptv_producer_username" value="<?php echo esc_attr( $producer_username ); ?>" />
+		</p>
 		<?php
 	}
 
@@ -198,6 +203,14 @@
 		} else {
 			delete_post_meta( $post_id, '_wptv_slides_url' );
 		}
+
+		$producer_username = sanitize_text_field( $_POST['_wptv_producer_username'] );
+
+		if ( wporg_username_exists( $producer_username ) ) {
+			update_post_meta( $post_id, '_wptv_producer_username', $producer_username );
+		} else {
+			delete_post_meta( $post_id, '_wptv_producer_username' );
+		}
 	}
 
 	/**
@@ -829,3 +842,42 @@
 	return $excerpt;
 }
 add_filter( 'get_the_excerpt', 'wptv_excerpt_slides' );
+
+/**
+ * Checks if the given username exists on WordPress.org
+ *
+ * grav-redirect.php will redirect to a Gravatar image URL. If the WordPress.org username exists, the `d` parameter
+ * will be 'retro', and if it doesn't it'll be 'mm'.
+ *
+ * @param string $username
+ *
+ * @return bool
+ */
+function wporg_username_exists( $username ) {
+	$username_exists = false;
+	$validator_url   = add_query_arg( 'user', $username, 'https://wordpress.org/grav-redirect.php' );
+	$response        = wp_remote_retrieve_headers( wp_remote_get( $validator_url, array( 'redirection' => 0 ) ) );
+
+	if ( array_key_exists( 'location', $response ) ) {
+		if ( false === strpos( $response['location'], 'd=mm' ) ) {
+			$username_exists = true;
+		}
+	}
+
+	return $username_exists;
+}
+
+// todo temp
+function test_wporg_username_exists() {
+	$valid_usernames   = array( 'iandunn', 'iandunn-CapitalTest', 'Ian Dunn Space Capital Test', 'kovshenin', '.EXTRATER.', '_Skyn3t_' );
+	$invalid_usernames = array( '', 252342, 'sfjj2fasdfaef', '#@(@%%@#&*(*&(', '.;.;.;' );
+
+	foreach ( $valid_usernames as $username ) {
+		printf( "<p>Valid username %s was marked as %s</p>", $username, wporg_username_exists( $username ) ? 'valid' : 'invalid' );
+	}
+
+	foreach ( $invalid_usernames as $username ) {
+		printf( "<p>Invalid username %s was marked as %s</p>", $username, wporg_username_exists( $username ) ? 'valid' : 'invalid' );
+	}
+}
+//test_wporg_username_exists();
Index: plugins/wordpresstv-anon-upload/anon-upload.php
===================================================================
--- plugins/wordpresstv-anon-upload/anon-upload.php	(revision 7134)
+++ plugins/wordpresstv-anon-upload/anon-upload.php	(working copy)
@@ -47,7 +47,7 @@
 	function validate() {
 		$text_fields = array(
 			'wptv_video_title',
-			'wptv_video_producer',
+			'wptv_producer_username',
 			'wptv_speakers',
 			'wptv_event',
 			'wptv_slides_url'
@@ -62,6 +62,10 @@
 			return $this->error( 13 );
 		}
 
+		if ( empty( $_POST['wptv_producer_username'] ) || ! wporg_username_exists( $_POST['wptv_producer_username'] ) ) {
+			return $this->error( 14 );
+		}
+
 		if ( ! is_user_logged_in() ) {
 			if ( empty( $_POST['wptv_uploaded_by'] ) ) {
 				return $this->error( 10 );
@@ -259,7 +263,7 @@
 		}
 
 		$video_title    = $this->sanitize_text( $_posted['wptv_video_title'] );
-		$video_producer = $this->sanitize_text( $_posted['wptv_video_producer'] );
+		$producer_username = $this->sanitize_text( $_posted['wptv_producer_username'] );
 		$speakers       = $this->sanitize_text( $_posted['wptv_speakers'] );
 		$event          = $this->sanitize_text( $_posted['wptv_event'] );
 		$description    = $this->sanitize_text( $_posted['wptv_video_description'], false );
@@ -266,6 +270,7 @@
 		$language       = $this->sanitize_text( $_posted['wptv_language'] );
 		$slides         = $this->sanitize_text( $_posted['wptv_slides_url'] );
 		$ip             = $_SERVER['REMOTE_ADDR'];
+		// todo re-align after this commit
 
 		$categories = '';
 		if ( ! empty( $_posted['post_category'] ) && is_array( $_posted['post_category'] ) ) {
@@ -282,7 +287,7 @@
 			'submitted_by'    => $anon_author,
 			'submitted_email' => $anon_author_email,
 			'title'           => $video_title,
-			'producer'        => $video_producer,
+			'producer_username' => $producer_username,
 			'speakers'        => $speakers,
 			'event'           => $event,
 			'language'        => $language,
@@ -290,6 +295,7 @@
 			'description'     => $description,
 			'slides'          => $slides,
 			'ip'              => $ip,
+			// todo re-align after this commit
 		);
 
 		$post_meta['video_guid'] = $video_data->guid;
@@ -324,9 +330,12 @@
 		$embed_args['blog_id'] = get_current_blog_id();
 		$embed_args['post_id'] = $meta['attachment_id'];
 
-		// Add slides index to meta (necessary for posts that were uploaded before the field was added)
-		if ( ! array_key_exists( 'slides', $meta ) ) {
-			$meta['slides'] = '';
+		// Add missing indexes to meta (necessary for posts that were uploaded before the fields were added)
+		$new_fields = array( 'slides', 'producer_username' );       // todo username should be taxonomy like producer name, rather than meta
+		foreach ( $new_fields as $field ) {
+			if ( ! array_key_exists( $field, $meta ) ) {
+				$meta[ $field ] = '';
+			}
 		}
 
 		?>
@@ -460,10 +469,11 @@
 					</div>
 
 					<div class="row">
-						<p class="label">Producer:</p>
+						<p class="label">Producer WordPress.org Username:</p>
+
 						<p class="data">
-							<input type="text" value="<?php echo esc_attr( $meta['producer'] ); ?>"/>
-							<a class="button-secondary anon-approve" href="#new-tag-producer">Approve</a>
+							<input type="text" value="<?php echo esc_attr( $meta['producer_username'] ); ?>"/>
+							<a class="button-secondary anon-approve" href="#wptv-producer-username">Approve</a>
 						</p>
 					</div>
 
@@ -528,6 +538,8 @@
 						if (id.indexOf('#new-tag-') != -1) {
 							el.val(target.siblings('input[type="text"]').val());
 							el.siblings('.tagadd').click();
+						} else if ('#title' == id || '#wptv-producer-username' == id) {
+							el.val(target.siblings('input[type="text"]').val());
 						} else if ('#title' == id  || '#wptv-slides-url' == id) {
 							el.val(target.siblings('input[type="text"]').val());
 						} else if (id == '#excerpt') {
Index: sidebar-single.php
===================================================================
--- sidebar-single.php	(revision 7133)
+++ sidebar-single.php	(working copy)
@@ -81,5 +81,40 @@
 						printf( '<a href="%s">Subtitle this video &rarr;</a>', esc_url( add_query_arg( 'video', $video->post_id, home_url( 'subtitle/' ) ) ) );
 					}
 				}
+
+			/*
+			 * Credit video producer with link to their WordPress.org profile
+			 *
+			 * In most cases we'll either have the producer name, or the username, but not both.
+			 */
+			$producer_username = get_post_meta( get_the_ID(), '_wptv_producer_username', true );
+
+			if ( $producer_name = get_the_terms( get_the_ID(), 'producer' ) ) {
+				if ( ! is_wp_error( $producer_name ) && ! empty( $producer_name[0]->name ) ) {
+					$producer_name = $producer_name[0]->name;
+				} else {
+					$producer_name = false;
+				}
+			}
+
 			?>
+
+			<?php if ( $producer_name || $producer_username ) : ?>
+				<h5>Producer</h5>
+
+				<div class="video-producer">
+					<?php if ( $producer_username ) : ?>
+
+						<a href="<?php echo esc_url( 'https://profiles.wordpress.org/' . rawurlencode( $producer_username ) ); ?>">
+							<?php echo esc_html( $producer_username ); ?>
+						</a>
+
+					<?php elseif ( $producer_name ) : ?>
+
+						<?php echo esc_html( $producer_name ); ?>
+
+					<?php endif; ?>
+				</div>
+			<?php endif; ?>
+
 </div><!-- .secondary-content -->
