seedhartha / QuestPlayer

Android port of Quest Soft Player
http://qsp.su/
26 stars 5 forks source link

Не все игры с сайта qsp.su доступны для скачивания #22

Closed seedhartha closed 3 years ago

seedhartha commented 3 years ago

Сейчас API сайта возвращает только те игры, которые запакованы в zip-архив. Нужно предоставить пользователю возможность скачать все игры - вероятно, договорившись с администратором сайта.

С другой стороны, можно переложить эту ответственность на авторов игр и сказать, что игра совместима с Android, только если она запакована в zip-архив.

Задача на подумать.

seedhartha commented 3 years ago

В Android нет нативной поддержки rar, поскольку это проприетарный формат.

Также доступа к исходникам API у администратора не оказалось, нужно разговаривать с @KirillAshikhmin.

KirillAshikhmin commented 3 years ago

Исходники все в репозитории ведь. И не я автор приложения, а просто выложил исходники сюда и доработал некоторые моменты.

seedhartha commented 3 years ago

Исходники все в репозитории ведь. И не я автор приложения, а просто выложил исходники сюда и доработал некоторые моменты.

:) Понятно, я думал, что вы - Nex. Здесь речь про API, которое на сайте qsp.su.

valeksan commented 3 years ago

можно выкачать весь репозиторий и создать свой с блекджеком и шл*...))) ну или поддержкой добавления сторонних, нуу или это тот еще гемор (особенно выделять задарма еще на это ресурсы свои, тотже сервак) А можно так сделать чтобы пользователи запускали серв у себя своего каталога и постели в сети адрес, а в приложении ручками его прописывать разок.

seedhartha commented 3 years ago

Проблема не в приложении. Авторам, которые хотят, чтобы игра была совместима с Android-плеером, достаточно выложить её в ZIP-архиве.

AlexandrKozlovskiy commented 3 years ago

Дело в том,что есть многие игры,доступные в rar,которые можно проходить под android. Но ведь сервер как-то же отдаёт сайту qsp.su список игр,значит,на мой взгляд,как-то это можно решить. В принципе если поднапрячься,можно было бы сварганить скрипт на питоне,который парсил html страницу и выкачивал бы оттуда игры. А по поводу того,что rar нету в android,вроде библиотека apachi решает эту проблему. Главное,чтобы в xml было указано расширение файла,хотя если всё правильно сделано,можно выдернуть его из заголовков при скачивании. В общим я бы всё таки подумал над этим и не закрывал бы это issue окончательно.

seedhartha commented 3 years ago

Парсинг html-страницы - это костыль. Заниматься этим не вижу смысла, учитывая что есть API для android и добавить в него поддержку rar достаточно просто. Но доработка API находится вне зоны ответственности плеера. Появится поддержка rar там - добавлю её в приложение.

AlexandrKozlovskiy commented 3 years ago

А как можно связаться с администрацией сайта,чтобы попросить изменить android api,или открыть доступ к публичному api?

AlexandrKozlovskiy commented 2 years ago

Будет ли развиваться qsp для android? Я договорился с одним из админов сайта и он создал новое api,которое возвращает список всех игр. Также я попросил,чтобы api для облегчения задачи возвращало тип файла. https://qsp.su/gamestock/gamestock2.php

seedhartha commented 2 years ago

Добавил установку из RAR-архивов. В целом развития не будет, только поддержка.

AlexandrKozlovskiy commented 2 years ago

Ещё есть игры типа .aqsp,которые Вы вроде не добавляли. Не могли бы Вы пожалуйста добавить aqsp,т.к как я понимаю .aqsp это тот же zip и некоторые игры спокойно работают на android.

AlexandrKozlovskiy commented 2 years ago

К сожалению я заметил некоторые не хорошие вещи в последнем quest player:

  1. При загрузке и запуске игры волшебство под новый год плеер крешится с exception:
AlexandrKozlovskiy commented 2 years ago

02-11 23:26:09.440 24681 24681 E AndroidRuntime: Process: com.qsp.player, PID: 24681 02-11 23:26:09.440 24681 24681 E AndroidRuntime: java.lang.ClassCastException: android.graphics.drawable.AnimatedImageDrawable cannot be cast to android.graphics.drawable.BitmapDrawable 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.service.HtmlProcessor.shouldImageBeResized(HtmlProcessor.java:97) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.service.HtmlProcessor.processHtmlImages(HtmlProcessor.java:83) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.service.HtmlProcessor.convertQspHtmlToWebViewHtml(HtmlProcessor.java:49) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.GameActivity.getHtml(GameActivity.java:462) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.GameActivity.refreshMainDesc(GameActivity.java:448) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.GameActivity.lambda$refresh$7$com-qsp-player-GameActivity(GameActivity.java:774) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.qsp.player.GameActivity$$ExternalSyntheticLambda3.run(Unknown Source:4) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:938) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at android.os.Looper.loop(Looper.java:236) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7861) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 02-11 23:26:09.440 24681 24681 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

  1. К сожалению после добавления мной возможности скачивания aqsp игр,игра чашка кофе не скачивается,т.е выдаётся ошибка. Я выяснил,что это связано с тем,что вроде скрипт отдаёт некорректный размер файла. Поэтому в файле gameStockActivity.java в строке 921 я заменил код на:

                    return totalBytesRead >0;

