Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
b2c61b4
Merge pull request #587 from madeofpendletonwool/main
madeofpendletonwool Aug 10, 2025
e52bdf0
Updating
madeofpendletonwool Aug 10, 2025
cf30362
Merge branch 'mobile-app' of https://github.com/madeofpendletonwool/P…
madeofpendletonwool Aug 10, 2025
8de6099
Further work through issues with android app pre-0.8.0
madeofpendletonwool Aug 10, 2025
aa25525
Fixed mini player spacing issue
madeofpendletonwool Aug 10, 2025
42e4ccb
Added finalized sync settings. More consistent
madeofpendletonwool Aug 10, 2025
c00e415
Think time syncing is fixed
madeofpendletonwool Aug 11, 2025
3584463
Fixed up logging and issues remaking extra calls
madeofpendletonwool Aug 11, 2025
3eb5cf7
Pushing up arm fixes
madeofpendletonwool Aug 11, 2025
15fc3a3
updated rm podcast call
madeofpendletonwool Aug 12, 2025
4f9ab33
replaced supervisor with horust
madeofpendletonwool Aug 12, 2025
8d7b452
close on gpodder sync
madeofpendletonwool Aug 13, 2025
d1c5c5a
Even closer yet
madeofpendletonwool Aug 13, 2025
5e986ce
Gpodder Very close
madeofpendletonwool Aug 14, 2025
c644020
Added working offline mode android
madeofpendletonwool Aug 15, 2025
a7ba65b
Added in error messages
madeofpendletonwool Aug 15, 2025
960fa92
Merge branch 'mobile-app' of https://github.com/madeofpendletonwool/P…
madeofpendletonwool Aug 15, 2025
ba836f8
Adding in horust services
madeofpendletonwool Aug 15, 2025
d8d5b8f
Merge branch 'mobile-app' of https://github.com/madeofpendletonwool/P…
madeofpendletonwool Aug 15, 2025
cc48289
Transcript support
madeofpendletonwool Aug 15, 2025
cbf124b
Finalized transcripts for html
madeofpendletonwool Aug 15, 2025
63ca9f5
Fix app references
madeofpendletonwool Aug 15, 2025
fb9f213
fixed stats nextcloud
madeofpendletonwool Aug 15, 2025
5f652a7
Merge branch 'mobile-app' of https://github.com/madeofpendletonwool/P…
madeofpendletonwool Aug 15, 2025
4edda86
Fixed some feed issues
madeofpendletonwool Aug 19, 2025
7b9371b
Ready for a nightly - RC
madeofpendletonwool Aug 20, 2025
e067006
Merge pull request #593 from madeofpendletonwool/mobile-app
madeofpendletonwool Aug 20, 2025
3d796b2
Fixing up issues with playlists
madeofpendletonwool Aug 21, 2025
2a2deca
Merge pull request #595 from madeofpendletonwool/mobile-app
madeofpendletonwool Aug 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build-android-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
run: echo "IMAGE_TAG=${{ github.event.release.tag_name || github.event.inputs.version || 'latest' }}" >> $GITHUB_ENV

- name: Setup | Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v3
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-flatpak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Install Flatpak
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-helm-chart.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
persist-credentials: false # This prevents the default token from being persisted in the local git config

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build-snap.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Get version
id: get_version
Expand Down
6 changes: 2 additions & 4 deletions .github/workflows/build-tauri-clients.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,7 @@ jobs:
- windows-latest
include:
- os: ubuntu-arm64
runs-on:
- runs-on=${{ github.run_id }}
- runner=4cpu-linux-arm64
runs-on: ubuntu-24.04-arm

runs-on: ${{ matrix.runs-on || matrix.os }}

Expand Down Expand Up @@ -73,7 +71,7 @@ jobs:
if: ${{ matrix.os == 'windows-latest' }}

- name: Setup | Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- uses: hecrj/setup-rust-action@v2
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
--health-retries 5

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
Expand Down Expand Up @@ -56,7 +56,7 @@ jobs:
frontend-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4

- uses: hecrj/setup-rust-action@v2
with:
Expand Down
10 changes: 4 additions & 6 deletions .github/workflows/docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
Expand All @@ -55,16 +55,14 @@ jobs:

