Giter Site home page Giter Site logo

radiokot / photoprism-android-client Goto Github PK

View Code? Open in Web Editor NEW
339.0 6.0 25.0 7.83 MB

📸 A convenient Android gallery for your PhotoPrism library with plenty of useful features

Home Page: https://radiokot.com.ua/p/photoprism-android-gallery

License: GNU General Public License v3.0

Kotlin 93.87% Java 2.52% HTML 3.60%
android gallery kotlin photoprism kotlin-android self-hosted exoplayer koin foss

photoprism-android-client's Introduction

Icon Gallery for PhotoPrism

GitHub discussions GitHub contributors Sponsors

This Android app brings a convenient mobile gallery experience for PhotoPrism.

It does not support all the official web app functionality, but nevertheless has plenty of useful features:

  • Sending photos or videos to Gmail, Telegram or any other app
  • Grouping the content by days and months
  • Chronological scroll bar that lets you quickly jump to a specific month
  • Configurable search
  • Search bookmarks that let you save search configurations and apply them later
  • Enhanced live photo viewer, looks best with Samsung and Apple shots
  • Full-screen slideshow with video support
  • Endless session without the need to re-enter the password
  • Connection to both private and public libraries
  • Support of mTLS (mutual TLS), HTTP basic and web portal authentication (Authelia, Cloudflare Access, etc.)
  • TV compatibility to easily browse your library with a remote-control (Search is only available with a mouse for now. How to install)

The gallery is not intended to sync content with the library. I recommend using Autosync app.

Compatibility

The gallery is confirmed to work with PhotoPrism versions from November 28, 2023 down to October 9, 2021. It may work with older ones though, I just haven't tested it. The app uses PhotoPrism Web Service API, which serves only the original frontend needs and doesn't guarantee backward compatibility. When a new version of PhotoPrism comes out, the app may break.

Download

APK APK from the latest release

F-Droid F-Droid

Google Play Google Play

Sponsors

Florian Voswinkel Koen Koppens Radon Rosborough Michael Mayer Neil Castelino Theresa Gresch Seth For Privacy C-Iaens Tobias Fiechter ippocratis
…and 3 anonymous sponsors.

I am very grateful to everyone supporting this project ❤️ To join this public list, email me the transaction reference once it is complete.  

License

I reject the concept of intellectual property. Claiming ownership over information that can be replicated perfectly and endlessly is inherently flawed. Consequently, any efforts to uphold such form of ownership inevitably result in some people gaining unjustifiable control over other's tangible resources, such as computers, printing equipment, construction materials, etc. 1 When talking specifically about source code licensing – without a state violently enforcing copyright monopolies, it would be ludicrous to assume that a mere text file in a directory enables someone to restrict processing copies of this information by others on their very own computers. However, there is such a file in this repository bearing the GPLv3 license. Why?

One would expect someone with such an attitude to not use the license at all, use a permissive license, or explicitly unlicense. But for me, to do so is to voluntarily limit my means of defense. To act as a gentleman with those who readily exploit state violence against you is to lose. In a world where copyright monopolies are violently enforced, I choose GPLv3 for the software I really care for, because under the current circumstances this license is a tool that:

  • Allows others to freely use, modify and distribute this software, without the risk of being sued;
  • Enables me to pull all the valuable changes from public forks back to the trunk, also without the risk of being sued;
  • Knocks down a peg individuals or companies willing to monopolize their use case or modifications of this software.

Tech stack

  • Kotlin
  • RxJava
  • Koin dependency injection
  • OkHTTP networking + Retrofit
  • Room database
  • kotlin-logging with slf4j-handroid
  • Picasso for images & ExoPlayer for videos
  • FastAdapter
  • ViewModel

photoprism-android-client's People

Contributors

a37052800 avatar baturax avatar cgcel avatar ippocratis avatar misebco avatar ondoteam avatar radiokot avatar vhaudiquet avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

photoprism-android-client's Issues

unconverted raw files are shown in the gallery

