// Note for next migration. I forgot the left pane JS replacement in the section "Task 671: Improve touchscreen support"
        // above in the initial release of 3.2.0. It was added on May 19, 4 days after the 3.2.0 release.
        // As an extra precaution, we should re-apply this fix in the next migration as well, so anyone who didn't manually
        // update their template still gets the fix.

        /// <summary>
        /// Upgrades the 3.2.0 data to the 3.2.1 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo321(GalleryDb ctx)
        {
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.LeftPane))
            {
                // Task 671: Improve touchscreen support.
                // NOTE: This should have been in the 3.2.0 upgrade, but it was forgotten.
                const string srcText = @"// Render the left pane, but not for touchscreens UNLESS the left pane is the only visible pane
var isTouch = window.Gsp.isTouchScreen();
var renderLeftPane = !isTouch  || (isTouch && ($('.gsp_tb_s_CenterPane:visible, .gsp_tb_s_RightPane:visible').length == 0));

if (renderLeftPane ) {
 $('#{{:Settings.LeftPaneClientId}}').html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));";

                const string replText = @"// Render the left pane if it exists
var $lp = $('#{{:Settings.LeftPaneClientId}}');

if ($lp.length > 0) {
 $lp.html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));";

                uiTmpl.ScriptTemplate = uiTmpl.ScriptTemplate.Replace(srcText, replText);
            }

            // Update data schema version to 3.2.1
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.2.1";

            ctx.SaveChanges();
        }
        /// <summary>
        /// Upgrades the 3.0.2 data to the 3.0.3 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo303(GalleryDb ctx)
        {
            // Fix bug# 632: Error "Cannot find skin path"
            // Change skin name from "Dark" to "dark".
            var asSkin = ctx.AppSettings.First(a => a.SettingName == "Skin");

            if (asSkin.SettingValue == "Dark")
            {
                asSkin.SettingValue = "dark";
            }

            // Fix bug# 633: Upgrading from 2.6 may result in duplicate sets of tags
            // Delete any duplicate "tag" metadata rows
            // FYI: We need the ToList() to avoid this error in SQL CE: The ntext and image data types cannot be used in WHERE, HAVING, GROUP BY, ON, or IN clauses, except when these data types are used with the LIKE or IS NULL predicates.
            var dupMetaTags = ctx.Metadatas
                              .Where(m => m.MetaName == MetadataItemName.Tags)
                              .GroupBy(m => m.FKMediaObjectId).Where(m => m.Count() > 1)
                              .ToList()
                              .Select(m => m.Where(t => t.Value == String.Empty))
                              .Select(m => m.FirstOrDefault());

            foreach (var dupMetaTag in dupMetaTags)
            {
                ctx.Metadatas.Remove(dupMetaTag);
            }

            // Update data schema version to 3.0.3
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.0.3";

            ctx.SaveChanges();
        }
        /// <summary>
        /// Upgrades the 3.0.3 data to the 3.1.0 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo310(GalleryDb ctx)
        {
            // Insert Orientation meta item into metadata definitions just before the ExposureProgram item.
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MetadataDisplaySettings"))
            {
                // First grab the sequence of ExposureProgram, then subtract one.
                // Matches: 'MetadataItem':14{ANY_TEXT}'Sequence':{ANY_DIGITS} => {ANY_DIGITS} is assigned to seq group name
                var match = System.Text.RegularExpressions.Regex.Match(metaDef.SettingValue, @"['""]MetadataItem['""]:14.+?['""]Sequence['""]:(?<seq>\d+)");

                var sequence = 12;                 // Default to 12 if we don't find one, which is correct if the user hasn't modified the original order
                if (match.Success)
                {
                    sequence = Convert.ToInt32(match.Groups["seq"].Value, CultureInfo.InvariantCulture) - 1;
                }

                // Serialized values are separated by apostrophes when first inserted; they are replaced by quotes by the JSON serializer when subsequently
                // saved, so we check for both. Look for the beginning of the ExposureProgram item and insert the orientation item just before it.
                if (!metaDef.SettingValue.Contains(@"""MetadataItem"":43") && !metaDef.SettingValue.Contains(@"'MetadataItem':43"))
                {
                    metaDef.SettingValue = metaDef.SettingValue.Replace(@"{""MetadataItem"":14", String.Concat(@"{""MetadataItem"":43,""Name"":""Orientation"",""DisplayName"":""Orientation"",""IsVisibleForAlbum"":false,""IsVisibleForGalleryObject"":true,""IsEditable"":false,""DefaultValue"":""{Orientation}"",""Sequence"":", sequence, @"},{""MetadataItem"":14"));
                    metaDef.SettingValue = metaDef.SettingValue.Replace(@"{'MetadataItem':14", String.Concat(@"{'MetadataItem':43,'Name':'Orientation','DisplayName':'Orientation','IsVisibleForAlbum':false,'IsVisibleForGalleryObject':true,'IsEditable':false,'DefaultValue':'{Orientation}','Sequence':", sequence, @"},{'MetadataItem':14"));
                }
            }

            // Task 611 & 645: Update MP4 encoder setting to (1) perform higher quality transcoding (2) auto-rotate videos (3) remove orientation flag
            const string mp4Setting303 = @"-y -i ""{SourceFilePath}"" -vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih)"" -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -ac 1 -ar 16000 -r 13 -ab 32000 -movflags +faststart ""{DestinationFilePath}""";
            const string mp4Setting310 = @"-y -i ""{SourceFilePath}"" -vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih){AutoRotateFilter}"" -vcodec libx264 -movflags +faststart -metadata:s:v:0 rotate=0 ""{DestinationFilePath}""";

            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MediaEncoderSettings"))
            {
                metaDef.SettingValue = metaDef.SettingValue.Replace(mp4Setting303, mp4Setting310);
            }

            // Task 664: Change jQuery 1.10.1 to 1.10.2
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";
            }

            // Task 649: Add .3GP file support
            if (!ctx.MimeTypes.Any(mt => mt.FileExtension == ".3gp"))
            {
                ctx.MimeTypes.Add(new MimeTypeDto
                {
                    FileExtension        = ".3gp",
                    MimeTypeValue        = "video/mp4",
                    BrowserMimeTypeValue = ""
                });
            }

            // Update data schema version to 3.1.0
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.1.0";

            ctx.SaveChanges();
        }
        /// <summary>
        /// Upgrades the 3.0.1 data to the 3.0.2 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo302(GalleryDb ctx)
        {
            // Bug 625: Search results do not allow downloading original file
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.MediaObject))
            {
                const string srcText  = "{{if Settings.AllowOriginalDownload}}";
                const string replText = "{{if Album.Permissions.ViewOriginalMediaObject}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Update data schema version to 3.0.2
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.0.2";

            ctx.SaveChanges();
        }
        /// <summary>
        /// Upgrades the 3.1.0 data to the 3.2.0 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo320(GalleryDb ctx)
        {
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Album))
            {
                // Task 669: Allow manual sorting of media objects
                // Step 1: Add the Custom option to the sort by dropdown
                var srcText = @"<li class='gsp_abm_sum_sbi_hdr'>{{:Resource.AbmSortbyTt}}</li>";

                var replText = @"<li class='gsp_abm_sum_sbi_hdr'>{{:Resource.AbmSortbyTt}}</li>
{{if Album.VirtualType == 1 && Album.Permissions.EditAlbum}}<li><a href='#' data-id='-2147483648'>{{:Resource.AbmSortbyCustom}}</a></li>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 2: Convert the thumbnails into a list of <li> tags instead of <div>'s. Required for jQuery UI Sortable.
                srcText = @"<div class='gsp_floatcontainer'>
 {{for Album.GalleryItems}}
 <div class='thmb{{if IsAlbum}} album{{/if}}' data-id='{{:Id}}' data-it='{{:ItemType}}'>
	<a class='gsp_thmbLink' href='{{: ~getGalleryItemUrl(#data, !IsAlbum) }}'>
	 <img class='gsp_thmb_img' style='width:{{:Views[ViewIndex].Width}}px;height:{{:Views[ViewIndex].Height}}px;' src='{{:Views[ViewIndex].Url}}'>
	</a>
	<p class='gsp_go_t' style='width:{{:Views[ViewIndex].Width + 40}}px;' title='{{stripHtml:Title}}'>{{stripHtmlAndTruncate:Title}}</p>
 </div>
 {{/for}}
</div>";

                replText = @"<ul class='gsp_floatcontainer gsp_abm_thmbs'>
 {{for Album.GalleryItems}}
 <li class='thmb{{if IsAlbum}} album{{/if}}' data-id='{{:Id}}' data-it='{{:ItemType}}' style='width:{{:Views[ViewIndex].Width + 40}}px;'>
	<a class='gsp_thmbLink' href='{{: ~getGalleryItemUrl(#data, !IsAlbum) }}'>
	 <img class='gsp_thmb_img' style='width:{{:Views[ViewIndex].Width}}px;height:{{:Views[ViewIndex].Height}}px;' src='{{:Views[ViewIndex].Url}}'>
	</a>
	<p class='gsp_go_t' title='{{stripHtml:Title}}'>{{stripHtmlAndTruncate:Title}}</p>
 </li>
 {{/for}}
</ul>";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 3: Update the JavaScript so that left pane is rendered regardless of whether the client is on a touchscreen device
                srcText = @"var isTouch = window.Gsp.isTouchScreen();
var renderLeftPane = !isTouch  || (isTouch && ($('.gsp_tb_s_CenterPane:visible, .gsp_tb_s_RightPane:visible').length == 0));

if (renderLeftPane ) {
 $('#{{:Settings.LeftPaneClientId}}').html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));
