fix google drive folder paths

This commit is contained in:
Luke Pulverenti 2015-03-29 18:36:23 -04:00
parent 387cb1806d
commit b2ba697dd0
16 changed files with 93 additions and 47 deletions

View File

@ -34,7 +34,7 @@
html += '<p>Click to configure how GameBrowser deals with online image & data sources</p>'; html += '<p>Click to configure how GameBrowser deals with online image & data sources</p>';
html += '<a data-role="button" data-icon="arrow-r" data-iconpos="right" href="' + metaHref + '">Metadata & Art Configuration</a>'; html += '<a data-role="button" data-icon="arrow-r" data-iconpos="right" href="' + metaHref + '">Metadata & Art Configuration</a>';
html += '<h2>GameBrowser help</h2>'; html += '<h2>GameBrowser help</h2>';
html += '<a data-role="button" data-icon="arrow-r" data-iconpos="right" href="http://mediabrowser3.com/community/index.php?/topic/855-gamebrowser-iii-support/" target="_blank">Gamebrowser on the Media Browser forum</a>'; html += '<a data-role="button" data-icon="arrow-r" data-iconpos="right" href="http://mediabrowser3.com/community/index.php?/topic/855-gamebrowser-iii-support/" target="_blank">Gamebrowser on the Emby forum</a>';
$('#configPageContent', page).html(html).trigger('create'); $('#configPageContent', page).html(html).trigger('create');
}); });

View File

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Adult DVD Empire Provider")] [assembly: AssemblyProduct("Adult DVD Empire Provider")]
[assembly: AssemblyCopyright("Copyright © Media Browser 2013")] [assembly: AssemblyCopyright("Copyright © Emby 2013")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]

View File

@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTitle("MediaBrowser.Plugins.ArgusTV")] [assembly: AssemblyTitle("MediaBrowser.Plugins.ArgusTV")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Media Browser Team")] [assembly: AssemblyCompany("Emby Team")]
[assembly: AssemblyProduct("MediaBrowser.Plugins.ArgusTV")] [assembly: AssemblyProduct("MediaBrowser.Plugins.ArgusTV")]
[assembly: AssemblyCopyright("Copyright © Media Browser Team 2013")] [assembly: AssemblyCopyright("Copyright © Emby Team 2013")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]

View File

@ -21,7 +21,7 @@ namespace MediaBrowser.Plugins.GoogleDrive
get get
{ {
var version = _applicationHost.ApplicationVersion.ToString(); var version = _applicationHost.ApplicationVersion.ToString();
return string.Format("Media Browser/{0} +http://mediabrowser.tv/", version); return string.Format("Emby/{0} +http://emby.media/", version);
} }
} }

View File

@ -50,6 +50,8 @@
<div><b>6.</b> Click "Create Client Id".</div> <div><b>6.</b> Click "Create Client Id".</div>
<div><b>7.</b> You'll be returned to the main screen, where your Client Id and Client Secret will be displayed. Copy these values.</div> <div><b>7.</b> You'll be returned to the main screen, where your Client Id and Client Secret will be displayed. Copy these values.</div>
<div><b>8.</b> In the left sidebar, click "APIs" under "APIs & Auth". In the API list, click Drive API and enable it.</div> <div><b>8.</b> In the left sidebar, click "APIs" under "APIs & Auth". In the API list, click Drive API and enable it.</div>
<div><b>9.</b> Enter the Client Id and Client Secret values here and click Save.</div>
<div><b>10.</b> Add one or more google drive accounts using the form below.</div>
<br /> <br />
</div> </div>

View File

