mirror of
https://github.com/markbeep/AudioBookRequest.git
synced 2026-01-24 15:09:58 -06:00
432 lines
44 KiB
HTML
432 lines
44 KiB
HTML
<!doctype html>
|
|
<html itemscope itemtype="http://schema.org/WebPage" lang="en" class="no-js">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
<link rel="alternate" type="text/html" href="https://markbeep.github.io/AudioBookRequest/docs/local-development/_print/">
|
|
<link rel="alternate" type="application/rss+xml" href="https://markbeep.github.io/AudioBookRequest/docs/local-development/index.xml">
|
|
<meta name="robots" content="noindex, nofollow">
|
|
|
|
|
|
<link rel="shortcut icon" href="/AudioBookRequest/favicons/favicon.ico" >
|
|
<link rel="apple-touch-icon" href="/AudioBookRequest/favicons/apple-touch-icon-180x180.png" sizes="180x180">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/favicon-16x16.png" sizes="16x16">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/favicon-32x32.png" sizes="32x32">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-36x36.png" sizes="36x36">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-48x48.png" sizes="48x48">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-72x72.png" sizes="72x72">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-96x96.png" sizes="96x96">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-144x144.png" sizes="144x144">
|
|
<link rel="icon" type="image/png" href="/AudioBookRequest/favicons/android-192x192.png" sizes="192x192">
|
|
|
|
<title>Local Development | AudioBookRequest Docs</title>
|
|
<meta name="description" content="How to set up the project for local development.">
|
|
<meta property="og:url" content="https://markbeep.github.io/AudioBookRequest/docs/local-development/">
|
|
<meta property="og:site_name" content="AudioBookRequest Docs">
|
|
<meta property="og:title" content="Local Development">
|
|
<meta property="og:description" content="How to set up the project for local development.">
|
|
<meta property="og:locale" content="en">
|
|
<meta property="og:type" content="website">
|
|
|
|
<meta itemprop="name" content="Local Development">
|
|
<meta itemprop="description" content="How to set up the project for local development.">
|
|
<meta itemprop="dateModified" content="2025-08-22T15:01:53+02:00">
|
|
<meta itemprop="wordCount" content="354">
|
|
<meta itemprop="keywords" content="Local">
|
|
<meta name="twitter:card" content="summary">
|
|
<meta name="twitter:title" content="Local Development">
|
|
<meta name="twitter:description" content="How to set up the project for local development.">
|
|
<link href="/AudioBookRequest/scss/main.css" rel="stylesheet">
|
|
<script
|
|
src="https://code.jquery.com/jquery-3.7.1.min.js"
|
|
integrity="sha512-v2CJ7UaYy4JwqLDIrZUI/4hqeoQieOmAZNXBeQyjo21dadnwR+8ZaIJVT8EE2iyI61OV8e6M8PP2/4hpQINQ/g=="
|
|
crossorigin="anonymous"></script>
|
|
|
|
</head>
|
|
<body class="td-section">
|
|
<header>
|
|
<nav class="td-navbar js-navbar-scroll" data-bs-theme="dark">
|
|
<div class="container-fluid flex-column flex-md-row">
|
|
<a class="navbar-brand" href="/AudioBookRequest/"><span class="navbar-brand__logo navbar-logo"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 500 500" style="enable-background:new 0 0 500 500"><g><path style="fill:#fff" d="M116.8525 421.9722c-5.7041.0-10.3442-4.3127-10.3442-9.6129V88.183c0-5.3002 4.6401-9.6117 10.3442-9.6117H320.858c3.0347.0 9.3959.5498 11.7506 2.6302l.3545.3442 58.905 63.2912c2.3101 2.491 2.9202 8.4928 2.9202 11.3184v256.2039c0 5.3002-4.6407 9.6129-10.3436 9.6129H116.8525z"/><g><g><g><path style="fill:#767676" d="M384.4445 423.2066H116.852c-6.3839.0-11.5786-4.8658-11.5786-10.8474V88.1831c0-5.9804 5.1947-10.8461 11.5786-10.8461h204.0062c.377.0 9.2786.0329 12.568 2.9389l.3947.3833 58.9508 63.337c3.2135 3.4652 3.2514 11.7924 3.2514 12.1593v256.2036C396.0231 418.3408 390.8284 423.2066 384.4445 423.2066zM116.5079 411.9189c.0848.0278.1999.0531.3441.0531h267.5925c.1442.0.2581-.0253.3441-.0531V156.1556c-.0076-.9033-.3593-3.7347-.7034-5.0037l-57.6527-61.9416c-1.4651-.3176-4.4533-.6389-5.5742-.6389H116.852c-.143.0-.2594.024-.3441.0531V411.9189zm267.4533-261.149zM327.0321 89.371v.0013V89.371z"/></g></g></g><g><g><path style="fill:#5b7fc0" d="M189.0874 210.1754l.0012-.0012c7.7751.0012 15.0295 4.1862 18.932 10.9234 1.9177 3.3159 2.9305 7.1011 2.9293 10.9378.0 5.8394-2.2733 11.3304-6.4032 15.4604-4.1288 4.1288-9.6186 6.4032-15.458 6.4032s-11.328-2.2733-15.458-6.4032-6.4032-9.6186-6.4056-15.4628c.0012-6.025 2.454-11.4897 6.4116-15.4473C177.5953 212.627 183.0601 210.1742 189.0874 210.1754zm7.993 21.8576c.0012-1.4042-.3687-2.7868-1.063-3.9887-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019-4.4077.0024-7.993 3.5877-7.993 7.993.0 2.1356.832 4.1431 2.3427 5.6539 1.5083 1.5083 3.5159 2.3403 5.6503 2.3415 2.1356.0 4.1443-.8308 5.6539-2.3403S197.0816 234.1722 197.0804 232.033z"/><path style="opacity:.3;fill:#fff" d="M189.0898 210.176c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 212.6276 183.0612 210.176 189.0898 210.176zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 236.239 197.0839 234.2399 197.0839 232.0372z"/><g><defs><path id="SVGID_1_" d="M194.7376 237.6875c-1.4461 1.4461-3.4452 2.3439-5.6479 2.3439-4.4077-.0024-7.9918-3.5865-7.9942-7.9942.0024-4.4125 3.5937-7.999 7.9942-7.9942 2.8443.0 5.497 1.5323 6.924 3.9983.6991 1.2067 1.0702 2.5881 1.0702 3.9959C197.0839 234.2399 196.1861 236.239 194.7376 237.6875z"/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_2_);fill:#fff" d="M190.0704 225.0237c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 225.7247 191.9774 225.0237 190.0704 225.0237z"/><path style="opacity:.13;clip-path:url(#SVGID_2_);fill:#020202" d="M190.0704 225.0237c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 225.7247 191.9774 225.0237 190.0704 225.0237z"/></g><g><defs><path id="SVGID_3_" d="M189.0898 210.176c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 212.6276 183.0612 210.176 189.0898 210.176zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 236.239 197.0839 234.2399 197.0839 232.0372z"/></defs><clipPath id="SVGID_4_"><use xlink:href="#SVGID_3_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_4_);fill:#5b7fc0" d="M172.6595 215.6045c-3.96 3.96-6.4116 9.4235-6.4116 15.452-.0024 12.0547 9.8066 21.8636 21.8613 21.8612 12.0547.0024 21.8636-9.797 21.8613-21.8612.0024-3.8475-1.0151-7.6326-2.9353-10.9462-3.8977-6.7324-11.1497-10.9151-18.926-10.9151C182.0806 209.1953 176.6171 211.647 172.6595 215.6045z"/></g></g><rect x="198.8952" y="225.1043" style="fill:#5b7fc0" width="122.6266" height="13.8671"/></g><g><path style="fill:#d95140" d="M189.0874 155.7611l.0012-.0012c7.7751.0012 15.0295 4.1862 18.932 10.9234 1.9177 3.3159 2.9305 7.1011 2.9293 10.9378.0 5.8394-2.2733 11.3304-6.4032 15.4604-4.1288 4.1288-9.6186 6.4032-15.458 6.4032s-11.328-2.2733-15.458-6.4032-6.4032-9.6186-6.4056-15.4628c.0012-6.0249 2.454-11.4897 6.4116-15.4473C177.5953 158.2128 183.0601 155.7599 189.0874 155.7611zm7.993 21.8577c.0012-1.4042-.3687-2.7868-1.063-3.9887-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019-4.4077.0024-7.993 3.5877-7.993 7.993.0 2.1356.832 4.1431 2.3427 5.6539 1.5083 1.5083 3.5159 2.3403 5.6503 2.3415 2.1356.0 4.1443-.8308 5.6539-2.3403C196.2508 181.7667 197.0816 179.758 197.0804 177.6188z"/><path style="opacity:.3;fill:#fff" d="M189.0898 155.7617c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3135 2.9377 7.0987 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 158.2134 183.0612 155.7617 189.0898 155.7617zm7.9941 21.8613c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 181.8248 197.0839 179.8256 197.0839 177.623z"/><g><defs><path id="SVGID_5_" d="M194.7376 183.2733c-1.4461 1.4461-3.4452 2.3439-5.6479 2.3439-4.4077-.0024-7.9918-3.5865-7.9942-7.9942.0024-4.4125 3.5937-7.9989 7.9942-7.9942 2.8443.0 5.497 1.5323 6.924 3.9983.6991 1.2067 1.0702 2.5881 1.0702 3.9959C197.0839 179.8256 196.1861 181.8248 194.7376 183.2733z"/></defs><clipPath id="SVGID_6_"><use xlink:href="#SVGID_5_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_6_);fill:#fff" d="M190.0704 170.6095c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 171.3104 191.9774 170.6095 190.0704 170.6095z"/><path style="opacity:.13;clip-path:url(#SVGID_6_);fill:#020202" d="M190.0704 170.6095c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9546.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.663-2.8588-6.116.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C193.7885 171.3104 191.9774 170.6095 190.0704 170.6095z"/></g><g><defs><path id="SVGID_7_" d="M189.0898 155.7617c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3135 2.9377 7.0987 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8066-21.8612-21.8613.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 158.2134 183.0612 155.7617 189.0898 155.7617zm7.9941 21.8613c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 181.8248 197.0839 179.8256 197.0839 177.623z"/></defs><clipPath id="SVGID_8_"><use xlink:href="#SVGID_7_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_8_);fill:#d95140" d="M172.6595 161.1903c-3.96 3.96-6.4116 9.4235-6.4116 15.452-.0024 12.0547 9.8066 21.8636 21.8613 21.8613 12.0547.0024 21.8636-9.797 21.8613-21.8613.0024-3.8474-1.0151-7.6326-2.9353-10.9462-3.8977-6.7324-11.1497-10.9151-18.926-10.9151C182.0806 154.7811 176.6171 157.2327 172.6595 161.1903z"/></g><rect x="198.8952" y="170.69" style="fill:#d95140" width="122.6266" height="13.8671"/></g><g><g><path style="fill:#56a55c" d="M189.5379 264.6147l.0012-.0012c7.7751.0012 15.0294 4.1862 18.932 10.9235 1.9177 3.3159 2.9305 7.1011 2.9293 10.9378.0 5.8394-2.2733 11.3304-6.4032 15.4604-4.1288 4.1288-9.6186 6.4032-15.458 6.4032-5.8394.0-11.3281-2.2733-15.458-6.4032-4.13-4.13-6.4032-9.6186-6.4056-15.4628.0012-6.0249 2.454-11.4897 6.4116-15.4472C178.0458 267.0663 183.5105 264.6135 189.5379 264.6147zm7.993 21.8576c.0012-1.4042-.3687-2.7868-1.063-3.9887-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019-4.4077.0024-7.993 3.5877-7.993 7.993.0 2.1356.832 4.1431 2.3427 5.6538 1.5083 1.5083 3.5159 2.3403 5.6503 2.3415 2.1356.0 4.1443-.8308 5.6539-2.3403C196.7013 290.6202 197.5321 288.6115 197.5309 286.4723z"/><path style="opacity:.3;fill:#fff" d="M189.5403 264.6153c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3135 2.9377 7.0987 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8065-21.8612-21.8613.0-6.0285 2.4516-11.492 6.4116-15.452C178.0482 267.0669 183.5117 264.6153 189.5403 264.6153zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9941.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.6366 290.6783 197.5344 288.6792 197.5344 286.4765z"/><g><defs><path id="SVGID_9_" d="M195.1881 292.1268c-1.4461 1.4461-3.4452 2.3439-5.6479 2.3439-4.4077-.0024-7.9918-3.5865-7.9942-7.9942.0024-4.4125 3.5937-7.9989 7.9942-7.9941 2.8443.0 5.497 1.5323 6.924 3.9983.6991 1.2067 1.0702 2.5881 1.0702 3.9959C197.5344 288.6792 196.6366 290.6783 195.1881 292.1268z"/></defs><clipPath id="SVGID_10_"><use xlink:href="#SVGID_9_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_10_);fill:#fff" d="M190.5209 279.463c-4.4005-.0048-7.9918 3.5817-7.9942 7.9941.0011 1.9547.7088 3.7452 1.8782 5.1354-1.7446-1.4674-2.8575-3.6631-2.8588-6.1161.0024-4.4125 3.5936-7.999 7.9942-7.9941 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C194.239 280.164 192.4279 279.463 190.5209 279.463z"/><path style="opacity:.13;clip-path:url(#SVGID_10_);fill:#020202" d="M190.5209 279.463c-4.4005-.0048-7.9918 3.5817-7.9942 7.9941.0011 1.9547.7088 3.7452 1.8782 5.1354-1.7446-1.4674-2.8575-3.6631-2.8588-6.1161.0024-4.4125 3.5936-7.999 7.9942-7.9941 2.3802-1e-4 4.616 1.0833 6.1218 2.8788C194.239 280.164 192.4279 279.463 190.5209 279.463z"/></g><g><defs><path id="SVGID_11_" d="M189.5403 264.6153c7.7763.0 15.0283 4.1826 18.926 10.9151 1.9201 3.3135 2.9377 7.0987 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8613-12.0547.0024-21.8636-9.8065-21.8612-21.8613.0-6.0285 2.4516-11.492 6.4116-15.452C178.0482 267.0669 183.5117 264.6153 189.5403 264.6153zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9941.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.6366 290.6783 197.5344 288.6792 197.5344 286.4765z"/></defs><clipPath id="SVGID_12_"><use xlink:href="#SVGID_11_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_12_);fill:#56a55c" d="M173.11 270.0439c-3.96 3.96-6.4116 9.4235-6.4116 15.452-.0024 12.0547 9.8066 21.8636 21.8613 21.8613 12.0547.0024 21.8636-9.797 21.8613-21.8613.0024-3.8474-1.0151-7.6326-2.9353-10.9462-3.8977-6.7325-11.1497-10.9151-18.926-10.9151C182.5311 263.6346 177.0676 266.0863 173.11 270.0439z"/></g></g><rect x="199.3456" y="279.5436" style="fill:#56a55c" width="122.6266" height="13.8671"/></g><g><g><path style="fill:#f1bc42" d="M189.0874 318.7208l.0012-.0012c7.7751.0012 15.0295 4.1862 18.932 10.9234 1.9177 3.3159 2.9305 7.1011 2.9293 10.9378.0 5.8394-2.2733 11.3305-6.4032 15.4604-4.1288 4.1288-9.6186 6.4032-15.458 6.4032s-11.328-2.2733-15.458-6.4032-6.4032-9.6186-6.4056-15.4628c.0012-6.025 2.454-11.4897 6.4116-15.4472C177.5953 321.1724 183.0601 318.7196 189.0874 318.7208zm7.993 21.8576c.0012-1.4042-.3687-2.7868-1.063-3.9887-1.4293-2.4684-4.0833-3.9995-6.9299-4.0019-4.4077.0024-7.993 3.5877-7.993 7.993.0 2.1356.832 4.1431 2.3427 5.6539 1.5083 1.5083 3.5159 2.3403 5.6503 2.3415 2.1356.0 4.1443-.8308 5.6539-2.3403S197.0816 342.7176 197.0804 340.5784z"/><path style="opacity:.3;fill:#fff" d="M189.0898 318.7214c7.7763.0 15.0283 4.1826 18.926 10.915 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8612-12.0547.0024-21.8636-9.8065-21.8612-21.8612.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 321.173 183.0612 318.7214 189.0898 318.7214zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 344.7844 197.0839 342.7853 197.0839 340.5826z"/><g><defs><path id="SVGID_13_" d="M194.7376 346.2329c-1.4461 1.4461-3.4452 2.3439-5.6479 2.3439-4.4077-.0024-7.9918-3.5865-7.9942-7.9942.0024-4.4125 3.5937-7.999 7.9942-7.9942 2.8443.0 5.497 1.5323 6.924 3.9983.6991 1.2067 1.0702 2.5881 1.0702 3.9959C197.0839 342.7853 196.1861 344.7844 194.7376 346.2329z"/></defs><clipPath id="SVGID_14_"><use xlink:href="#SVGID_13_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_14_);fill:#fff" d="M190.0704 333.5691c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9547.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.6631-2.8588-6.1161.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0834 6.1218 2.8788C193.7885 334.2701 191.9774 333.5691 190.0704 333.5691z"/><path style="opacity:.13;clip-path:url(#SVGID_14_);fill:#020202" d="M190.0704 333.5691c-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0011 1.9547.7088 3.7452 1.8782 5.1354-1.7447-1.4674-2.8575-3.6631-2.8588-6.1161.0024-4.4125 3.5936-7.999 7.9942-7.9942 2.3802-1e-4 4.616 1.0834 6.1218 2.8788C193.7885 334.2701 191.9774 333.5691 190.0704 333.5691z"/></g><g><defs><path id="SVGID_15_" d="M189.0898 318.7214c7.7763.0 15.0283 4.1826 18.926 10.915 1.9201 3.3136 2.9377 7.0988 2.9353 10.9462.0024 12.0643-9.8065 21.8636-21.8613 21.8612-12.0547.0024-21.8636-9.8065-21.8612-21.8612.0-6.0285 2.4516-11.4921 6.4116-15.452C177.5977 321.173 183.0612 318.7214 189.0898 318.7214zm7.9941 21.8612c0-1.4078-.3711-2.7892-1.0702-3.9959-1.4269-2.466-4.0797-3.9983-6.924-3.9983-4.4005-.0048-7.9918 3.5817-7.9942 7.9942.0024 4.4077 3.5865 7.9918 7.9942 7.9942 2.2027.0 4.2018-.8978 5.6479-2.3439C196.1861 344.7844 197.0839 342.7853 197.0839 340.5826z"/></defs><clipPath id="SVGID_16_"><use xlink:href="#SVGID_15_" style="overflow:visible"/></clipPath><path style="clip-path:url(#SVGID_16_);fill:#f1bc42" d="M172.6595 324.15c-3.96 3.96-6.4116 9.4235-6.4116 15.452-.0024 12.0547 9.8066 21.8636 21.8613 21.8612 12.0547.0024 21.8636-9.797 21.8613-21.8612.0024-3.8474-1.0151-7.6327-2.9353-10.9462-3.8977-6.7324-11.1497-10.9151-18.926-10.9151C182.0806 317.7407 176.6171 320.1924 172.6595 324.15z"/></g></g><rect x="198.8952" y="333.6497" style="fill:#f1bc42" width="122.6266" height="13.8671"/></g></g></svg></span><span class="navbar-brand__name">AudioBookRequest Docs</span></a>
|
|
<div class="td-navbar-nav-scroll ms-md-auto" id="main_navbar">
|
|
<ul class="navbar-nav">
|
|
<li class="nav-item">
|
|
<a class="nav-link active" href="/AudioBookRequest/docs/"><span>Documentation</span></a>
|
|
</li>
|
|
<li class="nav-item">
|
|
<a class="nav-link" href="/AudioBookRequest/community/"><span>Community</span></a>
|
|
</li>
|
|
<li class="td-light-dark-menu nav-item dropdown">
|
|
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
|
|
<symbol id="check2" viewBox="0 0 16 16">
|
|
<path d="M13.854 3.646a.5.5 0 0 1 0 .708l-7 7a.5.5 0 0 1-.708 0l-3.5-3.5a.5.5 0 1 1 .708-.708L6.5 10.293l6.646-6.647a.5.5 0 0 1 .708 0z"/>
|
|
</symbol>
|
|
<symbol id="circle-half" viewBox="0 0 16 16">
|
|
<path d="M8 15A7 7 0 1 0 8 1v14zm0 1A8 8 0 1 1 8 0a8 8 0 0 1 0 16z"/>
|
|
</symbol>
|
|
<symbol id="moon-stars-fill" viewBox="0 0 16 16">
|
|
<path d="M6 .278a.768.768 0 0 1 .08.858 7.208 7.208 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277.527 0 1.04-.055 1.533-.16a.787.787 0 0 1 .81.316.733.733 0 0 1-.031.893A8.349 8.349 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.752.752 0 0 1 6 .278z"/>
|
|
<path d="M10.794 3.148a.217.217 0 0 1 .412 0l.387 1.162c.173.518.579.924 1.097 1.097l1.162.387a.217.217 0 0 1 0 .412l-1.162.387a1.734 1.734 0 0 0-1.097 1.097l-.387 1.162a.217.217 0 0 1-.412 0l-.387-1.162A1.734 1.734 0 0 0 9.31 6.593l-1.162-.387a.217.217 0 0 1 0-.412l1.162-.387a1.734 1.734 0 0 0 1.097-1.097l.387-1.162zM13.863.099a.145.145 0 0 1 .274 0l.258.774c.115.346.386.617.732.732l.774.258a.145.145 0 0 1 0 .274l-.774.258a1.156 1.156 0 0 0-.732.732l-.258.774a.145.145 0 0 1-.274 0l-.258-.774a1.156 1.156 0 0 0-.732-.732l-.774-.258a.145.145 0 0 1 0-.274l.774-.258c.346-.115.617-.386.732-.732L13.863.1z"/>
|
|
</symbol>
|
|
<symbol id="sun-fill" viewBox="0 0 16 16">
|
|
<path d="M8 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0zm0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13zm8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5zM3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8zm10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0zm-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0zm9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707zM4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708z"/>
|
|
</symbol>
|
|
</svg>
|
|
|
|
<button class="btn btn-link nav-link dropdown-toggle d-flex align-items-center"
|
|
id="bd-theme"
|
|
type="button"
|
|
aria-expanded="false"
|
|
data-bs-toggle="dropdown"
|
|
data-bs-display="static"
|
|
aria-label="Toggle theme (auto)">
|
|
<svg class="bi my-1 theme-icon-active"><use href="#circle-half"></use></svg>
|
|
</button>
|
|
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="bd-theme-text">
|
|
<li>
|
|
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false">
|
|
<svg class="bi me-2 opacity-50"><use href="#sun-fill"></use></svg>
|
|
Light
|
|
<svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
|
|
</button>
|
|
</li>
|
|
<li>
|
|
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false">
|
|
<svg class="bi me-2 opacity-50"><use href="#moon-stars-fill"></use></svg>
|
|
Dark
|
|
<svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
|
|
</button>
|
|
</li>
|
|
<li>
|
|
<button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true">
|
|
<svg class="bi me-2 opacity-50"><use href="#circle-half"></use></svg>
|
|
Auto
|
|
<svg class="bi ms-auto d-none"><use href="#check2"></use></svg>
|
|
</button>
|
|
</li>
|
|
</ul>
|
|
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div class="d-none d-lg-block">
|
|
<div class="td-search">
|
|
<div class="td-search__icon"></div>
|
|
<input type="search" class="td-search__input form-control td-search-input" placeholder="Search this site…" aria-label="Search this site…" autocomplete="off">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
<div class="container-fluid td-outer">
|
|
<div class="td-main">
|
|
<div class="row flex-xl-nowrap">
|
|
<aside class="col-12 col-md-3 col-xl-2 td-sidebar d-print-none">
|
|
<div id="td-sidebar-menu" class="td-sidebar__inner">
|
|
<form class="td-sidebar__search d-flex align-items-center">
|
|
<div class="td-search">
|
|
<div class="td-search__icon"></div>
|
|
<input type="search" class="td-search__input form-control td-search-input" placeholder="Search this site…" aria-label="Search this site…" autocomplete="off">
|
|
</div>
|
|
<button class="btn btn-link td-sidebar__toggle d-md-none p-0 ms-3 fas fa-bars" type="button" data-bs-toggle="collapse" data-bs-target="#td-section-nav" aria-controls="td-section-nav" aria-expanded="false" aria-label="Toggle section navigation">
|
|
</button>
|
|
</form>
|
|
<nav class="td-sidebar-nav collapse" id="td-section-nav">
|
|
<ul class="td-sidebar-nav__section pe-md-3 ul-0">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child active-path" id="m-audiobookrequestdocs-li">
|
|
<a href="/AudioBookRequest/docs/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section tree-root" id="m-audiobookrequestdocs"><span class="">Documentation</span></a>
|
|
<ul class="ul-1">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id="m-audiobookrequestdocsgetting-started-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocsgetting-started"><span class="">Getting Started</span></a>
|
|
<ul class="ul-2 foldable">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id="m-audiobookrequestdocsgetting-startedrunning-the-app-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/running-the-app/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocsgetting-startedrunning-the-app"><span class="">Running the app</span></a>
|
|
<ul class="ul-3 foldable">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsgetting-startedrunning-the-appdocker-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/running-the-app/docker/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocsgetting-startedrunning-the-appdocker"><span class="">Docker</span></a>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsgetting-startedrunning-the-appdocker-compose-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/running-the-app/docker-compose/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocsgetting-startedrunning-the-appdocker-compose"><span class="">Docker Compose</span></a>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsgetting-startedrunning-the-appkubernetes-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/running-the-app/kubernetes/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocsgetting-startedrunning-the-appkubernetes"><span class="">Kubernetes</span></a>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsgetting-startedrunning-the-appbare-metal-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/running-the-app/bare-metal/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocsgetting-startedrunning-the-appbare-metal"><span class="">Bare Metal</span></a>
|
|
</li>
|
|
</ul>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsgetting-startedfirst-login-li">
|
|
<a href="/AudioBookRequest/docs/getting-started/first-login/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocsgetting-startedfirst-login"><span class="">First Login</span></a>
|
|
</li>
|
|
</ul>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id="m-audiobookrequestdocstutorials-li">
|
|
<a href="/AudioBookRequest/docs/tutorials/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocstutorials"><span class="">Tutorials</span></a>
|
|
<ul class="ul-2 foldable">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocstutorialsnotifications-li">
|
|
<a href="/AudioBookRequest/docs/tutorials/notifications/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocstutorialsnotifications"><span class="">Notifications</span></a>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id="m-audiobookrequestdocstutorialsapi-li">
|
|
<a href="/AudioBookRequest/docs/tutorials/api/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocstutorialsapi"><span class="">API</span></a>
|
|
<ul class="ul-3 foldable">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocstutorialsapiindexers-li">
|
|
<a href="/AudioBookRequest/docs/tutorials/api/indexers/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocstutorialsapiindexers"><span class="">Indexers</span></a>
|
|
</li>
|
|
</ul>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocstutorialsoidc-li">
|
|
<a href="/AudioBookRequest/docs/tutorials/oidc/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocstutorialsoidc"><span class="">OpenID Connect</span></a>
|
|
</li>
|
|
</ul>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section with-child" id="m-audiobookrequestdocsconcepts-li">
|
|
<a href="/AudioBookRequest/docs/concepts/" class="align-left ps-0 td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocsconcepts"><span class="">Concepts</span></a>
|
|
<ul class="ul-2 foldable">
|
|
<li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocsconceptsenvironment-variables-li">
|
|
<a href="/AudioBookRequest/docs/concepts/environment-variables/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocsconceptsenvironment-variables"><span class="">Environment Variables</span></a>
|
|
</li>
|
|
</ul>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child active-path" id="m-audiobookrequestdocslocal-development-li">
|
|
<a href="/AudioBookRequest/docs/local-development/" class="align-left ps-0 active td-sidebar-link td-sidebar-link__section" id="m-audiobookrequestdocslocal-development"><span class="td-sidebar-nav-active-item">Local Development</span></a>
|
|
</li><li class="td-sidebar-nav__section-title td-sidebar-nav__section without-child" id="m-audiobookrequestdocscontribution-guidelines-li">
|
|
<a href="/AudioBookRequest/docs/contribution-guidelines/" class="align-left ps-0 td-sidebar-link td-sidebar-link__page" id="m-audiobookrequestdocscontribution-guidelines"><span class="">Contribution Guidelines</span></a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
|
|
</aside>
|
|
<aside class="d-none d-xl-block col-xl-2 td-sidebar-toc d-print-none">
|
|
<div class="td-page-meta ms-2 pb-1 pt-2 mb-0">
|
|
<a href="https://github.com/markbeep/AudioBookRequest/tree/main/docs/content/docs/local-development/_index.md" class="td-page-meta--view td-page-meta__view" target="_blank" rel="noopener"><i class="fa-solid fa-file-lines fa-fw"></i> View page source</a>
|
|
<a href="https://github.com/markbeep/AudioBookRequest/edit/main/docs/content/docs/local-development/_index.md" class="td-page-meta--edit td-page-meta__edit" target="_blank" rel="noopener"><i class="fa-solid fa-pen-to-square fa-fw"></i> Edit this page</a>
|
|
<a href="https://github.com/markbeep/AudioBookRequest/new/main/docs/content/docs/local-development?filename=change-me.md&value=---%0Atitle%3A+%22Long+Page+Title%22%0AlinkTitle%3A+%22Short+Nav+Title%22%0Aweight%3A+100%0Adescription%3A+%3E-%0A+++++Page+description+for+heading+and+indexes.%0A---%0A%0A%23%23+Heading%0A%0AEdit+this+template+to+create+your+new+page.%0A%0A%2A+Give+it+a+good+name%2C+ending+in+%60.md%60+-+e.g.+%60getting-started.md%60%0A%2A+Edit+the+%22front+matter%22+section+at+the+top+of+the+page+%28weight+controls+how+its+ordered+amongst+other+pages+in+the+same+directory%3B+lowest+number+first%29.%0A%2A+Add+a+good+commit+message+at+the+bottom+of+the+page+%28%3C80+characters%3B+use+the+extended+description+field+for+more+detail%29.%0A%2A+Create+a+new+branch+so+you+can+preview+your+new+file+and+request+a+review+via+Pull+Request.%0A" class="td-page-meta--child td-page-meta__child" target="_blank" rel="noopener"><i class="fa-solid fa-pen-to-square fa-fw"></i> Create child page</a>
|
|
<a href="https://github.com/markbeep/AudioBookRequest/issues/new?title=Local%20Development" class="td-page-meta--issue td-page-meta__issue" target="_blank" rel="noopener"><i class="fa-solid fa-list-check fa-fw"></i> Create documentation issue</a>
|
|
<a href="https://github.com/markbeep/AudioBookRequest/issues/new" class="td-page-meta--project td-page-meta__project-issue" target="_blank" rel="noopener"><i class="fa-solid fa-list-check fa-fw"></i> Create project issue</a>
|
|
<a id="print" href="/AudioBookRequest/docs/local-development/_print/"><i class="fa-solid fa-print fa-fw"></i> Print entire section</a>
|
|
|
|
</div>
|
|
|
|
<div class="td-toc">
|
|
<nav id="TableOfContents">
|
|
<ul>
|
|
<li><a href="#requirements">Requirements</a></li>
|
|
<li><a href="#setup">Setup</a></li>
|
|
<li><a href="#initialize-database">Initialize Database</a></li>
|
|
<li><a href="#generate-the-css-files">Generate the CSS files</a></li>
|
|
<li><a href="#run-the-app">Run the app</a></li>
|
|
<li><a href="#docker-compose">Docker Compose</a></li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="taxonomy taxonomy-terms-cloud taxo-tags">
|
|
<h5 class="taxonomy-title">Tag Cloud</h5>
|
|
<ul class="taxonomy-terms">
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/tags/development/" data-taxonomy-term="development"><span class="taxonomy-label">Development</span><span class="taxonomy-count">1</span></a></li>
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/tags/docker/" data-taxonomy-term="docker"><span class="taxonomy-label">Docker</span><span class="taxonomy-count">3</span></a></li>
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/tags/local/" data-taxonomy-term="local"><span class="taxonomy-label">Local</span><span class="taxonomy-count">1</span></a></li>
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/tags/setup/" data-taxonomy-term="setup"><span class="taxonomy-label">Setup</span><span class="taxonomy-count">1</span></a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="taxonomy taxonomy-terms-cloud taxo-categories">
|
|
<h5 class="taxonomy-title">Categories</h5>
|
|
<ul class="taxonomy-terms">
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/categories/development/" data-taxonomy-term="development"><span class="taxonomy-label">Development</span><span class="taxonomy-count">1</span></a></li>
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/categories/setup/" data-taxonomy-term="setup"><span class="taxonomy-label">Setup</span><span class="taxonomy-count">6</span></a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
|
|
</aside>
|
|
<main class="col-12 col-md-9 col-xl-8 ps-md-5" role="main">
|
|
|
|
|
|
|
|
<nav aria-label="breadcrumb" class="td-breadcrumbs">
|
|
<ol class="breadcrumb">
|
|
<li class="breadcrumb-item">
|
|
<a href="/AudioBookRequest/docs/">Documentation</a></li>
|
|
<li class="breadcrumb-item active" aria-current="page">
|
|
Local Development</li>
|
|
</ol>
|
|
</nav>
|
|
<div class="td-content">
|
|
<h1>Local Development</h1>
|
|
<div class="lead">How to set up the project for local development.</div>
|
|
<header class="article-meta">
|
|
<div class="taxonomy taxonomy-terms-article taxo-tags">
|
|
<h5 class="taxonomy-title">Tags:</h5>
|
|
<ul class="taxonomy-terms">
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/tags/local/" data-taxonomy-term="local"><span class="taxonomy-label">Local</span></a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="taxonomy taxonomy-terms-article taxo-categories">
|
|
<h5 class="taxonomy-title">Categories:</h5>
|
|
<ul class="taxonomy-terms">
|
|
<li><a class="taxonomy-term" href="https://markbeep.github.io/AudioBookRequest/categories/development/" data-taxonomy-term="development"><span class="taxonomy-label">Development</span></a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
</header>
|
|
<h2 id="requirements">Requirements<a class="td-heading-self-link" href="#requirements" aria-label="Heading self-link"></a></h2>
|
|
<ul>
|
|
<li>Python >3.12</li>
|
|
<li><a href="https://docs.astral.sh/uv/">uv</a>. Used as the package manager</li>
|
|
<li>node.js. Exact version is not too important. Too old versions might fail when
|
|
installing packages.</li>
|
|
</ul>
|
|
<h2 id="setup">Setup<a class="td-heading-self-link" href="#setup" aria-label="Heading self-link"></a></h2>
|
|
<p>Virtual environments help isolate any installed packages to this directory.
|
|
Project was made with <code>Python 3.12</code> and uses new generics introduced in 3.12.
|
|
Older python versions might not work or could have incorrect typing.</p>
|
|
<p>For improved dependency management, <code>uv</code> is used instead of <code>pip</code>.</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span><span style="color:#8a93a5;font-style:italic"># This creates the venv as well as installs all dependencies</span>
|
|
</span></span><span style="display:flex;"><span>uv sync
|
|
</span></span></code></pre></div><p>For local development, environment variables can be added to <code>.env.local</code> and
|
|
they’ll be used wherever required. This file is not used in production.</p>
|
|
<h2 id="initialize-database">Initialize Database<a class="td-heading-self-link" href="#initialize-database" aria-label="Heading self-link"></a></h2>
|
|
<p><a href="https://alembic.sqlalchemy.org/en/latest/">Alembic</a> is used to create database
|
|
migrations. Run the following before starting up the application for the first
|
|
time. It will initialize the directory if non-existant, create the database file
|
|
as well as execute any required migrations.</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>uv run alembic upgrade heads
|
|
</span></span></code></pre></div><p><em>In case of any model changes, remember to create migrations using
|
|
<code>alembic revision --autogenerate -m "<message>"</code>.</em></p>
|
|
<h2 id="generate-the-css-files">Generate the CSS files<a class="td-heading-self-link" href="#generate-the-css-files" aria-label="Heading self-link"></a></h2>
|
|
<p><a href="https://tailwindcss.com/">Tailwindcss</a> is used to style elements using CSS. On
|
|
top of that, <a href="https://daisyui.com/">daisyUI</a> is for easy and consistent
|
|
component styling.</p>
|
|
<p>Install daisyUI and start Tailwindcss watcher. Required for any CSS styling.</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>npm i
|
|
</span></span><span style="display:flex;"><span>uv run tailwindcss -i static/tw.css -o static/globals.css --watch
|
|
</span></span><span style="display:flex;"><span><span style="color:#8a93a5;font-style:italic"># Alternatively npx can be used to run tailwindcss</span>
|
|
</span></span><span style="display:flex;"><span>npx @tailwindcss/cli@4 -i static/tw.css -o static/globals.css --watch
|
|
</span></span></code></pre></div><p>Tailwind has to run anytime something is changed in the HTML template files.</p>
|
|
<h2 id="run-the-app">Run the app<a class="td-heading-self-link" href="#run-the-app" aria-label="Heading self-link"></a></h2>
|
|
<p>Running the application is best done in multiple terminals:</p>
|
|
<ol>
|
|
<li>
|
|
<p>Start FastAPI dev mode:</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>uv run fastapi dev
|
|
</span></span></code></pre></div><p>Website can be visited at http://localhost:8000.</p>
|
|
</li>
|
|
<li>
|
|
<p><em>Optional:</em> Start browser-sync. This hot reloads the website when the html
|
|
template or python files are modified:</p>
|
|
</li>
|
|
</ol>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-sh" data-lang="sh"><span style="display:flex;"><span>browser-sync http://localhost:8000 --files templates/** --files app/**
|
|
</span></span></code></pre></div><p><strong>NOTE</strong>: Website has to be visited at http://localhost:3000 instead.</p>
|
|
<h2 id="docker-compose">Docker Compose<a class="td-heading-self-link" href="#docker-compose" aria-label="Heading self-link"></a></h2>
|
|
<p>The docker compose can also be used to run the app locally. Any services that
|
|
are required can be added to it for easy testing:</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose up --build
|
|
</span></span></code></pre></div><p>The local context (ABR) is in a docker compose profile called <code>local</code>, which is
|
|
only run if explicitly stated as follows:</p>
|
|
<div class="highlight"><pre tabindex="0" style="color:#b0c4de;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>docker compose --profile <span style="color:#ef8383">local</span> up
|
|
</span></span></code></pre></div>
|
|
<div class="section-index">
|
|
|
|
|
|
</div>
|
|
<style>
|
|
.feedback--answer {
|
|
display: inline-block;
|
|
}
|
|
.feedback--answer-no {
|
|
margin-left: 1em;
|
|
}
|
|
.feedback--response {
|
|
display: none;
|
|
margin-top: 1em;
|
|
}
|
|
.feedback--response__visible {
|
|
display: block;
|
|
}
|
|
</style>
|
|
<div class="d-print-none">
|
|
<h2 class="feedback--title">Feedback</h2>
|
|
<p class="feedback--question">Was this page helpful?</p>
|
|
<button class="btn btn-primary mb-4 feedback--answer feedback--answer-yes">Yes</button>
|
|
<button class="btn btn-primary mb-4 feedback--answer feedback--answer-no">No</button>
|
|
<p class="feedback--response feedback--response-yes">
|
|
Glad to hear it! Please <a href="https://github.com/markbeep/AudioBookRequest/issues/new">tell us how we can improve</a>.
|
|
</p>
|
|
<p class="feedback--response feedback--response-no">
|
|
Sorry to hear that. Please <a href="https://github.com/markbeep/AudioBookRequest/issues/new">tell us how we can improve</a>.
|
|
</p>
|
|
</div>
|
|
<script>
|
|
const yesButton = document.querySelector('.feedback--answer-yes');
|
|
const noButton = document.querySelector('.feedback--answer-no');
|
|
const yesResponse = document.querySelector('.feedback--response-yes');
|
|
const noResponse = document.querySelector('.feedback--response-no');
|
|
const disableButtons = () => {
|
|
yesButton.disabled = true;
|
|
noButton.disabled = true;
|
|
};
|
|
const sendFeedback = (value) => {
|
|
if (typeof gtag !== 'function') return;
|
|
gtag('event', 'page_helpful', {
|
|
'event_category': 'Helpful',
|
|
'event_label': window.location.pathname,
|
|
'value': value
|
|
});
|
|
};
|
|
yesButton.addEventListener('click', () => {
|
|
yesResponse.classList.add('feedback--response__visible');
|
|
disableButtons();
|
|
sendFeedback( 100 );
|
|
});
|
|
noButton.addEventListener('click', () => {
|
|
noResponse.classList.add('feedback--response__visible');
|
|
disableButtons();
|
|
sendFeedback(0);
|
|
});
|
|
</script>
|
|
<br />
|
|
<div class="td-page-meta__lastmod">
|
|
Last modified August 22, 2025: <a data-proofer-ignore href="https://github.com/markbeep/AudioBookRequest/commit/9b2cda30c01e8d024cc8e66fdef5cf0d46bc153f">feat: add API endpoint to update indexers (mam_id). Closes #122 (9b2cda3)</a>
|
|
</div>
|
|
</div>
|
|
|
|
</main>
|
|
</div>
|
|
</div>
|
|
<footer class="td-footer row d-print-none">
|
|
<div class="container-fluid">
|
|
<div class="row mx-md-2">
|
|
<div class="td-footer__left col-6 col-sm-4 order-sm-1">
|
|
<ul class="td-footer__links-list">
|
|
|
|
<li class="td-footer__links-item" data-bs-toggle="tooltip" title="Discord" aria-label="Discord">
|
|
<a target="_blank" rel="noopener" href="https://discord.gg/SsFRXWMg7s" aria-label="Discord">
|
|
<i class="fab fa-discord"></i>
|
|
</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div><div class="td-footer__right col-6 col-sm-4 order-sm-3">
|
|
<ul class="td-footer__links-list">
|
|
|
|
<li class="td-footer__links-item" data-bs-toggle="tooltip" title="GitHub" aria-label="GitHub">
|
|
<a target="_blank" rel="noopener" href="https://github.com/google/docsy" aria-label="GitHub">
|
|
<i class="fab fa-github"></i>
|
|
</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div><div class="td-footer__center col-12 col-sm-4 py-2 order-sm-2">
|
|
<span class="td-footer__copyright">©
|
|
2025–2025
|
|
<span class="td-footer__authors">markbeep | <a href="https://creativecommons.org/licenses/by/4.0">CC BY 4.0</a> |</span></span><span class="td-footer__all_rights_reserved">All Rights Reserved</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
<script src="/AudioBookRequest/js/main.js"></script>
|
|
<script defer src="/AudioBookRequest/js/click-to-copy.js" crossorigin="anonymous"></script>
|
|
<script src='/AudioBookRequest/js/tabpane-persist.js'></script>
|
|
|
|
</body>
|
|
</html> |