Skip to content

Commit

Permalink
Merge pull request #276 from dasgarner/develop
Browse files Browse the repository at this point in the history
Hotfix for SSP connectivity causing player instability
  • Loading branch information
dasgarner authored Nov 20, 2022
2 parents 292bb44 + a02849f commit 6393374
Show file tree
Hide file tree
Showing 11 changed files with 178 additions and 50 deletions.
15 changes: 0 additions & 15 deletions Adspace/Ad.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/
using Flurl;
using Flurl.Http;
using GeoJSON.Net.Contrib.MsSqlSpatial;
using GeoJSON.Net.Feature;
using GeoJSON.Net.Geometry;
Expand Down Expand Up @@ -109,19 +107,6 @@ public string GetFileName()
}
}

/// <summary>
/// Download this ad
/// </summary>
public void Download()
{
// We should download it.
string fileName = GetFileName();
new Url(Url).DownloadFileAsync(ApplicationSettings.Default.LibraryPath, fileName).ContinueWith(t =>
{
CacheManager.Instance.Add(fileName, CacheManager.Instance.GetMD5(fileName));
}, System.Threading.Tasks.TaskContinuationOptions.OnlyOnRanToCompletion);
}

/// <summary>
/// Set whether or not this GeoSchedule is active.
/// </summary>
Expand Down
98 changes: 74 additions & 24 deletions Adspace/ExchangeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,10 @@
using Flurl;
using Flurl.Http;
using Newtonsoft.Json.Linq;
using Org.BouncyCastle.Crypto.Engines;
using Swan;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.EnterpriseServices;
using System.Linq;
using System.Threading.Tasks;
using System.Xml;
Expand All @@ -42,12 +40,14 @@ class ExchangeManager
private readonly object buffetLock = new object();
private bool isActive;
private bool isNewPrefetchAdded = false;
private bool isUnwrapping = false;
private DateTime lastFillDate;
private DateTime lastPrefetchDate;
private List<string> prefetchUrls = new List<string>();
private List<Ad> adBuffet = new List<Ad>();
private Dictionary<string, int> lastUnwrapRateLimits = new Dictionary<string, int>();
private Dictionary<string, DateTime> lastUnwrapDates = new Dictionary<string, DateTime>();
private List<string> creativesDownloading = new List<string>();

public int ShareOfVoice { get; private set; } = 0;
public int AverageAdDuration { get; private set; } = 0;
Expand Down Expand Up @@ -159,15 +159,15 @@ public Ad GetAd(double width, double height)
}
catch
{
Trace.WriteLine(new LogMessage("ExchangeManager", "GetAd: no available ad returned while unwrapping"), LogType.Error.ToString());
Trace.WriteLine(new LogMessage("ExchangeManager", "GetAd: no available ad returned while unwrapping"), LogType.Info.ToString());
throw new AdspaceNoAdException("No ad returned");
}

// Check geo fence
if (!ad.IsGeoActive(ClientInfo.Instance.CurrentGeoLocation))
{
ReportError(ad.ErrorUrls, 408);
adBuffet.Remove(ad);
RemoveFromBuffet(ad);
throw new AdspaceNoAdException("Outside geofence");
}

Expand All @@ -183,36 +183,46 @@ public Ad GetAd(double width, double height)
else
{
ReportError(ad.ErrorUrls, 200);
adBuffet.Remove(ad);
RemoveFromBuffet(ad);
throw new AdspaceNoAdException("Type not recognised");
}

// Determine Size
if (width / height != ad.AspectRatio)
{
ReportError(ad.ErrorUrls, 203);
adBuffet.Remove(ad);
RemoveFromBuffet(ad);
throw new AdspaceNoAdException("Dimensions invalid");
}

// TODO: check fault status

// Check to see if the file is already there, and if not, download it.
if (!CacheManager.Instance.IsValidPath(ad.GetFileName()))
{
Task.Run(() => ad.Download());
DownloadAd(ad);

// Don't show it this time
adBuffet.Remove(ad);
RemoveFromBuffet(ad);
throw new AdspaceNoAdException("Creative pending download");
}