build-and-push-arm64:
needs: set-env
runs-on:
- runs-on=${{ github.run_id }}
- runner=4cpu-linux-arm64
runs-on: ubuntu-24.04-arm
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
Expand All @@ -90,7 +88,7 @@ jobs:
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
Expand Down
10 changes: 4 additions & 6 deletions .github/workflows/nightly-docker-publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
Expand All @@ -39,16 +39,14 @@ jobs:
run: echo ${{ steps.docker_build.outputs.digest }}

build-and-push-nightly-arm64:
runs-on:
- runs-on=${{ github.run_id }}
- runner=2cpu-linux-arm64
runs-on: ubuntu-24.04-arm
permissions:
contents: read
packages: write
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
Expand Down Expand Up @@ -76,7 +74,7 @@ jobs:
id-token: write
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
Expand Down
16 changes: 15 additions & 1 deletion .github/workflows/notification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:

steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Fetch the latest release
id: fetch_release
Expand All @@ -32,6 +32,14 @@ jobs:
echo "Release URL: $release_url"
echo "::set-output name=version::$latest_release"
echo "::set-output name=release_url::$release_url"

# Check if this is an RC release
if [[ "$latest_release" == *"-rc"* ]]; then
echo "RC release detected, skipping Discord notification"
echo "::set-output name=is_rc::true"
else
echo "::set-output name=is_rc::false"
fi

- name: Set release message
id: set_message
Expand All @@ -45,7 +53,13 @@ jobs:
echo "::set-output name=message::$message"
fi

- name: Skip Discord notification for RC release
if: steps.fetch_release.outputs.is_rc == 'true'
run: |
echo "Skipping Discord notification for RC release: ${{ steps.fetch_release.outputs.version }}"

- name: Discord notification to announce deployment
if: steps.fetch_release.outputs.is_rc == 'false'
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
uses: Ilshidur/action-discord@master
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-ios-app.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:
run: echo "IMAGE_TAG=${{ github.event.release.tag_name || github.event.inputs.version || 'latest' }}" >> $GITHUB_ENV

- name: Setup | Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- uses: hecrj/setup-rust-action@v2
with:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/test-pinepods.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Build the Docker test container
run: docker build -t madeofpendletonwool/pinepods-test . -f dockerfile-test
- uses: rustsec/audit-check@v1.4.1
Expand All @@ -37,5 +37,5 @@ jobs:
- uses: taiki-e/cache-cargo-install-action@v1
with:
tool: cargo-checkmate
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- run: cargo-checkmate run ${{ matrix.phase }}
2 changes: 1 addition & 1 deletion .github/workflows/update-aur-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Set version
run: |
Expand Down
127 changes: 127 additions & 0 deletions database_functions/migration_definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1958,6 +1958,133 @@ def migration_018_gpodder_sync_timestamp(conn, db_type: str):
cursor.close()


@register_migration("019", "fix_encryption_key_storage", "Convert EncryptionKey from binary to text format for consistency", requires=["001"])
def migration_019_fix_encryption_key_storage(conn, db_type: str):
"""Convert EncryptionKey storage from binary to text format"""
cursor = conn.cursor()

try:
if db_type == "postgresql":
# First, get the current encryption key value as bytes
cursor.execute('SELECT encryptionkey FROM "AppSettings" WHERE appsettingsid = 1')
result = cursor.fetchone()

if result and result[0]:
# Convert bytes to string
key_bytes = result[0]
if isinstance(key_bytes, bytes):
key_string = key_bytes.decode('utf-8')
else:
key_string = str(key_bytes)

# Drop and recreate column as TEXT
cursor.execute('ALTER TABLE "AppSettings" DROP COLUMN encryptionkey')
cursor.execute('ALTER TABLE "AppSettings" ADD COLUMN encryptionkey TEXT')

