Jump to content

New Statistics plugin


reggi

Recommended Posts

MSattler

Thanks for the feedback both, I will add some kind of fallback system so the task is not failing when TVDB is down (or can't be contacted)

 

On the last one you sent me it failed today too:

 

2017-03-14 17:47:24.0787 Error HttpClient: Error getting response from https://thetvdb.com/api/Updates.php?type=all&time=1489294326
*** Error Report ***
Version: 3.2.6.0
Command line: B:\Users\Administrator\AppData\Roaming\Emby-Server\system\MediaBrowser.ServerApplication.exe -service
Operating system: Microsoft Windows NT 6.2.9200.0
64-Bit OS: True
64-Bit Process: True
Processor count: 8
Program data path: B:\Users\Administrator\AppData\Roaming\Emby-Server
Application directory: B:\Users\Administrator\AppData\Roaming\Emby-Server\system
System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  --- End of inner exception stack trace ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
---> (Inner Exception #0) System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)<---
 
System.AggregateException
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
InnerException: System.Net.WebException
System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
 
2017-03-14 17:47:24.0787 Error TaskManager: Error
*** Error Report ***
Version: 3.2.6.0
Command line: B:\Users\Administrator\AppData\Roaming\Emby-Server\system\MediaBrowser.ServerApplication.exe -service
Operating system: Microsoft Windows NT 6.2.9200.0
64-Bit OS: True
64-Bit Process: True
Processor count: 8
Program data path: B:\Users\Administrator\AppData\Roaming\Emby-Server
Application directory: B:\Users\Administrator\AppData\Roaming\Emby-Server\system
System.AggregateException: One or more errors occurred. ---> MediaBrowser.Model.Net.HttpException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  --- End of inner exception stack trace ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
  --- End of inner exception stack trace ---
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<Get>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
  at Statistics.Api.TheTvDbProvider.<GetSeriesIdsToUpdate>d__13.MoveNext()
  --- End of inner exception stack trace ---
  at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
  at Statistics.Helpers.ShowProgressCalculator.GetShowsToUpdate(IEnumerable`1 showIds, String time, CancellationToken cancellationToken)
  at Statistics.ScheduledTasks.CalculateStatsTask.CalculateTotalEpisodes(CancellationToken cancellationToken)
  at Statistics.ScheduledTasks.CalculateStatsTask.<Execute>d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.ScheduledTasks.ScheduledTaskWorker.<ExecuteInternal>d__68.MoveNext()
---> (Inner Exception #0) MediaBrowser.Model.Net.HttpException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  --- End of inner exception stack trace ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
  --- End of inner exception stack trace ---
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<Get>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
  at Statistics.Api.TheTvDbProvider.<GetSeriesIdsToUpdate>d__13.MoveNext()<---
 
System.AggregateException
  at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
  at Statistics.Helpers.ShowProgressCalculator.GetShowsToUpdate(IEnumerable`1 showIds, String time, CancellationToken cancellationToken)
  at Statistics.ScheduledTasks.CalculateStatsTask.CalculateTotalEpisodes(CancellationToken cancellationToken)
  at Statistics.ScheduledTasks.CalculateStatsTask.<Execute>d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.ScheduledTasks.ScheduledTaskWorker.<ExecuteInternal>d__68.MoveNext()
InnerException: MediaBrowser.Model.Net.HttpException
MediaBrowser.Model.Net.HttpException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  --- End of inner exception stack trace ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
  --- End of inner exception stack trace ---
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<Get>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
  at Statistics.Api.TheTvDbProvider.<GetSeriesIdsToUpdate>d__13.MoveNext()
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<Get>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
  at Statistics.Api.TheTvDbProvider.<GetSeriesIdsToUpdate>d__13.MoveNext()
InnerException: System.AggregateException
System.AggregateException: One or more errors occurred. ---> System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  --- End of inner exception stack trace ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
---> (Inner Exception #0) System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)<---
 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at Emby.Common.Implementations.HttpClientManager.HttpClientManager.<SendAsyncInternal>d__22.MoveNext()
InnerException: System.Net.WebException
System.Net.WebException: The remote server returned an error: (522) Origin Connection Time-out.
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
  at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
 
2017-03-14 17:47:24.0787 Info TaskManager: Calculate statistics for all users Failed after 0 minute(s) and 18 seconds
2017-03-14 17:47:24.0942 Info App: Emailing xxxxxx.xxxxxxx@.com with subject Emby: Calculate statistics for all users failed.
Edited by Happy2Play
Removed email address
Link to comment
Share on other sites

reggi

It looks like the update call is failing a lot on the tvdb servers. I hope trying again a bit later will solve the issue for now.

At the moment I'm working on a solution for the 500 error codes.

Link to comment
Share on other sites

MSattler

It looks like the update call is failing a lot on the tvdb servers. I hope trying again a bit later will solve the issue for now. At the moment I'm working on a solution for the 500 error codes.

 

I just reran it manually and it did work, so that is what appears to be happening.

 

Thanks!

Link to comment
Share on other sites

Diedrich

should I be downloading the attached file in the OP or clicking the version link to get the latest version?

Link to comment
Share on other sites

Diedrich

0.0.9.2 worked well for me. Doing a great job, Reggie. My observations:

 

  • Displaying the plugin version would help with keeping track of keeping it current. This can then be removed once it goes live in the catalogue.
  • Dev's decision - but I feel like these should include "Total Size" in the title since a TV series is made up of multiple parts and thus being a "total size". e.g. "Largest TV Series Total Size", "Longest TV Series Total Runtime"...... even those sound strange though, I'm trying to think of the proper phraseology. "Largest Total Size: TV Series", "Longest Total Runtime: TV Series"? (I honestly don't know)58c9e3e899ec0_2017031520_56_27Plugins.pn
  • Also note the strange gap in the 219 hours for NCIS.
  • Request: Stats to show a total library hierarchy. Example - Movies library is comprised of movies and collections. You may have 300 movies but 100 are in the general movie library while the other 200 are spread throughout X # of collections. Each collection would then have its own stats for total movies, largest collection (total # of movies)
  • Request: Oldest movie (release date) displayed in years/months since theatrical release
  • Request: Newest movie (release date) displayed in months/days since theatrical release
  • Once you view a user, there is no way to get back to the main stats without going to the plugins page or pressing the Back button on the keyboard.
  • WOO-HOO! I love the User-based show progress! So this is telling me that the user has watched 15 out of 16 episodes of The Expanse? Correct? Is this including downloads? 58c9e8c3186d8_2017031521_20_28Plugins.pn
  • P.S. It should be "User-based", with a hyphen
  • Does anyone else see the dark background in the user picker? It's very difficult to see the underlying text.58c9e8f908518_2017031521_12_43Plugins.pn
Edited by dvgmar
  • Like 1
Link to comment
Share on other sites

Happy2Play

Also note the strange gap in the 219 hours for NCIS.

I believe this is 2 days 19 hours.  As mine shows "10 04:39:48 - CSI: Crime Scene Investigation".

 

 

Does anyone else see the dark background in the user picker? It's very difficult to see the underlying text

I have a white background with and without blue theme.

Link to comment
Share on other sites

Diedrich

Created from scratch, I can manipulate it in Illustrator to your preference if you would like to use it.

 

Artwork for submission. The border is there just to define it from the forum background. Attached is the Thumb and here is the link to the AI file.

 

58ca3b244b480_EmbyStatistics.png

 

post-7975-0-74166800-1489647746_thumb.png

  • Like 1
Link to comment
Share on other sites

reggi

@

 

First of all thanks for testing the plugin! 

To answer some of your question:

 

Displaying the plugin version would help with keeping track of keeping it current.

   Normally the version is displayed on the plugin page. Or do you mean to display the version number inside the pugin while it is in development? (before version 0.0.0.7 no version numbers are increased, I forgot to do that :) )

 

- Also note the strange gap in the 219 hours for NCIS.

    Like @@Happy2Play said, it's 2 days and 19 hours. Maybe I can change it to "2 days 19:48:06" to make it more clear.

 

- Once you view a user, there is no way to get back to the main stats without going to the plugins page or pressing the Back button on the keyboard.

    Normally there should be a "Go back" button under the user selection dropdown to go back to the main stats.

 

WOO-HOO! I love the User-based show progress! So this is telling me that the user has watched 15 out of 16 episodes of The Expanse? Correct? Is this including downloads? 

   yes it does tell you that, it also tells you that you have collected 88.9% from The Expanse and from that 88.9% you watched 93.8%. The 16 in the Episode column means you have 16 episodes of that show (excluded specials) in your Emby lib.

 

- Does anyone else see the dark background in the user picker?

    Can you tell me what theme you are using? So I can check the styling.

 

And thanks for the image, looking good already :) I'll send you some feedback later this week.

Edited by reggi
Link to comment
Share on other sites

Diedrich

@

Does anyone else see the dark background in the user picker?

Can you tell me what theme you are using? So I can check the styling.

No theming going on. I have the default Emby Server colors and background but I will double check that default is in fact set.
Link to comment
Share on other sites

reggi

Hey guys,

 

At last a new update. Had to help a friend move so not a lot of time to work on the plugin so only a smaller update.

 

Changelog

- Graph is back :D For now only a views per day of the week graphs, but more are in development. The styling is not 100% so still have to work on that!

- 2 new stats on the general page (youngest and oldest movie), thanks @ for the request 

- When TVDB returns a 500 the background task should just finish BUT user will not be able to visit the show progress page (see screenshot)

- spelling fix

 

58d0ae20af364_alert.png

 

Let me know if I made some spelling errors :)

 

58d0ae58e4b61_graphs.png

 

And this are the new stats, still have to work on the graph styling (axis style, tooltips, ...) but it's a start. Let me know what you think!

Also, you see a giant peek on Tuesday (dinsdag in dutch), this is because when you run the "Import playstates from Trakt.tv" task it will put the "LastPlayedDate" on the date of that day, not the day it is watched on Trakt (maybe a bug?)

 

Have fun testing it and let me know what you think!

Statistics 0.0.10.0.zip

  • Like 1
Link to comment
Share on other sites

CBers

In American vernacular we would say "Newest Movie" instead of Youngest.

Latest? Recent?

Link to comment
Share on other sites

reggi

Oke thanks.

 

So I'll change it to "Latest Movie" then?

"Oldest Movie" is still correct?

 

@@CBers

 

It is possible you have younger movies but maybe Emby has no PremiereDate in the database for that movie?

Can you tell me what movie is wrong as "Latest Movie"?

Link to comment
Share on other sites

CBers

It is possible you have younger movies but maybe Emby has no PremiereDate in the database for that movie?

Can you tell me what movie is wrong as "Latest Movie"?

Perhaps latest movie should be Added to Library date, rather than Release/Premiere Date.

 

Looks like the movie marked as LATEST is correct based on Release/Premiere Date, but not on Added to Library date.

Link to comment
Share on other sites

PenkethBoy

it depends what its trying to show - if its oldest (added) vs latest (Added) or is it based on release date of the movie

 

results would be quite different

 

BUG

 

@@reggi - cant get the plugin to run properly - it fails after approx a minute with "Nullable object must have a value." and your new warning does not pop up so guess it is something else

Link to comment
Share on other sites

reggi

Mmmm, I think in Belgium you switch it as well. I was too much into programming I didn't check that :)

 

The "youngest" movie at the moment represents the latest movie by release date, not the date the movie was added to the lib.

I can add that statistic as well if it would be useful, don't know yet how I can make the difference clear to the user.

 

@@PenkethBoy

 

Sorry to hear you have a new crash :( Can you send me the log file so I can see what's happening?

Link to comment
Share on other sites

CBers

I think YOUNGEST should be LATEST and then make that the latest movie added to Emby, unless you can present it both ways, Latest and Newest, but then it gets confusing :)

Link to comment
Share on other sites

I think YOUNGEST should be LATEST and then make that the latest movie added to Emby, unless you can present it both ways, Latest and Newest, but then it gets confusing :)

You want that based on release date, otherwise how does a movie get to 40 year ago. Knowing the first movie you added isnt really important from a statistics standpoint. Knowing the span of oldest -> newest based on release date is obviously what was intended. Knowing the oldest->newest based on date created would be nice for a viewing standpoint, but not statistically.

 

 

 

Sent from my Nexus 7 using Tapatalk

  • Like 1
Link to comment
Share on other sites

reggi

I think you may be correct @@speechles

 

Maybe I can add a "Latest Premiered Movie" and "Latest Added Movie"?

Edited by reggi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...