What is wrong?
It's not much of a big, but it's an annoying feature. In my gallery, along with jpegs unconverted raw files are displayed. On the web app they are not present.

To Reproduce
Steps to reproduce the behavior:

  1. Import folders that contain both raw and jpeg files
  2. Do not convert raws
  3. In the gallery app, raw files will be displayed as a "blank" image, while in the web app they won't be displaued

Expected behavior
Unconverted raw files should be ignored

Screenshots
If applicable, add screenshots to help explain your problem.
Screenshot_20240201-110033

Device (please complete the following information):

  • Model: Fairphone 4
  • Android version: 13

Thank you for your attention and your fantastic app!

Different views

It would be great if we could change the default view of the pictures. Even changing the style would be great like a mosaic type view and size.

Translations needed for new strings 🇹🇷 🇬🇷 🇨🇳 🇮🇹

I'm preparing the app to be featured on the PhotoPrism partners page and have added some clarifying elements to the app: the welcome screen and extra preference items.
Please, help me translate the newly added strings to Turkish, Greek, Chinese and Italian🙏🏻 The most important are the welcome screen title and disclaimer.

Welcome screen

Title:

Welcome to the gallery

Disclaimer:

Please note that this app is not an official PhotoPrism client.
It is maintained by Oleg\u00A0Koretsky (Radiokot) and has no relationship to the core team.\n\n
If something is wrong with the app, please leave a feedback on Google Play,
<a href="#issue">submit a bug report</a> or send a letter to 
<a href="mailto:[email protected]">[email protected]</a>.\n\n
Thank you.

Preferences

User guide:
User guide

Open-source licenses:
Used open-source software

Version info author and contributors:
Oleg Koretsky and contributors from GitHub

Videos taken in portrait mode are not rotated properly on Android TV

What is wrong?
Any video on an Android TV, plays back stretched and not rotated to fit on the screen.
The same videos work fine on several android phones I've tried.

To Reproduce
Steps to reproduce the behavior:

  1. Sideload the apk on an Android TV
  2. Play any video taken in portrait

Expected behavior
The video plays as it was taken, same way it does on an android phone.

Screenshots
IMG20230802163940

Device (please complete the following information):

  • Model: TCL 55EP660
  • Android version: 9

Mutual tls client certificate [feature request]

I am reverse proxying photoprism with caddy and i have configured it to use mutual tls with selected services it proxies adding the corenspodimg directive to them

I have installed the p12 client cert to the amdroid store

With the PWA it was easy
since it opens in a browser and the browser picks the client cert from the device cert store

Mutual tls will add an extra security layer to the app

Example app using it
bitfireAT/davx5-ose@3689df1

Thanks
keep up

Be a Muzei provider

It would be amazing if this app could register a Muzei wallpaper provider so that Muzei could use the photos in a bookmarked search.

This is something I have dreamed of having the time to implement myself. If I ever try it I shall be sending you a PR 😁

Unable to scroll up to recent photos after the use of the sidebar

What is wrong?
If you use the sidebar to jump to a specific date , landing on that date you can't scroll up to more recent dates only scroll down to past dates. You have to use the sidebar again to move to more recent photos than the landed date

To Reproduce
Use the sidebar on the feed
You cant Scroll up and have to use the sidebar again

Expected behavior
User could scroll up and down to past and recent photos after the sidebar is used

Screenshots

Device (please complete the following information):

Additional context
Not sure if thats a bug.
Most likelly this behaviour was intended
Maybe this will be more suited as a feature request?

Translations request

Hi, I like this app after using it, I'd like to help with Chinese translations, is there any plan about it?

Add possibility to Ignore self-signed certificate warning

Hi!
First off, thanks for the great work you're doing!
I have a local instance of Photoprism, running with a self-signed certificate.

The app fails to connect to my instance because of a SSLHandshakeException.
Would it be possible to add an "Accept self-signed SSL certificates" option?

Cheers

Failed to load the preview