";

                replText = @"var $lp = $('#{{:Settings.LeftPaneClientId}}');

if ($lp.length > 0) {
 $lp.html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));
";

                uiTmpl.ScriptTemplate = uiTmpl.ScriptTemplate.Replace(srcText, replText);

                // Bug 709: Link to add objects page should not appear in empty virtual albums
                // Add a condition to the if statement so that Add link appears only for non-virtual albums
                srcText = @"{{if Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                replText = @"{{if Album.VirtualType == 1 && Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Task 722: Add RSS link to album template
                srcText = @"
	<span class='gsp_abm_sum_col1_row1_hdr'>{{:Resource.AbmPfx}}</span>"    ;

                replText = @"
{{if Album.RssUrl}}
	<a class='gsp_abm_sum_btn' href='{{:Album.RssUrl}}'>
		<img src='{{:App.SkinPath}}/images/rss-s.png' title='{{:Resource.AbmRssTt}}' alt=''>
	</a>
{{/if}}
	<span class='gsp_abm_sum_col1_row1_hdr'>{{:Resource.AbmPfx}}</span>"    ;

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Task 730: Assign owner button should not be visible for virtual albums
                srcText = @"
{{if Album.Permissions.AdministerGallery}}
	<a class='gsp_abm_sum_ownr_trigger gsp_abm_sum_btn' href='#'>"    ;

                replText = @"
{{if Album.VirtualType == 1 && Album.Permissions.AdministerGallery}}
	<a class='gsp_abm_sum_ownr_trigger gsp_abm_sum_btn' href='#'>"    ;

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Task 681: Merge My account button into username in header
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Header))
            {
                // Step 1: Remove the HTML for the 'My account' icon
                var srcText = @"
	{{if Settings.AllowManageOwnAccount}}
	<div class='gsp_useroption'>
	 <a class='gsp_myaccountlink' href='{{:App.CurrentPageUrl}}?g=myaccount&aid={{:Album.Id}}'>
		<img class='gsp_myaccount-user-icon' title='{{:Resource.HdrMyAccountTt}}' alt='{{:Resource.HdrMyAccountTt}}' src='{{:App.SkinPath}}/images/user-l.png'>
	 </a></div>
	 {{/if}}"    ;

                var replText = "";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 2: Replace the username with a hyperlinked username that takes user to 'My account' page,
                // except when AllowManageOwnAccount=false, in which case just display the username like before.
                srcText = @"	<span id='{{:Settings.ClientId}}_userwelcome' class='gsp_welcome'>{{:User.UserName}}</span></div>";

                replText = @"{{if Settings.AllowManageOwnAccount}}
		<a id='{{:Settings.ClientId}}_userwelcome' href='{{:App.CurrentPageUrl}}?g=myaccount&aid={{:Album.Id}}' class='gsp_welcome' title='{{:Resource.HdrMyAccountTt}}'>{{:User.UserName}}</a>
	 {{else}}
		<span id='{{:Settings.ClientId}}_userwelcome' class='gsp_welcome'>{{:User.UserName}}</span>
	 {{/if}}
	 </div>"    ;

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.LeftPane))
            {
                // Task 675: Add RECENTLY ADDED and TOP RATED links to left pane
                const string srcText = @"<div id='{{:Settings.ClientId}}_lptv'></div>";

                const string replText = @"<div id='{{:Settings.ClientId}}_lptv' class='gsp_lpalbumtree'></div>
{{if App.LatestUrl}}<p class='gsp_lplatest'><a href='{{:App.LatestUrl}}' class='jstree-anchor'><i class='jstree-icon'></i>{{:Resource.LpRecent}}</a></p>{{/if}}
{{if App.TopRatedUrl}}<p class='gsp_lptoprated'><a href='{{:App.TopRatedUrl}}' class='jstree-anchor'><i class='jstree-icon'></i>{{:Resource.LpTopRated}}</a></p>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Task 727: Update jQuery 1.10.2 to 1.11.1. Update jQuery UI 1.10.3 to 1.10.4.
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js";
            }

            appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryUiScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js";
            }

            // Task 722: Now that {MediaObjectUrl} is an absolute URL, remove any instances of {HostUrl} that precede it.
            // Under default settings this only affects the HTML portion of two video/divx records, but we're making it more
            // generic to catch any customizations an admin may have done.
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.HtmlTemplate.Contains("{HostUrl}{MediaObjectUrl}") || mt.ScriptTemplate.Contains("{HostUrl}{MediaObjectUrl}")))
            {
                tmpl.HtmlTemplate   = tmpl.HtmlTemplate.Replace("{HostUrl}{MediaObjectUrl}", "{MediaObjectUrl}");
                tmpl.ScriptTemplate = tmpl.ScriptTemplate.Replace("{HostUrl}{MediaObjectUrl}", "{MediaObjectUrl}");
            }

            // Update data schema version to 3.2.0
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.2.0";

            ctx.SaveChanges();

            // Task 674: Add/update Enterprise UI templates introduced in 3.2.0
            var pkRow = ctx.AppSettings.Single(a => a.SettingName == "ProductKey");

            if (pkRow.SettingValue == Constants.ProductKeyEnterprise)
            {
                SeedController.InsertEnterpriseTemplates();
            }
        }
