diff --git a/Pixiview.Android/Pixiview.Android.csproj b/Pixiview.Android/Pixiview.Android.csproj index bfc83d9..3799741 100644 --- a/Pixiview.Android/Pixiview.Android.csproj +++ b/Pixiview.Android/Pixiview.Android.csproj @@ -28,15 +28,19 @@ portable false bin\Debug - DEBUG; + DEBUG;LOG prompt 4 None + true + + arm64-v8a;armeabi-v7a;x86;x86_64 true bin\Release + LOG prompt 4 true diff --git a/Pixiview.Android/Properties/AndroidManifest.xml b/Pixiview.Android/Properties/AndroidManifest.xml index 1092bec..d850bfa 100644 --- a/Pixiview.Android/Properties/AndroidManifest.xml +++ b/Pixiview.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/Pixiview.iOS.OpenExtension/Info.plist b/Pixiview.iOS.OpenExtension/Info.plist index 68abcd0..6b3226c 100644 --- a/Pixiview.iOS.OpenExtension/Info.plist +++ b/Pixiview.iOS.OpenExtension/Info.plist @@ -29,8 +29,8 @@ com.apple.share-services CFBundleShortVersionString - 1.0.519 + 1.0.520 CFBundleVersion - 8 + 9 diff --git a/Pixiview.iOS/AppDelegate.cs b/Pixiview.iOS/AppDelegate.cs index 455b65e..3e6edd1 100644 --- a/Pixiview.iOS/AppDelegate.cs +++ b/Pixiview.iOS/AppDelegate.cs @@ -26,8 +26,8 @@ namespace Pixiview.iOS public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) { -#if DEBUG - App.DebugPrint($"url: {url}."); +#if LOG + App.DebugPrint($"open url: {url}."); #endif return App.OpenUrl(url); } diff --git a/Pixiview.iOS/Info.plist b/Pixiview.iOS/Info.plist index 0c9e7bd..42b1a82 100644 --- a/Pixiview.iOS/Info.plist +++ b/Pixiview.iOS/Info.plist @@ -79,8 +79,8 @@ CFBundleShortVersionString - 1.0.519 + 1.0.520 CFBundleVersion - 8 + 9 diff --git a/Pixiview.iOS/Pixiview.iOS.csproj b/Pixiview.iOS/Pixiview.iOS.csproj index dc3adb2..cbb3272 100644 --- a/Pixiview.iOS/Pixiview.iOS.csproj +++ b/Pixiview.iOS/Pixiview.iOS.csproj @@ -21,7 +21,7 @@ full false bin\iPhoneSimulator\Debug - DEBUG + DEBUG;LOG prompt 4 x86_64 @@ -32,6 +32,7 @@ none true bin\iPhoneSimulator\Release + LOG prompt 4 None @@ -42,7 +43,7 @@ full false bin\iPhone\Debug - DEBUG + DEBUG;LOG prompt 4 ARM64 @@ -56,6 +57,7 @@ none true bin\iPhone\Release + LOG prompt 4 ARM64 diff --git a/Pixiview/App.cs b/Pixiview/App.cs index 614dee7..dd4a760 100644 --- a/Pixiview/App.cs +++ b/Pixiview/App.cs @@ -1,5 +1,7 @@ using System; +#if DEBUG using System.Diagnostics; +#endif using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -44,7 +46,7 @@ namespace Pixiview if (!string.IsNullOrEmpty(host) && port > 0) { Configs.Proxy = new System.Net.WebProxy(host, port); -#if DEBUG +#if LOG DebugPrint($"load proxy: {host}:{port}"); #endif } @@ -76,7 +78,7 @@ namespace Pixiview { return; } -#if DEBUG +#if LOG DebugPrint($"application theme: {theme}"); #endif ThemeBase themeInstance; @@ -117,17 +119,25 @@ namespace Pixiview var theme = AppInfo.RequestedTheme; SetTheme(theme); } - +#if DEBUG public static void DebugPrint(string message) { Debug.WriteLine("[{0:HH:mm:ss.ffff}] - {1}", DateTime.Now, message); } - public static void DebugError(string category, string message) { Debug.Fail(string.Format("[{0:HH:mm:ss.ffff}] - {1} - {2}", DateTime.Now, category, message)); } - +#else + public static void DebugPrint(string message) + { + Console.WriteLine("[Debug.Print] - {0}", message); + } + public static void DebugError(string category, string message) + { + Console.Error.WriteLine(string.Format("[Debug.Error] - {0} - {1}", category, message)); + } +#endif public static bool OpenUrl(Uri uri) { var current = Current.MainPage; diff --git a/Pixiview/AppShell.xaml.cs b/Pixiview/AppShell.xaml.cs index cd5e428..309a5e7 100644 --- a/Pixiview/AppShell.xaml.cs +++ b/Pixiview/AppShell.xaml.cs @@ -57,7 +57,7 @@ namespace Pixiview BindingContext = this; InitializeComponent(); -#if DEBUG +#if LOG App.DebugPrint($"folder: {Stores.PersonalFolder}"); App.DebugPrint($"cache: {Stores.CacheFolder}"); #endif diff --git a/Pixiview/Illust/FavoritesPage.xaml.cs b/Pixiview/Illust/FavoritesPage.xaml.cs index 429635c..6a15402 100644 --- a/Pixiview/Illust/FavoritesPage.xaml.cs +++ b/Pixiview/Illust/FavoritesPage.xaml.cs @@ -280,7 +280,7 @@ namespace Pixiview.Illust if (bookmarkId != null) { // not exists in remote any more -#if DEBUG +#if LOG App.DebugPrint($"remove bookmark ({bookmarkId}) - {b.Id}: {b.Title}"); #endif nows.RemoveAt(i); @@ -289,7 +289,7 @@ namespace Pixiview.Illust else if (bookmarkId != bookmark.BookmarkId) { // update bookmark id -#if DEBUG +#if LOG App.DebugPrint($"change bookmark ({bookmarkId}) to ({bookmark.BookmarkId}) - {b.Id}: {b.Title}"); #endif b.BookmarkId = bookmark.BookmarkId; @@ -303,7 +303,7 @@ namespace Pixiview.Illust for (var i = 0; i < list.Length; i++) { var item = list[i]; -#if DEBUG +#if LOG App.DebugPrint($"add bookmark ({item.BookmarkId}) - {item.Id}: {item.Title}"); #endif item.Image = StyleDefinition.DownloadBackground; @@ -316,7 +316,7 @@ namespace Pixiview.Illust return; } - ParallelTask.Start(0, list.Length, Configs.MaxPageThreads, i => + ParallelTask.Start("favorite.loadimages", 0, list.Length, Configs.MaxPageThreads, i => { var illustItem = list[i]; var data = Stores.LoadIllustPreloadData(illustItem.Id); diff --git a/Pixiview/Illust/IllustCollectionPage.cs b/Pixiview/Illust/IllustCollectionPage.cs index 21c04ab..ac8332c 100644 --- a/Pixiview/Illust/IllustCollectionPage.cs +++ b/Pixiview/Illust/IllustCollectionPage.cs @@ -595,7 +595,7 @@ namespace Pixiview.Illust task.Dispose(); task = null; } - task = ParallelTask.Start(0, collection.Count, Configs.MaxThreads, i => + task = ParallelTask.Start("collection.load", 0, collection.Count, Configs.MaxThreads, i => { if (!collection.Running) { diff --git a/Pixiview/Illust/RelatedIllustsPage.xaml.cs b/Pixiview/Illust/RelatedIllustsPage.xaml.cs index 815e4ce..c9e4c8a 100644 --- a/Pixiview/Illust/RelatedIllustsPage.xaml.cs +++ b/Pixiview/Illust/RelatedIllustsPage.xaml.cs @@ -45,7 +45,7 @@ namespace Pixiview.Illust if (startIndex < 0) { // init - data = Stores.LoadIllustRecommendsInitData(illustItem.Id, force); + data = Stores.LoadIllustRecommendsInitData(illustItem.Id); if (data == null || data.body == null) { return null; diff --git a/Pixiview/Illust/ViewIllustPage.xaml.cs b/Pixiview/Illust/ViewIllustPage.xaml.cs index 4bab17d..8c19cdb 100644 --- a/Pixiview/Illust/ViewIllustPage.xaml.cs +++ b/Pixiview/Illust/ViewIllustPage.xaml.cs @@ -400,7 +400,7 @@ namespace Pixiview.Illust task.Dispose(); task = null; } - task = ParallelTask.Start(0, items.Length, Configs.MaxPageThreads, i => + task = ParallelTask.Start("view.illusts", 0, items.Length, Configs.MaxPageThreads, i => { DoLoadImage(i); return true; @@ -545,6 +545,10 @@ namespace Pixiview.Illust { return; } + if (Configs.Cookie == null) + { + return; + } if (!add && string.IsNullOrEmpty(bookmarkId)) { return; diff --git a/Pixiview/OptionPage.xaml.cs b/Pixiview/OptionPage.xaml.cs index 127baf3..cdac905 100644 --- a/Pixiview/OptionPage.xaml.cs +++ b/Pixiview/OptionPage.xaml.cs @@ -102,7 +102,7 @@ namespace Pixiview { Preferences.Set(Configs.IsOnR18Key, r18); Configs.IsOnR18 = r18; -#if DEBUG +#if LOG App.DebugPrint($"r-18 filter: {r18}"); #endif } @@ -111,7 +111,7 @@ namespace Pixiview { Preferences.Set(Configs.SyncFavTypeKey, syncType); Configs.SyncFavType = (SyncType)syncType; -#if DEBUG +#if LOG App.DebugPrint($"favorite sync type changed to {Configs.SyncFavType}"); #endif } @@ -134,7 +134,7 @@ namespace Pixiview if (!string.IsNullOrEmpty(h) && pt > 0) { Configs.Proxy = new System.Net.WebProxy(h, pt); -#if DEBUG +#if LOG App.DebugPrint($"set proxy to: {h}:{pt}"); #endif } @@ -151,7 +151,7 @@ namespace Pixiview if (proxy != null) { Configs.Proxy = null; -#if DEBUG +#if LOG App.DebugPrint("clear proxy"); #endif } @@ -170,7 +170,7 @@ namespace Pixiview { session = session.Substring(0, index); Configs.SetUserId(session, true); -#if DEBUG +#if LOG App.DebugPrint($"cookie changed, user id: {session}"); #endif } diff --git a/Pixiview/UI/AdaptedPage.cs b/Pixiview/UI/AdaptedPage.cs index 808f708..661be8e 100644 --- a/Pixiview/UI/AdaptedPage.cs +++ b/Pixiview/UI/AdaptedPage.cs @@ -132,7 +132,7 @@ namespace Pixiview.UI { if (Tap.IsBusy) { -#if DEBUG +#if LOG App.DebugPrint("gesture recognizer is now busy..."); #endif return; diff --git a/Pixiview/Utils/EnvironmentService.cs b/Pixiview/Utils/EnvironmentService.cs index 2c3e601..b37e185 100644 --- a/Pixiview/Utils/EnvironmentService.cs +++ b/Pixiview/Utils/EnvironmentService.cs @@ -109,7 +109,7 @@ namespace Pixiview.Utils { Thread.CurrentThread.CurrentCulture = ci; Thread.CurrentThread.CurrentUICulture = ci; -#if DEBUG +#if LOG App.DebugPrint($"CurrentCulture set: {ci.Name}"); #endif } diff --git a/Pixiview/Utils/Extensions.cs b/Pixiview/Utils/Extensions.cs index 8702cbe..b0650cf 100644 --- a/Pixiview/Utils/Extensions.cs +++ b/Pixiview/Utils/Extensions.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Xamarin.Forms; @@ -96,19 +97,19 @@ namespace Pixiview.Utils public class ParallelTask : IDisposable { - public static ParallelTask Start(int from, int toExclusive, int maxCount, Predicate action, Action complete = null) + public static ParallelTask Start(string tag, int from, int toExclusive, int maxCount, Predicate action, Action complete = null) { if (toExclusive <= from) { if (complete != null) { - ThreadPool.QueueUserWorkItem(o => complete()); + Task.Run(complete); } return null; } - var task = new ParallelTask(from, toExclusive, maxCount, action, complete); - //Task.Run(task.Start); - ThreadPool.QueueUserWorkItem(task.Start); + var task = new ParallelTask(tag, from, toExclusive, maxCount, action, complete); + Task.Run(task.Start); + //ThreadPool.QueueUserWorkItem(task.Start); return task; } @@ -116,13 +117,14 @@ namespace Pixiview.Utils private int count; private bool disposed; + private readonly string tag; private readonly int max; private readonly int from; private readonly int to; private readonly Predicate action; private readonly Action complete; - private ParallelTask(int from, int to, int maxCount, Predicate action, Action complete) + private ParallelTask(string tag, int from, int to, int maxCount, Predicate action, Action complete) { if (maxCount <= 0) { @@ -133,14 +135,16 @@ namespace Pixiview.Utils { throw new ArgumentOutOfRangeException(nameof(from)); } + this.tag = tag; this.from = from; this.to = to; this.action = action; this.complete = complete; } - private void Start(object o) + private void Start() { + var list = new List(); for (int i = from; i < to; i++) { var index = i; @@ -152,8 +156,8 @@ namespace Pixiview.Utils } if (disposed) { -#if DEBUG - App.DebugPrint($"parallel task determinate, disposed"); +#if LOG + App.DebugPrint($"parallel task determinate, disposed ({tag})"); #endif return; } @@ -163,7 +167,7 @@ namespace Pixiview.Utils { count++; } - Task.Run(() => + list.Add(Task.Run(() => { try { @@ -174,7 +178,7 @@ namespace Pixiview.Utils } catch (Exception ex) { - App.DebugError("parallel.start", $"failed to run action, index: {i}, error: {ex.Message}"); + App.DebugError("parallel.start ({tag})", $"failed to run action, index: {i}, error: {ex.Message}"); } finally { @@ -183,10 +187,21 @@ namespace Pixiview.Utils count--; } } - }); + })); } -#if DEBUG - App.DebugPrint($"parallel task done"); + while (count > 0) + { + if (disposed) + { +#if LOG + App.DebugPrint($"parallel task determinate, disposed ({tag})"); +#endif + return; + } + Thread.Sleep(100); + } +#if LOG + App.DebugPrint($"parallel task done ({tag})"); #endif complete?.Invoke(); } diff --git a/Pixiview/Utils/Stores.cs b/Pixiview/Utils/Stores.cs index ccf1700..7192d1c 100644 --- a/Pixiview/Utils/Stores.cs +++ b/Pixiview/Utils/Stores.cs @@ -29,7 +29,7 @@ namespace Pixiview.Utils private const string preloadsFolder = "preloads"; private const string thumbFolder = "img-thumb"; private const string userFolder = "user-profile"; - private const string recommendsFolder = "recommends"; + //private const string recommendsFolder = "recommends"; public static bool NetworkAvailable { @@ -238,18 +238,17 @@ namespace Pixiview.Utils return result; } - public static IllustRecommendsData LoadIllustRecommendsInitData(string id, bool force = false) + public static IllustRecommendsData LoadIllustRecommendsInitData(string id) { - var file = Path.Combine(CacheFolder, recommendsFolder, $"{id}.json"); + //var file = Path.Combine(CacheFolder, recommendsFolder, $"{id}.json"); var result = HttpUtility.LoadObject( - file, + null, string.Format(Configs.UrlIllustRecommendsInit, id), string.Format(Configs.RefererIllust, id), - out _, - force: force); + out _); if (result == null || result.error) { - App.DebugPrint($"error when load recommends init data: {result?.message}, force({force})"); + App.DebugPrint($"error when load recommends init data: {result?.message}"); } return result; } @@ -303,7 +302,7 @@ namespace Pixiview.Utils } else { -#if DEBUG +#if LOG App.DebugPrint($"current csrf token: {result.token}"); #endif Configs.CsrfToken = result.token; @@ -338,7 +337,7 @@ namespace Pixiview.Utils } else { -#if DEBUG +#if LOG App.DebugPrint($"successs, bookmark id: {result.body.last_bookmark_id}, status: {result.body.stacc_status_id}"); #endif return result.body.last_bookmark_id; @@ -374,7 +373,7 @@ namespace Pixiview.Utils App.DebugPrint("failed to delete bookmark, result is null"); return false; } -#if DEBUG +#if LOG App.DebugPrint($"successs, delete bookmark"); #endif return true; diff --git a/Pixiview/Utils/Ugoira.cs b/Pixiview/Utils/Ugoira.cs index 04b67bf..b793ba6 100644 --- a/Pixiview/Utils/Ugoira.cs +++ b/Pixiview/Utils/Ugoira.cs @@ -30,6 +30,7 @@ namespace Pixiview.Utils private readonly ImageSource[] frames; private Timer timer; private int index = 0; + private ParallelTask downloadTask; public bool IsPlaying { get; private set; } public readonly int FrameCount; @@ -51,6 +52,11 @@ namespace Pixiview.Utils { TogglePlay(false); } + if (downloadTask != null) + { + downloadTask.Dispose(); + downloadTask = null; + } ClearTimer(); } @@ -178,7 +184,7 @@ namespace Pixiview.Utils var url = ugoira.originalSrc; var id = detailItem.Id; var (size, lastModified, client) = HttpUtility.GetUgoiraHeader(url, id); -#if DEBUG +#if LOG App.DebugPrint($"starting download ugoira: {size} bytes, last modified: {lastModified}"); #endif @@ -283,7 +289,12 @@ namespace Pixiview.Utils } } - ParallelTask.Start(0, inSegs.Count, 2, i => + if (downloadTask != null) + { + downloadTask.Dispose(); + downloadTask = null; + } + downloadTask = ParallelTask.Start("ugoira.download", 0, inSegs.Count, 2, i => { var seg = inSegs[i]; #if DEBUG @@ -325,8 +336,8 @@ namespace Pixiview.Utils } } } -#if DEBUG - App.DebugPrint("download over"); +#if LOG + App.DebugPrint("load frames over"); #endif } } @@ -454,78 +465,81 @@ namespace Pixiview.Utils #endif for (int i = 0; i < images.Length; i++) { - while (true) + while (!writerInput.ReadyForMoreMediaData) { - if (writerInput.ReadyForMoreMediaData) + lock (sync) { - // get pixel buffer and fill it with the image - using (CVPixelBuffer pixelBufferImage = pixelBufferAdaptor.PixelBufferPool.CreatePixelBuffer()) + if (timer == null) { - pixelBufferImage.Lock(CVPixelBufferLock.None); + return null; + } + } + Thread.Sleep(50); + } + // get pixel buffer and fill it with the image + using (CVPixelBuffer pixelBufferImage = pixelBufferAdaptor.PixelBufferPool.CreatePixelBuffer()) + { + pixelBufferImage.Lock(CVPixelBufferLock.None); - try + try + { + IntPtr pxdata = pixelBufferImage.BaseAddress; + + if (pxdata != IntPtr.Zero) + { + using (var rgbColorSpace = CGColorSpace.CreateDeviceRGB()) { - IntPtr pxdata = pixelBufferImage.BaseAddress; - - if (pxdata != IntPtr.Zero) + var cgImage = images[i].CGImage; + var width = cgImage.Width; + var height = cgImage.Height; + var bitsPerComponent = cgImage.BitsPerComponent; + var bytesPerRow = cgImage.BytesPerRow; + // padding to 64 + var bytes = bytesPerRow >> 6 << 6; + if (bytes < bytesPerRow) { - using (var rgbColorSpace = CGColorSpace.CreateDeviceRGB()) - { - var cgImage = images[i].CGImage; - var width = cgImage.Width; - var height = cgImage.Height; - var bitsPerComponent = cgImage.BitsPerComponent; - var bytesPerRow = cgImage.BytesPerRow; - // padding to 64 - var bytes = bytesPerRow >> 6 << 6; - if (bytes < bytesPerRow) - { - bytes += 64; - } + bytes += 64; + } #if DEBUG - if (!log) - { - log = true; - App.DebugPrint($"animation, width: {width}, height: {height}, type: {cgImage.UTType}\n" + - $"bitmapInfo: {cgImage.BitmapInfo}\n" + - $"bpc: {bitsPerComponent}\n" + - $"bpp: {cgImage.BitsPerPixel}\n" + - $"calculated: {bytesPerRow} => {bytes}"); - } + if (!log) + { + log = true; + App.DebugPrint($"animation, width: {width}, height: {height}, type: {cgImage.UTType}\n" + + $"bitmapInfo: {cgImage.BitmapInfo}\n" + + $"bpc: {bitsPerComponent}\n" + + $"bpp: {cgImage.BitsPerPixel}\n" + + $"calculated: {bytesPerRow} => {bytes}"); + } #endif - using (CGBitmapContext bitmapContext = new CGBitmapContext( - pxdata, width, height, - bitsPerComponent, - bytes, - rgbColorSpace, - CGImageAlphaInfo.NoneSkipFirst)) - { - if (bitmapContext != null) - { - bitmapContext.DrawImage(new CGRect(0, 0, width, height), cgImage); - } - } + using (CGBitmapContext bitmapContext = new CGBitmapContext( + pxdata, width, height, + bitsPerComponent, + bytes, + rgbColorSpace, + CGImageAlphaInfo.NoneSkipFirst)) + { + if (bitmapContext != null) + { + bitmapContext.DrawImage(new CGRect(0, 0, width, height), cgImage); } } } - finally - { - pixelBufferImage.Unlock(CVPixelBufferLock.None); - } - - // and finally append buffer to adapter - if (pixelBufferAdaptor.AssetWriterInput.ReadyForMoreMediaData && pixelBufferImage != null) - { - pixelBufferAdaptor.AppendPixelBufferWithPresentationTime(pixelBufferImage, lastTime); - } } - - var frameTime = new CMTime(ugoira.frames[i].delay, 1000); - lastTime = CMTime.Add(lastTime, frameTime); - break; } - Thread.Sleep(32); + finally + { + pixelBufferImage.Unlock(CVPixelBufferLock.None); + } + + // and finally append buffer to adapter + if (pixelBufferAdaptor.AssetWriterInput.ReadyForMoreMediaData && pixelBufferImage != null) + { + pixelBufferAdaptor.AppendPixelBufferWithPresentationTime(pixelBufferImage, lastTime); + } } + + var frameTime = new CMTime(ugoira.frames[i].delay, 1000); + lastTime = CMTime.Add(lastTime, frameTime); } writerInput.MarkAsFinished(); await videoWriter.FinishWritingAsync();