aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Server.Implementations
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Server.Implementations')
-rw-r--r--MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json7
-rw-r--r--MediaBrowser.Server.Implementations/Localization/Server/server.json3
-rw-r--r--MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj2
-rw-r--r--MediaBrowser.Server.Implementations/Social/SharingManager.cs88
-rw-r--r--MediaBrowser.Server.Implementations/Social/SharingRepository.cs184
5 files changed, 282 insertions, 2 deletions
diff --git a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
index 8bc244891..254e3c2f3 100644
--- a/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
+++ b/MediaBrowser.Server.Implementations/Localization/JavaScript/javascript.json
@@ -38,7 +38,7 @@
"HeaderSupportTheTeam": "Support the Emby Team",
"TextEnjoyBonusFeatures": "Enjoy Bonus Features",
"TitleLiveTV": "Live TV",
- "ButtonCancelSyncJob": "Cancel sync job",
+ "ButtonCancelSyncJob": "Cancel sync job",
"TitleSync": "Sync",
"HeaderSelectDate": "Select Date",
"ButtonDonate": "Donate",
@@ -811,5 +811,8 @@
"ErrorMessagePasswordNotMatchConfirm": "The password and password confirmation must match.",
"ErrorMessageUsernameInUse": "The username is already in use. Please choose a new name and try again.",
"ErrorMessageEmailInUse": "The email address is already in use. Please enter a new email address and try again, or use the forgot password feature.",
- "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in."
+ "MessageThankYouForConnectSignUp": "Thank you for signing up for Emby Connect. An email will be sent to your address with instructions on how to confirm your new account. Please confirm the account and then return here to sign in.",
+ "HeaderShare": "Share",
+ "ButtonShareHelp": "Only a web page containing media information will be shared. Media files are never shared publicly."
+
}
diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json
index d8628575a..bec5755b9 100644
--- a/MediaBrowser.Server.Implementations/Localization/Server/server.json
+++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json
@@ -313,6 +313,9 @@
"OptionAllowRemoteControlOthers": "Allow remote control of other users",
"OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
"OptionAllowRemoteSharedDevicesHelp": "Dlna devices are considered shared until a user begins controlling it.",
+ "OptionAllowLinkSharing": "Allow social media sharing",
+ "OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire based on your server sharing settings.",
+ "HeaderSharing": "Sharing",
"HeaderRemoteControl": "Remote Control",
"OptionMissingTmdbId": "Missing Tmdb Id",
"OptionIsHD": "HD",
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index b461fb78b..33b2493f5 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -227,6 +227,8 @@
<Compile Include="Logging\PatternsLogger.cs" />
<Compile Include="MediaEncoder\EncodingManager.cs" />
<Compile Include="Persistence\BaseSqliteRepository.cs" />
+ <Compile Include="Social\SharingManager.cs" />
+ <Compile Include="Social\SharingRepository.cs" />
<Compile Include="Sorting\StartDateComparer.cs" />
<Compile Include="Sync\SyncHelper.cs" />
<Compile Include="Sync\SyncJobOptions.cs" />
diff --git a/MediaBrowser.Server.Implementations/Social/SharingManager.cs b/MediaBrowser.Server.Implementations/Social/SharingManager.cs
new file mode 100644
index 000000000..1c3f35389
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Social/SharingManager.cs
@@ -0,0 +1,88 @@
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Configuration;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Library;
+using MediaBrowser.Controller.Social;
+using MediaBrowser.Model.Social;
+using System;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.Social
+{
+ public class SharingManager : ISharingManager
+ {
+ private readonly SharingRepository _repository;
+ private readonly IServerConfigurationManager _config;
+ private readonly ILibraryManager _libraryManager;
+ private readonly IServerApplicationHost _appHost;
+
+ public SharingManager(SharingRepository repository, IServerConfigurationManager config, ILibraryManager libraryManager, IServerApplicationHost appHost)
+ {
+ _repository = repository;
+ _config = config;
+ _libraryManager = libraryManager;
+ _appHost = appHost;
+ }
+
+ public async Task<SocialShareInfo> CreateShare(string itemId, string userId)
+ {
+ if (string.IsNullOrWhiteSpace(itemId))
+ {
+ throw new ArgumentNullException("itemId");
+ }
+ if (string.IsNullOrWhiteSpace(userId))
+ {
+ throw new ArgumentNullException("userId");
+ }
+
+ var item = _libraryManager.GetItemById(itemId);
+
+ if (item == null)
+ {
+ throw new ResourceNotFoundException();
+ }
+
+ var externalUrl = _appHost.GetSystemInfo().WanAddress;
+
+ if (string.IsNullOrWhiteSpace(externalUrl))
+ {
+ throw new InvalidOperationException("No external server address is currently available.");
+ }
+
+ var info = new SocialShareInfo
+ {
+ Id = Guid.NewGuid().ToString("N"),
+ ExpirationDate = DateTime.UtcNow.AddDays(_config.Configuration.SharingExpirationDays),
+ ItemId = itemId,
+ UserId = userId,
+ Overview = item.Overview,
+ Name = GetTitle(item)
+ };
+
+ info.ImageUrl = externalUrl + "/Social/Shares/Public/" + info.Id + "/Image";
+ info.ImageUrl = externalUrl + "/web/shared.html?id=" + info.Id;
+
+ await _repository.CreateShare(info).ConfigureAwait(false);
+
+ return GetShareInfo(info.Id);
+ }
+
+ private string GetTitle(BaseItem item)
+ {
+ return item.Name;
+ }
+
+ public SocialShareInfo GetShareInfo(string id)
+ {
+ var info = _repository.GetShareInfo(id);
+
+ return info;
+ }
+
+ public Task DeleteShare(string id)
+ {
+ return _repository.DeleteShare(id);
+ }
+ }
+}
diff --git a/MediaBrowser.Server.Implementations/Social/SharingRepository.cs b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs
new file mode 100644
index 000000000..d6d7f021a
--- /dev/null
+++ b/MediaBrowser.Server.Implementations/Social/SharingRepository.cs
@@ -0,0 +1,184 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.Social;
+using MediaBrowser.Server.Implementations.Persistence;
+using System;
+using System.Data;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Server.Implementations.Social
+{
+ public class SharingRepository : BaseSqliteRepository
+ {
+ private IDbConnection _connection;
+ private IDbCommand _saveShareCommand;
+ private readonly IApplicationPaths _appPaths;
+
+ public SharingRepository(ILogManager logManager, IApplicationPaths appPaths)
+ : base(logManager)
+ {
+ _appPaths = appPaths;
+ }
+
+ /// <summary>
+ /// Opens the connection to the database
+ /// </summary>
+ /// <returns>Task.</returns>
+ public async Task Initialize()
+ {
+ var dbFile = Path.Combine(_appPaths.DataPath, "shares.db");
+
+ _connection = await SqliteExtensions.ConnectToDb(dbFile, Logger).ConfigureAwait(false);
+
+ string[] queries = {
+
+ "create table if not exists Shares (Id GUID, ItemId TEXT, UserId TEXT, ExpirationDate DateTime, PRIMARY KEY (Id))",
+ "create index if not exists idx_Shares on Shares(Id)",
+
+ //pragmas
+ "pragma temp_store = memory",
+
+ "pragma shrink_memory"
+ };
+
+ _connection.RunQueries(queries, Logger);
+
+ PrepareStatements();
+ }
+
+ /// <summary>
+ /// Prepares the statements.
+ /// </summary>
+ private void PrepareStatements()
+ {
+ _saveShareCommand = _connection.CreateCommand();
+ _saveShareCommand.CommandText = "replace into Shares (Id, ItemId, UserId, ExpirationDate) values (@Id, @ItemId, @UserId, @ExpirationDate)";
+
+ _saveShareCommand.Parameters.Add(_saveShareCommand, "@Id");
+ _saveShareCommand.Parameters.Add(_saveShareCommand, "@ItemId");
+ _saveShareCommand.Parameters.Add(_saveShareCommand, "@UserId");
+ _saveShareCommand.Parameters.Add(_saveShareCommand, "@ExpirationDate");
+ }
+
+ public async Task CreateShare(SocialShareInfo info)
+ {
+ if (info == null)
+ {
+ throw new ArgumentNullException("info");
+ }
+ if (string.IsNullOrWhiteSpace(info.Id))
+ {
+ throw new ArgumentNullException("info.Id");
+ }
+
+ var cancellationToken = CancellationToken.None;
+
+ cancellationToken.ThrowIfCancellationRequested();
+
+ await WriteLock.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ IDbTransaction transaction = null;
+
+ try
+ {
+ transaction = _connection.BeginTransaction();
+
+ _saveShareCommand.GetParameter(0).Value = new Guid(info.Id);
+ _saveShareCommand.GetParameter(1).Value = info.ItemId;
+ _saveShareCommand.GetParameter(2).Value = info.UserId;
+ _saveShareCommand.GetParameter(3).Value = info.ExpirationDate;
+
+ _saveShareCommand.Transaction = transaction;
+
+ _saveShareCommand.ExecuteNonQuery();
+
+ transaction.Commit();
+ }
+ catch (OperationCanceledException)
+ {
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ catch (Exception e)
+ {
+ Logger.ErrorException("Failed to save share:", e);
+
+ if (transaction != null)
+ {
+ transaction.Rollback();
+ }
+
+ throw;
+ }
+ finally
+ {
+ if (transaction != null)
+ {
+ transaction.Dispose();
+ }
+
+ WriteLock.Release();
+ }
+ }
+
+ public SocialShareInfo GetShareInfo(string id)
+ {
+ if (string.IsNullOrWhiteSpace(id))
+ {
+ throw new ArgumentNullException("id");
+ }
+
+ var cmd = _connection.CreateCommand();
+ cmd.CommandText = "select Id, ItemId, UserId, ExpirationDate from Shares where id = @id";
+
+ cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = new Guid(id);
+
+ using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.SingleResult | CommandBehavior.SingleRow))
+ {
+ if (reader.Read())
+ {
+ return GetSocialShareInfo(reader);
+ }
+ }
+
+ return null;
+ }
+
+ private SocialShareInfo GetSocialShareInfo(IDataReader reader)
+ {
+ var info = new SocialShareInfo();
+
+ info.Id = reader.GetGuid(0).ToString("N");
+ info.ItemId = reader.GetString(1);
+ info.UserId = reader.GetString(2);
+ info.ExpirationDate = reader.GetDateTime(3).ToUniversalTime();
+
+ return info;
+ }
+
+ public async Task DeleteShare(string id)
+ {
+
+ }
+
+ protected override void CloseConnection()
+ {
+ if (_connection != null)
+ {
+ if (_connection.IsOpen())
+ {
+ _connection.Close();
+ }
+
+ _connection.Dispose();
+ _connection = null;
+ }
+ }
+ }
+}