Пример #6
0
        private static void InsertMimeTypes(GalleryDb ctx)
        {
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".3gp", MimeTypeValue = "video/mp4", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".afl", MimeTypeValue = "video/animaflex", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".aif", MimeTypeValue = "audio/aiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".aifc", MimeTypeValue = "audio/aiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".aiff", MimeTypeValue = "audio/aiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".asf", MimeTypeValue = "video/x-ms-asf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".asx", MimeTypeValue = "video/x-ms-asf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".au", MimeTypeValue = "audio/basic", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".avi", MimeTypeValue = "video/x-ms-wvx", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".avs", MimeTypeValue = "video/avs-video", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".bm", MimeTypeValue = "image/bmp", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".bmp", MimeTypeValue = "image/bmp", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".chm", MimeTypeValue = "application/vnd.ms-htmlhelp", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".css", MimeTypeValue = "text/css", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".divx", MimeTypeValue = "video/divx", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dl", MimeTypeValue = "video/dl", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".doc", MimeTypeValue = "application/msword", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".docm", MimeTypeValue = "application/vnd.ms-word.document.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".docx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.wordprocessingml.document", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dotx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.wordprocessingml.template", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dot", MimeTypeValue = "application/msword", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dotm", MimeTypeValue = "application/vnd.ms-word.template.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dtd", MimeTypeValue = "application/xml-dtd", BrowserMimeTypeValue = "text/plain" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dv", MimeTypeValue = "video/x-dv", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dwg", MimeTypeValue = "image/vnd.dwg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".dxf", MimeTypeValue = "image/vnd.dwg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".emf", MimeTypeValue = "image/x-emf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".eps", MimeTypeValue = "image/postscript", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".exe", MimeTypeValue = "application/octet-stream", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".f4v", MimeTypeValue = "video/f4v", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".fif", MimeTypeValue = "image/fif", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".fli", MimeTypeValue = "video/fli", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".flo", MimeTypeValue = "image/florian", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".flv", MimeTypeValue = "video/x-flv", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".fpx", MimeTypeValue = "image/vnd.fpx", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".funk", MimeTypeValue = "audio/make", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".g3", MimeTypeValue = "image/g3fax", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".gif", MimeTypeValue = "image/gif", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".gl", MimeTypeValue = "video/gl", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".htm", MimeTypeValue = "text/html", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".html", MimeTypeValue = "text/html", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ico", MimeTypeValue = "image/ico", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ief", MimeTypeValue = "image/ief", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".iefs", MimeTypeValue = "image/ief", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".it", MimeTypeValue = "audio/it", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jar", MimeTypeValue = "application/java-archive", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jfif", MimeTypeValue = "image/jpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jfif-tbnl", MimeTypeValue = "image/jpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jpe", MimeTypeValue = "image/jpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jpeg", MimeTypeValue = "image/jpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jpg", MimeTypeValue = "image/jpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".js", MimeTypeValue = "text/javascript", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".jut", MimeTypeValue = "image/jutvision", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".kar", MimeTypeValue = "audio/midi", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".la", MimeTypeValue = "audio/nspaudio", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".lma", MimeTypeValue = "audio/nspaudio", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m1v", MimeTypeValue = "video/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m2a", MimeTypeValue = "audio/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m2ts", MimeTypeValue = "video/MP2T", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m2v", MimeTypeValue = "video/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m4a", MimeTypeValue = "audio/m4a", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".m4v", MimeTypeValue = "video/m4v", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mcf", MimeTypeValue = "image/vasa", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mht", MimeTypeValue = "message/rfc822", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mid", MimeTypeValue = "audio/midi", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".midi", MimeTypeValue = "audio/midi", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mod", MimeTypeValue = "audio/mod", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".moov", MimeTypeValue = "video/mp4", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mov", MimeTypeValue = "video/mp4", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mp2", MimeTypeValue = "audio/mpeg", BrowserMimeTypeValue = "application/x-mplayer2" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mp3", MimeTypeValue = "audio/x-mp3", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mp4", MimeTypeValue = "video/mp4", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mpa", MimeTypeValue = "audio/mpeg", BrowserMimeTypeValue = "application/x-mplayer2" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mpe", MimeTypeValue = "video/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mpeg", MimeTypeValue = "video/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mpg", MimeTypeValue = "video/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mpga", MimeTypeValue = "audio/mpeg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".mts", MimeTypeValue = "video/MP2T", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".my", MimeTypeValue = "audio/make", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".nap", MimeTypeValue = "image/naplps", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".naplps", MimeTypeValue = "image/naplps", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".oga", MimeTypeValue = "audio/ogg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ogg", MimeTypeValue = "video/ogg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ogv", MimeTypeValue = "video/ogg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pdf", MimeTypeValue = "application/pdf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pfunk", MimeTypeValue = "audio/make", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pic", MimeTypeValue = "image/pict", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pict", MimeTypeValue = "image/pict", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".png", MimeTypeValue = "image/png", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".potm", MimeTypeValue = "application/vnd.ms-powerpoint.template.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".potx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.presentationml.template", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ppam", MimeTypeValue = "application/vnd.ms-powerpoint.addin.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pps", MimeTypeValue = "application/vnd.ms-powerpoint", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ppsm", MimeTypeValue = "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ppsx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.presentationml.slideshow", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ppt", MimeTypeValue = "application/vnd.ms-powerpoint", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pptm", MimeTypeValue = "application/vnd.ms-powerpoint.presentation.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".pptx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.presentationml.presentation", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".psd", MimeTypeValue = "image/psd", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".qcp", MimeTypeValue = "audio/vnd.qcelp", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".qt", MimeTypeValue = "video/mp4", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ra", MimeTypeValue = "audio/x-pn-realaudio", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ram", MimeTypeValue = "audio/x-pn-realaudio", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".ras", MimeTypeValue = "image/cmu-raster", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rast", MimeTypeValue = "image/cmu-raster", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rf", MimeTypeValue = "image/vnd.rn-realflash", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rmi", MimeTypeValue = "audio/mid", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rp", MimeTypeValue = "image/vnd.rn-realpix", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rtf", MimeTypeValue = "application/rtf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".rv", MimeTypeValue = "video/vnd.rn-realvideo", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".sgml", MimeTypeValue = "text/sgml", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".s3m", MimeTypeValue = "audio/s3m", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".snd", MimeTypeValue = "audio/basic", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".svf", MimeTypeValue = "image/vnd.dwg", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".svg", MimeTypeValue = "image/svg+xml", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".swf", MimeTypeValue = "application/x-shockwave-flash", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".tif", MimeTypeValue = "image/tiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".tiff", MimeTypeValue = "image/tiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".tsi", MimeTypeValue = "audio/tsp-audio", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".tsp", MimeTypeValue = "audio/tsplayer", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".turbot", MimeTypeValue = "image/florian", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".txt", MimeTypeValue = "text/plain", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".vdo", MimeTypeValue = "video/vdo", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".viv", MimeTypeValue = "video/vivo", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".vivo", MimeTypeValue = "video/vivo", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".voc", MimeTypeValue = "audio/voc", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".vos", MimeTypeValue = "video/vosaic", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".vox", MimeTypeValue = "audio/voxware", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wax", MimeTypeValue = "audio/x-ms-wax", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wav", MimeTypeValue = "audio/wav", BrowserMimeTypeValue = "application/x-mplayer2" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wbmp", MimeTypeValue = "image/vnd.wap.wbmp", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".webm", MimeTypeValue = "video/webm", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wmf", MimeTypeValue = "image/wmf", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wma", MimeTypeValue = "audio/x-ms-wma", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wmv", MimeTypeValue = "video/x-ms-wmv", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".wvx", MimeTypeValue = "video/x-ms-wvx", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xbap", MimeTypeValue = "application/x-ms-xbap", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xaml", MimeTypeValue = "application/xaml+xml", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xlam", MimeTypeValue = "application/vnd.ms-excel.addin.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xls", MimeTypeValue = "application/vnd.ms-excel", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xlsb", MimeTypeValue = "application/vnd.ms-excel.sheet.binary.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xlsm", MimeTypeValue = "application/vnd.ms-excel.sheet.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xlsx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xltm", MimeTypeValue = "application/vnd.ms-excel.template.macroEnabled.12", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xltx", MimeTypeValue = "application/vnd.openxmlformats-officedocument.spreadsheetml.template", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xif", MimeTypeValue = "image/vnd.xiff", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xml", MimeTypeValue = "text/xml", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".xps", MimeTypeValue = "application/vnd.ms-xpsdocument", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".x-png", MimeTypeValue = "image/png", BrowserMimeTypeValue = "" });
            ctx.MimeTypes.AddOrUpdate(a => a.FileExtension, new MimeTypeDto { FileExtension = ".zip", MimeTypeValue = "application/octet-stream", BrowserMimeTypeValue = "" });

            ctx.SaveChanges();
        }
Пример #7
0
        /// <summary>
        /// Adds or updates the left pane templates available to Enterprise users.
        /// </summary>
        private static void InsertLeftPaneEnterpriseTemplates()
        {
            using (var ctx = new GalleryDb())
            {
                var galleryId = ctx.Galleries.Single(g => g.IsTemplate).GalleryId;

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                    {
                        TemplateType = UiTemplateType.LeftPane,
                        Name = "Default with Tag and People Trees",
                        FKGalleryId = galleryId,
                        Description = "",
                        HtmlTemplate = GetLeftPaneHtmlTmpl(true, false),
                        ScriptTemplate = GetLeftPaneJsTmpl(true, false)
                    });

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                    {
                        TemplateType = UiTemplateType.LeftPane,
                        Name = "Default with Tag and People Clouds",
                        FKGalleryId = galleryId,
                        Description = "",
                        HtmlTemplate = GetLeftPaneHtmlTmpl(false, true),
                        ScriptTemplate = GetLeftPaneJsTmpl(false, true)
                    });

                ctx.SaveChanges();
            }
        }
Пример #8
0
        /// <summary>
        /// Upgrades the 3.0.2 data to the 3.0.3 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo303(GalleryDb ctx)
        {
            // Fix bug# 632: Error "Cannot find skin path"
            // Change skin name from "Dark" to "dark".
            var asSkin = ctx.AppSettings.First(a => a.SettingName == "Skin");
            if (asSkin.SettingValue == "Dark")
            {
                asSkin.SettingValue = "dark";
            }

            // Fix bug# 633: Upgrading from 2.6 may result in duplicate sets of tags
            // Delete any duplicate "tag" metadata rows
            // FYI: We need the ToList() to avoid this error in SQL CE: The ntext and image data types cannot be used in WHERE, HAVING, GROUP BY, ON, or IN clauses, except when these data types are used with the LIKE or IS NULL predicates.
            var dupMetaTags = ctx.Metadatas
                .Where(m => m.MetaName == MetadataItemName.Tags)
                .GroupBy(m => m.FKMediaObjectId).Where(m => m.Count() > 1)
                .ToList()
                .Select(m => m.Where(t => t.Value == String.Empty))
                .Select(m => m.FirstOrDefault());

            foreach (var dupMetaTag in dupMetaTags)
            {
                ctx.Metadatas.Remove(dupMetaTag);
            }

            // Update data schema version to 3.0.3
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.0.3";

            ctx.SaveChanges();
        }
