{"id":29790916,"url":"https://github.com/metabrainz/metabrainz.org","last_synced_at":"2025-07-28T00:13:10.887Z","repository":{"id":21179393,"uuid":"24484323","full_name":"metabrainz/metabrainz.org","owner":"metabrainz","description":"Website for the MetaBrainz Foundation","archived":false,"fork":false,"pushed_at":"2025-07-24T11:49:10.000Z","size":24457,"stargazers_count":27,"open_issues_count":3,"forks_count":48,"subscribers_count":10,"default_branch":"master","last_synced_at":"2025-07-24T16:06:56.751Z","etag":null,"topics":["api","donations","flask","metabrainz","payments","python","web-app"],"latest_commit_sha":null,"homepage":"https://metabrainz.org","language":"HTML","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/metabrainz.png","metadata":{"funding":{"custom":["https://metabrainz.org/donate"],"github":["metabrainz"]},"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2014-09-26T03:09:13.000Z","updated_at":"2025-07-06T15:29:20.000Z","dependencies_parsed_at":"2023-10-20T15:29:10.097Z","dependency_job_id":"3c3653fe-cdf8-4492-ac09-4d308a83b26a","html_url":"https://github.com/metabrainz/metabrainz.org","commit_stats":null,"previous_names":[],"tags_count":91,"template":false,"template_full_name":null,"purl":"pkg:github/metabrainz/metabrainz.org","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metabrainz%2Fmetabrainz.org","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metabrainz%2Fmetabrainz.org/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metabrainz%2Fmetabrainz.org/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metabrainz%2Fmetabrainz.org/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/metabrainz","download_url":"https://codeload.github.com/metabrainz/metabrainz.org/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/metabrainz%2Fmetabrainz.org/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267442904,"owners_count":24087893,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","donations","flask","metabrainz","payments","python","web-app"],"created_at":"2025-07-28T00:13:08.239Z","updated_at":"2025-07-28T00:13:10.868Z","avatar_url":"https://github.com/metabrainz.png","language":"HTML","funding_links":["https://metabrainz.org/donate","https://github.com/sponsors/metabrainz","https://developer.paypal.com/webapps/developer/docs/"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cbr\u003e\n  \u003ca href=\"https://github.com/metabrainz/metabrainz.org/archive/master.zip\"\u003e\u003cimg src=\"https://github.com/metabrainz/metabrainz-logos/blob/master/logos/MetaBrainz/SVG/MetaBrainz_logo.svg\" alt=\"MetaBrainz\"\u003e\u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/metabrainz/metabrainz.org/commits/master\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/metabrainz/metabrainz.org.svg?style=flat-square\u0026logo=github\u0026logoColor=white\"\n         alt=\"GitHub last commit\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/metabrainz/metabrainz.org/issues\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues-raw/metabrainz/metabrainz.org.svg?style=flat-square\u0026logo=github\u0026logoColor=white\"\n         alt=\"GitHub issues\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/metabrainz/metabrainz.org/pulls\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues-pr-raw/metabrainz/metabrainz.org.svg?style=flat-square\u0026logo=github\u0026logoColor=white\"\n         alt=\"GitHub pull requests\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**Website for the [MetaBrainz Foundation](https://metabrainz.org/).** This is\na Flask-based web application that provides info about the foundation and its\nsupporters, accepts donations from users and organizations, and provides\naccess to the [replication packets](https://musicbrainz.org/doc/Replication_Mechanics)\nfor MusicBrainz.\n\n## Doing a Release \nLike other PythonBrainz, this repository also has GitHub Actions setup to help do a\nrelease. A docker image is built and pushed to docker hub whenever a release is made\nfrom GitHub. Following are the steps to do a release:\n\n1. Navigate to the [Releases](https://github.com/metabrainz/metabrainz.org/releases) page. \n   More info about releases is available [here](https://docs.github.com/en/github/administering-a-repository/releasing-projects-on-github/managing-releases-in-a-repository#about-release-management).\n2. You should see a `Draft` Release at the top. Click on the `Edit` button next to it.\n3. In the `Tag Version` field, enter the tag you want to docker image to be tagged with. For example,\n    if you enter `v-2021-06-08.0` as the tag, the corresponding docker image will be `metabrainz/metabrainz:v-2021-06-08.0`.\n4. Click on `Publish release`.   \n   \n### Note:    \n1. The status of the build can be checked from the [Actions](https://github.com/metabrainz/metabrainz.org/actions) page.\n2. The release title field is ignored by the action. It can be set to any value we wish. We usually set it to the tag of\nthat release.\n3. The release description is only updated with titles of merged PRs not commits pushed directly to master.   \n\n## Development setup\n\nThe easiest way to set up MetaBrainz website for development is to use\n[Docker](https://www.docker.com/). Make sure that it is installed on your\nmachine before following the instructions.\n\n### Configuration\n\nThe app configuration must be stored in the file called `config.py`.\nYou can use an example one (`config.py.example`) and tweak the\nconfiguration:\n\n    $ cp config.py.example config.py\n    $ vim config.py\n\nYou need to make sure that required variables are set.\n\n#### MusicBrainz OAuth\n\nTo allow users to log in, you'll need to set two keys: ``MUSICBRAINZ_CLIENT_ID``\nand ``MUSICBRAINZ_CLIENT_SECRET``. To obtain these keys, you need to register\nyour instance of MetaBrainz.org on MusicBrainz at\nhttps://musicbrainz.org/account/applications/register. Set Callback URL field\nto ``http://\u003cyour host\u003e/login/musicbrainz/post`` (if ``PREFERRED_URL_SCHEME``\nin the config file is set to ``https``, make sure that you specify the same\nprotocol for callback URL). If you run the server locally, replace ``\u003cyour host\u003e``\nwith ``localhost``.\n\n#### Payments\n\nNext is the configuration of the payment systems. We use PayPal and Stripe to accept\npayments to our foundation. *PAYPAL_ACCOUNT_IDS* dictionary contains PayPal IDs or\nemail addresses of accounts for each supported currency. *PAYPAL_BUSINESS* is\nan address for non-donations; all payments sent there will be ignored.\n\nAfter these settings have been set and you are sure that your configuration\nis working properly within test mode, you can flip the switch. Set *DEBUG* to\n``False`` and *PAYMENT_PRODUCTION* to ``True``. **WARNING! For development\npurposes, you should only use payments in debug mode.**\n\n#### Serving replication packets\n\nReplication packets must be copied into ``./data/replication_packets`` directory.\nIt must have the following structure:\n```\n./data/replication_packets/\n    - hourly replication packets\n```\n\n### Startup\n\nThis command will build and start all the services that you will be able to\nuse for development:\n\n    $ ./develop.sh\n\nThe first time you set up the application, the database needs to be initialized:\n\n    $ ./develop.sh manage init-db --create-db\n\nThe web server should now be accessible at **http://localhost:80/**.\n\n\n### Building style sheets\n\nDue to the way development environment works with Docker, it's necessary to build CSS\nseparately from building an image. To do that you need to start the development server\n(all the containers with Docker Compose) and attach to the `web` container:\n```bash\n$ ./develop.sh exec -it web bash\n```\n\nThen install npm modules and build CSS:\n```bash\nweb# npm install\nweb# ./node_modules/.bin/lessc ./metabrainz/static/css/main.less \u003e ./metabrainz/static/css/main.css\nweb# ./node_modules/.bin/lessc ./metabrainz/static/css/theme/boostrap/boostrap.less \u003e ./metabrainz/static/css/theme/boostrap/boostrap.css\nweb# ./node_modules/.bin/lessc ./metabrainz/static/fonts/font_awesome/less/font-awesome.less \u003e ./metabrainz/static/fonts/font_awesome/less/font-awesome.css\n```\n\n*Last two builds are necessary only if you are planning to use the admin interface.*\n\n\n## Translations\n\n### Extracting strings\n\nOnce you have built and started all the services as mentioned above, run:\n\n`$ ./develop.sh manage extract-strings`\n\n### Compiling the strings\n\nThe POT files are compiled automatically every time the services are built, but in case you make any changes to the POT files\nand want to compile the translation files again, run:\n\n`$ ./develop.sh manage compile-translations`\n\n\n## Testing\n\nTo run all tests use:\n\n    $ ./test.sh\n\n### Testing payments\n\nBefore doing anything make sure that the `PAYMENT_PRODUCTION` variable in\nthe configuration file is set to `False`! This way you'll use testing environments\nwhere credit cards and bank accounts are not actually charged. More info about\ntesting environments for each payment service can be found in their documentation:\n\n* PayPal: https://developer.paypal.com/webapps/developer/docs/\n* Stripe: https://stripe.com/docs/testing\n\nPlease note that for [IPNs](https://en.wikipedia.org/wiki/Instant_payment_notification)\nto work, the application MUST be publicly available. If you are doing development\non your local machine it is likely that your callback endpoints will not be\nreachable for payment processors.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetabrainz%2Fmetabrainz.org","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmetabrainz%2Fmetabrainz.org","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmetabrainz%2Fmetabrainz.org/lists"}