What is wrong?
When clicking on a thumbnail a loading animation is shown and then the error "Failed to load the preview" is shown.

To Reproduce
Steps to reproduce the behavior:

  1. Go to 'select any picture from the starting picture Overview"
  2. Click on 'the picture you want to see in fullscreen"
  3. See error

Expected behavior
The picture in fullscreen.

Screenshots
Screenshot_20230924-081244_1
Screenshot_20230924-081519_1

Device:

  • Model: Pixel 6a
  • Android version: 13

Additional context
No Errors in the Server Side logs. All requests are answered with http 200. Access to the fullscreen Image from the web Interface works as expected.

Too little time until SocketTimeoutException

What is wrong?
My Photoprim library contains about 175000 images and is on an old HDD in my NAS.
Login via browser takes roughly 25 seconds.
When trying to log in with the app, I get a SocketTimeoutException after 10 seconds, so I am unable to use the app.

To Reproduce
Steps to reproduce the behavior:

  1. Have the library on a device with slow hardware
  2. Have lots of images in the library
  3. Try to log in via app
  4. See error

Expected behavior
I expect to be able to log in successfully

Screenshots
Browser:
Screenshot_20230709-022341.png

App:
Screenshot_20230709-022416.png

Device (please complete the following information):

  • Model: Google Pixel 5
  • Android version: 13

Additional context
I understand that for most people a timeout of 10s is enough since oftentimes it means you're really not able to reach the configured endpoint. But maybe there is a different way of recognizing if it's reachable so that a longer socket timeout could be used.

failed to download the file

What is wrong?
While watching videos after some assersts are downloaded and viewed the app refuses to download another one until it is restarted

To Reproduce
Select video type and start watching videos

Screenshots
Screenshot_20230412-151251_PhotoPrism Gallery

Device (please complete the following information):

  • Model: [redmi note 9s]
  • Android version: [13]
  • custom rom , rooted, unlocked bootloader, sandboxed play store

Additional context
Captured log

downloadFile(): error_occurred:
url=https://xxxxxxxxxx.com/api/v1/dl/537b4b7858d8b4d8baf56fe9457129ca18d1f008?t=ytrszspk
java.net.SocketTimeoutException: timeout
 at okhttp3.internal.http2.Http2Stream$StreamTimeout.newTimeoutException(Http2Stream.kt:677)
 at okhttp3.internal.http2.Http2Stream$StreamTimeout.exitAndThrowIfTimedOut(Http2Stream.kt:686)
 at okhttp3.internal.http2.Http2Stream$FramingSource.read(Http2Stream.kt:382)
 at okhttp3.internal.connection.Exchange$ResponseBodySource.read(Exchange.kt:276)
 at okio.RealBufferedSource.read(RealBufferedSource.kt:189)
 at okio.ForwardingSource.read(ForwardingSource.kt:29)
 at ua.com.radiokot.photoprism.util.downloader.ProgressResponseBody$wrapSource$1.read(ProgressResponseBody.kt:31)
 at okio.RealBufferedSource.readAll(RealBufferedSource.kt:284)
 at ua.com.radiokot.photoprism.util.downloader.OkHttpObservableDownloader.download$lambda$3(OkHttpObservableDownloader.kt:71)
 at ua.com.radiokot.photoprism.util.downloader.OkHttpObservableDownloader.$r8$lambda$XFzdA4SLAvEP5mT21JqX1PCDJAQ(Unknown Source:0)
 at ua.com.radiokot.photoprism.util.downloader.OkHttpObservableDownloader$$ExternalSyntheticLambda0.subscribe(Unknown Source:6)
 at io.reactivex.rxjava3.internal.operators.observable.ObservableCreate.subscribeActual(ObservableCreate.java:41)
 at io.reactivex.rxjava3.core.Observable.subscribe(Observable.java:13262)
 at io.reactivex.rxjava3.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
 at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644)
 at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
 at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
 at java.util.concurrent.FutureTask.run(FutureTask.java:264)
 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:307)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
 at java.lang.Thread.run(Thread.java:1012)