Пример #9
0
        private static void InsertUiTemplates(GalleryDb ctx)
        {
            var galleryId = ctx.Galleries.Single(g => g.IsTemplate).GalleryId;

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.Album,
                                                                                                                                                                                Name = DefaultTmplName,
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = @"<div class='gsp_abm_sum'>
             <div class='gsp_abm_sum_col2'>
            <p class='gsp_abm_sum_col2_row1'>({{:Album.NumGalleryItems}}{{:Resource.AbmNumObjSuffix}})</p>
            <div class='gsp_abm_sum_col2_row2'>
             {{if Settings.ShowSlideShowButton}}
             <a class='gsp_abm_sum_ss_trigger gsp_abm_sum_btn' href='#'>
            <img src='{{:App.SkinPath}}/images/play-ss-m.png' title='{{:Resource.MoTbSsStart}}' alt=''>
             </a>
             {{/if}}
             {{if Settings.ShowUrlsButton}}
             <a class='gsp_abm_sum_sa_trigger gsp_abm_sum_btn' href='#'>
            <img src='{{:App.SkinPath}}/images/link-m.png' title='{{:Resource.AbmShareAlbum}}' alt=''>
             </a>
             {{/if}}
             {{if Settings.AllowZipDownload}}
             <a class='gsp_abm_sum_DownloadZip gsp_abm_sum_btn' href='{{: ~getDownloadUrl(Album.Id) }}'>
            <img src='{{:App.SkinPath}}/images/download-zip-m.png' title='{{:Resource.AbmDwnldZip}}' alt=''>
             </a>
             {{/if}}
             <span>
            <button class='gsp_abm_sum_rs'>{{:Resource.AbmRvsSortTt}}</button>
            <button class='gsp_btn_sb'>{{:Resource.AbmSortbyTt}}</button>
             </span>
             <ul class='gsp_abm_sum_sbi'>
            <li class='gsp_abm_sum_sbi_hdr'>{{:Resource.AbmSortbyTt}}</li>
            {{if Album.VirtualType == 1 && Album.Permissions.EditAlbum}}<li><a href='#' data-id='-2147483648'>{{:Resource.AbmSortbyCustom}}</a></li>{{/if}}
            <li><a href='#' data-id='8'>{{:Resource.AbmSortbyDatePictureTaken}}</a></li>
            <li><a href='#' data-id='111'>{{:Resource.AbmSortbyDateAdded}}</a></li>
            <li><a href='#' data-id='26'>{{:Resource.AbmSortbyRating}}</a></li>
            <li><a href='#' data-id='29'>{{:Resource.AbmSortbyTitle}}</a></li>
            <li><a href='#' data-id='34'>{{:Resource.AbmSortbyFilename}}</a></li>
             </ul>
            </div>
             </div>
             <p class='gsp_abm_sum_col1_row1'>
            {{if Album.VirtualType == 1 && Album.Permissions.EditAlbum}}
            <a class='gsp_abm_sum_pvt_trigger gsp_abm_sum_btn' href='#'>
            <img src='{{:App.SkinPath}}/images/lock-{{if Album.IsPrivate || !Settings.AllowAnonBrowsing}}active-{{/if}}s.png' title='{{if !Settings.AllowAnonBrowsing}}{{:Resource.AbmAnonDisabledTt}}{{else}}{{if Album.IsPrivate}}{{:Resource.AbmIsPvtTt}}{{else}}{{:Resource.AbmNotPvtTt}}{{/if}}{{/if}}' alt=''>
             </a>
            {{/if}}
            {{if Album.VirtualType == 1 && Album.Permissions.AdministerGallery}}
            <a class='gsp_abm_sum_ownr_trigger gsp_abm_sum_btn' href='#'>
            <img src='{{:App.SkinPath}}/images/user-s.png' title='{{:Resource.AbmOwnrTt}}' alt=''>
             </a>
            {{/if}}
            {{if Album.RssUrl}}
            <a class='gsp_abm_sum_btn' href='{{:Album.RssUrl}}'>
            <img src='{{:App.SkinPath}}/images/rss-s.png' title='{{:Resource.AbmRssTt}}' alt=''>
            </a>
            {{/if}}
            <span class='gsp_abm_sum_col1_row1_hdr'>{{:Resource.AbmPfx}}</span>
            <span class='gsp_abm_sum_col1_row1_dtl'>{{:Album.Title}}</span>
             </p>
             <div class='gsp_abm_sum_col1_row2'>
            <span class='gsp_abm_sum_col1_row2_hdr'></span>
            <span class='gsp_abm_sum_col1_row2_dtl'>{{:Album.Caption}}</span>
             </div>
            </div>

            {{if Album.GalleryItems.length == 0}}
             <p class='gsp_abm_noobj'>{{:Resource.AbmNoObj}} {{if Album.VirtualType == 1 && Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}</p>
            {{/if}}

            <ul class='gsp_floatcontainer gsp_abm_thmbs'>
             {{for Album.GalleryItems}}
             <li class='thmb{{if IsAlbum}} album{{/if}}' data-id='{{:Id}}' data-it='{{:ItemType}}' style='width:{{:Views[ViewIndex].Width + 40}}px;'>
            <a class='gsp_thmbLink' href='{{: ~getGalleryItemUrl(#data, !IsAlbum) }}'>
             <img class='gsp_thmb_img' style='width:{{:Views[ViewIndex].Width}}px;height:{{:Views[ViewIndex].Height}}px;' src='{{:Views[ViewIndex].Url}}'>
            </a>
            <p class='gsp_go_t' title='{{stripHtml:Title}}'>{{stripHtmlAndTruncate:Title}}</p>
             </li>
             {{/for}}
            </ul>

            <div class='gsp_abm_sum_share_dlg gsp_dlg'>
             <p class='gsp_abm_sum_share_dlg_t'>{{:Resource.AbmShareAlbum}}</p>
             <p class='gsp_abm_sum_share_dlg_s'>{{:Resource.AbmLinkToAlbum}}</p>
             <p><input type='text' class='gsp_abm_sum_share_dlg_ipt' value='{{: ~getAlbumUrl(Album.Id, true) }}' /></p>
            </div>

            <div class='gsp_abm_sum_ownr_dlg gsp_dlg'>
             <p class='gsp_abm_sum_ownr_dlg_t'>{{:Resource.AbmOwnr}}</p>
             <p class='gsp_abm_sum_ownr_dlg_s'>{{:Resource.AbmOwnrDtl}}</p>
            {{if Album.Permissions.AdministerGallery}}
             <p class='gsp_abm_sum_ownr_dlg_o'><span>{{:Resource.AbmOwnrLbl}}</span> <input type='text' class='gsp_abm_sum_ownr_dlg_ipt' value='{{:Album.Owner}}' /></p>
            {{/if}}
            {{if Album.InheritedOwners}}
             <p class='gsp_abm_sum_ownr_dlg_io'>{{:Resource.AbmOwnrInhtd}} {{:Album.InheritedOwners}}</p>
            {{/if}}
            </div>",
                                                                                                                                                                                ScriptTemplate = @"// Call the gspThumbnails plug-in, which adds the HTML to the page and then configures it
            $('#{{:Settings.ThumbnailClientId}}').gspThumbnails('{{:Settings.ThumbnailTmplName}}', window.{{:Settings.ClientId}}.gspData);"
                                                                                                                                                                            });

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.MediaObject,
                                                                                                                                                                                Name = DefaultTmplName,
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = GetMediaObjectHtmlTmpl(false),
                                                                                                                                                                                ScriptTemplate = GetMediaObjectJsTmpl(false)
                                                                                                                                                                            });

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.Header,
                                                                                                                                                                                Name = DefaultTmplName,
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = GetHeaderHtmlTmpl(false),
                                                                                                                                                                                ScriptTemplate = GetHeaderJsTmpl(false)
                                                                                                                                                                            });

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.LeftPane,
                                                                                                                                                                                Name = DefaultTmplName,
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = GetLeftPaneHtmlTmpl(false, false),
                                                                                                                                                                                ScriptTemplate = GetLeftPaneJsTmpl(false, false)
                                                                                                                                                                            });

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.RightPane,
                                                                                                                                                                                Name = DefaultTmplName,
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = GetRightPaneHtmlTmpl(false, false),
                                                                                                                                                                                ScriptTemplate = GetRightPaneJsTmpl(false, false)
                                                                                                                                                                            });

            ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                                                                                                                                                                            {
                                                                                                                                                                                TemplateType = UiTemplateType.Album,
                                                                                                                                                                                Name = "List View",
                                                                                                                                                                                FKGalleryId = galleryId,
                                                                                                                                                                                Description = "",
                                                                                                                                                                                HtmlTemplate = @"<table>
            <thead style='font-weight:bold;'><td>Title</td><td>Type</td><thead>
            {{for Album.GalleryItems}}
            <tr>
            <td>
             <p><a title='{{:Title}}' href='{{:#parent.parent.data.App.CurrentPageUrl}}{{if IsAlbum}}?aid={{:Id}}'>{{:#parent.parent.parent.data.Resource.AbmPfx}} {{else}}?moid={{:Id}}'>{{/if}}{{:Title}}</a></p>
            </td>
            <td><p>{{getItemTypeDesc:ItemType}}</p></td>
            </tr>
            {{/for}}
            </table>",
                                                                                                                                                                                ScriptTemplate = "$('#{{:Settings.ThumbnailClientId}}').html($.render [ '{{:Settings.ThumbnailTmplName}}' ](window.{{:Settings.ClientId}}.gspData));"
                                                                                                                                                                            });

            ctx.SaveChanges(); // Save so we can reference these records in InsertJQueryTemplateAlbums()
        }
