Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 1.4.1-upgrade-release
  • 1121-download
  • 1218-smartplaylist_backend
  • 1373-login-form-move-reset-your-password-link
  • 1381-progress-bars
  • 1481
  • 1518-update-django-allauth
  • 1645
  • 1675-widget-improperly-configured-missing-resource-id
  • 1675-widget-improperly-configured-missing-resource-id-2
  • 1704-required-props-are-not-always-passed
  • 1716-add-frontend-tests-again
  • 1749-smtp-uri-configuration
  • 1930-first-upload-in-a-batch-always-fails
  • 1976-update-documentation-links-in-readme-files
  • 2054-player-layout
  • 2063-funkwhale-connection-interrupted-every-so-often-requires-network-reset-page-refresh
  • 2091-iii-6-improve-visuals-layout
  • 2151-refused-to-load-spa-manifest-json-2
  • 2154-add-to-playlist-pop-up-hidden-by-now-playing-screen
  • 2155-can-t-see-the-episode-list-of-a-podcast-as-an-anonymous-user-with-anonymous-access-enabled
  • 2156-add-management-command-to-change-file-ref-for-in-place-imported-files-to-s3
  • 2192-clear-queue-bug-when-random-shuffle-is-enabled
  • 2205-channel-page-pagination-link-dont-working
  • 2215-custom-logger-does-not-work-at-all-with-webkit-and-blink-based-browsers
  • 2228-troi-real-world-review
  • 2274-implement-new-upload-api
  • 2303-allow-users-to-own-tagged-items
  • 2395-far-right-filter
  • 2405-front-buttont-trigger-third-party-hook
  • 2408-troi-create-missing-tracks
  • 2416-revert-library-drop
  • 2448-complete-tags
  • 2451-delete-no-user-query
  • 2452-fetch-third-party-metadata
  • 623-test
  • 653-enable-starting-embedded-player-at-a-specific-position-in-track
  • activitypub-overview
  • album-sliders
  • arne/2091-improve-visuals
  • back-option-for-edits
  • chore/2406-compose-modularity-scope
  • develop
  • develop-password-reset
  • env-file-cleanup
  • feat/2091-improve-visuals
  • fix-amd64-docker-build-gfortran
  • fix-gitpod
  • fix-plugins-dev-setup
  • fix-rate-limit-serializer
  • fix-schema-channel-metadata-choices
  • flupsi/2803-improve-visuals
  • flupsi/2804-new-upload-process
  • funkwhale-fix_pwa_manifest
  • funkwhale-petitminion-2136-bug-fix-prune-skipped-upload
  • funkwhale-ui-buttons
  • georg/add-typescript
  • gitpod/test-1866
  • global-button-experiment
  • global-buttons
  • juniorjpdj/pkg-repo
  • manage-py-reference
  • merge-review
  • minimal-python-version
  • petitminion-develop-patch-84496
  • pin-mutagen-to-1.46
  • pipenv
  • plugins
  • plugins-v2
  • plugins-v3
  • pre-release/1.3.0
  • prune_skipped_uploads_docs
  • renovate/front-all-dependencies
  • renovate/front-major-all-dependencies
  • schema-updates
  • small-gitpod-improvements
  • spectacular_schema
  • stable
  • tempArne
  • ui-buttons
  • update-frontend-dependencies
  • upload-process-spec
  • user-concept-docs
  • v2-artists
  • vite-ws-ssl-compatible
  • wip/2091-improve-visuals
  • wvffle/dependency-maintenance
  • wvffle/new-upload-process
  • wvffle/ui-rewrite-sidebar
  • wvffle/ui-sidebar
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.16
  • 0.16.1
  • 0.16.2
  • 0.16.3
  • 0.17
  • 0.18
  • 0.18.1
  • 0.18.2
  • 0.18.3
  • 0.19.0
  • 0.19.0-rc1
  • 0.19.0-rc2
  • 0.19.1
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.20.0
  • 0.20.0-rc1
  • 0.20.1
  • 0.21
  • 0.21-rc1
  • 0.21-rc2
  • 0.21.1
  • 0.21.2
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
  • 1.0
  • 1.0-rc1
  • 1.0.1
  • 1.1
  • 1.1-rc1
  • 1.1-rc2
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.2.0
  • 1.2.0-rc1
  • 1.2.0-rc2
  • 1.2.0-testing
  • 1.2.0-testing2
  • 1.2.0-testing3
  • 1.2.0-testing4
  • 1.2.1
  • 1.2.10
  • 1.2.2
  • 1.2.3
  • 1.2.4
  • 1.2.5
  • 1.2.6
  • 1.2.6-1
  • 1.2.7
  • 1.2.8
  • 1.2.9
  • 1.3.0
  • 1.3.0-rc1
  • 1.3.0-rc2
  • 1.3.0-rc3
  • 1.3.0-rc4
  • 1.3.0-rc5
  • 1.3.0-rc6
  • 1.3.1
  • 1.3.2
  • 1.3.3
  • 1.3.4
  • 1.4.0
  • 1.4.0-rc1
  • 1.4.0-rc2
  • 1.4.1
  • 2.0.0-alpha.1
  • 2.0.0-alpha.2