@ -1,4 +1,5 @@
using MediaBrowser.Controller.Sync; using MediaBrowser.Controller.Sync;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.MediaInfo;
using MediaBrowser.Model.Sync; using MediaBrowser.Model.Sync;
using MediaBrowser.Plugins.GoogleDrive.Configuration; using MediaBrowser.Plugins.GoogleDrive.Configuration;
@ -15,11 +16,13 @@ namespace MediaBrowser.Plugins.GoogleDrive
{ {
private readonly IConfigurationRetriever _configurationRetriever; private readonly IConfigurationRetriever _configurationRetriever;
private readonly IGoogleDriveService _googleDriveService; private readonly IGoogleDriveService _googleDriveService;
private readonly ILogger _logger;
public GoogleDriveServerSyncProvider(IConfigurationRetriever configurationRetriever, IGoogleDriveService googleDriveService) public GoogleDriveServerSyncProvider(IConfigurationRetriever configurationRetriever, IGoogleDriveService googleDriveService, ILogManager logManager)
{ {
_configurationRetriever = configurationRetriever; _configurationRetriever = configurationRetriever;
_googleDriveService = googleDriveService; _googleDriveService = googleDriveService;
_logger = logManager.GetLogger("GoogleDrive");
} }
public string Name public string Name
@ -39,6 +42,8 @@ namespace MediaBrowser.Plugins.GoogleDrive
public async Task<SyncedFileInfo> SendFile(Stream stream, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken) public async Task<SyncedFileInfo> SendFile(Stream stream, string remotePath, SyncTarget target, IProgress<double> progress, CancellationToken cancellationToken)
{ {
_logger.Debug("Sending file {0} to {1}", remotePath, target.Name);
var file = CreateGoogleDriveFile(remotePath, target); var file = CreateGoogleDriveFile(remotePath, target);
var googleCredentials = GetGoogleCredentials(target); var googleCredentials = GetGoogleCredentials(target);
@ -53,6 +58,8 @@ namespace MediaBrowser.Plugins.GoogleDrive
public async Task<SyncedFileInfo> GetSyncedFileInfo(string remotePath, SyncTarget target, CancellationToken cancellationToken) public async Task<SyncedFileInfo> GetSyncedFileInfo(string remotePath, SyncTarget target, CancellationToken cancellationToken)
{ {
_logger.Debug("Getting synced file info for {0} from {1}", remotePath, target.Name);
var file = CreateGoogleDriveFile(remotePath, target); var file = CreateGoogleDriveFile(remotePath, target);
var googleCredentials = GetGoogleCredentials(target); var googleCredentials = GetGoogleCredentials(target);
@ -125,24 +132,5 @@ namespace MediaBrowser.Plugins.GoogleDrive
GoogleDriveFolderId = syncAccount.FolderId GoogleDriveFolderId = syncAccount.FolderId
}; };
} }
private DeviceFileInfo CreateDeviceFileInfo(GoogleDriveFile file)
{
return new DeviceFileInfo
{
Name = file.Name,
Path = GetGoogleDriveFilePath(file)
};
}
private static string GetGoogleDriveFilePath(GoogleDriveFile file)
{
if (!string.IsNullOrEmpty(file.FolderPath))
{
return Path.Combine(file.FolderPath, file.Name);
}
return file.Name;
}
} }
} }

View File