Пример #10
0
        /// <summary>
        /// Adds or updates the PayPal 'view cart' and 'add to cart' widgets.
        /// </summary>
        private static void InsertPayPalTemplates()
        {
            using (var ctx = new GalleryDb())
            {
                var galleryId = ctx.Galleries.Single(g => g.IsTemplate).GalleryId;

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                {
                    TemplateType = UiTemplateType.Header,
                    Name = "Default with PayPal View Cart Widget",
                    FKGalleryId = galleryId,
                    Description = "",
                    HtmlTemplate = GetHeaderHtmlTmpl(true),
                    ScriptTemplate = GetHeaderJsTmpl(true)
                });

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                {
                    TemplateType = UiTemplateType.RightPane,
                    Name = "Default with PayPal Add To Cart Widget",
                    FKGalleryId = galleryId,
                    Description = "",
                    HtmlTemplate = GetRightPaneHtmlTmpl(true, false),
                    ScriptTemplate = GetRightPaneJsTmpl(true, false)
                });

                ctx.SaveChanges();
            }
        }
Пример #11
0
        /// <summary>
        /// Upgrades the 3.0.0 data to the 3.0.1 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo301(GalleryDb ctx)
        {
            // Bug 547: Change jQuery 1.10.0 to 1.10.1 (the migration code for 2.6 => 3.0 mistakenly specified 1.10.0 instead of 1.10.1)
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js";
            }

            // Bug 570: Change "DateAdded" to "Date Added"
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MetadataDisplaySettings"))
            {
                // Serialized values are separated by apostrophes when first inserted; they are replaced by quotes by the JSON serializer when subsequently
                // saved, so we check for both.
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"""MetadataItem"":111,""Name"":""DateAdded"",""DisplayName"":""DateAdded""", @"""MetadataItem"":111,""Name"":""DateAdded"",""DisplayName"":""Date Added""");
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"'MetadataItem':111,'Name':'DateAdded','DisplayName':'DateAdded'", @"'MetadataItem':111,'Name':'DateAdded','DisplayName':'Date Added'");
            }

            // Bug 578: Change MP4 encoder setting
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MediaEncoderSettings"))
            {
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"-s {Width}x{Height} -b:v 384k", @"-vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih)"" -b:v 384k");
            }

            // Bug 554: (a) Fix M4V templates
            var mimeType = ctx.MimeTypes.FirstOrDefault(mt => mt.FileExtension == ".m4v" && mt.MimeTypeValue == "video/x-m4v");
            if (mimeType != null)
            {
                mimeType.MimeTypeValue = "video/m4v";
            }

            // Bug 554: (b) Delete x-m4v / safari template
            var mediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "video/x-m4v" && mt.BrowserId == "safari");
            if (mediaTmpl != null)
            {
                ctx.MediaTemplates.Remove(mediaTmpl);
            }

            // Bug 554: (c) Delete existing m4v templates
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/m4v"))
            {
                ctx.MediaTemplates.Remove(tmpl);
            }

            // Bug 554: (d) Add m4v templates based on the mp4 ones
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/mp4"))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType = "video/m4v",
                    BrowserId = tmpl.BrowserId,
                    HtmlTemplate = tmpl.HtmlTemplate,
                    ScriptTemplate = tmpl.ScriptTemplate
                });
            }

            // Bug 555: (a) Add MP3 template for IE1TO8 (copy it from Firefox, which uses Silverlight)
            var mp3MediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "audio/x-mp3" && mt.BrowserId == "firefox");
            if (mp3MediaTmpl != null && (!ctx.MediaTemplates.Any(mt => mt.MimeType == mp3MediaTmpl.MimeType && mt.BrowserId == "ie1to8")))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType = mp3MediaTmpl.MimeType,
                    BrowserId = "ie1to8",
                    HtmlTemplate = mp3MediaTmpl.HtmlTemplate,
                    ScriptTemplate = mp3MediaTmpl.ScriptTemplate
                });

            }

            // Bug 555: (b) Delete MP3 template for Safari
            mp3MediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "audio/x-mp3" && mt.BrowserId == "safari");
            if (mp3MediaTmpl != null)
            {
                ctx.MediaTemplates.Remove(mp3MediaTmpl);
            }

            // Bug 564: (a) Change MIME type of .qt and .moov files from video/quicktime to video/mp4
            foreach (var qtMimeType in ctx.MimeTypes.Where(mt => new[] { ".qt", ".moov" }.Contains(mt.FileExtension) && mt.MimeTypeValue == "video/quicktime"))
            {
                qtMimeType.MimeTypeValue = "video/mp4";
            }

            // Bug 564: (b) Delete video/quicktime safari template
            foreach (var qtMediaTmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/quicktime" && mt.BrowserId == "safari"))
            {
                ctx.MediaTemplates.Remove(qtMediaTmpl);
            }

            // Bug 562: Add PDF template for Safari. It looks mostly like the IE one except we have to clear the iframe src before we can hide it.

            const string pdfScriptTmplSafari = @"// IE and Safari render Adobe Reader iframes on top of jQuery UI dialogs, so add event handler to hide frame while dialog is visible
            // Safari requires that we clear the iframe src before we can hide it
            $('.gsp_mo_share_dlg').on('dialogopen', function() {
             $('#{UniqueId}_frame').attr('src', '').css('visibility', 'hidden');
            }).on('dialogclose', function() {
            $('#{UniqueId}_frame').attr('src', '{MediaObjectUrl}').css('visibility', 'visible');
            });";

            if (!ctx.MediaTemplates.Any(mt => mt.MimeType == "application/pdf" && mt.BrowserId == "safari"))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType = "application/pdf",
                    BrowserId = "safari",
                    HtmlTemplate = "<p><a href='{MediaObjectUrl}'>Enlarge PDF to fit browser window</a></p><iframe id='{UniqueId}_frame' src='{MediaObjectUrl}' frameborder='0' style='width:680px;height:600px;border:1px solid #000;'></iframe>",
                    ScriptTemplate = pdfScriptTmplSafari
                });
            }

            // Bug 580: Need to use AddMediaObject permission instead of EditAlbum permission when deciding whether to render the Add link in an empty album.
            // Task 579: Change lock icon tooltip when anonymous access is disabled
            // Task 575: Update signature of jsRender helper functions getAlbumUrl, getGalleryItemUrl, getDownloadUrl, currentUrl
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Album))
            {
                const string srcText580 = "{{if Album.Permissions.EditAlbum}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";
                const string replText580 = "{{if Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                const string srcText579 = "<img src='{{:App.SkinPath}}/images/lock-{{if Album.IsPrivate}}active-{{/if}}s.png' title='{{if Album.IsPrivate}}{{:Resource.AbmIsPvtTt}}{{else}}{{:Resource.AbmNotPvtTt}}{{/if}}' alt=''>";
                const string replText579 = "<img src='{{:App.SkinPath}}/images/lock-{{if Album.IsPrivate || !Settings.AllowAnonBrowsing}}active-{{/if}}s.png' title='{{if !Settings.AllowAnonBrowsing}}{{:Resource.AbmAnonDisabledTt}}{{else}}{{if Album.IsPrivate}}{{:Resource.AbmIsPvtTt}}{{else}}{{:Resource.AbmNotPvtTt}}{{/if}}{{/if}}' alt=''>";

                const string srcText575a = "~getAlbumUrl(#data)";
                const string replText575a = "~getAlbumUrl(Album.Id, true)";

                const string srcText575b = "~getGalleryItemUrl(#data)";
                const string replText575b = "~getGalleryItemUrl(#data, !IsAlbum)";

                const string srcText575c = "~getDownloadUrl(#data)";
                const string replText575c = "~getDownloadUrl(Album.Id)";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText580, replText580);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText579, replText579);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575a, replText575a);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575b, replText575b);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575c, replText575c);
            }

            // Task 575: Update signature of jsRender helper function getDownloadUrl
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.MediaObject))
            {
                const string srcText575c = "~getDownloadUrl()";
                const string replText575c = "~getDownloadUrl(Album.Id)";

                const string srcText575d = "~currentUrl()";
                const string replText575d = "~getMediaUrl(MediaItem.Id, true)";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575c, replText575c);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575d, replText575d);
            }

            // Update data schema version to 3.0.1
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.0.1";

            ctx.SaveChanges();
        }