190 results

Target

Select target project
  • funkwhale/funkwhale
  • Luclu7/funkwhale
  • mbothorel/funkwhale
  • EorlBruder/funkwhale
  • tcit/funkwhale
  • JocelynDelalande/funkwhale
  • eneiluj/funkwhale
  • reg/funkwhale
  • ButterflyOfFire/funkwhale
  • m4sk1n/funkwhale
  • wxcafe/funkwhale
  • andybalaam/funkwhale
  • jcgruenhage/funkwhale
  • pblayo/funkwhale
  • joshuaboniface/funkwhale
  • n3ddy/funkwhale
  • gegeweb/funkwhale
  • tohojo/funkwhale
  • emillumine/funkwhale
  • Te-k/funkwhale
  • asaintgenis/funkwhale
  • anoadragon453/funkwhale
  • Sakada/funkwhale
  • ilianaw/funkwhale
  • l4p1n/funkwhale
  • pnizet/funkwhale
  • dante383/funkwhale
  • interfect/funkwhale
  • akhardya/funkwhale
  • svfusion/funkwhale
  • noplanman/funkwhale
  • nykopol/funkwhale
  • roipoussiere/funkwhale
  • Von/funkwhale
  • aurieh/funkwhale
  • icaria36/funkwhale
  • floreal/funkwhale
  • paulwalko/funkwhale
  • comradekingu/funkwhale
  • FurryJulie/funkwhale
  • Legolars99/funkwhale
  • Vierkantor/funkwhale
  • zachhats/funkwhale
  • heyjake/funkwhale
  • sn0w/funkwhale
  • jvoisin/funkwhale
  • gordon/funkwhale
  • Alexander/funkwhale
  • bignose/funkwhale
  • qasim.ali/funkwhale
  • fakegit/funkwhale
  • Kxze/funkwhale
  • stenstad/funkwhale
  • creak/funkwhale
  • Kaze/funkwhale
  • Tixie/funkwhale
  • IISergII/funkwhale
  • lfuelling/funkwhale
  • nhaddag/funkwhale
  • yoasif/funkwhale
  • ifischer/funkwhale
  • keslerm/funkwhale
  • flupe/funkwhale
  • petitminion/funkwhale
  • ariasuni/funkwhale
  • ollie/funkwhale
  • ngaumont/funkwhale
  • techknowlogick/funkwhale
  • Shleeble/funkwhale
  • theflyingfrog/funkwhale
  • jonatron/funkwhale
  • neobrain/funkwhale
  • eorn/funkwhale
  • KokaKiwi/funkwhale
  • u1-liquid/funkwhale
  • marzzzello/funkwhale
  • sirenwatcher/funkwhale
  • newer027/funkwhale
  • codl/funkwhale
  • Zwordi/funkwhale
  • gisforgabriel/funkwhale
  • iuriatan/funkwhale
  • simon/funkwhale
  • bheesham/funkwhale
  • zeoses/funkwhale
  • accraze/funkwhale
  • meliurwen/funkwhale
  • divadsn/funkwhale
  • Etua/funkwhale
  • sdrik/funkwhale
  • Soran/funkwhale
  • kuba-orlik/funkwhale
  • cristianvogel/funkwhale
  • Forceu/funkwhale
  • jeff/funkwhale
  • der_scheibenhacker/funkwhale
  • owlnical/funkwhale
  • jovuit/funkwhale
  • SilverFox15/funkwhale
  • phw/funkwhale
  • mayhem/funkwhale
  • sridhar/funkwhale
  • stromlin/funkwhale
  • rrrnld/funkwhale
  • nitaibezerra/funkwhale
  • jaller94/funkwhale
  • pcouy/funkwhale
  • eduxstad/funkwhale
  • codingHahn/funkwhale
  • captain/funkwhale
  • polyedre/funkwhale
  • leishenailong/funkwhale
  • ccritter/funkwhale
  • lnceballosz/funkwhale
  • fpiesche/funkwhale
  • Fanyx/funkwhale
  • markusblogde/funkwhale
  • Firobe/funkwhale
  • devilcius/funkwhale
  • freaktechnik/funkwhale
  • blopware/funkwhale
  • cone/funkwhale
  • thanksd/funkwhale
  • vachan-maker/funkwhale
  • bbenti/funkwhale
  • tarator/funkwhale
  • prplecake/funkwhale
  • DMarzal/funkwhale
  • lullis/funkwhale
  • hanacgr/funkwhale
  • albjeremias/funkwhale
  • xeruf/funkwhale
  • llelite/funkwhale
  • RoiArthurB/funkwhale
  • cloo/funkwhale
  • nztvar/funkwhale
  • Keunes/funkwhale
  • petitminion/funkwhale-petitminion
  • m-idler/funkwhale
  • SkyLeite/funkwhale