@ -20,11 +20,38 @@ namespace MediaBrowser.Plugins.GoogleDrive
private const string SyncFolderPropertyValue = "ba460da6-2cdf-43d8-98fc-ecda617ff1db"; private const string SyncFolderPropertyValue = "ba460da6-2cdf-43d8-98fc-ecda617ff1db";
private const string PathPropertyKey = "Path"; private const string PathPropertyKey = "Path";
private async Task<string> GetOrCreateParent(GoogleCredentials googleCredentials, string path, string rootParentId, CancellationToken cancellationToken)
{
var parts = path.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries).ToList();
string currentPath = null;
string currentparentId = rootParentId;
foreach (var part in parts)
{
if (currentPath == null)
{
currentPath = part;
}
else
{
currentPath = Path.Combine(currentPath, part);
}
currentparentId = await GetOrCreateFolder(part, currentparentId, googleCredentials, cancellationToken);
}
return currentparentId;
}
public async Task<string> UploadFile(Stream stream, GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, IProgress<double> progress, CancellationToken cancellationToken) public async Task<string> UploadFile(Stream stream, GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, IProgress<double> progress, CancellationToken cancellationToken)
{ {
var fullDriveService = CreateDriveServiceAndCredentials(googleCredentials); var fullDriveService = CreateDriveServiceAndCredentials(googleCredentials);
var driveService = fullDriveService.Item1; var driveService = fullDriveService.Item1;
var parentId = await GetOrCreateParent(googleCredentials, googleDriveFile.FolderPath, googleDriveFile.GoogleDriveFolderId, cancellationToken);
googleDriveFile.GoogleDriveFolderId = parentId;
await TryDeleteFile(googleDriveFile, googleCredentials, cancellationToken); await TryDeleteFile(googleDriveFile, googleCredentials, cancellationToken);
var file = CreateFileToUpload(googleDriveFile); var file = CreateFileToUpload(googleDriveFile);
@ -43,18 +70,18 @@ namespace MediaBrowser.Plugins.GoogleDrive
return uploadedFile.DownloadUrl + "&access_token=" + fullDriveService.Item2.Token.AccessToken; return uploadedFile.DownloadUrl + "&access_token=" + fullDriveService.Item2.Token.AccessToken;
} }
public async Task<string> GetOrCreateFolder(string name, GoogleCredentials googleCredentials, CancellationToken cancellationToken) public async Task<string> GetOrCreateFolder(string name, string parentId, GoogleCredentials googleCredentials, CancellationToken cancellationToken)
{ {
var driveService = CreateDriveService(googleCredentials); var driveService = CreateDriveService(googleCredentials);
var folder = await FindFolder(name, driveService, cancellationToken); var folder = await FindFolder(name, parentId, driveService, cancellationToken);
if (folder != null) if (folder != null)
{ {
return folder.Id; return folder.Id;
} }
return await CreateFolder(name, cancellationToken, driveService); return await CreateFolder(name, parentId, cancellationToken, driveService);
} }
public async Task DeleteFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken) public async Task DeleteFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken)
@ -88,9 +115,20 @@ namespace MediaBrowser.Plugins.GoogleDrive
.Select(CreateGoogleDriveFile); .Select(CreateGoogleDriveFile);
} }
public async Task<File> FindFileId(GoogleDriveFile googleDriveFile, DriveService driveService, CancellationToken cancellationToken) public Task<File> FindFileId(GoogleDriveFile googleDriveFile, DriveService driveService, CancellationToken cancellationToken)
{ {
var query = string.Format("'{0}' in parents and title = '{1}'", googleDriveFile.GoogleDriveFolderId, googleDriveFile.Name); return FindFileId(googleDriveFile, false, driveService, cancellationToken);
}
public async Task<File> FindFileId(GoogleDriveFile googleDriveFile, bool isFolder, DriveService driveService, CancellationToken cancellationToken)
{
var query = string.Format("title = '{0}'", googleDriveFile.Name);
if (isFolder)
{
query += " and mimeType = 'application/vnd.google-apps.folder'";
}
var matchingFiles = await GetFiles(query, driveService, cancellationToken); var matchingFiles = await GetFiles(query, driveService, cancellationToken);
var file = matchingFiles.FirstOrDefault(f => FileIsInPath(f, googleDriveFile.FolderPath)); var file = matchingFiles.FirstOrDefault(f => FileIsInPath(f, googleDriveFile.FolderPath));
@ -161,7 +199,7 @@ namespace MediaBrowser.Plugins.GoogleDrive
var initializer = new BaseClientService.Initializer var initializer = new BaseClientService.Initializer
{ {
ApplicationName = "Media Browser", ApplicationName = "Emby",
HttpClientInitializer = credentials HttpClientInitializer = credentials
}; };
@ -189,7 +227,7 @@ namespace MediaBrowser.Plugins.GoogleDrive
var initializer = new BaseClientService.Initializer var initializer = new BaseClientService.Initializer
{ {
ApplicationName = "Media Browser", ApplicationName = "Emby",
HttpClientInitializer = credentials HttpClientInitializer = credentials
}; };
@ -244,17 +282,22 @@ namespace MediaBrowser.Plugins.GoogleDrive
return pathProperty.Value; return pathProperty.Value;
} }
private async Task<File> FindFolder(string name, DriveService driveService, CancellationToken cancellationToken) private async Task<File> FindFolder(string name, string parentId, DriveService driveService, CancellationToken cancellationToken)
{ {
var query = string.Format(@"title = '{0}' and properties has {{ key='{1}' and value='{2}' and visibility='PRIVATE' }}", name, SyncFolderPropertyKey, SyncFolderPropertyValue); var query = string.Format(@"title = '{0}' and properties has {{ key='{1}' and value='{2}' and visibility='PRIVATE' }}", name, SyncFolderPropertyKey, SyncFolderPropertyValue);
if (!string.IsNullOrWhiteSpace(parentId))
{
query += string.Format(" and '{0}' in parents", parentId);
}
var matchingFolders = await GetFiles(query, driveService, cancellationToken); var matchingFolders = await GetFiles(query, driveService, cancellationToken);
return matchingFolders.FirstOrDefault(); return matchingFolders.FirstOrDefault();
} }
private static async Task<string> CreateFolder(string name, CancellationToken cancellationToken, DriveService driveService) private static async Task<string> CreateFolder(string name, string parentId, CancellationToken cancellationToken, DriveService driveService)
{ {
var file = CreateFolderToUpload(name); var file = CreateFolderToUpload(name, parentId);
var request = driveService.Files.Insert(file); var request = driveService.Files.Insert(file);
var newFolder = await request.ExecuteAsync(cancellationToken); var newFolder = await request.ExecuteAsync(cancellationToken);
@ -262,7 +305,7 @@ namespace MediaBrowser.Plugins.GoogleDrive
return newFolder.Id; return newFolder.Id;
} }
private static File CreateFolderToUpload(string name) private static File CreateFolderToUpload(string name, string parentId)
{ {
var property = new Property var property = new Property
{ {
@ -271,12 +314,25 @@ namespace MediaBrowser.Plugins.GoogleDrive
Visibility = "PRIVATE" Visibility = "PRIVATE"
}; };
return new File File file = new File
{ {
Title = name, Title = name,
MimeType = "application/vnd.google-apps.folder", MimeType = "application/vnd.google-apps.folder",
Properties = new List<Property> { property } Properties = new List<Property> { property }
}; };
if (!string.IsNullOrWhiteSpace(parentId))
{
file.Parents = new List<ParentReference>
{
new ParentReference
{
Id = parentId
}
};
}
return file;
} }
} }
} }