Пример #12
0
        // Note for next migration. I forgot the left pane JS replacement in the section "Task 671: Improve touchscreen support"
        // above in the initial release of 3.2.0. It was added on May 19, 4 days after the 3.2.0 release.
        // As an extra precaution, we should re-apply this fix in the next migration as well, so anyone who didn't manually
        // update their template still gets the fix.
        /// <summary>
        /// Upgrades the 3.2.0 data to the 3.2.1 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo321(GalleryDb ctx)
        {
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.LeftPane))
            {
                // Task 671: Improve touchscreen support.
                // NOTE: This should have been in the 3.2.0 upgrade, but it was forgotten.
                const string srcText = @"// Render the left pane, but not for touchscreens UNLESS the left pane is the only visible pane
            var isTouch = window.Gsp.isTouchScreen();
            var renderLeftPane = !isTouch  || (isTouch && ($('.gsp_tb_s_CenterPane:visible, .gsp_tb_s_RightPane:visible').length == 0));

            if (renderLeftPane ) {
             $('#{{:Settings.LeftPaneClientId}}').html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));";

                const string replText = @"// Render the left pane if it exists
            var $lp = $('#{{:Settings.LeftPaneClientId}}');

            if ($lp.length > 0) {
             $lp.html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));";

                uiTmpl.ScriptTemplate = uiTmpl.ScriptTemplate.Replace(srcText, replText);
            }

            // Update data schema version to 3.2.1
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.2.1";

            ctx.SaveChanges();
        }
Пример #13
0
        /// <summary>
        /// Upgrades the 3.1.0 data to the 3.2.0 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo320(GalleryDb ctx)
        {
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Album))
            {
                // Task 669: Allow manual sorting of media objects
                // Step 1: Add the Custom option to the sort by dropdown
                var srcText = @"<li class='gsp_abm_sum_sbi_hdr'>{{:Resource.AbmSortbyTt}}</li>";

                var replText = @"<li class='gsp_abm_sum_sbi_hdr'>{{:Resource.AbmSortbyTt}}</li>
            {{if Album.VirtualType == 1 && Album.Permissions.EditAlbum}}<li><a href='#' data-id='-2147483648'>{{:Resource.AbmSortbyCustom}}</a></li>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 2: Convert the thumbnails into a list of <li> tags instead of <div>'s. Required for jQuery UI Sortable.
                srcText = @"<div class='gsp_floatcontainer'>
             {{for Album.GalleryItems}}
             <div class='thmb{{if IsAlbum}} album{{/if}}' data-id='{{:Id}}' data-it='{{:ItemType}}'>
            <a class='gsp_thmbLink' href='{{: ~getGalleryItemUrl(#data, !IsAlbum) }}'>
             <img class='gsp_thmb_img' style='width:{{:Views[ViewIndex].Width}}px;height:{{:Views[ViewIndex].Height}}px;' src='{{:Views[ViewIndex].Url}}'>
            </a>
            <p class='gsp_go_t' style='width:{{:Views[ViewIndex].Width + 40}}px;' title='{{stripHtml:Title}}'>{{stripHtmlAndTruncate:Title}}</p>
             </div>
             {{/for}}
            </div>";

                replText = @"<ul class='gsp_floatcontainer gsp_abm_thmbs'>
             {{for Album.GalleryItems}}
             <li class='thmb{{if IsAlbum}} album{{/if}}' data-id='{{:Id}}' data-it='{{:ItemType}}' style='width:{{:Views[ViewIndex].Width + 40}}px;'>
            <a class='gsp_thmbLink' href='{{: ~getGalleryItemUrl(#data, !IsAlbum) }}'>
             <img class='gsp_thmb_img' style='width:{{:Views[ViewIndex].Width}}px;height:{{:Views[ViewIndex].Height}}px;' src='{{:Views[ViewIndex].Url}}'>
            </a>
            <p class='gsp_go_t' title='{{stripHtml:Title}}'>{{stripHtmlAndTruncate:Title}}</p>
             </li>
             {{/for}}
            </ul>";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 3: Update the JavaScript so that left pane is rendered regardless of whether the client is on a touchscreen device
                srcText = @"var isTouch = window.Gsp.isTouchScreen();
            var renderLeftPane = !isTouch  || (isTouch && ($('.gsp_tb_s_CenterPane:visible, .gsp_tb_s_RightPane:visible').length == 0));

            if (renderLeftPane ) {
             $('#{{:Settings.LeftPaneClientId}}').html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));
            ";

                replText = @"var $lp = $('#{{:Settings.LeftPaneClientId}}');

            if ($lp.length > 0) {
             $lp.html( $.render [ '{{:Settings.LeftPaneTmplName}}' ]( window.{{:Settings.ClientId}}.gspData ));
            ";

                uiTmpl.ScriptTemplate = uiTmpl.ScriptTemplate.Replace(srcText, replText);

                // Bug 709: Link to add objects page should not appear in empty virtual albums
                // Add a condition to the if statement so that Add link appears only for non-virtual albums
                srcText = @"{{if Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                replText = @"{{if Album.VirtualType == 1 && Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Task 722: Add RSS link to album template
                srcText = @"
            <span class='gsp_abm_sum_col1_row1_hdr'>{{:Resource.AbmPfx}}</span>";

                replText = @"
            {{if Album.RssUrl}}
            <a class='gsp_abm_sum_btn' href='{{:Album.RssUrl}}'>
            <img src='{{:App.SkinPath}}/images/rss-s.png' title='{{:Resource.AbmRssTt}}' alt=''>
            </a>
            {{/if}}
            <span class='gsp_abm_sum_col1_row1_hdr'>{{:Resource.AbmPfx}}</span>";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Task 730: Assign owner button should not be visible for virtual albums
                srcText = @"
            {{if Album.Permissions.AdministerGallery}}
            <a class='gsp_abm_sum_ownr_trigger gsp_abm_sum_btn' href='#'>";

                replText = @"
            {{if Album.VirtualType == 1 && Album.Permissions.AdministerGallery}}
            <a class='gsp_abm_sum_ownr_trigger gsp_abm_sum_btn' href='#'>";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Task 681: Merge My account button into username in header
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Header))
            {
                // Step 1: Remove the HTML for the 'My account' icon
                var srcText = @"
            {{if Settings.AllowManageOwnAccount}}
            <div class='gsp_useroption'>
             <a class='gsp_myaccountlink' href='{{:App.CurrentPageUrl}}?g=myaccount&aid={{:Album.Id}}'>
            <img class='gsp_myaccount-user-icon' title='{{:Resource.HdrMyAccountTt}}' alt='{{:Resource.HdrMyAccountTt}}' src='{{:App.SkinPath}}/images/user-l.png'>
             </a></div>
             {{/if}}";

                var replText = "";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);

                // Step 2: Replace the username with a hyperlinked username that takes user to 'My account' page,
                // except when AllowManageOwnAccount=false, in which case just display the username like before.
                srcText = @"	<span id='{{:Settings.ClientId}}_userwelcome' class='gsp_welcome'>{{:User.UserName}}</span></div>";

                replText = @"{{if Settings.AllowManageOwnAccount}}
            <a id='{{:Settings.ClientId}}_userwelcome' href='{{:App.CurrentPageUrl}}?g=myaccount&aid={{:Album.Id}}' class='gsp_welcome' title='{{:Resource.HdrMyAccountTt}}'>{{:User.UserName}}</a>
             {{else}}
            <span id='{{:Settings.ClientId}}_userwelcome' class='gsp_welcome'>{{:User.UserName}}</span>
             {{/if}}
             </div>";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.LeftPane))
            {
                // Task 675: Add RECENTLY ADDED and TOP RATED links to left pane
                const string srcText = @"<div id='{{:Settings.ClientId}}_lptv'></div>";

                const string replText = @"<div id='{{:Settings.ClientId}}_lptv' class='gsp_lpalbumtree'></div>
            {{if App.LatestUrl}}<p class='gsp_lplatest'><a href='{{:App.LatestUrl}}' class='jstree-anchor'><i class='jstree-icon'></i>{{:Resource.LpRecent}}</a></p>{{/if}}
            {{if App.TopRatedUrl}}<p class='gsp_lptoprated'><a href='{{:App.TopRatedUrl}}' class='jstree-anchor'><i class='jstree-icon'></i>{{:Resource.LpTopRated}}</a></p>{{/if}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Task 727: Update jQuery 1.10.2 to 1.11.1. Update jQuery UI 1.10.3 to 1.10.4.
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js";
            }

            appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryUiScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js";
            }

            // Task 722: Now that {MediaObjectUrl} is an absolute URL, remove any instances of {HostUrl} that precede it.
            // Under default settings this only affects the HTML portion of two video/divx records, but we're making it more
            // generic to catch any customizations an admin may have done.
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.HtmlTemplate.Contains("{HostUrl}{MediaObjectUrl}") || mt.ScriptTemplate.Contains("{HostUrl}{MediaObjectUrl}")))
            {
                tmpl.HtmlTemplate = tmpl.HtmlTemplate.Replace("{HostUrl}{MediaObjectUrl}", "{MediaObjectUrl}");
                tmpl.ScriptTemplate = tmpl.ScriptTemplate.Replace("{HostUrl}{MediaObjectUrl}", "{MediaObjectUrl}");
            }

            // Update data schema version to 3.2.0
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.2.0";

            ctx.SaveChanges();

            // Task 674: Add/update Enterprise UI templates introduced in 3.2.0
            var pkRow = ctx.AppSettings.Single(a => a.SettingName == "ProductKey");

            if (pkRow.SettingValue == Constants.ProductKeyEnterprise)
            {
                SeedController.InsertEnterpriseTemplates();
            }
        }