Crash on loading gallery

What is wrong?
The app crashes when loading the gallery. On first launch I could enter my server address and credentials, but the app crashed after login. Server details have been stored as I don't have to enter them again, but the app crashes directly after opening.

I see a loading screen (search box and spinner) for about 1 second before crashing.

To Reproduce
Steps to reproduce the behavior:

  1. Open Photoprism Gallery

  2. Login (HTTPS, server in /photoprism subdir, with authentication)

  3. Crash

  4. Re-open app

  5. Crash

Expected behavior
Expected to see the main view with photo gallery.

Device (please complete the following information):

  • Model: Google Pixel 6a
  • Android version: 13

Additional context
I have tried version 1.5.1, 1.5.0 and 1.4.0 from f-Droid, the APK from Github and the version from Google Play Store. All show the same crash.

I see no error output from my Photoprism server.

Logcat logs

--------- beginning of crash
04-26 14:06:52.490 10377 10377 E AndroidRuntime: FATAL EXCEPTION: main
04-26 14:06:52.490 10377 10377 E AndroidRuntime: Process: ua.com.radiokot.photoprism, PID: 10377
04-26 14:06:52.490 10377 10377 E AndroidRuntime: java.lang.IllegalStateException: Two different ViewHolders have the same stable ID. Stable IDs in your adapter MUST BE unique and SHOULD NOT change.
04-26 14:06:52.490 10377 10377 E AndroidRuntime:  ViewHolder 1:ViewHolder{8cc0c12 position=4 id=-532034660, oldPos=-1, pLpos:-1 not recyclable(1)} 
04-26 14:06:52.490 10377 10377 E AndroidRuntime:  View Holder 2:ViewHolder{ec5a5c1 position=0 id=-532034660, oldPos=-1, pLpos:-1 not recyclable(1)} androidx.recyclerview.widget.RecyclerView{28e1527 VFED..... ......ID 0,231-1080,2667 #7f0a0116 app:id/gallery_recycler_view}, adapter:com.mikepenz.fastadapter.FastAdapter@633dde0, layout:androidx.recyclerview.widget.GridLayoutManager@cefe899, context:ua.com.radiokot.photoprism.features.gallery.view.GalleryActivity@38b9ea0
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at androidx.recyclerview.widget.RecyclerView.handleMissingPreInfoForChangeError(RecyclerView.java:4442)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:4366)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:4031)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4578)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.google.android.material.appbar.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:149)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.google.android.material.appbar.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:43)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:2376)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:918)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1891)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1729)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.LinearLayout.onLayout(LinearLayout.java:1638)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.widget.FrameLayout.onLayout(FrameLayout.java:270)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.android.internal.policy.DecorView.onLayout(DecorView.java:799)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.View.layout(View.java:23716)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewGroup.layout(ViewGroup.java:6413)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4097)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3438)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2350)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9194)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1231)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1239)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.Choreographer.doCallbacks(Choreographer.java:899)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.Choreographer.doFrame(Choreographer.java:832)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1214)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.os.Handler.handleCallback(Handler.java:942)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:99)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.os.Looper.loopOnce(Looper.java:201)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:288)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:7884)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
04-26 14:06:52.490 10377 10377 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Higher resolution photos (not downscaled) never load

What is wrong?
On both my android phones and the Android TV, high resolution photos never load. Sometimes (especially on the Android TV) the app crashes. This is not an issue for the official photoprism PWA app.

An example of such a case is a photo taken with my phone:
JPEG 8192x6144, 6.8 MBs

When I enable downscaling, things work fine for some of the photos, others continue to fail loading.

To Reproduce
Steps to reproduce the behavior:

  1. Browse any photo that has high resolution.

Expected behavior
All photos should -eventually- load (up to a reasonable size/resolution)

Screenshots