// We've converted it into a play
adBuffet.Remove(ad);
RemoveFromBuffet(ad);

return ad;
}

/// <summary>
/// Removes an ad from the buffet, respecting the buffet lock
/// </summary>
/// <param name="ad"></param>
private void RemoveFromBuffet(Ad ad)
{
lock (buffetLock)
{
adBuffet.Remove(ad);
}
}

/// <summary>
/// Get an available ad
/// </summary>
Expand Down Expand Up @@ -293,12 +303,7 @@ public void Prefetch()
string fileName = "axe_" + creative.GetValue(idProp).ToString();
if (!CacheManager.Instance.IsValidPath(fileName))
{
// We should download it.
new Url(fetchUrl).DownloadFileAsync(ApplicationSettings.Default.LibraryPath, fileName).ContinueWith(t =>
{
CacheManager.Instance.Add(fileName, CacheManager.Instance.GetMD5(fileName));
},
TaskContinuationOptions.OnlyOnRanToCompletion);
DownloadAd(fetchUrl, fileName);
}
}
}
Expand All @@ -313,12 +318,7 @@ public void Prefetch()
string fileName = "axe_" + fetchUrl.Split('/').Last();
if (!CacheManager.Instance.IsValidPath(fileName))
{
// We should download it.
new Url(fetchUrl).DownloadFileAsync(ApplicationSettings.Default.LibraryPath, fileName).ContinueWith(t =>
{
CacheManager.Instance.Add(fileName, CacheManager.Instance.GetMD5(fileName));
},
TaskContinuationOptions.OnlyOnRanToCompletion);
DownloadAd(fetchUrl, fileName);
}
}
}
Expand Down Expand Up @@ -768,7 +768,7 @@ private List<Ad> Request(Url url, Ad wrappedAd)
// Download if necessary
if (!CacheManager.Instance.IsValidPath(ad.GetFileName()))
{
Task.Run(() => ad.Download());
DownloadAd(ad);
}

// Ad this to our list
Expand Down Expand Up @@ -799,8 +799,16 @@ private List<Ad> Request(Url url, Ad wrappedAd)
/// </summary>
private void UnwrapAds()
{
if (isUnwrapping)
{
// Don't queue, just unwrap
return;
}

lock (buffetLock)
{
isUnwrapping = true;

// Keep a list of ads we add
List<Ad> unwrappedAds = new List<Ad>();

Expand Down Expand Up @@ -844,6 +852,8 @@ private void UnwrapAds()
// Add in any new ones we've got as a result
adBuffet.AddRange(unwrappedAds);
unwrappedAds.Clear();

isUnwrapping = false;
}
}

Expand Down Expand Up @@ -877,6 +887,46 @@ private void ReportError(List<string> urls, int errorCode)
}
}