Пример #14
0
        /// <summary>
        /// Upgrades the 3.0.3 data to the 3.1.0 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo310(GalleryDb ctx)
        {
            // Insert Orientation meta item into metadata definitions just before the ExposureProgram item.
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MetadataDisplaySettings"))
            {
                // First grab the sequence of ExposureProgram, then subtract one.
                // Matches: 'MetadataItem':14{ANY_TEXT}'Sequence':{ANY_DIGITS} => {ANY_DIGITS} is assigned to seq group name
                var match = System.Text.RegularExpressions.Regex.Match(metaDef.SettingValue, @"['""]MetadataItem['""]:14.+?['""]Sequence['""]:(?<seq>\d+)");

                var sequence = 12; // Default to 12 if we don't find one, which is correct if the user hasn't modified the original order
                if (match.Success)
                {
                    sequence = Convert.ToInt32(match.Groups["seq"].Value, CultureInfo.InvariantCulture) - 1;
                }

                // Serialized values are separated by apostrophes when first inserted; they are replaced by quotes by the JSON serializer when subsequently
                // saved, so we check for both. Look for the beginning of the ExposureProgram item and insert the orientation item just before it.
                if (!metaDef.SettingValue.Contains(@"""MetadataItem"":43") && !metaDef.SettingValue.Contains(@"'MetadataItem':43"))
                {
                    metaDef.SettingValue = metaDef.SettingValue.Replace(@"{""MetadataItem"":14", String.Concat(@"{""MetadataItem"":43,""Name"":""Orientation"",""DisplayName"":""Orientation"",""IsVisibleForAlbum"":false,""IsVisibleForGalleryObject"":true,""IsEditable"":false,""DefaultValue"":""{Orientation}"",""Sequence"":", sequence, @"},{""MetadataItem"":14"));
                    metaDef.SettingValue = metaDef.SettingValue.Replace(@"{'MetadataItem':14", String.Concat(@"{'MetadataItem':43,'Name':'Orientation','DisplayName':'Orientation','IsVisibleForAlbum':false,'IsVisibleForGalleryObject':true,'IsEditable':false,'DefaultValue':'{Orientation}','Sequence':", sequence, @"},{'MetadataItem':14"));
                }
            }

            // Task 611 & 645: Update MP4 encoder setting to (1) perform higher quality transcoding (2) auto-rotate videos (3) remove orientation flag
            const string mp4Setting303 = @"-y -i ""{SourceFilePath}"" -vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih)"" -b:v 384k -vcodec libx264 -flags +loop+mv4 -cmp 256 -partitions +parti4x4+parti8x8+partp4x4+partp8x8 -subq 6 -trellis 0 -refs 5 -bf 0 -coder 0 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -qmin 10 -qmax 51 -qdiff 4 -ac 1 -ar 16000 -r 13 -ab 32000 -movflags +faststart ""{DestinationFilePath}""";
            const string mp4Setting310 = @"-y -i ""{SourceFilePath}"" -vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih){AutoRotateFilter}"" -vcodec libx264 -movflags +faststart -metadata:s:v:0 rotate=0 ""{DestinationFilePath}""";
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MediaEncoderSettings"))
            {
                metaDef.SettingValue = metaDef.SettingValue.Replace(mp4Setting303, mp4Setting310);
            }

            // Task 664: Change jQuery 1.10.1 to 1.10.2
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js";
            }

            // Task 649: Add .3GP file support
            if (!ctx.MimeTypes.Any(mt => mt.FileExtension == ".3gp"))
            {
                ctx.MimeTypes.Add(new MimeTypeDto
                    {
                        FileExtension = ".3gp",
                        MimeTypeValue = "video/mp4",
                        BrowserMimeTypeValue = ""
                    });
            }

            // Update data schema version to 3.1.0
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.1.0";

            ctx.SaveChanges();
        }
Пример #15
0
        /// <summary>
        /// Adds or updates the media object Facebook Comments widget and the right pane Facebook Like widget.
        /// </summary>
        private static void InsertFacebookTemplates()
        {
            using (var ctx = new GalleryDb())
            {
                var galleryId = ctx.Galleries.Single(g => g.IsTemplate).GalleryId;

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                {
                    TemplateType = UiTemplateType.MediaObject,
                    Name = "Default with Facebook Comments Widget",
                    FKGalleryId = galleryId,
                    Description = "",
                    HtmlTemplate = GetMediaObjectHtmlTmpl(true),
                    ScriptTemplate = GetMediaObjectJsTmpl(true)
                });

                ctx.UiTemplates.AddOrUpdate(a => new { a.TemplateType, a.FKGalleryId, a.Name }, new UiTemplateDto
                {
                    TemplateType = UiTemplateType.RightPane,
                    Name = "Default with Facebook Like Widget",
                    FKGalleryId = galleryId,
                    Description = "",
                    HtmlTemplate = GetRightPaneHtmlTmpl(false, true),
                    ScriptTemplate = GetRightPaneJsTmpl(false, true)
                });

                ctx.SaveChanges();
            }
        }
Пример #16
0
        /// <summary>
        /// Upgrades the 3.0.0 data to the 3.0.1 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo301(GalleryDb ctx)
        {
            // Bug 547: Change jQuery 1.10.0 to 1.10.1 (the migration code for 2.6 => 3.0 mistakenly specified 1.10.0 instead of 1.10.1)
            var appSetting = ctx.AppSettings.FirstOrDefault(a => a.SettingName == "JQueryScriptPath");

            if (appSetting != null && appSetting.SettingValue == "//ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js")
            {
                appSetting.SettingValue = "//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js";
            }

            // Bug 570: Change "DateAdded" to "Date Added"
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MetadataDisplaySettings"))
            {
                // Serialized values are separated by apostrophes when first inserted; they are replaced by quotes by the JSON serializer when subsequently
                // saved, so we check for both.
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"""MetadataItem"":111,""Name"":""DateAdded"",""DisplayName"":""DateAdded""", @"""MetadataItem"":111,""Name"":""DateAdded"",""DisplayName"":""Date Added""");
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"'MetadataItem':111,'Name':'DateAdded','DisplayName':'DateAdded'", @"'MetadataItem':111,'Name':'DateAdded','DisplayName':'Date Added'");
            }

            // Bug 578: Change MP4 encoder setting
            foreach (var metaDef in ctx.GallerySettings.Where(gs => gs.SettingName == "MediaEncoderSettings"))
            {
                metaDef.SettingValue = metaDef.SettingValue.Replace(@"-s {Width}x{Height} -b:v 384k", @"-vf ""scale=min(iw*min(640/iw\,480/ih)\,iw):min(ih*min(640/iw\,480/ih)\,ih)"" -b:v 384k");
            }

            // Bug 554: (a) Fix M4V templates
            var mimeType = ctx.MimeTypes.FirstOrDefault(mt => mt.FileExtension == ".m4v" && mt.MimeTypeValue == "video/x-m4v");

            if (mimeType != null)
            {
                mimeType.MimeTypeValue = "video/m4v";
            }

            // Bug 554: (b) Delete x-m4v / safari template
            var mediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "video/x-m4v" && mt.BrowserId == "safari");

            if (mediaTmpl != null)
            {
                ctx.MediaTemplates.Remove(mediaTmpl);
            }

            // Bug 554: (c) Delete existing m4v templates
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/m4v"))
            {
                ctx.MediaTemplates.Remove(tmpl);
            }

            // Bug 554: (d) Add m4v templates based on the mp4 ones
            foreach (var tmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/mp4"))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType       = "video/m4v",
                    BrowserId      = tmpl.BrowserId,
                    HtmlTemplate   = tmpl.HtmlTemplate,
                    ScriptTemplate = tmpl.ScriptTemplate
                });
            }

            // Bug 555: (a) Add MP3 template for IE1TO8 (copy it from Firefox, which uses Silverlight)
            var mp3MediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "audio/x-mp3" && mt.BrowserId == "firefox");

            if (mp3MediaTmpl != null && (!ctx.MediaTemplates.Any(mt => mt.MimeType == mp3MediaTmpl.MimeType && mt.BrowserId == "ie1to8")))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType       = mp3MediaTmpl.MimeType,
                    BrowserId      = "ie1to8",
                    HtmlTemplate   = mp3MediaTmpl.HtmlTemplate,
                    ScriptTemplate = mp3MediaTmpl.ScriptTemplate
                });
            }

            // Bug 555: (b) Delete MP3 template for Safari
            mp3MediaTmpl = ctx.MediaTemplates.FirstOrDefault(mt => mt.MimeType == "audio/x-mp3" && mt.BrowserId == "safari");
            if (mp3MediaTmpl != null)
            {
                ctx.MediaTemplates.Remove(mp3MediaTmpl);
            }

            // Bug 564: (a) Change MIME type of .qt and .moov files from video/quicktime to video/mp4
            foreach (var qtMimeType in ctx.MimeTypes.Where(mt => new[] { ".qt", ".moov" }.Contains(mt.FileExtension) && mt.MimeTypeValue == "video/quicktime"))
            {
                qtMimeType.MimeTypeValue = "video/mp4";
            }

            // Bug 564: (b) Delete video/quicktime safari template
            foreach (var qtMediaTmpl in ctx.MediaTemplates.Where(mt => mt.MimeType == "video/quicktime" && mt.BrowserId == "safari"))
            {
                ctx.MediaTemplates.Remove(qtMediaTmpl);
            }

            // Bug 562: Add PDF template for Safari. It looks mostly like the IE one except we have to clear the iframe src before we can hide it.

            const string pdfScriptTmplSafari = @"// IE and Safari render Adobe Reader iframes on top of jQuery UI dialogs, so add event handler to hide frame while dialog is visible
