jellyfin/Emby.Server.Implementations/Devices/DeviceId.cs

98 lines
2.4 KiB
C#
Raw Normal View History

2019-11-01 17:38:54 +00:00
#pragma warning disable CS1591
using System;
using System.Globalization;
2016-10-29 05:40:15 +00:00
using System.IO;
using System.Text;
using MediaBrowser.Common.Configuration;
using Microsoft.Extensions.Logging;
2016-10-29 05:40:15 +00:00
namespace Emby.Server.Implementations.Devices
2016-10-29 05:40:15 +00:00
{
public class DeviceId
{
private readonly IApplicationPaths _appPaths;
2020-06-06 00:15:56 +00:00
private readonly ILogger<DeviceId> _logger;
2016-10-29 05:40:15 +00:00
private readonly object _syncLock = new object();
2024-03-13 13:56:51 +00:00
private string? _id;
2021-10-02 18:06:00 +00:00
2024-03-13 13:56:51 +00:00
public DeviceId(IApplicationPaths appPaths, ILogger<DeviceId> logger)
2021-10-02 18:06:00 +00:00
{
_appPaths = appPaths;
2024-03-13 13:56:51 +00:00
_logger = logger;
2021-10-02 18:06:00 +00:00
}
2024-03-13 13:56:51 +00:00
public string Value => _id ??= GetDeviceId();
2021-10-02 18:06:00 +00:00
private string CachePath => Path.Combine(_appPaths.DataPath, "device.txt");
2016-10-29 05:40:15 +00:00
2024-03-13 13:56:51 +00:00
private string? GetCachedId()
2016-10-29 05:40:15 +00:00
{
try
{
lock (_syncLock)
{
2019-01-07 23:24:34 +00:00
var value = File.ReadAllText(CachePath, Encoding.UTF8);
2016-10-29 05:40:15 +00:00
2021-12-15 17:25:36 +00:00
if (Guid.TryParse(value, out _))
2016-10-29 05:40:15 +00:00
{
return value;
}
_logger.LogError("Invalid value found in device id file");
2016-10-29 05:40:15 +00:00
}
}
catch (DirectoryNotFoundException)
{
}
catch (FileNotFoundException)
{
}
catch (Exception ex)
{
2018-12-20 12:11:26 +00:00
_logger.LogError(ex, "Error reading file");
2016-10-29 05:40:15 +00:00
}
return null;
}
private void SaveId(string id)
{
try
{
var path = CachePath;
2024-03-13 13:56:51 +00:00
Directory.CreateDirectory(Path.GetDirectoryName(path) ?? throw new InvalidOperationException("Path can't be a root directory."));
2016-10-29 05:40:15 +00:00
lock (_syncLock)
{
File.WriteAllText(path, id, Encoding.UTF8);
2016-10-29 05:40:15 +00:00
}
}
catch (Exception ex)
{
2018-12-20 12:11:26 +00:00
_logger.LogError(ex, "Error writing to file");
2016-10-29 05:40:15 +00:00
}
}
private static string GetNewId()
2016-10-29 05:40:15 +00:00
{
return Guid.NewGuid().ToString("N", CultureInfo.InvariantCulture);
2016-10-29 05:40:15 +00:00
}
private string GetDeviceId()
{
var id = GetCachedId();
if (string.IsNullOrWhiteSpace(id))
{
id = GetNewId();
SaveId(id);
}
return id;
}
}
}