private void DownloadAd(string url, string fileName)
{
lock (creativesDownloading)
{
if (creativesDownloading.Contains(fileName))
{
LogMessage.Info("ExchangeManager", "DownloadAd", "Already downloading " + fileName);
return;
}

// Not downloading yet, so do it now
creativesDownloading.Add(fileName);

// We use a task for this so that it happens in the background
try
{
new Url(url).DownloadFileAsync(ApplicationSettings.Default.LibraryPath, fileName).ContinueWith(t =>
{
// Completed successfully, so add to the cache manager and remove from download queue
CacheManager.Instance.Add(fileName, CacheManager.Instance.GetMD5(fileName));
creativesDownloading.Remove(fileName);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}
catch (Exception e)
{
LogMessage.Error("ExchangeManager", "DownloadAd", "Failed to download " + fileName + ", e: " + e.Message);
CacheManager.Instance.Remove(fileName);
}
}
}

/// <summary>
/// Download an ad
/// </summary>
/// <param name="ad"></param>
private void DownloadAd(Ad ad)
{
DownloadAd(ad.Url, ad.GetFileName());
}

private void SetUnwrapRateThreshold(string partner, int seconds)
{
if (!string.IsNullOrEmpty(partner))
Expand Down
2 changes: 1 addition & 1 deletion Logic/ApplicationSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private static readonly Lazy<ApplicationSettings>
/// </summary>
private List<string> ExcludedProperties;

public string ClientVersion { get; } = "3 R306.2";
public string ClientVersion { get; } = "3 R306.3";
public string Version { get; } = "6";
public int ClientCodeVersion { get; } = 306;

Expand Down
11 changes: 11 additions & 0 deletions Logic/Schedule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,17 @@ public int ActiveLayouts
}
}

/// <summary>
/// The number of active adspace exchange events
/// </summary>
public int ActiveAdspaceExchangeEvents
{
get
{
return _layoutSchedule.FindAll(item => item.IsAdspaceExchange).Count;
}
}

/// <summary>
/// A layout file has changed
/// </summary>
Expand Down
18 changes: 13 additions & 5 deletions MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -557,16 +557,24 @@ private void ChangeToNextLayout(ScheduleItem scheduleItem)
}
catch (Exception ex)
{
Trace.WriteLine(new LogMessage("MainForm", "ChangeToNextLayout: Layout Change to " + scheduleItem.layoutFile + " failed. Exception raised was: " + ex.Message), LogType.Error.ToString());

// Store the active layout count, so that we can remove this one that failed and still see if there is another to try
int activeLayouts = _schedule.ActiveLayouts;

// We could not prepare or start this Layout, so we ought to remove it from the Schedule.
_schedule.RemoveLayout(scheduleItem);
if (scheduleItem.IsAdspaceExchange)
{
LogMessage.Audit("MainForm", "ChangeToNextLayout", "No ad to show, e: " + ex.Message);
}
else
{
LogMessage.Info("MainForm", "ChangeToNextLayout", "Layout Change to " + scheduleItem.layoutFile + " failed. Exception raised was: " + ex.Message);

// We could not prepare or start this Layout, so we ought to remove it from the Schedule.
_schedule.RemoveLayout(scheduleItem);
}

// Do we have more than one Layout in our Schedule which we can try?
if (activeLayouts > 1)
// and make sure they aren't solely AXE
if (activeLayouts > 1 && activeLayouts > _schedule.ActiveAdspaceExchangeEvents)
{
_schedule.NextLayout();
}
Expand Down
4 changes: 2 additions & 2 deletions Properties/AssemblyInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,6 @@
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.306.0.2")]
[assembly: AssemblyFileVersion("3.306.0.2")]
[assembly: AssemblyVersion("3.306.0.3")]
[assembly: AssemblyFileVersion("3.306.0.3")]
[assembly: Guid("3bd467a4-4ef9-466a-b156-a79c13a863f7")]
1 change: 1 addition & 0 deletions Rendering/Layout.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,7 @@ public void LoadFromAd(ScheduleItem scheduleItem, Ad ad)

// Set our impression URLs which we will call on stop.
_regions[0].SetAdspaceExchangeImpressionUrls(ad.ImpressionUrls);
_regions[0].SetAdspaceExchangeErrorUrls(ad.ErrorUrls);
}

/// <summary>
Expand Down
8 changes: 8 additions & 0 deletions Rendering/Media.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,11 @@ public partial class Media : UserControl
/// </summary>
public bool StatsEnabled { get; private set; }

/// <summary>
/// Did this media item fail to play?
/// </summary>
public bool IsFailedToPlay { get; protected set; }

/// <summary>
/// Media Object
/// </summary>
Expand All @@ -132,6 +137,9 @@ public Media(MediaOptions options)
ScheduleId = options.scheduleId;
LayoutId = options.layoutId;
StatsEnabled = options.isStatEnabled;

// Start us off in a good state
IsFailedToPlay = false;
}

/// <summary>
Expand Down
Loading

0 comments on commit 6393374

Please sign in to comment.