How to: Force reconversion of converted media
When a media is converted to a specific format, this conversion is stored in the database in one of the registered storages. Whenever the specific format for that media is requested, that conversion is reused and sent to the client.
If you for some reason need to clear these media and force reconversion you can clear those converted states and media from the storage.
All content are stored in the MediaContentReferences table, or rather the information about a content. What media it originates from and what conversion format it uses and what storage module it has stored the actual content in.
To clear a conversion we need to update the MediaContentReference post and instruct it that it has no content stored. A request for this content (using it's url) will then force a conversion to the specific format and find a suitable storage module that it will store it's data in.
It is also important to remove the old content from the storage module since the storage module might fail if trying to store the same content (using the same MediaContentReferenceId).
When changing an already converted content this will change the content of the url and if the content is already used by clients, this method does not guarantee that the client will use the new conversion since it can be cached on the client and this is nothing that we could affect.
Regenerate media (from v5.4)
The easiest way to regenerate a conversion is to mark a mediaContentReference for regeneration by setting the RegenerateMedia column to 1. The RegenerateMedia job will run every 10 minutes and process all marked media.
Regenerate media example
The example below will mark all pdf files for regeneration. This can be used if you have pdf files in your system that not uses the pdf converter but have installed it afterwards.
DECLARE @converterType NVARCHAR(255) DECLARE @originalContentType NVARCHAR(255) SET @converterType = N'ImageVault.Core.PdfEpsPlugin.PdfEpsConverter,ImageVault.Core.PdfEpsPlugin' SET @originalContentType=N'application/pdf' DECLARE @originalFormatId int DECLARE @converterTypeId int SET @converterTypeId=0 SET @originalFormatId=0 --Find correct converter SELECT @converterTypeId=MediaConverterTypeId FROM MediaConverterTypes WHERE Type=@converterType IF @converterTypeId=0 BEGIN RAISERROR('Converter type %s is not installed. Cannot continue',11,0,@converterType) GOTO DONE END RAISERROR('Converter type %s has id %d.',0,0,@converterType,@converterTypeId) --Find id of original formats SELECT @originalFormatId=mf.Id from MediaFormats mf INNER JOIN TypeRegistrations tr on mf.TypeId=tr.Id WHERE tr.Type='ImageVault.Common.Data.OriginalFormat,ImageVault.Common' IF @originalFormatId=0 BEGIN RAISERROR('Cannot find OriginalFormat. Cannot continue',11,0) GOTO DONE END RAISERROR('OriginalFormat has id %d.',0,0,@originalFormatId) --Mark all references that not already uses the correct converter to be regenerated --Marking the original version for regenerate will regenerate its media information which then will be correct for the original representation UPDATE MediaContentReferences SET RegenerateMedia=1 WHERE VersionId IN( SELECT VersionId from MediaContentReferences where MediaConversionId=@originalFormatId and ContentType=@originalContentType ) AND (MediaConverterTypeId<>@converterTypeId or MediaConverterTypeId is null) RAISERROR('Marked %d items for Regeneration',0,0,@@ROWCOUNT) DONE:
If you would like to utilize the SvgConverter included in v5.7, just change the variables above on row 3-4 to the following data
SET @converterType = N'ImageVault.Core.SvgPlugin.SvgConverter,ImageVault.Core.SvgPlugin' SET @originalContentType=N'image/svg+xml'
Manual method (prior to v5.4)
If you have an older version, you can manually remove the converted media and trigger regeneration by accessing the media url.
Manual method example: Clear all converted png media
In ImageVault 4.4.12 we introduced a fix that made conversion of png files smoother. If you have previously used png files and already have conversions for those, then we would need to force reconversion of those converted media.
Find the conversions that we need to clear
We first need to identify the conversions that we should clear. This should be all content references to png files that is not original media.
The original MediaFormat is the format that an uploaded media will get. The original format id can be found using the following SQL statement
DECLARE @OriginalFormatId int SELECT @OriginalFormatId = mf.Id FROM MediaFormats mf INNER JOIN TypeRegistrations tr ON mf.TypeId=tr.Id WHERE tr.Type='ImageVault.Common.Data.OriginalFormat,ImageVault.Common'
Small media storage
The Small media storage is a storage that uses the database for storing content. As default this is used for all media of size less than 1Mb Since this is the case for most thumbnails, we will only clear those conversions that are using the small media storage.
Each storage type is registered in the database and the id for the small media storage can be found using the following SQL statement.
DECLARE @SmallMediaStorageId int SELECT @SmallMediaStorageId = MediaStorageTypeId FROM MediaStorageTypes WHERE Type='ImageVault.Core.Storage.SmallMediaStorage.SmallMediaStorage,ImageVault.Core.Storage'
Filtering out the content references
To find the content we need to clear, filter out all png files that isn't original and are stored in the small media storage, use the following SQL statement.
SELECT * FROM MediaContentReferences WHERE ContentType='image/png' AND MediaConversionId <> @OriginalFormatId AND MediaStorageTypeId = @SmallMediaStorageId
Removing the conversions
To remove the conversions we need to do the following steps. A good advice is to create a database backup before running any of the following queries since these will affect the database.
Another advice is to use transactions to wrap the queries to make them atomic. (I often use BEGIN TRAN and ROLLBACK TRAN when testing the queries and when running them for real, just replace the ROLLBACK with a COMMIT instead.)
Remove from the small media storage
To delete the content from the small media storage, run the SQL statement below. This will remove all entries from the conversions found above.
DELETE FROM SmallMediaContents WHERE MediaContentReferenceId IN ( SELECT MediaContentReferenceId FROM MediaContentReferences WHERE ContentType='image/png' AND MediaConversionId <> @OriginalFormatId AND MediaStorageTypeId = @SmallMediaStorageId )
Update the content reference table
Then we can use the following statement to clear the storage information from the content reference table.
UPDATE MediaContentReferences SET MediaStorageTypeId=null FROM MediaContentReferences WHERE ContentType='image/png' AND MediaConversionId <> @OriginalFormatId AND MediaStorageTypeId = @SmallMediaStorageId
Restart core service
After the database has been changed, the ImageVault core service needs to be restarted for the changes to take effect.
Clear client cache
Since previous requested images will surely be cached in the client (webbrowser) the client cache needs to be cleared for the change to propagate to the end user.