140 results
Select Git revision
  • 1121-download
  • 1218-smartplaylist_backend
  • 1288-user-me-can-be-created-but-cannot-be-edited
  • 1381-progress-bars
  • 1392-update-actor-cache-task
  • 1434-update-pyld
  • 1481
  • 1515-update-click
  • 1518-update-django-allauth
  • 1645
  • 1674-recently-added-radio-repair
  • 1711-ping_remote_instance
  • 1714-resolve-timeouts-on-domain-nodeinfo-fetch
  • 1717-stop-player-when-stop-radio
  • 1798-bulk-fetch-actor-data
  • 2010-fix_i18n_globally
  • 2136-bug-fix-prune-skipped-upload
  • 2275-quality-filter-backend
  • 2322-troi-frontend
  • 623-test
  • 639-ThirdPartyStream-poc
  • 653-enable-starting-embedded-player-at-a-specific-position-in-track
  • 762-domain_follow
  • album-sliders
  • back-option-for-edits
  • develop
  • feat/2091-improve-visuals
  • funkwhale-activityPub-overview
  • generate-swagger
  • master
  • pipenv
  • plugins
  • plugins-v2
  • plugins-v3
  • poetry
  • renovate/configure
  • spec-domain-follow
  • spec_test_for_issue_1
  • stable
  • test_typesens
  • testbranch
  • troi-recommendation-system-with-typenses
  • update-boto3
  • update-frontend-dependencies
  • update-uvicorn
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.16
  • 0.16.1
  • 0.16.2
  • 0.16.3
  • 0.17
  • 0.18
  • 0.18.1
  • 0.18.2
  • 0.18.3
  • 0.19.0
  • 0.19.0-rc1
  • 0.19.0-rc2
  • 0.19.1
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.20.0
  • 0.20.0-rc1
  • 0.20.1
  • 0.21
  • 0.21-rc1
  • 0.21-rc2
  • 0.21.1
  • 0.21.2
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
  • 1.0
  • 1.0-rc1
  • 1.0.1
  • 1.1
  • 1.1-rc1
  • 1.1-rc2
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.2.0
  • 1.2.0-rc1
  • 1.2.0-rc2
  • 1.2.0-testing
  • 1.2.0-testing2
  • 1.2.0-testing3
  • 1.2.0-testing4
  • 1.2.1