Device (please complete the following information):

  • Model: TCL 55EP660

  • Android version: 9

  • Model: OnePlus Nord 2

  • Android version: 13

HTTPS not working

Trust anchor for certification path not found

This error occurs when trying to use HTTPS secured url

  1. But if I use https://demo.photoprism.app it works without error and logged in without error.

  2. And later i logout the demo photoprism and I try my personal cloud storage it logins successful and entire personal gallery loads without error.

3)once I close the App from task manager and again i open the APP it gives error "trust anchor for certification not found"

Clearing data and trying to login to personal cloud it gives same issue.

  1. To solve it temporarily i have to logout my cloud storage and repeat step 1) and 2) and it solves the issue until i close the app from task manager and the app gives same error for HTTPS.

I tried the PKCS12 client certificate its same issue with and without the certificate its no difference.

My HTTPS is provided from Letsencrypt and web version is working fine on chrome browser.

Login Demo > logout Demo > Personal Cloud login >

PhotoPrism Gallery does not reach library when on the same network as the library

Hello, I have encountered a issue in the PhotoPrism Gallery v1.17.0 where if you are on the same network as as the PhotoPrism server, the app will not be able to reach the library.

My set up:
I have PhotoPrism docker running on a unraid server on my home network. The URL for PhotoPrism is set to the default "http://[email protected]:2342/originals/"
I set up a SWAG reverse proxy through Duck DNS. The URL is "customURL.duckdns.org".
I have successfully linked those in unraid, so now when use my phone or computer browser and I go to "https://customURL.duckdns.org" PhotoPrism loads. I can access Photoprism this way both on my network and off my network.
I have the PhotoPrism Gallery app library root URL set to "customURL.duckdns.org".

The app is able to connect to the library when on any other network than my home network (the one that hosts PhotoPrism).
Once I turn on wifi at home the app says it can not connect to the library. However I am still able to reach PhotoPrism's GUI via the web browser on while on the same network on the same phone.

Admittedly, I am not the most adept at networking or setting up reverse proxies. So the issue could be on my end. However it is odd to me that while the app can not reach the library when on my wifi the mobile browser can.

GitHub sponsors

Are you open to setting up GitHub sponsors? I'd like to support your work here and GitHub sponsors makes it really easy to do so! :)

Offline mode [feature request]

Being able to navigate a bit in the app
while it is indeed snapy I think it suffers from on of the basic disadvantages the pwa do
There is no offline mode
Being a proper android app maybe there is a way to cache the alreafy cahed thumbnails and photos/videos for ofline view
to take it even further an option to predownload all thumbnails would also probably make sense for even faster scrolling thumbnail loads

Example app that does the same (the pre-caching).
It is a Kotlin android client for another popular photo managment app librephotos savvasdalkitsis/uhuruphotos-android@ebd77b0

On the other hand I'm not sure this is even doable with web service api (or maybe it is totaly indipended from the api?)

Thanks
keep up

Video-format is hardcoded, should be dynamic

What is wrong?

Photoprism allows the specify the video format in which the video should be streamed/downloaded: https://github.com/photoprism/photoprism/blob/ce4cb6bd47cc/internal/api/video.go#L25

At the moment, in photoprism-android-client the video is hardcoded to avc: https://github.com/Radiokot/photoprism-android-client/blob/main/app/src/main/java/ua/com/radiokot/photoprism/features/gallery/logic/PhotoPrismPreviewUrlFactory.kt#L43

It should be great if the requested video format should be dynamic.

Background-Info:

I´m running photoprism convert in a cronjob to transcode all my videos so that the videos can get streamed instantly. The convert command transcode the videos in a lower bitrate so that my device can display these also in low-network-situations.

That works fine with the photoprism-web-ui. But when using the mobile app, photoprism triggers a transcode on the fly even for example the hevc format already exists as a transcoded video, because at the moment avc is getting requested.

The codec can be getted from the rest api:

[
  {
    "ID": "21866-40001",
    ....
    "Files": [
      {
        "UID": "fs194zdqar778v1f",
        "PhotoUID": "ps194zb1ttfvybb0",
        ...
        "FileType": "jpg",
        "MediaType": "image",
        "Mime": "image/jpeg"
      },
      {
        "UID": "fs194zb2mn8quou0",
        "PhotoUID": "ps194zb1ttfvybb0",
        ....
        "Codec": "hvc1",  # here is the codec. hvc1 is hevc in the rest api, avc1 is avc (the current default)
        "FileType": "mp4",
        "MediaType": "video",
        "Mime": "video/mp4",
        ....
      }
    ]
  },

Downloading or sharing stuck

What is wrong?
When clicking either the download or share button, the progress bar or icon at the bottom will continue to "spin" but never actually complete.

I can see the data is pulled to the device (by a network speed indicator), but then never finishes the process. If I click to the side to exit the download status pop-up, nothing has happened. There is no photo downloaded anywhere on the device

To Reproduce
Steps to reproduce the behavior:

  1. Go to any photo.
  2. Click download or share.

Expected behavior
The photo is downloaded to the device.

Screenshots
I can add if needed but there isn't anything to show.

Device (please complete the following information):

  • Model: Asus Zenfone 8 and a Huawei p20 lite
  • Android version: 13 and 9

Additional context
Version 1.23.0 from fdroid.

fatal exceptions

For starters thanks so much for the app
I'm a selfhoster and mostly viewing photos on my phone
so
I was very excited when I saw an active android client for the most popular (and probably most stable) photo managment software photoprism.
Unfortunately the app crashes on my device

OS: android 13 , sparkOS (custom rom), unlocked bootloader, rooted

Photoprism build: 221118-e58fee0fb

Grabed some logs
App Logins and open fine
but crashes as long as I try to scroll in the timeline

logcat_scroll_timeline.txt

If I tap on one of the firsy images without scrolling it opens and I can swipe left to the other images for some time before it crashes
logcat_image_view-swipe.txt

Thanks and keep up

Cannot download video

Hi, first of All thanks for this awesome app. I really like the native Integration into Android and I'm looking forward to see more features coming!

I noticed that I'm not able to download videos. If I open a video, the app opens the preview image and if I click on the download button, it opens a dialogs "select media file" where I can choose the preview image or the video, but I can't click on anything.

PhotoPrism Folder View

Finally something akin to Nextclouds various gallery apps. This is already running stably, super fast and responsive, at least on my end. Really excited to see how this develops!

Not sure how feasible this is but one feature that would increase the apps utility would be an ability to view PhotoPrism folders.

Cannot exit selection mode

What is wrong?
Once a photo has been selected, you cannot exit selection mode without closing the application.

To Reproduce
Steps to reproduce the behavior:

  1. Open the application
  2. Hold tap on a photo
  3. Try to click the 'X' button on the bottom
  4. See error

Expected behavior
The application should exit selection mode

Screenshots
IMG_20230805_141813.jpg

Device (please complete the following information):

  • Model: OnePlus Nord N20 5G
  • Android version: 12
  • System language: Italian (but I am a native English speaker)
  • Location: USA

Additional context
I installed the latest version from F-droid today.

Android TV exit from app

What is wrong?
In google Chromecast 4k, I have installed latest version 1.22. All pictures are displayed fine, including slideshow. When I try to play a video, it throw me out of app without any error. The videos are using Hevc codec and are full hd only.
In my phone, everything is playing fine, including videos.

Device (please complete the following information):

  • Model: Google Chromecast 4k
  • Android tv 12

Support for Auhtelia

Hi!

Do you think it's possible to add support for Authelia authentication ?

Thanks

Kotlin Exception on PhotoPrismMergedPhoto$File

What is wrong?
the already configured app (http protocol, local ip, no user/password) crashes when loading photos from photoprism server

To Reproduce
Steps to reproduce the behavior:

  1. open app
  2. loading icon shown for some seconds
  3. crash

Expected behavior
show photos / photo gallery

Screenshots
screenshot

Device (please complete the following information):

  • Model: Google Pixel 8 Pro
  • Android version: 14

Additional context

  • your app is the latest version 1.20.2 from fdroid
  • photo prism server version 211018-e200f322; web interface works fine; older version of your app worked also fine with my old mobile (android 11)

Can't connect to my library

What is wrong?
Error "Library is not accessible: HTTP 404" when i try to connect to my library. My URL is correct, I can connect to this in browser.

To Reproduce
Steps to reproduce the behavior:

  1. Go to my library's URL
  2. Enter my login and password
  3. See error

Screenshots
Screenshot_20230920-131046~2.png

Device:

  • Model: [e.g. Pixel 6a]
  • Android version: [e.g. 13]
  • App version 1.18.0

Additional context
Router keenetic Kn-1010, I use keendns.

refresh on long pull

What is wrong?
On long pull from the top, the app does not talk back to the server to get a refreshed list of items. The list that is rendered is generated on app start-up. After that, no matter how many times I pull down, it doesn't refresh.

To Reproduce
Steps to reproduce the behavior:

  1. Open app
  2. Get an initial list of items
  3. Add items on the remote server
  4. Index items on remote server
  5. Refresh on this app

Expected behavior
Newly indexed items should reflect

Device (please complete the following information):

  • Model: Google Pixel 7
  • Android version: 13

Additional context
Take a look at the PWA app. It does refresh on pull down.

Albums are sorted from newest to oldest

In the search library, I want the albums to be sorted from newest to oldest. Because when entering the search, the first reaction may be to want to see the most recent album.

Thank you.

Live Photos always play the video portion and don't show the actual photo

What is wrong?
When I open a Live Photo on the app it starts playing the video automatically, I can't find any way to stop the video and just see the photo.

To Reproduce
Steps to reproduce the behavior:

  1. Open a Live Photo in the app.

Expected behavior
There should be a button to stop the video and just show the photo, maybe by pressing on the video too.

Screenshots

Device (please complete the following information):

  • Model: Google Pixel 6
  • Android version: 13

Failed to load the contend

Hello, I am unable to use this application.

After entering my URL and credentials, I've got this error :

Screenshot_2023-03-25-18-48-12-88_54b4ff97b4165ae42c8f5e9bdd7817b2.jpg

Selecting an image after opening in the built in web browser makes the image disappear from screen

What is wrong?
After opening an image in the built in web browser, it will disappear from screen if you long press to select that image. The selection menu appears as usual, but the image has been moved below the screen. The user can then scroll down to see the selected image, but the experience is a little jarring.

To Reproduce
Steps to reproduce the behavior:

  1. Go to any photo in the app
  2. Click on the three dot menu in the top right
  3. Click on "Open in web browser"
  4. Press and hold on the image that appears to select it
  5. See error - the image is out of view

Expected behavior
After selecting the photo in step 4, it should remain on screen so the user has the visual feedback that it is selected

Screenshots
If applicable, add screenshots to help explain your problem.

Device (please complete the following information):

  • Model: Google Pixel 4a
  • Android version: 13, modded with the CalyxOS rom

Additional context
This issue does not appear on the native web browser (Chromium and FireFox). I can help debug if needed.

Add support for listing albums

Firstly thanks for the awesome app. One thing that I use heavily in Photoprism is the albums feature, being able to quickly list the albums (I managed to search for them and then bookmark a couple) would be amazing!

Android TV user interface issues

What is wrong?
When using the App on Android TV a few issues occur.

  • The current photo is not marked when navigating with keyboard. Only the search bar is highlighted. Therefore it's nearly impossible to select the correct photo to open.
  • Once a photo has been opened, it's not possible to navigate through the photos by clicking back and forth on the keyboard. Also it's not possible to reach the other UI elements (e.g. download). Only back button works.
  • When entering the search it's impossible to enter text in the search bar (at least I haven't managed to do so). Selecting album and type works.
  • It seems to be impossible to click on "reset" or "search" within the search as it can not be reached via keyboard.