View File

@ -9,7 +9,7 @@ namespace MediaBrowser.Plugins.GoogleDrive
public interface IGoogleDriveService public interface IGoogleDriveService
{ {
Task<string> UploadFile(Stream stream, GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, IProgress<double> progress, CancellationToken cancellationToken); Task<string> UploadFile(Stream stream, GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, IProgress<double> progress, CancellationToken cancellationToken);
Task<string> GetOrCreateFolder(string name, GoogleCredentials googleCredentials, CancellationToken cancellationToken); Task<string> GetOrCreateFolder(string name, string parentId, GoogleCredentials googleCredentials, CancellationToken cancellationToken);
Task DeleteFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken); Task DeleteFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken);
Task<Stream> GetFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken); Task<Stream> GetFile(GoogleDriveFile googleDriveFile, GoogleCredentials googleCredentials, CancellationToken cancellationToken);
Task<IEnumerable<GoogleDriveFile>> GetFilesListing(string googleDrivefolder, string parentFolderId, GoogleCredentials googleCredentials, CancellationToken cancellationToken); Task<IEnumerable<GoogleDriveFile>> GetFilesListing(string googleDrivefolder, string parentFolderId, GoogleCredentials googleCredentials, CancellationToken cancellationToken);

View File

@ -82,7 +82,7 @@ namespace MediaBrowser.Plugins.GoogleDrive.RestServices
RefreshToken = refreshToken RefreshToken = refreshToken
}; };
return await _googleDriveService.GetOrCreateFolder(Constants.GoogleDriveFolderName, googleCredentials, CancellationToken.None); return await _googleDriveService.GetOrCreateFolder(Constants.GoogleDriveFolderName, null, googleCredentials, CancellationToken.None);
} }
} }
} }

