--- /dev/null
+<?php
+
+namespace Drupal\video_embed_media;
+
+use Drupal\Core\Entity\Query\QueryFactory;
+use Drupal\media_entity\Entity\Media;
+use Drupal\media_entity\Entity\MediaBundle;
+use Drupal\video_embed_media\Plugin\MediaEntity\Type\VideoEmbedField;
+
+/**
+ * Upgrades existing media_entity_embedded_video bundles.
+ */
+class UpgradeManager implements UpgradeManagerInterface {
+
+ /**
+ * The entity query factory.
+ *
+ * @var \Drupal\Core\Entity\Query\QueryFactory
+ */
+ protected $entityQuery;
+
+ /**
+ * UpgradeManager constructor.
+ *
+ * @param \Drupal\Core\Entity\Query\QueryFactory $entity_query
+ * The entity query service.
+ */
+ public function __construct(QueryFactory $entity_query) {
+ $this->entityQuery = $entity_query;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function upgrade() {
+ $entities = $this->entityQuery->get('media_bundle')->condition('type', 'embeddable_video')->execute();
+ foreach ($entities as $entity) {
+ $bundle = MediaBundle::load($entity);
+ $this->upgradeBundle($bundle);
+ }
+ }
+
+ /**
+ * Upgrade a whole bundle to use video_embed_field.
+ *
+ * @param \Drupal\media_entity\Entity\MediaBundle $bundle
+ * The media bundle object.
+ */
+ protected function upgradeBundle(MediaBundle $bundle) {
+ // Create a video embed field on the media bundle.
+ VideoEmbedField::createVideoEmbedField($bundle->id());
+ // Load and update all of the existing media entities.
+ $media_entities = $this->entityQuery->get('media')->condition('bundle', $bundle->id())->execute();
+ foreach ($media_entities as $media_entity) {
+ $media_entity = Media::load($media_entity);
+ $this->upgradeEntity($media_entity, $bundle->getTypeConfiguration());
+ }
+ // Update the media bundle type.
+ $bundle->type = 'video_embed_field';
+ $bundle->save();
+ }
+
+ /**
+ * Upgrade an individual media entity.
+ *
+ * @param \Drupal\media_entity\Entity\Media $media_entity
+ * The media entity.
+ * @param array $type_configuration
+ * The media type configuration.
+ */
+ protected function upgradeEntity(Media $media_entity, $type_configuration) {
+ // Copy the existing media bundle field value to the new field value.
+ $existing_url_field = $media_entity->{$type_configuration['source_field']}->getValue();
+ $existing_url = isset($existing_url_field[0]['uri']) ? $existing_url_field[0]['uri'] : $existing_url_field[0]['value'];
+ $media_entity->{VideoEmbedField::VIDEO_EMBED_FIELD_DEFAULT_NAME} = [['value' => $existing_url]];
+ $media_entity->save();
+ }
+
+}