To Reproduce
Steps to reproduce the behavior:

  1. Install apk via side loading to an Android TV device
  2. Open the app

Expected behavior
Navigation is possible on Android TV devices via keyboard / remote control.

Device (please complete the following information):

  • Model: nVidia Shield Pro
  • Android version: Shield Android TV 9.1.1 (Android 11)

Additional context
Navigation only possible via remote control / keyboard

Scrollbar Behaviour

What is wrong?
The scroll bar has currently a weird behaviour, which shows in two use cases:

  • the bar isn't visible always, at least on my phone it's really tricky to access it
  • I got one picture from 2004 in my library, the other images are from 2015+. The scroll bar takes the half of my screen to navigate through my library, even there are no images:
  • when using the scroll bar to scrolling into a date, all images in the future relative to the scrolled date aren't visible. You have to do a new scroll to get to those images.

Screenshots
If applicable, add screenshots to help explain your problem.

Device (please complete the following information):

  • Model: Google Pixel 7
  • Android version: 14

Swipe to review?

Would love it if the app could provide a swipe left / right interface to approve / deny photos in the review list.

I have thousands of pics in review and this would help eventually get the list down to zero.

Possibly a niche request 🤷

Authelia redirection not working

What is wrong?
Hi thank you for this app, while looking at the latest release I realized that Authelia should now be supported but I don't get redirected to the auth portal.