View File

@ -46,7 +46,7 @@ namespace MediaBrowser.Plugins.NotifyMyAndroidNotifications.Api
{"apikey", options.Token}, {"apikey", options.Token},
{"event", "Test Notification"}, {"event", "Test Notification"},
{"description", "This is a test notification from MediaBrowser"}, {"description", "This is a test notification from MediaBrowser"},
{"application", "Media Browser"} {"application", "Emby"}
}; };
_logger.Debug("NotifyMyAndroid <TEST> to {0}", options.Token); _logger.Debug("NotifyMyAndroid <TEST> to {0}", options.Token);

View File

@ -47,7 +47,7 @@ namespace MediaBrowser.Plugins.NotifyMyAndroidNotifications
var parameters = new Dictionary<string, string> var parameters = new Dictionary<string, string>
{ {
{"apikey", options.Token}, {"apikey", options.Token},
{"application", "Media Browser"} {"application", "Emby"}
}; };
if (string.IsNullOrEmpty(request.Description)) if (string.IsNullOrEmpty(request.Description))

View File

@ -43,7 +43,7 @@ namespace MediaBrowser.Plugins.ProwlNotifications.Api
{"apikey", options.Token}, {"apikey", options.Token},
{"event", "Test Notification"}, {"event", "Test Notification"},
{"description", "This is a test notification from MediaBrowser"}, {"description", "This is a test notification from MediaBrowser"},
{"application", "Media Browser"} {"application", "Emby"}
}; };
_logger.Debug("Prowl <TEST> to {0}", options.Token); _logger.Debug("Prowl <TEST> to {0}", options.Token);

View File

@ -47,7 +47,7 @@ namespace MediaBrowser.Plugins.ProwlNotifications
var parameters = new Dictionary<string, string> var parameters = new Dictionary<string, string>
{ {
{"apikey", options.Token}, {"apikey", options.Token},
{"application", "Media Browser"} {"application", "Emby"}
}; };
if (string.IsNullOrEmpty(request.Description)) if (string.IsNullOrEmpty(request.Description))

View File

@ -37,7 +37,7 @@ namespace MediaBrowser.Plugins.SmtpNotifications.Api
var mail = new MailMessage(options.EmailFrom, options.EmailTo) var mail = new MailMessage(options.EmailFrom, options.EmailTo)
{ {
Subject = "Media Browser: Test Notification", Subject = "Emby: Test Notification",
Body = "This is a test notification from MediaBrowser" Body = "This is a test notification from MediaBrowser"
}; };

View File

@ -63,7 +63,7 @@ namespace MediaBrowser.Plugins.SmtpNotifications
var mail = new MailMessage(options.EmailFrom, options.EmailTo) var mail = new MailMessage(options.EmailFrom, options.EmailTo)
{ {
Subject = "Media Browser: " + request.Name, Subject = "Emby: " + request.Name,
Body = request.Description Body = request.Description
}; };

View File

@ -7,9 +7,9 @@ using System.Runtime.InteropServices;
[assembly: AssemblyTitle("MediaBrowser.Plugins.StudioCleaner")] [assembly: AssemblyTitle("MediaBrowser.Plugins.StudioCleaner")]
[assembly: AssemblyDescription("")] [assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Media Browser Team")] [assembly: AssemblyCompany("Emby Team")]
[assembly: AssemblyProduct("MediaBrowser.Plugins.StudioCleaner")] [assembly: AssemblyProduct("MediaBrowser.Plugins.StudioCleaner")]
[assembly: AssemblyCopyright("Copyright © Media Browser Team 2013")] [assembly: AssemblyCopyright("Copyright © Emby Team 2013")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]