Videos
Define the following fields used in Video section:
#region Fields
private List<VideoLibrary> _dropboxVideosLibraries = new List<VideoLibrary>() { };
private List<Video> _dropboxVideos = new List<Video>() { };
private bool _deletedVideos = false;
#endregion
Override the GetVideos method of OpenAccessLibrariesProvider class:
public override IQueryable<Video> GetVideos()
{
if (Config.Get<LibrariesConfig>().Providers[Name].Parameters["cursorVideos"] != null)
{
DropboxBlobStorageProviderName = String.Empty;
var libConfig = ConfigMan.GetSection<LibrariesConfig>();
if (String.Empty.Equals(Config.Get<LibrariesConfig>().Providers[Name].Parameters["cursorVideos"].Trim()))
{
var videosToDelete = base.GetVideos();
if (videosToDelete.Count<Video>() > 0)
{
var libraryToDelete = base.GetLibraries();
foreach (Library library in libraryToDelete)
{
base.Delete(library);
CommitTransaction();
}
}
libConfig.Providers[Name].Parameters["cursorVideos"] = GetFiles(String.Empty, "videos");
}
else
{
libConfig.Providers[Name].Parameters["cursorVideos"] = GetFiles(Config.Get<LibrariesConfig>().Providers[Name].Parameters["cursorVideos"], "videos");
}
if (_dropboxFolders.Count() > 0 || _dropboxFiles.Count() > 0 || _deletedVideos)
{
SyncVideoLibraries();
SyncVideos();
CommitTransaction();
ConfigMan.SaveSection(libConfig);
ResetVideosData();
}
var videos = base.GetVideos();
return videos;
}
else
{
throw new Exception(_dropboxConfigError);
}
}
This method gets the videos in Sitefinity data base and from Dropbox. If there are new or deleted videos, the SyncVideoLibraries and SyncVideos methods make the synchronization and then commit the transaction.
SyncVideoLibraries and SyncVideos methods:
public void SyncVideoLibraries()
{
_dropboxVideosLibraries = GetVideoLibraries().ToList<VideoLibrary>();
if (_dropboxVideosLibraries.SingleOrDefault<VideoLibrary>(l => l.Title == _dropboxDefaultLibraryName) == null)
{
VideoLibrary defaultLibrary = CreateVideoLibrary();
_dropboxVideosLibraries.Add(defaultLibrary);
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].BlobStorageProvider = DropboxBlobStorageProviderName;
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].Title = _dropboxDefaultLibraryName;
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].UrlName = _dropboxDefaultLibraryName.ToLower().Replace(' ', '-');
LibManager.RecompileItemUrls(_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1]);
}
foreach (DeltaEntry entry in _dropboxFolders)
{
CreateDropboxVideoLibrary(entry);
}
}
public void SyncVideos()
{
VideoLibrary defVideoLibrary = _dropboxVideosLibraries.FirstOrDefault<VideoLibrary>(l => l.Title == _dropboxDefaultLibraryName);
VideoLibrary videoLibrary;
Video sfVideo = null;
var sfVideos = base.GetVideos();
var libConfig = ConfigMan.GetSection<LibrariesConfig>();
foreach (DeltaEntry entry in _dropboxFiles)
{
if (entry.MetaData.Path.Split('/').Count<string>() == 2)
{
if (_dropboxVideos.Where<Video>(v => v.Parent.Id == defVideoLibrary.Id && v.Title == entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty)).FirstOrDefault() != null)
{
continue;
}
else if (sfVideos.Count() > 0 && (sfVideo = sfVideos.Where<Video>(v => v.Parent.Id == defVideoLibrary.Id && v.Title == entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty)).FirstOrDefault()) != null)
{
this.GenerateVideoThumbnails(sfVideo, new FileInfo(LibManager.GetItemTemporaryFilePath(sfVideo, string.Concat(sfVideo.Id, sfVideo.Extension))));
continue;
}
_dropboxVideos.Add(CreateVideo());
_dropboxVideos[_dropboxVideos.Count - 1].Parent = defVideoLibrary;
}
else
{
string videoLibraryName = entry.MetaData.Path.Split('/')[1];
videoLibrary = _dropboxVideosLibraries.FirstOrDefault<VideoLibrary>(l => l.Title == videoLibraryName);
if (_dropboxVideos.Where<Video>(v => v.Parent.Id == videoLibrary.Id && v.Title == entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty)).FirstOrDefault() != null)
{
continue;
}
else if (sfVideos.Count() > 0 && (sfVideo = sfVideos.Where<Video>(v => v.Parent.Id == videoLibrary.Id && v.Title == entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty)).FirstOrDefault()) != null)
{
this.GenerateVideoThumbnails(sfVideo, new FileInfo(LibManager.GetItemTemporaryFilePath(sfVideo, string.Concat(sfVideo.Id, sfVideo.Extension))));
continue;
}
_dropboxVideos.Add(CreateVideo());
_dropboxVideos[_dropboxVideos.Count - 1].Parent = videoLibrary;
}
_dropboxVideos[_dropboxVideos.Count - 1].Title = entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty);
_dropboxVideos[_dropboxVideos.Count - 1].Extension = entry.MetaData.Extension;
_dropboxVideos[_dropboxVideos.Count - 1].TotalSize = entry.MetaData.Bytes;
_dropboxVideos[_dropboxVideos.Count - 1].UrlName = entry.MetaData.Name.Replace(entry.MetaData.Extension, String.Empty).Trim().Replace(' ', '-');
_dropboxVideos[_dropboxVideos.Count - 1].Urls.Add(new MediaUrlData() { Url = _dropboxDefaultURL + entry.MetaData.Path.Replace(entry.MetaData.Extension, String.Empty).Replace(" ", "??") });
_dropboxVideos[_dropboxVideos.Count - 1].Uploaded = true;
_dropboxVideos[_dropboxVideos.Count - 1].Description = String.Empty;
_dropboxVideos[_dropboxVideos.Count - 1].MimeType = libConfig.MimeMappings[entry.MetaData.Extension].MimeType;
_dropboxVideos[_dropboxVideos.Count - 1].ChunkSize = libConfig.SizeOfChunk;
_dropboxVideos[_dropboxVideos.Count - 1].BlobStorageProvider = DropboxBlobStorageProviderName;
this.GenerateVideoThumbnails(_dropboxVideos[_dropboxVideos.Count - 1], new FileInfo(LibManager.GetItemTemporaryFilePath(_dropboxVideos[_dropboxVideos.Count - 1], string.Concat(_dropboxVideos[_dropboxVideos.Count - 1].Id, _dropboxVideos[_dropboxVideos.Count - 1].Extension))));
LibManager.RecompileItemUrls(_dropboxVideos[_dropboxVideos.Count - 1]);
}
}
NOTE: To sync properly the folders from Dropbox and libraries from Sitefinity you should make the root folder of the Dropbox application Default library in your Sitefinity content module and all the folders in the root folder will be your other libraries. The same is the logic with the videos. All videos in the root folder go to the Default library in Sitefinity. All other videos in the sub folders should be taken recursively and assigned to the corresponding library in Sitefinity backend. When you do this you should be aware that if you have for example:
\dropboxAppFolder\RootVideoFolder\Video1.wmv ;
\dropboxAppFolder\RootVideoFolder\SubVideoFolder\ Video1.wmv;
\dropboxAppFolder\RootVideoFolder\SubVideoFolder\ Video2.wmv
The synchronization will add in Sitefinity Video content module only first of Videos with name Video1.wmv and Video2.wmv and will assign them to RootVideoFolder library.
Override Delete(Video videoToDelete) method of OpenAccessLibrariesProvider class: public override void Delete(Video videoToDelete)
{
if (videoToDelete.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Master)
{
try
{
Client.Delete(videoToDelete.Urls.SingleOrDefault<MediaUrlData>(u => u.Url.Contains(_dropboxDefaultURL)).Url.Replace(_dropboxDefaultURL, String.Empty).Replace(" ", "??") + videoToDelete.Extension);
SetLatestCursor(videoToDelete);
}
catch (Exception ex) { }
}
var context = this.GetContext();
if (videoToDelete.Parent != null)
{
this.DeletePermissionsInheritanceAssociation(videoToDelete.Parent, videoToDelete);
}
this.providerDecorator.DeletePermissions(videoToDelete);
this.ClearLifecycle(videoToDelete, base.GetVideos());
if (context != null)
{
base.DeleteMediaContent(videoToDelete, context);
}
}
Override GeenrateVideoThumbnail method from LibrariesDataProvider class:
public override void GenerateVideoThumbnails(Video video, FileInfo videoFile)
{
if (!videoFile.Exists)
{
using (var videoWriterStream = videoFile.Create())
{
using (var stream = this.Download(video))
{
var buffer = new byte[video.ChunkSize];
int bytesRead = buffer.Length;
if (bytesRead > 0)
{
while (bytesRead == buffer.Length)
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
videoWriterStream.Write(buffer, 0, bytesRead);
}
}
}
}
}
var imageFilePath = String.Concat(videoFile.FullName, ".jpg");
try
{
var libConfig = ConfigMan.GetSection<LibrariesConfig>();
var img = video.CreateThumbnail(videoFile, imageFilePath);
GenerateThumbnails(video, img, libConfig.MimeMappings[".jpg"].MimeType);
}
catch (Exception ex)
{
//Log.Write(ex, "Video");
}
finally
{
if (File.Exists(videoFile.FullName))
videoFile.Delete();
if (File.Exists(imageFilePath))
File.Delete(imageFilePath);
}
}
GetDropboxVideos is method that sets the filters that describes which items are videos from whole Dropbox set of files and call the methods which fill the final collections for syncing:
private void GetDropboxVideos(DeltaPage delta)
{
var libConfig = ConfigMan.GetSection<LibrariesConfig>();
string videoExt = ".wmv";
if (!String.IsNullOrEmpty(libConfig.Videos.AllowedExensionsSettings))
{
videoExt = libConfig.Videos.AllowedExensionsSettings;
}
foreach (DeltaEntry entry in delta.Entries)
{
if (entry.MetaData == null)
{
FillItemsToDelete(entry, videoExt, true, "videos");
_deletedVideos = true;
}
else
{
FillContentLists(entry, videoExt, true);
}
}
_dropboxFolders.RemoveAll(f => !_folders.ToString().Contains(f.MetaData.Name));
}
GetDropboxVideosToDelete is method that manages the items for deleting – libraries or videos and call the proper delete methods:
private void GetDropboxVideosToDelete(DeltaEntry entry, string extensions)
{
Video video = null;
VideoLibrary videoLibrary;
string[] pathElements = entry.Path.Split('/');
{
if (pathElements.Count<string>() == 2)
{
if (pathElements[1].Contains('.') && extensions.Contains("." + pathElements[1].Split('.')[pathElements[1].Split('.').Count<string>() - 1]))
{
string fileName = pathElements[1].Split('.')[pathElements[1].Split('.').Count<string>() - 2];
video = base.GetVideos().SingleOrDefault<Video>(i => i.Parent.Title == _dropboxDefaultLibraryName && i.Title.ToString().ToLower() == fileName);
if (video != null)
{
Delete(video);
}
video = null;
}
else
{
string folderName = pathElements[1];
videoLibrary = base.GetVideoLibraries().SingleOrDefault<VideoLibrary>(v => v.Title.ToString().ToLower() == folderName);
if (videoLibrary != null)
{
base.Delete(videoLibrary);
}
videoLibrary = null;
}
}
else
{
if (pathElements[pathElements.Count<string>() - 1].Contains('.') && extensions.Contains("." + pathElements[pathElements.Count<string>() - 1].Split('.')[pathElements[pathElements.Count<string>() - 1].Split('.').Count<string>() - 1]))
{
string fileName = pathElements[pathElements.Count<string>() - 1].Split('.')[pathElements[pathElements.Count<string>() - 1].Split('.').Count<string>() - 2];
video = base.GetVideos().SingleOrDefault<Video>(i => i.Parent.Title.ToString().ToLower() == pathElements[1] && i.Title.ToString().ToLower() == fileName);
if (video != null)
{
Delete(video);
}
video = null;
}
}
}
}
CreateDropboxVideoLibrary is method that creates albums from Dropbox folders:
private void CreateDropboxVideoLibrary(DeltaEntry entry)
{
if (_dropboxVideosLibraries.SingleOrDefault<VideoLibrary>(d => d.Title == entry.MetaData.Path.Split('/')[1]) == null)
{
_dropboxVideosLibraries.Add(CreateVideoLibrary());
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].Title = entry.MetaData.Path.Split('/')[1];
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].UrlName = entry.MetaData.Path.Split('/')[1].Replace(' ', '-');
_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1].BlobStorageProvider = DropboxBlobStorageProviderName;
LibManager.RecompileItemUrls(_dropboxVideosLibraries[_dropboxVideosLibraries.Count - 1]);
}
}
ResetVideosData is method that resets the values of the fields and collections that are used for the synchronization process, after syncing is done:
private void ResetVideosData()
{
_deletedVideos = false;
_dropboxFiles = new List<DeltaEntry>() { };
_dropboxFolders = new List<DeltaEntry>() { };
_dropboxVideosLibraries = new List<VideoLibrary>() { };
_dropboxVideos = new List<Video>() { };
_folders = new StringBuilder();
}