Compare commits
17 Commits
feature/ap
...
v0.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
| f18285b853 | |||
| 88e7d0cf6b | |||
| 6a11a0e0d7 | |||
| f2d36798ba | |||
| 6b89925ab8 | |||
| edefcab01c | |||
| c41394e116 | |||
| c6c00d1e4b | |||
| c00e9c83c9 | |||
| 0f9d28de61 | |||
| 432185a92d | |||
| 89509418be | |||
| bd7306ecf2 | |||
| c5053e70db | |||
| c744f3bcc5 | |||
| 174da803ec | |||
| ca9e360bfd |
@@ -1,5 +1,8 @@
|
|||||||
name: Android Build Final Fixed
|
name: Android Build Final Fixed
|
||||||
on: [push]
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
tags: ["v*"] # Triggert bei v0.1.0, v1.0, etc.
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-android:
|
build-android:
|
||||||
@@ -53,23 +56,51 @@ jobs:
|
|||||||
export PATH="$HOME/.cargo/bin:$PATH"
|
export PATH="$HOME/.cargo/bin:$PATH"
|
||||||
export ANDROID_HOME=$HOME/android-sdk
|
export ANDROID_HOME=$HOME/android-sdk
|
||||||
export NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393
|
export NDK_HOME=$ANDROID_HOME/ndk/25.1.8937393
|
||||||
|
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
|
||||||
|
|
||||||
# 1. Frontend mit Trunk bauen
|
# 1. Frontend bauen
|
||||||
trunk build --release
|
trunk build --release
|
||||||
|
|
||||||
# 2. Android APK bauen
|
# 2. Android Build
|
||||||
if [ ! -d "src-tauri/gen/android" ]; then
|
if [ ! -d "src-tauri/gen/android" ]; then
|
||||||
cargo-tauri android init
|
cargo-tauri android init
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cargo-tauri android build --target aarch64 --apk true
|
cargo-tauri android build --target aarch64 --apk true
|
||||||
|
|
||||||
|
# 3. APK manuell signieren
|
||||||
|
echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | tr -d '[:space:]' > keystore.b64
|
||||||
|
base64 -d keystore.b64 > release.keystore
|
||||||
|
|
||||||
|
UNSIGNED_APK=$(find src-tauri/gen/android/app/build/outputs/apk/universal/release -name "*-unsigned.apk" | head -n 1)
|
||||||
|
APKSIGNER=$(find $ANDROID_HOME/build-tools -name apksigner | sort -r | head -n 1)
|
||||||
|
|
||||||
|
$APKSIGNER sign --ks release.keystore \
|
||||||
|
--ks-type PKCS12 \
|
||||||
|
--ks-key-alias "${{ secrets.ANDROID_KEY_ALIAS }}" \
|
||||||
|
--ks-pass pass:"${{ secrets.ANDROID_KEYSTORE_PASSWORD }}" \
|
||||||
|
--key-pass pass:"${{ secrets.ANDROID_KEY_PASSWORD }}" \
|
||||||
|
--v4-signing-enabled true \
|
||||||
|
--out Marstemedia-Signed.apk \
|
||||||
|
"$UNSIGNED_APK"
|
||||||
|
|
||||||
|
echo "Signierung erfolgreich!"
|
||||||
env:
|
env:
|
||||||
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
|
JAVA_HOME: /usr/lib/jvm/java-17-openjdk-amd64
|
||||||
|
|
||||||
- name: Upload APK Artifact
|
- name: Upload Artifact
|
||||||
# Downgrade auf v3, da v4 auf Gitea/GHES oft nicht funktioniert
|
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: Xiaomi-App
|
name: Marstemedia-Signed
|
||||||
# v3 unterstützt Wildcards etwas anders, daher geben wir den Pfad präzise an
|
path: Marstemedia-Signed.apk
|
||||||
path: src-tauri/gen/android/app/build/outputs/apk/release/*.apk
|
|
||||||
|
- name: Create Gitea Release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
with:
|
||||||
|
files: Marstemedia-Signed.apk
|
||||||
|
# Gitea braucht manchmal explizit den Namen/Body
|
||||||
|
name: "Release ${{ github.ref_name }}"
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -2,3 +2,4 @@
|
|||||||
/target/
|
/target/
|
||||||
/Cargo.lock
|
/Cargo.lock
|
||||||
/.jj/
|
/.jj/
|
||||||
|
my-release-key.keystore
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ easy-nostr = { path = "./easy-nostr" }
|
|||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
feed-rs = "2.3.1"
|
feed-rs = "2.3.1"
|
||||||
ron = "0.8"
|
ron = "0.8"
|
||||||
|
nostr-sdk = "0.44.1"
|
||||||
|
|
||||||
# FIX: default-features entfernt und rustls-tls hinzugefügt
|
# FIX: default-features entfernt und rustls-tls hinzugefügt
|
||||||
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] }
|
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] }
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
use easy_nostr::EasyNostr;
|
use easy_nostr::EasyNostr;
|
||||||
use serde::Serialize;
|
use nostr_sdk::prelude::{Keys, ToBech32};
|
||||||
|
use serde::Serialize; // Import für die Schlüssel-Generierung
|
||||||
|
|
||||||
// Diese Struktur ist für den Transport zum Frontend (JSON)
|
// Diese Struktur ist für den Transport zum Frontend (JSON)
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@@ -11,12 +12,20 @@ pub struct LocalPost {
|
|||||||
|
|
||||||
#[tauri::command]
|
#[tauri::command]
|
||||||
pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> {
|
pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> {
|
||||||
// 1. Verbindung aufbauen
|
// 1. Temporären Einweg-Schlüssel generieren
|
||||||
let easy = EasyNostr::new("nsec1fkhszd5sv8yp6g966qdh5kuph25g4nn9pa2k5rwpuglt6rde8u8qwr3r87")
|
// Das erzeugt ein Schlüsselpaar im RAM, das nach dem Funktionsaufruf verschwindet.
|
||||||
|
let random_keys = Keys::generate();
|
||||||
|
let temp_nsec = random_keys
|
||||||
|
.secret_key()
|
||||||
|
.to_bech32()
|
||||||
|
.map_err(|e| format!("Fehler beim Generieren des Keys: {}", e))?;
|
||||||
|
|
||||||
|
// 2. Verbindung mit dem temporären Key aufbauen
|
||||||
|
let easy = EasyNostr::new(&temp_nsec)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| e.to_string())?;
|
.map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
// 2. Relays hinzufügen
|
// 3. Relays hinzufügen
|
||||||
easy.add_relays(vec![
|
easy.add_relays(vec![
|
||||||
"wss://relay.damus.io",
|
"wss://relay.damus.io",
|
||||||
"wss://nos.lol",
|
"wss://nos.lol",
|
||||||
@@ -25,16 +34,16 @@ pub async fn fetch_nostr_posts() -> Result<Vec<LocalPost>, String> {
|
|||||||
.await
|
.await
|
||||||
.map_err(|e| e.to_string())?;
|
.map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
// 3. Posts von der Library holen
|
// 4. Posts von der Library holen
|
||||||
let raw_posts = easy.get_random_posts().await.map_err(|e| e.to_string())?;
|
let raw_posts = easy.get_random_posts().await.map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
// 4. Mappen: Library-Typ -> Unser serialisierbarer Typ
|
// 5. Mappen: Library-Typ -> Unser serialisierbarer Typ
|
||||||
let mapped_posts = raw_posts
|
let mapped_posts = raw_posts
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|p| LocalPost {
|
.map(|p| LocalPost {
|
||||||
content: p.content,
|
content: p.content,
|
||||||
author: p.author.to_string(),
|
author: p.author.to_string(),
|
||||||
created_at: p.created_at.as_secs(), // Hier geändert von as_u64()
|
created_at: p.created_at.as_secs(),
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user