После этого всё заработало.

  1. К сожалению при нажатии кнопки назад не появляется меню,позволяющее закрыть квест плеер,т.е его приходится закрывать через диспетчер приложений.
AlexandrKozlovskiy commented 2 years ago

Также почему-то не распаковывается игра Return of the Hamster,хотя структура архива вполне нормальная. (http://qsp.su/index2.php?option=com_sobi2&sobi2Task=dd_download&fid=369&format=html)

AlexandrKozlovskiy commented 2 years ago

Также в играх чашка кофе и цветохимия вместо некоторых ссылок появляются кракозябры. Как я выяснил,это происходит,если у ссылки нету текста,а есть только изображение,к примеру в такой ссылке:

AlexandrKozlovskiy commented 2 years ago

@seedhartha Когда выше указанные баги будут исправлены,на мой взгляд можно будет выложить новую версию на qsp.su,т.к не все смотрят релизы на github.

AlexandrKozlovskiy commented 2 years ago

Также в игре Jupiter_II player крахнулся на первой главе,когда у меня не было сохранёнок. Видимо это связано с тем,что игра автосохраняется,но второй раз,когда у меня уже были сохранёнки,креш не повторился.

02-15 06:23:35.617 16433 24509 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #132 02-15 06:23:35.617 16433 24509 E AndroidRuntime: Process: com.qsp.player, PID: 16433 02-15 06:23:35.617 16433 24509 E AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground() 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at android.os.AsyncTask$4.done(AsyncTask.java:415) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:252) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:271) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:305) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.lang.Thread.run(Thread.java:923) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: Caused by: java.lang.StackOverflowError: stack size 1043KB 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at libcore.io.Linux.remove(Native Method) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at libcore.io.ForwardingOs.remove(ForwardingOs.java:185) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at libcore.io.BlockGuardOs.remove(BlockGuardOs.java:342) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at libcore.io.ForwardingOs.remove(ForwardingOs.java:185) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at android.app.ActivityThread$AndroidOs.remove(ActivityThread.java:7779) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.io.UnixFileSystem.delete(UnixFileSystem.java:331) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at java.io.File.delete(File.java:1037) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at com.qsp.player.util.GameDirUtil.normalizeGameDirectory(GameDirUtil.java:19) 02-15 06:23:35.617 16433 24509 E AndroidRuntime: at com.qsp.player.util.GameDirUtil.normalizeGameDirectory(GameDirUtil.java:20)

последняя строчка повторяется очень много раз,т.е,на мой взгляд,эта ошибка связана с тем,что не удаётся удалить файл,как это происходит при некорректной распаковке игры,когда файл не удаляется. Также при попытке зайти на корабль (загрузите третий слот),плеер крешится с таким стеком:

02-15 07:51:24.190 27344 27344 E AndroidRuntime: FATAL EXCEPTION: main 02-15 07:51:24.190 27344 27344 E AndroidRuntime: Process: com.qsp.player, PID: 27344 02-15 07:51:24.190 27344 27344 E AndroidRuntime: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:9012) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1690) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.View.requestLayout(View.java:25759) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.View.setLayoutParams(View.java:18336) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.WindowManagerGlobal.updateViewLayout(WindowManagerGlobal.java:458) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:118) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.widget.PopupWindow.update(PopupWindow.java:2223) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.widget.PopupWindow.update(PopupWindow.java:2344) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.widget.PopupWindow.alignToAnchor(PopupWindow.java:2514) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.widget.PopupWindow.lambda$new$0$PopupWindow(PopupWindow.java:272) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.widget.-$$Lambda$PopupWindow$8Gc2stI5cSJZbuKX7X4Qr_vU2nI.onLayoutChange(Unknown Source:16) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.View.layout(View.java:23080) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:6468) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:3586) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3054) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2057) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8360) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1058) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:880) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:813) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1043) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:938) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.os.Looper.loop(Looper.java:236) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7861) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:600) 02-15 07:51:24.190 27344 27344 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)

В общем,@seedhartha,на мой взгляд,если Вы не будете исправлять вышеуказанные баги,лучше отменить релиз в github,если это возможно,не откатывая при этом коммит. Jupiter_II.zip

AlexandrKozlovskiy commented 2 years ago

Первый креш произошёл не в игре юпитер 2,а при попытке распаковки игры играя в богов.

seedhartha commented 2 years ago

При загрузке и запуске игры волшебство под новый год плеер крешится с exception

Исправлено в 2.3.2.

Почему-то не распаковывается игра Return of the Hamster

Проблема на стороне API: возвращается две игры с одним ID. Та, которая в итоге отображается в списке - битая. Не будет исправлено.

com.qsp.player.util.GameDirUtil.normalizeGameDirectory(GameDirUtil.java:20) последняя строчка повторяется очень много раз

Ошибка в алгоритме "нормализации" папки, когда вложенная папка имеет такое же имя, как папка в которой она находится. Исправлено, будет выпущено в 2.3.3.

при попытке зайти на корабль (загрузите третий слот),плеер крешится

Исправлено, будет выпущено в 2.3.3.

при нажатии кнопки назад не появляется меню,позволяющее закрыть квест плеер,т.е его приходится закрывать через диспетчер приложений

Кнопки "закрыть приложение" не будет - в Android так не принято. Но будет кнопка "закрыть игру", которая остановит поток интерпретатора.