# Insert the key back as text
cursor.execute('UPDATE "AppSettings" SET encryptionkey = %s WHERE appsettingsid = 1', (key_string,))
logger.info("Converted PostgreSQL encryptionkey from BYTEA to TEXT")
else:
# No existing key, just change the column type
cursor.execute('ALTER TABLE "AppSettings" DROP COLUMN encryptionkey')
cursor.execute('ALTER TABLE "AppSettings" ADD COLUMN encryptionkey TEXT')
logger.info("Changed PostgreSQL encryptionkey column to TEXT (no existing data)")

else: # MySQL
# First, get the current encryption key value
cursor.execute('SELECT EncryptionKey FROM AppSettings WHERE AppSettingsID = 1')
result = cursor.fetchone()

if result and result[0]:
# Convert binary to string
key_data = result[0]
if isinstance(key_data, bytes):
# Remove null padding and decode
key_string = key_data.rstrip(b'\x00').decode('utf-8')
else:
key_string = str(key_data)

# Change column type and update value
cursor.execute('ALTER TABLE AppSettings MODIFY EncryptionKey VARCHAR(255)')
cursor.execute('UPDATE AppSettings SET EncryptionKey = %s WHERE AppSettingsID = 1', (key_string,))
logger.info("Converted MySQL EncryptionKey from BINARY to VARCHAR")
else:
# No existing key, just change the column type
cursor.execute('ALTER TABLE AppSettings MODIFY EncryptionKey VARCHAR(255)')
logger.info("Changed MySQL EncryptionKey column to VARCHAR (no existing data)")

logger.info("Encryption key storage migration completed successfully")

except Exception as e:
logger.error(f"Error in encryption key migration: {e}")
raise
finally:
cursor.close()


@register_migration("020", "add_default_gpodder_device", "Add DefaultGpodderDevice column to Users table for tracking user's selected GPodder device", requires=["001"])
def migration_020_add_default_gpodder_device(conn, db_type: str):
"""Add DefaultGpodderDevice column to Users table"""
cursor = conn.cursor()

try:
if db_type == "postgresql":
# Add defaultgpodderdevice column to Users table
safe_execute_sql(cursor, 'ALTER TABLE "Users" ADD COLUMN defaultgpodderdevice VARCHAR(255)')
logger.info("Added defaultgpodderdevice column to Users table (PostgreSQL)")

else: # MySQL
# Add DefaultGpodderDevice column to Users table
safe_execute_sql(cursor, 'ALTER TABLE Users ADD COLUMN DefaultGpodderDevice VARCHAR(255)')
logger.info("Added DefaultGpodderDevice column to Users table (MySQL)")

logger.info("Default GPodder device column migration completed successfully")

except Exception as e:
logger.error(f"Error in default GPodder device migration: {e}")
raise
finally:
cursor.close()


@register_migration("021", "limit_system_playlists_episodes", "Add MaxEpisodes limit to high-volume system playlists", requires=["010"])
def migration_021_limit_system_playlists_episodes(conn, db_type: str):
"""Add MaxEpisodes limit to Commuter Mix, Longform, and Weekend Marathon system playlists"""
cursor = conn.cursor()

try:
logger.info("Starting system playlist episodes limit migration")

# Define the playlists to update with 1000 episode limit
playlists_to_update = ['Commuter Mix', 'Longform', 'Weekend Marathon']

if db_type == "postgresql":
for playlist_name in playlists_to_update:
safe_execute_sql(cursor, '''
UPDATE "Playlists"
SET maxepisodes = 1000
WHERE name = %s AND issystemplaylist = TRUE
''', (playlist_name,))
logger.info(f"Updated {playlist_name} system playlist with maxepisodes=1000 (PostgreSQL)")

else: # MySQL
for playlist_name in playlists_to_update:
safe_execute_sql(cursor, '''
UPDATE Playlists
SET MaxEpisodes = 1000
WHERE Name = %s AND IsSystemPlaylist = TRUE
''', (playlist_name,))
logger.info(f"Updated {playlist_name} system playlist with MaxEpisodes=1000 (MySQL)")

logger.info("System playlist episodes limit migration completed successfully")

except Exception as e:
logger.error(f"Error in system playlist episodes limit migration: {e}")
raise
finally:
cursor.close()


def register_all_migrations():
"""Register all migrations with the migration manager"""
# Migrations are auto-registered via decorators
Expand Down
Loading
Loading