// Safari requires that we clear the iframe src before we can hide it
$('.gsp_mo_share_dlg').on('dialogopen', function() {
 $('#{UniqueId}_frame').attr('src', '').css('visibility', 'hidden');
}).on('dialogclose', function() {
$('#{UniqueId}_frame').attr('src', '{MediaObjectUrl}').css('visibility', 'visible');
});";

            if (!ctx.MediaTemplates.Any(mt => mt.MimeType == "application/pdf" && mt.BrowserId == "safari"))
            {
                ctx.MediaTemplates.Add(new MediaTemplateDto()
                {
                    MimeType       = "application/pdf",
                    BrowserId      = "safari",
                    HtmlTemplate   = "<p><a href='{MediaObjectUrl}'>Enlarge PDF to fit browser window</a></p><iframe id='{UniqueId}_frame' src='{MediaObjectUrl}' frameborder='0' style='width:680px;height:600px;border:1px solid #000;'></iframe>",
                    ScriptTemplate = pdfScriptTmplSafari
                });
            }

            // Bug 580: Need to use AddMediaObject permission instead of EditAlbum permission when deciding whether to render the Add link in an empty album.
            // Task 579: Change lock icon tooltip when anonymous access is disabled
            // Task 575: Update signature of jsRender helper functions getAlbumUrl, getGalleryItemUrl, getDownloadUrl, currentUrl
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.Album))
            {
                const string srcText580  = "{{if Album.Permissions.EditAlbum}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";
                const string replText580 = "{{if Album.Permissions.AddMediaObject}}<a href='{{: ~getAddUrl(#data) }}'>{{:Resource.AbmAddObj}}</a>{{/if}}";

                const string srcText579  = "<img src='{{:App.SkinPath}}/images/lock-{{if Album.IsPrivate}}active-{{/if}}s.png' title='{{if Album.IsPrivate}}{{:Resource.AbmIsPvtTt}}{{else}}{{:Resource.AbmNotPvtTt}}{{/if}}' alt=''>";
                const string replText579 = "<img src='{{:App.SkinPath}}/images/lock-{{if Album.IsPrivate || !Settings.AllowAnonBrowsing}}active-{{/if}}s.png' title='{{if !Settings.AllowAnonBrowsing}}{{:Resource.AbmAnonDisabledTt}}{{else}}{{if Album.IsPrivate}}{{:Resource.AbmIsPvtTt}}{{else}}{{:Resource.AbmNotPvtTt}}{{/if}}{{/if}}' alt=''>";

                const string srcText575a  = "~getAlbumUrl(#data)";
                const string replText575a = "~getAlbumUrl(Album.Id, true)";

                const string srcText575b  = "~getGalleryItemUrl(#data)";
                const string replText575b = "~getGalleryItemUrl(#data, !IsAlbum)";

                const string srcText575c  = "~getDownloadUrl(#data)";
                const string replText575c = "~getDownloadUrl(Album.Id)";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText580, replText580);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText579, replText579);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575a, replText575a);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575b, replText575b);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575c, replText575c);
            }

            // Task 575: Update signature of jsRender helper function getDownloadUrl
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.MediaObject))
            {
                const string srcText575c  = "~getDownloadUrl()";
                const string replText575c = "~getDownloadUrl(Album.Id)";

                const string srcText575d  = "~currentUrl()";
                const string replText575d = "~getMediaUrl(MediaItem.Id, true)";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575c, replText575c);
                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText575d, replText575d);
            }

            // Update data schema version to 3.0.1
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");

            asDataSchema.SettingValue = "3.0.1";

            ctx.SaveChanges();
        }
Пример #17
0
        /// <summary>
        /// Upgrades the 3.0.1 data to the 3.0.2 data. Applies to data such as app settings, gallery settings, templates, etc.
        /// Does not contain data structure changes such as new columns.
        /// </summary>
        /// <param name="ctx">Context to be used for updating data.</param>
        private static void UpgradeTo302(GalleryDb ctx)
        {
            // Bug 625: Search results do not allow downloading original file
            foreach (var uiTmpl in ctx.UiTemplates.Where(t => t.TemplateType == UiTemplateType.MediaObject))
            {
                const string srcText = "{{if Settings.AllowOriginalDownload}}";
                const string replText = "{{if Album.Permissions.ViewOriginalMediaObject}}";

                uiTmpl.HtmlTemplate = uiTmpl.HtmlTemplate.Replace(srcText, replText);
            }

            // Update data schema version to 3.0.2
            var asDataSchema = ctx.AppSettings.First(a => a.SettingName == "DataSchemaVersion");
            asDataSchema.SettingValue = "3.0.2";

            ctx.SaveChanges();
        }