private CheckForUpdateResult CheckForUpdateResult(RootObject[] obj, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename) { if (updateLevel == PackageVersionClass.Release) { // Technically all we need to do is check that it's not pre-release // But let's addititional checks for -beta and -dev to handle builds that might be temporarily tagged incorrectly. obj = obj.Where(i => !i.prerelease && !i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) && !i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Beta) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Dev) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } var availableUpdate = obj .Select(i => CheckForUpdateResult(i, minVersion, assetFilename, packageName, targetFilename)) .Where(i => i != null) .OrderByDescending(i => Version.Parse(i.AvailableVersion)) .FirstOrDefault(); return availableUpdate ?? new CheckForUpdateResult { IsUpdateAvailable = false }; }
public async Task<CheckForUpdateResult> CheckForUpdateResult(string organzation, string repository, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename, CancellationToken cancellationToken) { var url = string.Format("https://api.github.com/repos/{0}/{1}/releases", organzation, repository); var options = new HttpRequestOptions { Url = url, EnableKeepAlive = false, CancellationToken = cancellationToken, UserAgent = "Emby/3.0" }; if (_cacheLength.Ticks > 0) { options.CacheMode = CacheMode.Unconditional; options.CacheLength = _cacheLength; } using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) { var obj = _jsonSerializer.DeserializeFromStream<RootObject[]>(stream); return CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename); } }
private CheckForUpdateResult CheckForUpdateResult(RootObject[] obj, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename) { if (updateLevel == PackageVersionClass.Release) { obj = obj.Where(i => !i.prerelease).ToArray(); } else if (updateLevel == PackageVersionClass.Beta) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Dev) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } var availableUpdate = obj .Select(i => CheckForUpdateResult(i, minVersion, assetFilename, packageName, targetFilename)) .Where(i => i != null) .OrderByDescending(i => Version.Parse(i.AvailableVersion)) .FirstOrDefault(); return availableUpdate ?? new CheckForUpdateResult { IsUpdateAvailable = false }; }
private async Task CheckVersion(Version currentVersion, PackageVersionClass updateLevel, CancellationToken cancellationToken) { var releases = await new GithubUpdater(_httpClient, _jsonSerializer, TimeSpan.FromMinutes(5)) .GetLatestReleases("MediaBrowser", "Emby", _releaseAssetFilename, cancellationToken).ConfigureAwait(false); var newUpdateLevel = updateLevel; // If the current version is later than current stable, set the update level to beta if (releases.Count >= 1) { var release = releases[0]; var version = ParseVersion(release.tag_name); if (version != null && currentVersion > version) { newUpdateLevel = PackageVersionClass.Beta; } } // If the current version is later than current beta, set the update level to dev if (releases.Count >= 2) { var release = releases[1]; var version = ParseVersion(release.tag_name); if (version != null && currentVersion > version) { newUpdateLevel = PackageVersionClass.Dev; } } if (newUpdateLevel != updateLevel) { _config.Configuration.SystemUpdateLevel = newUpdateLevel; _config.SaveConfiguration(); } }
public async Task<CheckForUpdateResult> CheckForApplicationUpdate(Version currentVersion, PackageVersionClass updateLevel, IInstallationManager installationManager, CancellationToken cancellationToken, IProgress<double> progress) { var result = new CheckForUpdateResult { AvailableVersion = currentVersion.ToString(), IsUpdateAvailable = false }; return Task.FromResult(result); }
private async Task CheckVersion(Version currentVersion, PackageVersionClass currentUpdateLevel, CancellationToken cancellationToken) { var releases = await new GithubUpdater(_httpClient, _jsonSerializer) .GetLatestReleases("MediaBrowser", "Emby", _releaseAssetFilename, cancellationToken).ConfigureAwait(false); var newUpdateLevel = GetNewUpdateLevel(currentVersion, currentUpdateLevel, releases); if (newUpdateLevel != currentUpdateLevel) { _config.Configuration.SystemUpdateLevel = newUpdateLevel; _config.SaveConfiguration(); } }
private bool MatchesUpdateLevel(RootObject i, PackageVersionClass updateLevel) { if (updateLevel == PackageVersionClass.Beta) { return !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase); } if (updateLevel == PackageVersionClass.Dev) { return !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase); } // Technically all we need to do is check that it's not pre-release // But let's addititional checks for -beta and -dev to handle builds that might be temporarily tagged incorrectly. return !i.prerelease && !i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) && !i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase); }
/// <summary> /// Initialize our internal variables from an installation request /// </summary> /// <param name="request"></param> protected void Init(InstallationRequest request) { Operation = request.Operation; Archive = request.Archive; PackageClass = request.PackageClass; RequestedVersion = request.Version ?? new Version("4.0"); Progress = request.Progress; ReportStatus = request.ReportStatus; MainClient = request.WebClient; ServiceName = request.ServiceName; AppDataFolder = request.InstallPath ?? Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); switch (request.Product.ToLower()) { case "mbt": PackageName = "MBTheater"; RootSuffix = "-Theater"; TargetExe = "MediaBrowser.UI.exe"; FriendlyName = "Media Browser Theater"; RootPath = request.InstallPath ?? Path.Combine(AppDataFolder, "MediaBrowser" + RootSuffix); EndInstallPath = Path.Combine(RootPath, "system"); break; case "mbc": PackageName = "MBClassic"; RootSuffix = "-Classic"; TargetExe = "ehshell.exe"; TargetArgs = @"/nostartupanimation /entrypoint:{CE32C570-4BEC-4aeb-AD1D-CF47B91DE0B2}\{FC9ABCCC-36CB-47ac-8BAB-03E8EF5F6F22}"; FriendlyName = "Media Browser Classic"; RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix); EndInstallPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "ehome"); break; default: PackageName = "MBServer"; RootSuffix = "-Server"; TargetExe = "MediaBrowser.ServerApplication.exe"; FriendlyName = "Media Browser Server"; RootPath = request.InstallPath ?? Path.Combine(AppDataFolder, "MediaBrowser" + RootSuffix); EndInstallPath = Path.Combine(RootPath, "system"); break; } }
private PackageVersionClass GetNewUpdateLevel(Version currentVersion, PackageVersionClass currentUpdateLevel, List<GithubUpdater.RootObject> releases) { var newUpdateLevel = currentUpdateLevel; // If the current version is later than current stable, set the update level to beta if (releases.Count >= 1) { var release = releases[0]; var version = ParseVersion(release.tag_name); if (version != null) { if (currentVersion > version) { newUpdateLevel = PackageVersionClass.Beta; } else { return PackageVersionClass.Release; } } } // If the current version is later than current beta, set the update level to dev if (releases.Count >= 2) { var release = releases[1]; var version = ParseVersion(release.tag_name); if (version != null) { if (currentVersion > version) { newUpdateLevel = PackageVersionClass.Dev; } else { return PackageVersionClass.Beta; } } } return newUpdateLevel; }
/// <summary> /// Initialize our internal variables from an installation request /// </summary> /// <param name="request"></param> protected void Init(InstallationRequest request) { Operation = request.Operation; Archive = request.Archive; PackageClass = request.PackageClass; RequestedVersion = request.Version ?? new Version("4.0"); Progress = request.Progress; ReportStatus = request.ReportStatus; MainClient = request.WebClient; ServiceName = request.ServiceName; switch (request.Product.ToLower()) { case "mbt": PackageName = "MBTheater"; FriendlyName = "Emby Theater"; ProgramDataPath = request.ProgramDataPath ?? GetTheaterProgramDataPath(); TargetExecutablePath = request.TargetExecutablePath ?? Path.Combine(ProgramDataPath, "system", "MediaBrowser.UI.exe"); SystemPath = request.SystemPath ?? Path.GetDirectoryName(TargetExecutablePath); break; case "mbc": PackageName = "MBClassic"; TargetArgs = @"/nostartupanimation /entrypoint:{CE32C570-4BEC-4aeb-AD1D-CF47B91DE0B2}\{FC9ABCCC-36CB-47ac-8BAB-03E8EF5F6F22}"; FriendlyName = "Emby for WMC"; ProgramDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + "-Classic"); TargetExecutablePath = request.TargetExecutablePath ?? Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "ehome", "ehshell.exe"); SystemPath = request.SystemPath ?? Path.Combine(ProgramDataPath, "system"); break; default: PackageName = "MBServer"; FriendlyName = "Emby Server"; ProgramDataPath = request.ProgramDataPath ?? GetServerProgramDataPath(); TargetExecutablePath = request.TargetExecutablePath ?? Path.Combine(ProgramDataPath, "system", "MediaBrowser.ServerApplication.exe"); SystemPath = request.SystemPath ?? Path.GetDirectoryName(TargetExecutablePath); break; } }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="availablePackages">The available packages.</param> /// <param name="name">The name.</param> /// <param name="classification">The classification.</param> /// <returns>PackageVersionInfo.</returns> public PackageVersionInfo GetLatestCompatibleVersion(IEnumerable<PackageInfo> availablePackages, string name, PackageVersionClass classification = PackageVersionClass.Release) { var package = availablePackages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (package == null) { return null; } return package.versions .OrderByDescending(v => v.version) .FirstOrDefault(v => v.classification <= classification && IsPackageVersionUpToDate(v, ApplicationHost.ApplicationVersion)); }
/// <summary> /// Gets the package. /// </summary> /// <param name="name">The name.</param> /// <param name="classification">The classification.</param> /// <param name="version">The version.</param> /// <returns>Task{PackageVersionInfo}.</returns> public async Task<PackageVersionInfo> GetPackage(string name, PackageVersionClass classification, Version version) { var packages = await GetAvailablePackages(CancellationToken.None).ConfigureAwait(false); var package = packages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (package == null) { return null; } return package.versions.FirstOrDefault(v => v.version.Equals(version) && v.classification == classification); }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="name">The name.</param> /// <param name="classification">The classification.</param> /// <returns>Task{PackageVersionInfo}.</returns> public async Task<PackageVersionInfo> GetLatestCompatibleVersion(string name, PackageVersionClass classification = PackageVersionClass.Release) { var packages = await GetAvailablePackages(CancellationToken.None).ConfigureAwait(false); return GetLatestCompatibleVersion(packages, name, classification); }
private CheckForUpdateResult CheckForUpdateResult(RootObject[] obj, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename) { if (updateLevel == PackageVersionClass.Release) { obj = obj.Where(i => !i.prerelease).ToArray(); } else if (updateLevel == PackageVersionClass.Beta) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Dev) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } var availableUpdate = obj .Select(i => CheckForUpdateResult(i, minVersion, assetFilename, packageName, targetFilename)) .Where(i => i != null) .OrderByDescending(i => Version.Parse(i.AvailableVersion)) .FirstOrDefault(); return(availableUpdate ?? new CheckForUpdateResult { IsUpdateAvailable = false }); }
public Task <CheckForUpdateResult> CheckForEmbyTheaterUpdate(PackageVersionClass level, CancellationToken cancellationToken) { return(CheckForUpdateResult("MediaBrowser", "Emby.Theater.Windows", new Version(1, 0, 0), level, "emby.theater.zip", "emby.theater", "emby.theater.zip", cancellationToken)); }
protected void GetArgs() { //cmd line args should be name/value pairs like: product=server archive="c:\.." caller=34552 var cmdArgs = Environment.GetCommandLineArgs(); var args = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase); foreach (var pair in cmdArgs) { var nameValue = pair.Split('='); if (nameValue.Length == 2) { args[nameValue[0]] = nameValue[1]; } } Archive = args.GetValueOrDefault("archive", null); if (args.GetValueOrDefault("pismo", "true") == "false") { InstallPismo = false; } var product = args.GetValueOrDefault("product", null) ?? ConfigurationManager.AppSettings["product"] ?? "server"; PackageClass = (PackageVersionClass)Enum.Parse(typeof(PackageVersionClass), args.GetValueOrDefault("class", null) ?? ConfigurationManager.AppSettings["class"] ?? "Release"); RequestedVersion = new Version(args.GetValueOrDefault("version", "4.0")); var callerId = args.GetValueOrDefault("caller", null); if (callerId != null) { // Wait for our caller to exit try { var process = Process.GetProcessById(Convert.ToInt32(callerId)); process.WaitForExit(); } catch (ArgumentException) { // wasn't running } } //MessageBox.Show(string.Format("Called with args: product: {0} archive: {1} caller: {2}", product, Archive, callerId)); switch (product.ToLower()) { case "mbt": PackageName = "MBTheater"; RootSuffix = "-Theater"; TargetExe = "MediaBrowser.UI.exe"; FriendlyName = "Media Browser Theater"; break; default: PackageName = "MBServer"; RootSuffix = "-Server"; TargetExe = "MediaBrowser.ServerApplication.exe"; FriendlyName = "Media Browser Server"; break; } RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser" + RootSuffix); }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="availablePackages">The available packages.</param> /// <param name="name">The name.</param> /// <param name="currentServerVersion">The current server version.</param> /// <param name="classification">The classification.</param> /// <returns>PackageVersionInfo.</returns> public PackageVersionInfo GetLatestCompatibleVersion(IEnumerable<PackageInfo> availablePackages, string name, string guid, Version currentServerVersion, PackageVersionClass classification = PackageVersionClass.Release) { var package = availablePackages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase)) ?? availablePackages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (package == null) { return null; } return package.versions .OrderByDescending(GetPackageVersion) .FirstOrDefault(v => v.classification <= classification && IsPackageVersionUpToDate(v, currentServerVersion)); }
private CheckForUpdateResult CheckForUpdateResult(RootObject[] obj, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename) { if (updateLevel == PackageVersionClass.Release) { // Technically all we need to do is check that it's not pre-release // But let's addititional checks for -beta and -dev to handle builds that might be temporarily tagged incorrectly. obj = obj.Where(i => !i.prerelease && !i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) && !i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Beta) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase)).ToArray(); } else if (updateLevel == PackageVersionClass.Dev) { obj = obj.Where(i => !i.prerelease || i.name.EndsWith("-beta", StringComparison.OrdinalIgnoreCase) || i.name.EndsWith("-dev", StringComparison.OrdinalIgnoreCase)).ToArray(); } var availableUpdate = obj .Select(i => CheckForUpdateResult(i, minVersion, assetFilename, packageName, targetFilename)) .Where(i => i != null) .OrderByDescending(i => Version.Parse(i.AvailableVersion)) .FirstOrDefault(); return(availableUpdate ?? new CheckForUpdateResult { IsUpdateAvailable = false }); }
public async Task <CheckForUpdateResult> CheckForUpdateResult(string organzation, string repository, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename, CancellationToken cancellationToken) { var url = string.Format("https://api.github.com/repos/{0}/{1}/releases", organzation, repository); var options = new HttpRequestOptions { Url = url, EnableKeepAlive = false, CancellationToken = cancellationToken, UserAgent = "Emby/3.0" }; if (_cacheLength.Ticks > 0) { options.CacheMode = CacheMode.Unconditional; options.CacheLength = _cacheLength; } using (var stream = await _httpClient.Get(options).ConfigureAwait(false)) { var obj = _jsonSerializer.DeserializeFromStream <RootObject[]>(stream); return(CheckForUpdateResult(obj, minVersion, updateLevel, assetFilename, packageName, targetFilename)); } }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="availablePackages">The available packages.</param> /// <param name="name">The name.</param> /// <param name="classification">The classification.</param> /// <returns>PackageVersionInfo.</returns> public PackageVersionInfo GetLatestCompatibleVersion(IEnumerable <PackageInfo> availablePackages, string name, PackageVersionClass classification = PackageVersionClass.Release) { var package = availablePackages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (package == null) { return(null); } return(package.versions .OrderByDescending(v => v.version) .FirstOrDefault(v => v.classification <= classification && IsPackageVersionUpToDate(v, _applicationHost.ApplicationVersion))); }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="name">The name.</param> /// <param name="guid">The assembly guid if this is a plug-in</param> /// <param name="currentServerVersion">The current server version.</param> /// <param name="classification">The classification.</param> /// <returns>Task{PackageVersionInfo}.</returns> public async Task <PackageVersionInfo> GetLatestCompatibleVersion(string name, string guid, Version currentServerVersion, PackageVersionClass classification = PackageVersionClass.Release) { var packages = await GetAvailablePackages(CancellationToken.None, false).ConfigureAwait(false); return(GetLatestCompatibleVersion(packages, name, guid, currentServerVersion, classification)); }
public async Task <CheckForUpdateResult> CheckForUpdateResult(string organzation, string repository, Version minVersion, PackageVersionClass updateLevel, string assetFilename, string packageName, string targetFilename, CancellationToken cancellationToken) { Trace.TraceInformation("Getting github releases for {0} {1} minVersion: {2} level: {3}", organzation, repository, minVersion, updateLevel); // Need to bust the cache var url = string.Format("https://api.github.com/repos/{0}/{1}/releases?v={2}", organzation, repository, DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture)); Trace.TraceInformation("Github url: {0}", url); // Github will throw an error without a user agent _mainClient.Headers.Set(HttpRequestHeader.UserAgent, "Emby/3.0"); var json = await _mainClient.DownloadStringTaskAsync(url); Trace.TraceInformation("Github json: {0}", json); var packages = JsonSerializer.DeserializeFromString <RootObject[]>(json); Trace.TraceInformation("Release count: {0}", packages.Length); var availableUpdate = CheckForUpdateResult(packages, minVersion, updateLevel, assetFilename, packageName, targetFilename); return(availableUpdate ?? new CheckForUpdateResult { IsUpdateAvailable = false }); }
/// <summary> /// Gets the latest compatible version. /// </summary> /// <param name="availablePackages">The available packages.</param> /// <param name="name">The name.</param> /// <param name="currentServerVersion">The current server version.</param> /// <param name="classification">The classification.</param> /// <returns>PackageVersionInfo.</returns> public PackageVersionInfo GetLatestCompatibleVersion(IEnumerable <PackageInfo> availablePackages, string name, string guid, Version currentServerVersion, PackageVersionClass classification = PackageVersionClass.Release) { var package = availablePackages.FirstOrDefault(p => string.Equals(p.guid, guid ?? "none", StringComparison.OrdinalIgnoreCase)) ?? availablePackages.FirstOrDefault(p => p.name.Equals(name, StringComparison.OrdinalIgnoreCase)); if (package == null) { return(null); } return(package.versions .OrderByDescending(GetPackageVersion) .FirstOrDefault(v => v.classification <= classification && IsPackageVersionUpToDate(v, currentServerVersion))); }
public static async Task<CheckForUpdateResult> CheckForApplicationUpdate(Version currentVersion, PackageVersionClass updateLevel, IInstallationManager installationManager, CancellationToken cancellationToken, IProgress<double> progress) { var availablePackages = await installationManager.GetAvailablePackagesWithoutRegistrationInfo(cancellationToken).ConfigureAwait(false); var version = installationManager.GetLatestCompatibleVersion(availablePackages, "MBServer", null, currentVersion, updateLevel); var versionObject = version == null || string.IsNullOrWhiteSpace(version.versionStr) ? null : new Version(version.versionStr); var isUpdateAvailable = versionObject != null && versionObject > currentVersion; return versionObject != null ? new CheckForUpdateResult { AvailableVersion = versionObject.ToString(), IsUpdateAvailable = isUpdateAvailable, Package = version } : new CheckForUpdateResult { AvailableVersion = currentVersion.ToString(), IsUpdateAvailable = false }; }