From 65ea265282a167f2fd385031eb5a4fb313566e01 Mon Sep 17 00:00:00 2001 From: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Date: Thu, 29 May 2025 19:04:08 -0400 Subject: [PATCH 1/4] initial commit --- docs/docs/guides/obtainium.mdx | 8 ++++++++ docs/src/components/obtainium.tsx | 10 ++++++++++ 2 files changed, 18 insertions(+) create mode 100644 docs/docs/guides/obtainium.mdx create mode 100644 docs/src/components/obtainium.tsx diff --git a/docs/docs/guides/obtainium.mdx b/docs/docs/guides/obtainium.mdx new file mode 100644 index 0000000000000..74f693610c395 --- /dev/null +++ b/docs/docs/guides/obtainium.mdx @@ -0,0 +1,8 @@ +# Obtainium + +Here is a config generator: + +import ObtainiumConfig from '../../src/components/obtainium.tsx'; +import React from 'react'; + + diff --git a/docs/src/components/obtainium.tsx b/docs/src/components/obtainium.tsx new file mode 100644 index 0000000000000..ef3334fedf8fe --- /dev/null +++ b/docs/src/components/obtainium.tsx @@ -0,0 +1,10 @@ +export default function ObtainiumConfig(): JSX.Element { + let inputUrl = 'example.com'; + let obtainiumUrl = `https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22app.alextran.immich%22%2C%22url%22%3A%22${inputUrl}%2Fapi%2Fserver%2Fandroid-links%22%2C%22author%22%3A%22Immich%22%2C%22name%22%3A%22Immich%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%2C%7B%5C%22requestHeader%5C%22%3A%5C%22x-api-key%3A%20${inputApiKey}%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%2Fv(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B)%2F%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%241.%242.%243%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22app-release%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D`; + return ( +
+ + hello +
+ ); +} From 6ce6a772e043d22d1180b987d3740375c5efc3f3 Mon Sep 17 00:00:00 2001 From: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Date: Thu, 29 May 2025 20:50:43 -0400 Subject: [PATCH 2/4] make a working but kinda ugly config generator --- docs/docs/guides/obtainium.mdx | 2 +- docs/src/components/obtainium.tsx | 78 ++++++++++++++++++++++++++-- docs/static/img/obtainium-badge.png | Bin 0 -> 25845 bytes 3 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 docs/static/img/obtainium-badge.png diff --git a/docs/docs/guides/obtainium.mdx b/docs/docs/guides/obtainium.mdx index 74f693610c395..41e737babf7fa 100644 --- a/docs/docs/guides/obtainium.mdx +++ b/docs/docs/guides/obtainium.mdx @@ -2,7 +2,7 @@ Here is a config generator: -import ObtainiumConfig from '../../src/components/obtainium.tsx'; +import ObtainiumConfig from '@site/src/components/obtainium.tsx'; import React from 'react'; diff --git a/docs/src/components/obtainium.tsx b/docs/src/components/obtainium.tsx index ef3334fedf8fe..b742cc2c578c6 100644 --- a/docs/src/components/obtainium.tsx +++ b/docs/src/components/obtainium.tsx @@ -1,10 +1,80 @@ +import React, { useState } from 'react'; export default function ObtainiumConfig(): JSX.Element { - let inputUrl = 'example.com'; - let obtainiumUrl = `https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22app.alextran.immich%22%2C%22url%22%3A%22${inputUrl}%2Fapi%2Fserver%2Fandroid-links%22%2C%22author%22%3A%22Immich%22%2C%22name%22%3A%22Immich%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%2C%7B%5C%22requestHeader%5C%22%3A%5C%22x-api-key%3A%20${inputApiKey}%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%2Fv(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B)%2F%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%241.%242.%243%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22app-release%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D`; + let [inputUrl, setInputUrl] = useState(''); + let [inputApiKey, setInputApiKey] = useState(''); + let [archVariant, setArchVariant] = useState(''); + let obtainiumUrl = `https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22app.alextran.immich%22%2C%22url%22%3A%22${inputUrl}%2Fapi%2Fserver%2Fandroid-links%22%2C%22author%22%3A%22Immich%22%2C%22name%22%3A%22Immich%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%2C%7B%5C%22requestHeader%5C%22%3A%5C%22x-api-key%3A%20${inputApiKey}%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%2Fv(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B)%2F%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%241.%242.%243%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22${archVariant}%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D`; + return (
- - hello +

Enter values into the inputs to get a link.

+
+ +
+ +

+ Variant:{' '} + + + + +

+
+
); } diff --git a/docs/static/img/obtainium-badge.png b/docs/static/img/obtainium-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..f7cdea73fb2559617b6f1f65dd65bb96e702cf9b GIT binary patch literal 25845 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 Jw^SP!^56OLNwfd} literal 0 HcmV?d00001 From 3f9ac57ba7932524e74833451cb58d4c25d0686e Mon Sep 17 00:00:00 2001 From: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Date: Sat, 2 Aug 2025 18:16:32 -0400 Subject: [PATCH 3/4] update the link --- docs/src/components/obtainium.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/components/obtainium.tsx b/docs/src/components/obtainium.tsx index b742cc2c578c6..d2779eefdaa9a 100644 --- a/docs/src/components/obtainium.tsx +++ b/docs/src/components/obtainium.tsx @@ -3,7 +3,7 @@ export default function ObtainiumConfig(): JSX.Element { let [inputUrl, setInputUrl] = useState(''); let [inputApiKey, setInputApiKey] = useState(''); let [archVariant, setArchVariant] = useState(''); - let obtainiumUrl = `https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22app.alextran.immich%22%2C%22url%22%3A%22${inputUrl}%2Fapi%2Fserver%2Fandroid-links%22%2C%22author%22%3A%22Immich%22%2C%22name%22%3A%22Immich%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%2C%7B%5C%22requestHeader%5C%22%3A%5C%22x-api-key%3A%20${inputApiKey}%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%2Fv(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B)%2F%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%241.%242.%243%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22${archVariant}%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D`; + let obtainiumUrl = `https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22app.alextran.immich%22%2C%22url%22%3A%22${inputUrl}%2Fapi%2Fserver%2Fapk-links%22%2C%22author%22%3A%22Immich%22%2C%22name%22%3A%22Immich%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%2C%7B%5C%22requestHeader%5C%22%3A%5C%22x-api-key%3A%20${inputApiKey}%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%2Fv(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B).(%5C%5C%5C%5Cd%2B)%2F%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%241.%242.%243%5C%22%2C%5C%22versionDetection%5C%22%3Atrue%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22${archVariant}%24%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D`; return (
From 67ba41e6c84a622288b10e0640fbbe53ab7e607b Mon Sep 17 00:00:00 2001 From: Nicholas Flamy <30300649+NicholasFlamy@users.noreply.github.com> Date: Sat, 2 Aug 2025 18:52:37 -0400 Subject: [PATCH 4/4] add link to guide to mobile app downloads --- docs/docs/partials/_mobile-app-download.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/partials/_mobile-app-download.md b/docs/docs/partials/_mobile-app-download.md index 72a3053440d34..f925eee23ecf3 100644 --- a/docs/docs/partials/_mobile-app-download.md +++ b/docs/docs/partials/_mobile-app-download.md @@ -1,5 +1,6 @@ The mobile app can be downloaded from the following places: +- [Obtainium](/docs/guides/obtainium.mdx) - [Google Play Store](https://play.google.com/store/apps/details?id=app.alextran.immich) - [Apple App Store](https://apps.apple.com/us/app/immich/id1613945652) - [F-Droid](https://f-droid.org/packages/app.alextran.immich)