[READ-ONLY] Mirror of https://github.com/jmrplens/PyOctaveBand. [Python3] Octave-Band and Fractional Octave-Band filter. For signal in time domain. jmrplens.github.io/PyOctaveBand/
acoustics audio filter frequency frequency-analysis frequency-domain octave python3 signal time-domain
0

Configure Feed

Select the types of activity you want to include in your feed.

ci: IndexNow submission after docs deploy (#74)

* ci: submit docs URLs to IndexNow after each deploy

Serves the IndexNow key file from the site root and posts every sitemap
URL to api.indexnow.org (Bing and other IndexNow-enabled engines) once
the Pages deployment finishes.

Claude-Session: https://claude.ai/code/session_013kkVt3nxi9svp1an28uHxf

* docs: add Wikidata item Q140451720 to JSON-LD sameAs

Claude-Session: https://claude.ai/code/session_013kkVt3nxi9svp1an28uHxf

* docs: fix stale Python floor in JSON-LD softwareRequirements

Claude-Session: https://claude.ai/code/session_013kkVt3nxi9svp1an28uHxf

* ci: harden IndexNow job per review

- derive base URL and host from the deploy job's page_url output
- walk sitemap-index.xml so every shard is submitted
- retry the key-file check while Pages propagates
- explicit timeouts everywhere (urllib 30s, job 10min)
- clear error when INDEXNOW_KEY is missing; job name added

Claude-Session: https://claude.ai/code/session_013kkVt3nxi9svp1an28uHxf

authored by

José M. Requena Plens and committed by
GitHub
(Jul 6, 2026, 10:18 PM +0200) 05fc6e4a fbca88ce

+67 -1
+2 -1
site/astro.config.mjs
··· 77 77 'Physical SPL calibration (IEC 60942 calibrators) and dBFS mode', 78 78 'Vectorized multichannel processing and stateful block (streaming) workflows', 79 79 ]; 80 - const softwareRequirements = 'Python >= 3.11 with NumPy and SciPy (matplotlib and numba optional).'; 80 + const softwareRequirements = 'Python >= 3.13 with NumPy and SciPy (matplotlib and numba optional).'; 81 81 82 82 const jsonLd = JSON.stringify({ 83 83 '@context': 'https://schema.org', ··· 158 158 sameAs: [ 159 159 'https://pypi.org/project/phonometry/', 160 160 'https://doi.org/10.5281/zenodo.21215280', 161 + 'https://www.wikidata.org/wiki/Q140451720', 161 162 `${fullUrl}/`, 162 163 ], 163 164 },
+64
.github/workflows/docs.yml
··· 57 57 environment: 58 58 name: github-pages 59 59 url: ${{ steps.deployment.outputs.page_url }} 60 + outputs: 61 + page_url: ${{ steps.deployment.outputs.page_url }} 60 62 steps: 61 63 - id: deployment 62 64 uses: actions/deploy-pages@v5 65 + 66 + indexnow: 67 + name: Submit URLs to IndexNow 68 + needs: deploy 69 + runs-on: ubuntu-latest 70 + permissions: {} 71 + timeout-minutes: 10 72 + steps: 73 + - name: Submit sitemap URLs to IndexNow 74 + env: 75 + INDEXNOW_KEY: ${{ secrets.INDEXNOW_KEY }} 76 + PAGE_URL: ${{ needs.deploy.outputs.page_url }} 77 + run: | 78 + set -euo pipefail 79 + if [ -z "${INDEXNOW_KEY:-}" ]; then 80 + echo "::error::INDEXNOW_KEY secret is not set"; exit 1 81 + fi 82 + python3 - <<'PY' 83 + import json, os, sys, time, urllib.request, xml.etree.ElementTree as ET 84 + from urllib.parse import urlparse 85 + 86 + TIMEOUT = 30 87 + key = os.environ["INDEXNOW_KEY"] 88 + base = os.environ["PAGE_URL"].rstrip("/") 89 + host = urlparse(base).netloc 90 + 91 + def fetch(url): 92 + with urllib.request.urlopen(url, timeout=TIMEOUT) as r: 93 + return r.read() 94 + 95 + # Pages can take a moment to propagate after deploy: retry the key file. 96 + key_url = f"{base}/{key}.txt" 97 + for attempt in range(6): 98 + try: 99 + assert fetch(key_url).decode().strip() == key 100 + break 101 + except Exception: 102 + if attempt == 5: 103 + sys.exit(f"key file unreachable: {key_url}") 104 + time.sleep(2 ** attempt) 105 + 106 + ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"} 107 + index = ET.fromstring(fetch(f"{base}/sitemap-index.xml")) 108 + urls = [] 109 + for shard in index.findall("sm:sitemap/sm:loc", ns): 110 + tree = ET.fromstring(fetch(shard.text.strip())) 111 + urls += [loc.text.strip() for loc in tree.findall("sm:url/sm:loc", ns)] 112 + if not urls: 113 + sys.exit("sitemap produced no URLs") 114 + 115 + payload = json.dumps({ 116 + "host": host, "key": key, "keyLocation": key_url, "urlList": urls, 117 + }).encode() 118 + req = urllib.request.Request( 119 + "https://api.indexnow.org/IndexNow", data=payload, 120 + headers={"Content-Type": "application/json; charset=utf-8"}, 121 + ) 122 + with urllib.request.urlopen(req, timeout=TIMEOUT) as r: 123 + print(f"IndexNow HTTP {r.status} ({len(urls)} URLs submitted)") 124 + if r.status not in (200, 202): 125 + sys.exit(f"unexpected status {r.status}: {r.read()[:300]}") 126 + PY
+1
site/public/dc7e97bcf6a14edea77efc1983e3e751.txt
··· 1 + dc7e97bcf6a14edea77efc1983e3e751