118 results
Show changes
Showing
with 177 additions and 109 deletions
...@@ -3,11 +3,11 @@ x-django: &django ...@@ -3,11 +3,11 @@ x-django: &django
volumes: volumes:
- ../api:/app - ../api:/app
- ../.env:/app/.env - ../.env:/app/.env
- "${MUSIC_DIRECTORY_SERVE_PATH:-../.state/music}:/music:ro" - '${MUSIC_DIRECTORY_SERVE_PATH:-../.state/music}:/music:ro'
- "../.state/plugins:/srv/funkwhale/plugins" - '../.state/plugins:/srv/funkwhale/plugins'
- "../.state/staticfiles:/staticfiles" - '../.state/staticfiles:/staticfiles'
- "../.state/media:/protected/media" - '../.state/media:/protected/media'
- "../.state/${COMPOSE_PROJECT_NAME:-funkwhale}/media:/data/media" - '../.state/${COMPOSE_PROJECT_NAME:-funkwhale}/media:/data/media'
depends_on: depends_on:
postgres: postgres:
condition: service_healthy condition: service_healthy
...@@ -23,11 +23,7 @@ services: ...@@ -23,11 +23,7 @@ services:
context: ../api context: ../api
dockerfile: Dockerfile.debian dockerfile: Dockerfile.debian
healthcheck: healthcheck:
test: test: ['CMD-SHELL', 'docker compose logs api | grep -q "Uvicorn running on" || exit 0']
[
"CMD-SHELL",
'docker compose logs api | grep -q "Uvicorn running on" || exit 0',
]
interval: 3s interval: 3s
timeout: 5s timeout: 5s
retries: 3 retries: 3
...@@ -42,7 +38,7 @@ services: ...@@ -42,7 +38,7 @@ services:
command: > command: >
sh -c ' sh -c '
pip install watchdog[watchmedo] && pip install watchdog[watchmedo] &&
watchmedo auto-restart --patterns="*.py" --recursive -- celery -A funkwhale_api.taskapp worker -l debug -B --concurrency=${CELERYD_CONCURRENCY} watchmedo auto-restart --patterns="*.py" --recursive -- celery -A funkwhale_api.taskapp worker -l debug -B --concurrency=${CELERYD_CONCURRENCY:-0}
' '
depends_on: depends_on:
api: api:
......
...@@ -5,7 +5,7 @@ services: ...@@ -5,7 +5,7 @@ services:
- api - api
- front - front
volumes: volumes:
- "${MUSIC_DIRECTORY_SERVE_PATH:-../.state/music}:${MUSIC_DIRECTORY_PATH:-/music}:ro" - '${MUSIC_DIRECTORY_SERVE_PATH:-../.state/music}:${MUSIC_DIRECTORY_PATH:-/music}:ro'
- ./etc/nginx/conf.dev:/etc/nginx/templates/default.conf.template:ro - ./etc/nginx/conf.dev:/etc/nginx/templates/default.conf.template:ro
- ../deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro - ../deploy/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro
......
...@@ -2,18 +2,18 @@ services: ...@@ -2,18 +2,18 @@ services:
openapi: openapi:
image: swaggerapi/swagger-ui image: swaggerapi/swagger-ui
environment: environment:
- "URL=/openapi.yml" - 'URL=/openapi.yml'
ports: ports:
- "8002:8080" - '8002:8080'
volumes: volumes:
- "../docs/specs/nodeinfo21/schema.yml:/usr/share/nginx/html/openapi.yml" - '../docs/specs/nodeinfo21/schema.yml:/usr/share/nginx/html/openapi.yml'
# - "../docs/api:/usr/share/nginx/html/api" # - "../docs/api:/usr/share/nginx/html/api"
labels: labels:
- "traefik.enable=true" - 'traefik.enable=true'
- "traefik.http.routers.test-funkwhale-openapi-web.rule=Host(`openapi.funkwhale.test`)" - 'traefik.http.routers.test-funkwhale-openapi-web.rule=Host(`openapi.funkwhale.test`)'
- "traefik.http.routers.test-funkwhale-openapi-web.entrypoints=web" - 'traefik.http.routers.test-funkwhale-openapi-web.entrypoints=web'
- "traefik.http.services.test-funkwhale-openapi.loadbalancer.server.port=8080" - 'traefik.http.services.test-funkwhale-openapi.loadbalancer.server.port=8080'
- "traefik.http.routers.test-funkwhale-openapi-webs.rule=Host(`openapi.funkwhale.test`)" - 'traefik.http.routers.test-funkwhale-openapi-webs.rule=Host(`openapi.funkwhale.test`)'
- "traefik.http.routers.test-funkwhale-openapi-webs.entrypoints=webs" - 'traefik.http.routers.test-funkwhale-openapi-webs.entrypoints=webs'
- "traefik.http.routers.test-funkwhale-openapi-webs.tls=true" - 'traefik.http.routers.test-funkwhale-openapi-webs.tls=true'
networks: ["web"] networks: ['web']
...@@ -4,16 +4,16 @@ services: ...@@ -4,16 +4,16 @@ services:
context: ../ context: ../
dockerfile: docs/Dockerfile dockerfile: docs/Dockerfile
init: true init: true
ports: ["8001:8001"] ports: ['8001:8001']
command: sh -c 'cd /src/docs && make dev' command: sh -c 'cd /src/docs && make dev'
volumes: volumes:
- ../docs:/src/docs - ../docs:/src/docs
labels: labels:
- "traefik.enable=true" - 'traefik.enable=true'
- "traefik.http.routers.test-funkwhale-docs-web.rule=Host(`docs.funkwhale.test`)" - 'traefik.http.routers.test-funkwhale-docs-web.rule=Host(`docs.funkwhale.test`)'
- "traefik.http.routers.test-funkwhale-docs-web.entrypoints=web" - 'traefik.http.routers.test-funkwhale-docs-web.entrypoints=web'
- "traefik.http.routers.test-funkwhale-docs-webs.rule=Host(`docs.funkwhale.test`)" - 'traefik.http.routers.test-funkwhale-docs-webs.rule=Host(`docs.funkwhale.test`)'
- "traefik.http.routers.test-funkwhale-docs-webs.entrypoints=webs" - 'traefik.http.routers.test-funkwhale-docs-webs.entrypoints=webs'
- "traefik.http.routers.test-funkwhale-docs-webs.tls=true" - 'traefik.http.routers.test-funkwhale-docs-webs.tls=true'
networks: ["web"] networks: ['web']
services:
ui:
build:
context: ../front
dockerfile: Dockerfile.dev
command: yarn dev:docs --host 0.0.0.0
expose: ['5173']
ports:
- '8003:5173'
volumes:
- '../front:/app'
- '/app/node_modules'
networks: ['web']
labels:
- 'traefik.enable=true'
- 'traefik.http.routers.test-funkwhale-ui-web.rule=Host(`ui.funkwhale.test`)'
- 'traefik.http.routers.test-funkwhale-ui-web.entrypoints=web'
- 'traefik.http.services.test-funkwhale-ui.loadbalancer.server.port=5173'
- 'traefik.http.routers.test-funkwhale-ui-webs.rule=Host(`ui.funkwhale.test`)'
- 'traefik.http.routers.test-funkwhale-ui-webs.entrypoints=webs'
- 'traefik.http.routers.test-funkwhale-ui-webs.tls=true'
...@@ -74,6 +74,11 @@ server { ...@@ -74,6 +74,11 @@ server {
proxy_pass http://funkwhale-api; proxy_pass http://funkwhale-api;
} }
location /node_modules/.vite/ {
include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-front;
}
location ~ ^/@(vite-plugin-pwa|vite|id)/ { location ~ ^/@(vite-plugin-pwa|vite|id)/ {
include /etc/nginx/funkwhale_proxy.conf; include /etc/nginx/funkwhale_proxy.conf;
proxy_pass http://funkwhale-front; proxy_pass http://funkwhale-front;
......
...@@ -3,7 +3,7 @@ http: ...@@ -3,7 +3,7 @@ http:
test-funkwhale-mailpit: test-funkwhale-mailpit:
loadbalancer: loadbalancer:
servers: servers:
- url: "http://172.17.0.1:8025" - url: 'http://172.17.0.1:8025'
passhostheader: true passhostheader: true
routers: routers:
test-funkwhale-mailpit-web: test-funkwhale-mailpit-web:
......
...@@ -13,8 +13,8 @@ api: ...@@ -13,8 +13,8 @@ api:
entryPoints: entryPoints:
traefik: traefik:
address: "172.17.0.1:8008" address: '172.17.0.1:8008'
web: web:
address: "172.17.0.1:80" address: '172.17.0.1:80'
webs: webs:
address: "172.17.0.1:443" address: '172.17.0.1:443'
x-busybox: &busybox x-busybox: &busybox
init: true init: true
image: "busybox" image: 'busybox'
network_mode: bridge network_mode: bridge
dns: 172.17.0.1 dns: 172.17.0.1
dns_search: funkwhale.test dns_search: funkwhale.test
...@@ -11,18 +11,18 @@ networks: ...@@ -11,18 +11,18 @@ networks:
services: services:
whoami: whoami:
image: "traefik/whoami" image: 'traefik/whoami'
networks: networks:
- web - web
labels: labels:
- "traefik.enable=true" - 'traefik.enable=true'
- "traefik.http.routers.whoami-web.rule=Host(`whoami.funkwhale.test`)" - 'traefik.http.routers.whoami-web.rule=Host(`whoami.funkwhale.test`)'
- "traefik.http.routers.whoami-web.entrypoints=web" - 'traefik.http.routers.whoami-web.entrypoints=web'
- "traefik.http.routers.whoami-webs.rule=Host(`whoami.funkwhale.test`)" - 'traefik.http.routers.whoami-webs.rule=Host(`whoami.funkwhale.test`)'
- "traefik.http.routers.whoami-webs.entrypoints=webs" - 'traefik.http.routers.whoami-webs.entrypoints=webs'
- "traefik.http.routers.whoami-webs.tls=true" - 'traefik.http.routers.whoami-webs.tls=true'
- "traefik.http.routers.whoami.tls.domains[0].main=whoami.funkwhale.test" - 'traefik.http.routers.whoami.tls.domains[0].main=whoami.funkwhale.test'
shell: shell:
<<: *busybox <<: *busybox
......
...@@ -9,5 +9,5 @@ services: ...@@ -9,5 +9,5 @@ services:
MP_SMTP_BIND_ADDR: 172.17.0.1:1025 MP_SMTP_BIND_ADDR: 172.17.0.1:1025
MP_MAX_MESSAGES: 5000 MP_MAX_MESSAGES: 5000
MP_DATABASE: /data/mailpit.db MP_DATABASE: /data/mailpit.db
MP_SMTP_AUTH_ACCEPT_ANY: "true" MP_SMTP_AUTH_ACCEPT_ANY: 'true'
MP_SMTP_AUTH_ALLOW_INSECURE: "true" MP_SMTP_AUTH_ALLOW_INSECURE: 'true'
...@@ -3,13 +3,13 @@ services: ...@@ -3,13 +3,13 @@ services:
image: minio/minio image: minio/minio
command: server /data command: server /data
volumes: volumes:
- "../.state/${COMPOSE_PROJECT_NAME:-funkwhale}/minio:/data" - '../.state/${COMPOSE_PROJECT_NAME:-funkwhale}/minio:/data'
environment: environment:
- "MINIO_ACCESS_KEY=${AWS_ACCESS_KEY_ID:-access_key}" - 'MINIO_ACCESS_KEY=${AWS_ACCESS_KEY_ID:-access_key}'
- "MINIO_SECRET_KEY=${AWS_SECRET_ACCESS_KEY:-secret_key}" - 'MINIO_SECRET_KEY=${AWS_SECRET_ACCESS_KEY:-secret_key}'
- "MINIO_HTTP_TRACE: /dev/stdout" - 'MINIO_HTTP_TRACE: /dev/stdout'
ports: ports:
- "9000:9000" - '9000:9000'
networks: networks:
- web - web
- internal - internal
......
x-verify: &verify x-verify: &verify
init: true init: true
image: "busybox" image: 'busybox'
network_mode: bridge network_mode: bridge
dns: 172.17.0.1 dns: 172.17.0.1
dns_search: funkwhale.test dns_search: funkwhale.test
...@@ -12,4 +12,4 @@ services: ...@@ -12,4 +12,4 @@ services:
verify-internal-connectivity: verify-internal-connectivity:
<<: *verify <<: *verify
command: "ping -c 1 ${COMPOSE_PROJECT_NAME:-funkwhale}.funkwhale.test" command: 'ping -c 1 ${COMPOSE_PROJECT_NAME:-funkwhale}.funkwhale.test'
version: "3" version: '3'
services: services:
postgres: postgres:
restart: unless-stopped restart: unless-stopped
env_file: .env env_file: .env
environment: environment:
- "POSTGRES_HOST_AUTH_METHOD=trust" - 'POSTGRES_HOST_AUTH_METHOD=trust'
image: postgres:15-alpine image: postgres:15-alpine
volumes: volumes:
- ./data/postgres:/var/lib/postgresql/data - ./data/postgres:/var/lib/postgresql/data
...@@ -41,8 +41,8 @@ services: ...@@ -41,8 +41,8 @@ services:
environment: environment:
- C_FORCE_ROOT=true - C_FORCE_ROOT=true
volumes: volumes:
- "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro" - '${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro'
- "${MEDIA_ROOT}:${MEDIA_ROOT}" - '${MEDIA_ROOT}:${MEDIA_ROOT}'
celerybeat: celerybeat:
restart: unless-stopped restart: unless-stopped
...@@ -65,9 +65,9 @@ services: ...@@ -65,9 +65,9 @@ services:
- redis - redis
env_file: .env env_file: .env
volumes: volumes:
- "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro" - '${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro'
- "${MEDIA_ROOT}:${MEDIA_ROOT}" - '${MEDIA_ROOT}:${MEDIA_ROOT}'
- "${STATIC_ROOT}:${STATIC_ROOT}" - '${STATIC_ROOT}:${STATIC_ROOT}'
front: front:
restart: unless-stopped restart: unless-stopped
...@@ -78,7 +78,7 @@ services: ...@@ -78,7 +78,7 @@ services:
- .env - .env
environment: environment:
# Override those variables in your .env file if needed # Override those variables in your .env file if needed
- "NGINX_MAX_BODY_SIZE=${NGINX_MAX_BODY_SIZE-100M}" - 'NGINX_MAX_BODY_SIZE=${NGINX_MAX_BODY_SIZE-100M}'
volumes: volumes:
# Uncomment if you want to use your previous nginx config, please let us # Uncomment if you want to use your previous nginx config, please let us
# know what special configuration you need, so we can support it with out # know what special configuration you need, so we can support it with out
...@@ -86,12 +86,12 @@ services: ...@@ -86,12 +86,12 @@ services:
#- "./nginx/funkwhale.template:/etc/nginx/templates/default.conf.template:ro" #- "./nginx/funkwhale.template:/etc/nginx/templates/default.conf.template:ro"
#- "./nginx/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro" #- "./nginx/funkwhale_proxy.conf:/etc/nginx/funkwhale_proxy.conf:ro"
- "${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro" - '${MUSIC_DIRECTORY_SERVE_PATH-/srv/funkwhale/data/music}:${MUSIC_DIRECTORY_PATH-/music}:ro'
- "${MEDIA_ROOT}:${MEDIA_ROOT}:ro" - '${MEDIA_ROOT}:${MEDIA_ROOT}:ro'
- "${STATIC_ROOT}:/usr/share/nginx/html/staticfiles:ro" - '${STATIC_ROOT}:/usr/share/nginx/html/staticfiles:ro'
ports: ports:
# override those variables in your .env file if needed # override those variables in your .env file if needed
- "${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}:80" - '${FUNKWHALE_API_IP}:${FUNKWHALE_API_PORT}:80'
typesense: typesense:
restart: unless-stopped restart: unless-stopped
......
...@@ -34,30 +34,6 @@ docker compose run --rm api funkwhale-manage import_files --help ...@@ -34,30 +34,6 @@ docker compose run --rm api funkwhale-manage import_files --help
:local: :local:
``` ```
## Get demo music
If you don't have music on your server, you can download creative commons music to test imports with. The Funkwhale project provides a collection courtesy of [Jamendo](https://jamendo.com). To download these tracks:
1. Download the shell script.
```{parsed-literal}
curl -L -o download-tracks.sh "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/{sub-ref}`version`/demo/download-tracks.sh"
```
2. Download the music list.
```{parsed-literal}
curl -L -o music.txt "https://dev.funkwhale.audio/funkwhale/funkwhale/raw/{sub-ref}`version`/demo/music.txt" chmod +x download-tracks.sh
```
3. Run the shell script against the music list to download the tracks.
```{code-block} sh
./download-tracks.sh music.txt
```
This downloads a set compressed albums to your `data/music` directory and unzips them. You can then import these tracks using the methods in this article.
## Find your library ID ## Find your library ID
You need to create a library before you can import music. Follow the instructions in [Create a library](../user/libraries/create.md) to get started. You need to create a library before you can import music. Follow the instructions in [Create a library](../user/libraries/create.md) to get started.
...@@ -200,7 +176,7 @@ Funkwhale imports the music in your storage directory into the specified library ...@@ -200,7 +176,7 @@ Funkwhale imports the music in your storage directory into the specified library
Funkwhale attempts to import album art for your music library. The import process checks for the following. Funkwhale attempts to import album art for your music library. The import process checks for the following.
1. The cover embedded in the audio files (works with FLAC and MP3 files). 1. The cover embedded in the audio files (works with FLAC, OGG, MP3 and MP4 files, possibly others).
2. A `cover.jpg` or `cover.png` in the the track's directory. 2. A `cover.jpg` or `cover.png` in the the track's directory.
3. An `mbid` in the file's tags. If there is an `mbid`, the import process tries to fetch cover art from Musicbrainz. 3. An `mbid` in the file's tags. If there is an `mbid`, the import process tries to fetch cover art from Musicbrainz.
......
# OpenApi schema
The frontend need up to date schemas ! If you change the api you need to upgrade the schema by running : `docker compose run --rm api funkwhale-manage spectacular > ./api/funkwhale_api/common/schema.yml`.
Then you need to upgrade the frontend schema has well by running `yarn generate-types-from-local-schema`.
Be aware that `get_signup_form_additional_fields_serializer` can tweak the schema generation.
...@@ -129,8 +129,13 @@ def test_downgrade_not_superuser_skips_email(factories, mocker): ...@@ -129,8 +129,13 @@ def test_downgrade_not_superuser_skips_email(factories, mocker):
mocked_notify.assert_not_called() mocked_notify.assert_not_called()
``` ```
<!-- prettier-ignore-start -->
(runtests)=
## Run tests ## Run tests
<!-- prettier-ignore-end -->
You can run all tests in the pytest suite with the following command: You can run all tests in the pytest suite with the following command:
```sh ```sh
......
...@@ -47,8 +47,8 @@ const labels = computed(() => ({ ...@@ -47,8 +47,8 @@ const labels = computed(() => ({
:::{tab-item} Template :::{tab-item} Template
```html ```html
<h2>{{ $t('components.About.header.funkwhale') }}</h2> <h2>{{ t('components.About.header.funkwhale') }}</h2>
<button>{{ $t('components.About.button.cancel') }}</button> <button>{{ t('components.About.button.cancel') }}</button>
``` ```
::: :::
...@@ -84,11 +84,11 @@ Some strings change depending on whether they are plural or not. You can create ...@@ -84,11 +84,11 @@ Some strings change depending on whether they are plural or not. You can create
v-if="object.artist?.content_category === 'podcast'" v-if="object.artist?.content_category === 'podcast'"
class="meta ellipsis" class="meta ellipsis"
> >
{{ $t('components.audio.ChannelCard.meta.episodes', {episode_count: {{ t('components.audio.ChannelCard.meta.episodes', {episode_count:
object.artist.tracks_count}) }} object.artist.tracks_count}) }}
</span> </span>
<span v-else> <span v-else>
{{ $t('components.audio.ChannelCard.meta.tracks', {tracks_count: {{ t('components.audio.ChannelCard.meta.tracks', {tracks_count:
object.artist?.tracks_count}) }} object.artist?.tracks_count}) }}
</span> </span>
<tags-list <tags-list
......
...@@ -2,25 +2,72 @@ ...@@ -2,25 +2,72 @@
The Funkwhale frontend is a {abbr}`SPA (Single Page Application)` written in [Typescript](https://typescriptlang.org) and [Vue.js](https://vuejs.org). The Funkwhale frontend is a {abbr}`SPA (Single Page Application)` written in [Typescript](https://typescriptlang.org) and [Vue.js](https://vuejs.org).
## Troubleshooting
### Network errors (405 and 404) in the console
If you are using Google Chrome, you may have to disable the network cache:
- Go to the Dev Tools
- Select the Network tab
- In the toolbar under the Network tab, activate the checkmark "Disable Cache"
### Edits don't appear when I check them in the browser
Reload the page with `Ctrl+Shift+R` (Mac: `Cmd+Shift+R`)
Make sure you have no add-ons in your browser that mess with the DOM. The best way to check is to open a private window/tab with `Ctrl/Cmd+Shift+P` (Firefox)
## Styles ## Styles
We currently use [Fomantic UI](https://fomantic-ui.com) as our UI framework. We customize this with our own SCSS files located in `front/src/styles/_main.scss`. <--! TODO: Mermaid diagrams -->
We apply changes to the Fomantic CSS files before we import them: ### UI styles
1. We replace hardcoded color values with CSS variables to make themin easier. For example: `color: orange` is replaced by `color: var(--vibrant-color)` ```mermaid
2. We remove unused values from the CSS files to keep the size down graph TD
/node_modules/bootstrap-icons/font/bootstrap-icons.css --> src/styles/font.scss
src/styles/base/generic.scss --> src/styles/base/index.scss
src/styles/base/index.scss --> src/styles/funkwhale.scss
src/styles/font.scss --> src/styles/funkwhale.scss
src/styles/colors.scss --> src/styles/funkwhale.scss
src/styles/funkwhale.scss --> src/main.ts
```
These changes are applied when you run `yarn install` through a `postinstall` hook. If you want to modify these changes, check the `front/scripts/fix-fomantic-css.py` script. ### App styles
We plan to replace Fomantic with our own UI framework in the near future. Check our [Penpot](https://design.funkwhale.audio) to see what we've got planned. ```mermaid
graph TD
_css_vars --> /themes/_...
vendor/_media.scss --> _main.scss
/globals/_... --> _main.scss
/components/_... --> _main.scss
/pages/_... --> _main.scss
/themes/_... --> _main.scss
_vars.scss --> /themes/_...
```
## Components ## Components
Our [component library](https://ui.funkwhale.audio) contains reusable Vue components that you can add to the Funkwhale frontend. If you want to add a new component, check out [the repository](https://dev.funkwhale.audio/funkwhale/vui). Start the **UI Live Docs** (vitepress) and follow the link:
```sh
yarn dev:docs
```
- Example: [Button component in the live docs](http://localhost:5173/components/ui/button)
- Find more details about the UI library and [how to contributein the live docs](http://localhost:5173/contributing)
<!-- prettier-ignore-start -->
(testing)=
## Testing ## Testing
<!-- prettier-ignore-end -->
### Unit tests
The Funkwhale frontend contains some tests to catch errors before changes go live. The coverage is still fairly low, so we welcome any contributions. The Funkwhale frontend contains some tests to catch errors before changes go live. The coverage is still fairly low, so we welcome any contributions.
To run the test suite, run the following command: To run the test suite, run the following command:
...@@ -34,3 +81,7 @@ To run tests as you make changes, launch the test suite with the `-w` flag: ...@@ -34,3 +81,7 @@ To run tests as you make changes, launch the test suite with the `-w` flag:
```sh ```sh
docker compose run --rm front yarn test:unit -w docker compose run --rm front yarn test:unit -w
``` ```
### End-to-end testing and User testing
In addition, there are End-to-end tests (cyprus), and we are planning to do User tests in 2025.
...@@ -19,6 +19,12 @@ maxdepth: 1 ...@@ -19,6 +19,12 @@ maxdepth: 1
objects objects
``` ```
## How to use federation in the user interface
If you have the fediverse handle of a user ('xx@xx.xx'), displayed in their profile, you can paste this address in the global search field. Funkwhale will then clone the profile onto your instance and you will be able to see their profile locally and follow their activities. You are not automatically subscribed to their channels or have access to their public libraries. We still have to implement this in a [viable way] (https://dev.funkwhale.audio/funkwhale/funkwhale/-/issues/2422)
The same works for rss feeds that are outside of the fediverse. Just enter the RSS feed URI into the search field and you can add it as a podcast or music channel.
## Technologies and standards ## Technologies and standards
Funkwhale's federation is built on top of the following technologies: Funkwhale's federation is built on top of the following technologies:
...@@ -798,8 +804,7 @@ An `Audio` object is a custom object used to store upload information. It extend ...@@ -798,8 +804,7 @@ An `Audio` object is a custom object used to store upload information. It extend
- Integer - Integer
- The bitrate of the audio in bytes/s - The bitrate of the audio in bytes/s
* - `duration`* * - `duration`*
- Integer - The duration of the audio as defined in [as](https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration)
- The duration of the audio in seconds
* - `library`* * - `library`*
- String (URI) - String (URI)
- The ID of the audio's containing [`Library` object](#library) - The ID of the audio's containing [`Library` object](#library)
...@@ -826,7 +831,7 @@ An `Audio` object is a custom object used to store upload information. It extend ...@@ -826,7 +831,7 @@ An `Audio` object is a custom object used to store upload information. It extend
"name": "Krav Boca - Mortem", "name": "Krav Boca - Mortem",
"size": 8656581, "size": 8656581,
"bitrate": 320000, "bitrate": 320000,
"duration": 213, "duration": "PT1312S,
"library": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6", "library": "https://awesome.music/federation/music/libraries/dc702491-f6ce-441b-9da0-cecbed08bcc6",
"updated": "2018-10-02T19:49:35.646372+00:00", "updated": "2018-10-02T19:49:35.646372+00:00",
"published": "2018-10-02T19:49:35.646359+00:00", "published": "2018-10-02T19:49:35.646359+00:00",
......
...@@ -7,16 +7,18 @@ Two level of privacy for activities : ...@@ -7,16 +7,18 @@ Two level of privacy for activities :
- from the Actor of the activities - from the Actor of the activities
- from the Object of the activities - from the Object of the activities
We follow both actor and object privacy_level. If an user want to share it's playlist he need both the user privacy level and playlist privacy level set to allow it.
### User level privacy_level ### User level privacy_level
Check is done in `activity_pass_user_privacy_level` but only works if `actor` is passed within the `context` Check is done in `activity_pass_user_privacy_level` but only works if `actor` is passed within the `context`. This applies to object that don't have their own privacy_level settings :
- `Listening`
- `TrackFavorite`
### Object privacy_level ### Object privacy_level
Playlist support it's own privacy level. Check is done in `activity_pass_object_privacy_level`. Other objects should be added manually to this function. `Playlist` support it's own privacy level. Check is done in `activity_pass_object_privacy_level` for AP activities and on `has_playlist_access` for the federation views. Other objects should be added manually to this function.
`PlaylistTracks` follow the `Playlist` privacy_level setting.
## Followers privacy_level ## Followers privacy_level for User
If a user follow a local user we don't need to send ActivityPub activities since the data is already in our db. We can use the local database the fetch the data. That's why Funkwhale outbox will always discard activities that are not public. But this need to be updated to support `followers` privacy level. Some warning should be displayed to the users to explain that setting a privacy_level to `followers` will send the data to remote server. This means we need to trust the remote server admins to follow our privacy_level wish. In other words when you trust your followers your also trust the admins of your followers. If a user follow a local user we don't need to send ActivityPub activities since the data is already in our db. We can use the local database the fetch the data. That's why Funkwhale outbox will always discard activities that are not public. But this need to be updated to support `followers` privacy level. Some warning should be displayed to the users to explain that setting a privacy_level to `followers` will send the data to remote server. This means we need to trust the remote server admins to follow our privacy_level wish. In other words when you trust your followers your also trust the admins of your followers.