To Reproduce
I reset the app then tried to log in using the base URL but no redirection happens, the app just reports the 401 error.

Expected behavior
The web browser opening to the auth portal.

Screenshots
share_3316446001017637086.jpeg

Device (please complete the following information):

  • Pixel 6 pro
  • Android version: 14

Additional context
Logs from the Authelia server:

authelia-wzgxp authelia time="2024-03-03T17:59:20+01:00" level=info msg="Access to https://photos.example.com/api/v1/session (method POST) is not authorized to user <anonymous>, responding with status code 401 with location redirect to https://auth.example.com/?rd=https%3A%2F%2Fphotos.example.com%2Fapi%2Fv1%2Fsession&rm=POST" method=GET path=/api/verify remote_ip=1.2.3.4

App ignores installed root CA certificate on device and connection fails

What is wrong?

  • Latest version from Play Store, 1.2.4.1
  • Trying to set Library root URL to https://<ourPhotoPrismHost>:2342 leads to error:
  • Library is not accessible: SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
  • Our home PhotoPrism instance runs with a self signed TLS certificate.
  • Root CA certificate was installed on our Android devices
  • Tried with Android 14, latest PixelOS (several different devices) and Samsung A53 current OTA Samsung version
  • Connection to PhotoPrism instance via browser works with self signed certificate and installed root certificate. Works without setting up a browser exception rule for self signed TLS certificate.

To Reproduce
Steps to reproduce the behavior:

  1. Set up local PhotoPrism with self signed TLS certificate and own root CA certificate
  2. make sure own root CA certificate is installed on device
  3. verify TLS works with browsers without certificate manual rule in browser but with installed root CA only
  4. Try to connect PP Gallery with PP instance

Expected behavior
PP Gallery takes own installed root CA into account and accepts the self signed certificate.

Screenshots
share_8508605572797421237

Device (please complete the following information):

  • Model: Xiaomi M21016G, PixelOS, Android 14, security update 5th January
  • Model: Samsung A53, Android 14 current OTA
  • Model: Xiaomi Redmi Note 8T, PixelOS, Android 14

Additional context
Add any other context about the problem here.

Pinch-to-zoom doesn't work as expected

Discussed in #117

Originally posted by dronnikovigor January 9, 2024
When i open photo and try to zoom with 2-finger-gestue it just moves the photo. The only way is to zoom with double tap. And then you can use pinch-to-zoom. Sometimes it's not so convinient.

InShot_20240117_132141350.mp4

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.