├── app.jpg ├── title.png ├── google079fb87c211e31f1.html ├── hdhrGRID.png ├── show_info.png ├── show_list.png ├── show_info2.png ├── channel_list.png ├── hdhr_VCR.applescript ├── hdhr_VCR_lib.applescript ├── .gitattributes ├── .gitignore ├── .github ├── CODEOWNERS ├── workflows │ ├── update-version-json.yml │ ├── update-changelog.yml │ └── archive-codex-requests.yml └── scripts │ └── update_changelog.py ├── docs ├── TESTING.md ├── CODEX_REQUESTS.md ├── APPLE_SCRIPT_STYLE.md └── handler.md ├── AGENTS.md ├── version.json ├── README.md ├── README_old.md ├── CHANGELOG.md ├── LICENSE └── sitemap.xml /app.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/app.jpg -------------------------------------------------------------------------------- /title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/title.png -------------------------------------------------------------------------------- /google079fb87c211e31f1.html: -------------------------------------------------------------------------------- 1 | google-site-verification: google079fb87c211e31f1.html -------------------------------------------------------------------------------- /hdhrGRID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/hdhrGRID.png -------------------------------------------------------------------------------- /show_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/show_info.png -------------------------------------------------------------------------------- /show_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/show_list.png -------------------------------------------------------------------------------- /show_info2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/show_info2.png -------------------------------------------------------------------------------- /channel_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/channel_list.png -------------------------------------------------------------------------------- /hdhr_VCR.applescript: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/hdhr_VCR.applescript -------------------------------------------------------------------------------- /hdhr_VCR_lib.applescript: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/HEAD/hdhr_VCR_lib.applescript -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | 3 | # Normalize source AppleScript files 4 | *.applescript text eol=lf linguist-language=AppleScript 5 | 6 | # Offer readable diffs for compiled script artifacts 7 | *.scpt diff=astextplain 8 | *.scptd diff=astextplain 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # macOS Finder metadata 2 | .DS_Store 3 | 4 | # Script Editor export scratchpad 5 | whatsnew.txt 6 | 7 | # AppleScript build artifacts 8 | *.scpt 9 | *.scptd 10 | *.app 11 | *.app/ 12 | 13 | # Local packaging leftovers 14 | *.dmg 15 | *.pkg 16 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This file defines code owners for review automation. 2 | # See https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners 3 | 4 | # Allow direct changelog edits to be auto-approved by designated reviewers. 5 | CHANGELOG.md @identd113 6 | 7 | # Default catch-all: request review from the primary maintainer. 8 | * @identd113 9 | -------------------------------------------------------------------------------- /.github/workflows/update-version-json.yml: -------------------------------------------------------------------------------- 1 | name: Auto update version metadata 2 | 3 | on: 4 | push: 5 | branches: 6 | - main # Trigger when commits land on the default branch 7 | paths: # Only run when the primary AppleScript sources change 8 | - "hdhr_VCR.applescript" 9 | - "hdhr_VCR_lib.applescript" 10 | 11 | permissions: 12 | contents: write 13 | 14 | jobs: 15 | version_metadata: 16 | if: github.event.deleted == false 17 | runs-on: ubuntu-latest 18 | steps: 19 | - name: Checkout repository 20 | uses: actions/checkout@v4 21 | with: 22 | fetch-depth: 0 23 | 24 | - name: Placeholder 25 | run: echo "Update version.json workflow placeholder" 26 | -------------------------------------------------------------------------------- /.github/workflows/update-changelog.yml: -------------------------------------------------------------------------------- 1 | name: Auto update changelog 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | permissions: 9 | contents: write 10 | 11 | jobs: 12 | changelog: 13 | if: github.event.deleted == false 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout repository 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Update changelog 23 | env: 24 | BEFORE: ${{ github.event.before }} 25 | AFTER: ${{ github.sha }} 26 | run: | 27 | python3 .github/scripts/update_changelog.py 28 | 29 | - name: Commit changelog update 30 | run: | 31 | if git diff --quiet --exit-code CHANGELOG.md; then 32 | echo "No changelog updates to commit." 33 | else 34 | git config --global user.name "github-actions[bot]" 35 | git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" 36 | git add CHANGELOG.md 37 | git commit -m "chore: update changelog for core script changes" 38 | git push 39 | fi 40 | -------------------------------------------------------------------------------- /docs/TESTING.md: -------------------------------------------------------------------------------- 1 | # Testing hdhr_VCR 2 | 3 | Automated tests are not available for this AppleScript project. Use the checklist below to validate changes on macOS. 4 | 5 | ## Preparing the App Bundle 6 | 1. Open `hdhr_VCR.applescript` in **Script Editor**. 7 | 2. Compile the script to confirm it builds cleanly. 8 | 3. Export it as an **Application** with **“Stay open after run handler”** enabled. 9 | 4. Place the exported app in `/Applications` (or a test folder) and launch it. 10 | 11 | ## Functional Smoke Tests 12 | - **Device discovery**: Verify that the app lists all reachable HDHomeRun tuners and surfaces their channels. 13 | - **Guide retrieval**: Ensure the channel guide populates with at least the next four hours of data and thumbnails where available. 14 | - **Single recording**: Schedule a one-off recording, confirm pre-recording notifications, verify the `.ts` file is created, and inspect the log for errors. 15 | - **Series recording**: Add a series recording across multiple days. Confirm subsequent entries appear in the “Shows” list with accurate next-run times. 16 | - **Manual add**: Schedule a recording using decimal time. Confirm the time normalizes to the correct start boundary. 17 | - **Disk checks**: Trigger a recording on a volume with limited space and watch for the warning/abort logic tied to `Max_disk_percentage`. 18 | - **Quit flow**: While recording, attempt to quit the app. Validate the prompts to continue, cancel, or leave recordings running. 19 | 20 | ## Logging and Telemetry 21 | - Review `~/Library/Logs/hdhr_VCR.log` for new warnings or errors. 22 | - If debugging, switch the logger level to include `DEBUG`/`TRACE` and confirm that sensitive data (API keys, user paths) is not leaked. 23 | 24 | Document the macOS version, HDHomeRun model, and steps executed when recording manual test results for a PR. 25 | -------------------------------------------------------------------------------- /docs/CODEX_REQUESTS.md: -------------------------------------------------------------------------------- 1 | # Codex Request Archival Process 2 | 3 | This repository now archives Codex request issues automatically whenever a pull 4 | request that resolves them is merged. The automation relies on a lightweight 5 | convention in the pull request description, so maintainers should follow the 6 | steps below when submitting work that came from a Codex request. 7 | 8 | ## Referencing the Codex request 9 | 10 | Include a line in the pull request description using the following format: 11 | 12 | ``` 13 | Codex Request: https://github.com///issues/ 14 | ``` 15 | 16 | You may reference more than one request by adding additional lines that follow 17 | the same `Codex Request:` prefix. The workflow parses these URLs after the pull 18 | request merges, closes the linked issues, and applies an `archived` label to 19 | highlight that the request is complete. 20 | 21 | ## Optional cross-repository support 22 | 23 | By default, the workflow uses the standard `GITHUB_TOKEN`, which can manage 24 | issues within this repository. If your Codex requests live in a separate 25 | repository, add a personal access token with the necessary permissions as the 26 | `CODEX_ARCHIVE_TOKEN` repository secret. The workflow will automatically fall 27 | back to that token when available and attempt to archive the linked requests in 28 | that external repository as well. 29 | 30 | ## Troubleshooting 31 | 32 | - **Label missing:** The workflow creates the `archived` label if it does not 33 | already exist. If label creation fails (for example, due to missing 34 | permissions), the issue will still close but remain unlabelled. 35 | - **Malformed URL:** If the URL after `Codex Request:` is not a standard GitHub 36 | issue link, the workflow skips it. Edit the merged pull request description 37 | to fix the URL and re-run the workflow manually from the Actions tab. 38 | -------------------------------------------------------------------------------- /AGENTS.md: -------------------------------------------------------------------------------- 1 | # hdhr_VCR-AS Contribution Agent 2 | 3 | This repository contains the AppleScript sources and assets for the hdhr_VCR smart DVR helper. 4 | 5 | ## General Guidance 6 | - Keep `hdhr_VCR.applescript` and `hdhr_VCR_lib.applescript` in the project root; downstream users expect these exact filenames when exporting the app bundle. 7 | - When you introduce a user-facing change, update `README.md` to reflect the new workflow or capability. 8 | - If you bump the in-script `Version_local` or library version, add a matching entry to `version.json` (newest release at the top of the list). 9 | - Screenshots in this repo document the UI flow. If the UI changes meaningfully, refresh the corresponding PNG and keep resolution/aspect consistent with the existing assets. 10 | 11 | ## Comment Handling 12 | - Treat any text that follows a `#` character on a line in the AppleScript sources as a comment. 13 | - Treat any code enclosed by `(*` and `*)` as a block comment. 14 | - Ignore modifications limited to these comments when deciding whether `CHANGELOG.md` or `version.json` require updates. 15 | 16 | ## Coding Standards 17 | - Follow the AppleScript conventions captured in `docs/APPLE_SCRIPT_STYLE.md` for any `.applescript` edits. 18 | - Reuse shared handlers instead of duplicating logic; most string and list helpers already live in `hdhr_VCR_lib.applescript`. 19 | - Preserve the existing logging pattern so log parsing tools stay compatible. 20 | - When one handler calls another within the same script, prefix it with `my`; when calling across scripts, use `of ParentScript` 21 | or `of LibScript` as appropriate. 22 | 23 | ## Testing Expectations 24 | - There are no automated tests. Perform the macOS smoke tests described in `docs/TESTING.md` when the behavior of recordings, notifications, or device discovery changes. 25 | - Document the manual tests you executed in your PR description or summary message. 26 | 27 | ## Documentation Assets 28 | - Place any additional developer documentation under `docs/` and link to it from the README when relevant. 29 | - Keep markdown files wrapped at a readable width (~100 characters) and use GitHub-flavored Markdown features sparingly. 30 | 31 | ## PR Message 32 | When preparing a PR summary, include: 33 | 1. A short list of the major feature or bug-fix highlights. 34 | 2. A bullet list of manual tests you performed (referencing `docs/TESTING.md` as needed). 35 | 36 | Following these instructions keeps the project aligned with how downstream users compile and run the scripts. 37 | -------------------------------------------------------------------------------- /docs/APPLE_SCRIPT_STYLE.md: -------------------------------------------------------------------------------- 1 | # AppleScript Style Guide 2 | 3 | These conventions capture how the existing scripts are structured. Follow them for any changes to `hdhr_VCR.applescript` or `hdhr_VCR_lib.applescript`. 4 | 5 | ## Indentation and Formatting 6 | - Use **hard tabs** for indentation inside handlers. The top-level scope stays unindented. 7 | - Keep handler declarations flush left: `on handlerName(...)` on one line followed by the body on the next line. 8 | - Leave a blank line between handlers and between logical sections inside a long handler. 9 | 10 | ## Handler Structure 11 | - Define `handlername` at the beginning of every handler. The literal string should match the handler’s purpose (e.g., `set handlername to "setup_logging"`). 12 | - When a handler accepts a `caller`, compute a context string with `my cm(handlername, caller)` and reuse it for nested calls. 13 | - Wrap risky logic in `try/on error` blocks. On failure, return either `false` or a `{handlername, errmsg}` tuple, matching the surrounding pattern. 14 | - When returning lists or records, stick to the existing AppleScript record syntax (`{key:value, ...}`) and maintain consistent key names. 15 | 16 | ## Logging and Diagnostics 17 | - Use the logger in the parent script (`logger(...) of ParentScript`) instead of ad-hoc `display dialog` calls for background operations. 18 | - Populate the logger with the `handlername` and `caller` context so log lines stay searchable. 19 | - Prefer returning explicit error details and let the caller decide how to handle UI notifications. 20 | 21 | ## Error Handling Patterns 22 | - Normalize strings through helpers like `stringToUtf8` before logging them. 23 | - Use helper utilities in `hdhr_VCR_lib.applescript` (e.g., `stringlistflip`, `emptylist`) rather than duplicating parsing logic. 24 | - When touching file paths or shell commands, sanitize inputs with the existing helper routines (e.g., `replace_chars`). 25 | 26 | ## Versioning and Globals 27 | - Keep global declarations grouped at the top of `hdhr_VCR.applescript`. Add new globals near related entries to preserve readability. 28 | - If you introduce new configuration constants, ensure they are initialized both in `setup_globals` and persisted through the JSON config. 29 | 30 | ## User Interaction 31 | - Maintain the non-blocking pattern: dialogs should have timeouts and avoid leaving the app idle loop paused indefinitely. 32 | - Leverage the existing emoji icon map (`Icon_record`) for any new UI icons instead of embedding raw characters throughout the code. 33 | 34 | Following these conventions keeps the app consistent and makes it easier to diff updates across releases. 35 | -------------------------------------------------------------------------------- /version.json: -------------------------------------------------------------------------------- 1 | { 2 | "versions": [ 3 | { 4 | "hdhr_version": "20230907", 5 | "changelog": "Adds lots of feature, see link for list of changes: https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/20230907_Release/changes.md" 6 | }, 7 | { 8 | "hdhr_version": "20230318", 9 | "changelog": "Stable release with lots of features! See commit of this file, to see list of changes." 10 | }, 11 | { 12 | "hdhr_version": "20230223", 13 | "changelog": "Release! Fixed error when missing the cache folder, Replaced obsolete python2 requirement, display is logs if a channel does not contains MPEG or AC3 for codec types. General code cleanup" 14 | }, 15 | { 16 | "hdhr_version": "20211222", 17 | "changelog": "Stuff changed, and I am too lazy to document them all. We can detect if a recording has a PID, and restart the recording as needed." 18 | }, 19 | { 20 | "hdhr_version": "20210905", 21 | "changelog": "We now use JSON to save the config. We will attempt to convert your old config file. We can now edit, and add multiple shows. Main screen now shows the next upcoming shows, and what is currently recording. When adding a show, we now show the shows thumbnail image. We now roll logs as needed. More progress bars!" 22 | }, 23 | { 24 | "hdhr_version": "20210805", 25 | "changelog": "You can now select multiple shows on the same channel. You can optionally choose to apply the same settings to all shows, which allows you to add them quickly.New: Main screen shows you the next shows to be recorded.The current recorded shows will show up as a notification. New: We now show the show graphic when adding shows." 26 | }, 27 | { 28 | "hdhr_version": "20210721", 29 | "changelog": "Added The main screen will now show you the next shows that are going to record. This saves a click into Shows." 30 | }, 31 | { 32 | "hdhr_version": "20210716", 33 | "changelog": "Big Update. Lots of stability changes, and some updated verbiage and icons. More information at https://github.com/identd113/hdhr_VCR-AS/commit/1e65c927dc7b46a34db980c6ba2d05f7e9317e8a#diff-5af381b49e80c9f4c6828989c3cc939db4ccd1e8d39ed0142b4f10b9ab1d674b" 34 | }, 35 | { 36 | "hdhr_version": "20210301", 37 | "changelog": "Big update. Added a logger, so we can more closely see what is happening, and makes it easier to track down bugs. There is more to do, but satisfied this is working well for now. Numerous bug fixes, including update_show from running on days the recording is not set to record." 38 | }, 39 | { 40 | "hdhr_version": "20210209", 41 | "changelog": "Cleaned up some handlers, and testing version message in logs." 42 | }, 43 | { 44 | "hdhr_version": "20210208", 45 | "changelog": "Added: hdhr_VCR.log in Documents folder to allow us to keep a running tab if what is happening." 46 | } 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # hdhr_VCR 2 | 3 | > **A Smart VCR script for all HDHomeRun devices. 4 | No cloud. No subscriptions. No drama. 5 | Just simple, AppleScript-powered TV recording for macOS.** 6 | 7 | ![Show List](show_list.png) 8 | 9 | --- 10 | 11 | ## Why? 12 | 13 | I wanted to record TV shows quickly on my HDHomeRun, without a massive install or a paid DVR system. This project gives you guide-based, one-click recording—no accounts or setup fees. 14 | 15 | --- 16 | 17 | ## Features 18 | 19 | - **Automatic HDHomeRun discovery** – Finds all compatible tuners on your network. 20 | - **Guide-based recording** – Automatically pulls show, season, episode, and timing info. 21 | - **Flexible Series Recording:** 22 | • Record by channel or *across all channels* for syndicated shows **(NEW)** 23 | • Supports SeriesID tracking for smarter scheduling **(NEW)** 24 | - **Dynamic Task Queueing:** 25 | • Show IDs for series recordings are now queued and processed efficiently at the end of the idle loop **(NEW)** 26 | - **Modular Script Design:** 27 | • Core logic split into a library file for easier updates and better stability **(NEW)** 28 | - **Powerful Logging and Debugging:** 29 | • Robust, handler-specific logs 30 | • Optional JSON log mode: open API calls in your browser for troubleshooting **(NEW)** 31 | - **Smart Error Handling:** 32 | • Automatic pause on repeated recording failures **(NEW)** 33 | • Protects against accidental config wipeouts **(NEW)** 34 | - **Disk space management:** 35 | • Configurable disk space checks before/during recording **(NEW)** 36 | - **Easy “Add,” “Edit,” and “Manual Add” workflows** 37 | - **macOS notifications:** See every step from “about to record” to “recording complete” 38 | - **Runs quietly in the background—no complex setup needed** 39 | 40 | --- 41 | 42 | ## Requirements 43 | 44 | 1. macOS 45 | 2. [JSONHelper](https://apps.apple.com/us/app/json-helper-for-applescript/id453114608) is required (free) 46 | 3. A configured HDHomeRun device from [SiliconDust](https://www.silicondust.com) 47 | 4. The HDHomeRun device should have a static IP on the network, as we record the IP address of the tuner when we add a show. 48 | 5. hdhr_VCR needs access to the following paths: 49 | 50 | - ~/Documents/hdhr_VCR.json 51 | - ~/Library/Caches/hdhr_VCR/ 52 | - ~/Library/Logs/hdhr_VCR.log 53 | 54 | --- 55 | 56 | ## Quick Start 57 | 58 | 1. Download `hdhr_VCR.applescript` ([latest release](https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/20230907_Release/hdhr_VCR.applescript)). 59 | 2. Open in **Script Editor**. 60 | 3. Go to **File → Export...** 61 | - Save as **Application** 62 | - Check **“Stay open after run handler”** 63 | 4. Move the app to your **Applications** folder and launch. 64 | 5. On first run, grant the necessary permissions (macOS will prompt). 65 | 66 | --- 67 | 68 | ## How to Use 69 | 70 | - **Add**: Pick a tuner, pick a channel, pick a show—done. 71 | - **Series Recording**: Record on specific days, repeats every week. 72 | - **Manual Add**: Need something outside the guide? Use decimal time (e.g., 18.75 for 6:45pm). 73 | - **Run**: Resets UI or goes idle. 74 | - **Edit/Remove**: Click the app in the dock for options. 75 | 76 | ### Screenshots 77 | 78 | _See below for a visual walkthrough of the process:_ 79 | 80 | ![Title Screen](title.png) 81 | 82 | - **Channel List Selection** 83 | 84 | ![Channel List](channel_list.png) 85 | 86 | - **Show Grid / Guide View** 87 | 88 | ![HDHR Guide](hdhrGRID.png) 89 | 90 | - **Show Info** 91 | 92 | ![Show Info](show_info2.png) 93 | 94 | --- 95 | 96 | ## How It Works 97 | 98 | - Scans for tuners, fetches lineup and guide. 99 | - Stores settings/data in JSON and AppleScript records. 100 | - Uses `curl` for all network/file transfers. 101 | - Prevents sleep with `caffeinate` during recordings. 102 | - Shows and device records look like this: 103 | 104 | ```applescript 105 | {show_title:"Example", show_time:16, ...} 106 | ``` 107 | 108 | --- 109 | 110 | ## Maintainer Automation 111 | 112 | See [docs/CODEX_REQUESTS.md](docs/CODEX_REQUESTS.md) for details on the workflow 113 | that archives Codex requests automatically after a pull request merges. 114 | -------------------------------------------------------------------------------- /.github/workflows/archive-codex-requests.yml: -------------------------------------------------------------------------------- 1 | name: Archive Codex requests 2 | 3 | on: 4 | pull_request: 5 | types: [closed] 6 | 7 | permissions: 8 | pull-requests: read 9 | contents: read 10 | issues: write 11 | 12 | jobs: 13 | archive: 14 | if: github.event.pull_request.merged == true 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Archive referenced Codex requests 18 | uses: actions/github-script@v7 19 | with: 20 | github-token: ${{ secrets.CODEX_ARCHIVE_TOKEN || github.token }} 21 | script: | 22 | const body = context.payload.pull_request.body ?? ""; 23 | const pattern = /Codex Request:\s*(https:\/\/github\.com\/[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+\/issues\/\d+)/gi; 24 | const matches = [...body.matchAll(pattern)]; 25 | 26 | if (matches.length === 0) { 27 | core.info("No Codex request references detected in the pull request body."); 28 | return; 29 | } 30 | 31 | const requestsByRepo = new Map(); 32 | 33 | for (const match of matches) { 34 | const issueUrl = match[1]; 35 | const parsed = issueUrl.match(/https:\/\/github\.com\/([^\/]+)\/([^\/]+)\/issues\/(\d+)/i); 36 | 37 | if (!parsed) { 38 | core.warning(`Unable to parse Codex request reference: ${issueUrl}`); 39 | continue; 40 | } 41 | 42 | const [, owner, repo, issueNumberRaw] = parsed; 43 | const issueNumber = Number.parseInt(issueNumberRaw, 10); 44 | 45 | if (Number.isNaN(issueNumber)) { 46 | core.warning(`Skipping Codex request with invalid issue number from ${issueUrl}`); 47 | continue; 48 | } 49 | 50 | const key = `${owner}/${repo}`; 51 | if (!requestsByRepo.has(key)) { 52 | requestsByRepo.set(key, { owner, repo, issues: new Set() }); 53 | } 54 | 55 | requestsByRepo.get(key).issues.add(issueNumber); 56 | } 57 | 58 | if (requestsByRepo.size === 0) { 59 | core.info("No valid Codex request references found after parsing."); 60 | return; 61 | } 62 | 63 | async function ensureArchivedLabel(owner, repo) { 64 | try { 65 | await github.rest.issues.getLabel({ owner, repo, name: "archived" }); 66 | core.info(`'archived' label already present in ${owner}/${repo}.`); 67 | } catch (error) { 68 | if (error.status === 404) { 69 | try { 70 | await github.rest.issues.createLabel({ 71 | owner, 72 | repo, 73 | name: "archived", 74 | color: "BFD4F2", 75 | description: "Codex request has been archived after merge" 76 | }); 77 | core.info(`Created 'archived' label in ${owner}/${repo}.`); 78 | } catch (createError) { 79 | core.warning(`Unable to create 'archived' label in ${owner}/${repo}: ${createError.message}`); 80 | } 81 | } else { 82 | core.warning(`Failed to verify 'archived' label in ${owner}/${repo}: ${error.message}`); 83 | } 84 | } 85 | } 86 | 87 | for (const entry of requestsByRepo.values()) { 88 | const { owner, repo, issues } = entry; 89 | 90 | await ensureArchivedLabel(owner, repo); 91 | 92 | for (const issueNumber of issues) { 93 | core.info(`Archiving Codex request ${owner}/${repo}#${issueNumber}.`); 94 | 95 | try { 96 | await github.rest.issues.update({ 97 | owner, 98 | repo, 99 | issue_number: issueNumber, 100 | state: "closed" 101 | }); 102 | } catch (error) { 103 | core.warning(`Unable to close ${owner}/${repo}#${issueNumber}: ${error.message}`); 104 | continue; 105 | } 106 | 107 | try { 108 | await github.rest.issues.addLabels({ 109 | owner, 110 | repo, 111 | issue_number: issueNumber, 112 | labels: ["archived"] 113 | }); 114 | } catch (error) { 115 | core.warning(`Unable to apply 'archived' label to ${owner}/${repo}#${issueNumber}: ${error.message}`); 116 | } 117 | 118 | try { 119 | await github.rest.issues.createComment({ 120 | owner, 121 | repo, 122 | issue_number: issueNumber, 123 | body: `This Codex request was automatically archived after ${context.payload.pull_request.html_url} was merged.` 124 | }); 125 | } catch (error) { 126 | core.warning(`Unable to add archival comment to ${owner}/${repo}#${issueNumber}: ${error.message}`); 127 | } 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /.github/scripts/update_changelog.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | """Automatically update CHANGELOG.md when core scripts change. 3 | 4 | The script expects the following environment variables: 5 | - BEFORE: the commit SHA before the merge (e.g. github.event.before) 6 | - AFTER: the commit SHA after the merge (e.g. github.sha) 7 | """ 8 | 9 | from __future__ import annotations 10 | 11 | import os 12 | import subprocess 13 | from collections import OrderedDict 14 | from dataclasses import dataclass 15 | from datetime import datetime, timezone 16 | from pathlib import Path 17 | from typing import Iterable, List, Sequence, Set 18 | 19 | TARGET_FILES = {"hdhr_VCR.applescript", "hdhr_VCR_lib.applescript"} 20 | CHANGELOG_PATH = Path("CHANGELOG.md") 21 | 22 | 23 | @dataclass 24 | class CommitInfo: 25 | sha: str 26 | subject: str 27 | files: Sequence[str] 28 | 29 | 30 | class GitError(RuntimeError): 31 | """Raised when a git command fails.""" 32 | 33 | 34 | def run_git_command(args: Sequence[str]) -> str: 35 | try: 36 | completed = subprocess.run( 37 | ["git", *args], 38 | check=True, 39 | stdout=subprocess.PIPE, 40 | stderr=subprocess.PIPE, 41 | text=True, 42 | ) 43 | except subprocess.CalledProcessError as exc: # pragma: no cover - defensive 44 | message = exc.stderr.strip() or exc.stdout.strip() or str(exc) 45 | raise GitError(f"git {' '.join(args)} failed: {message}") from exc 46 | return completed.stdout 47 | 48 | 49 | def gather_commits(before: str, after: str) -> List[CommitInfo]: 50 | rev_output = run_git_command(["rev-list", "--reverse", f"{before}..{after}"]) 51 | shas = [line.strip() for line in rev_output.splitlines() if line.strip()] 52 | commits: List[CommitInfo] = [] 53 | for sha in shas: 54 | subject = run_git_command(["show", "-s", "--format=%s", sha]).strip() 55 | files_output = run_git_command(["diff-tree", "--no-commit-id", "--name-only", "-r", sha]) 56 | files = [line.strip() for line in files_output.splitlines() if line.strip()] 57 | relevant = [f for f in files if f in TARGET_FILES] 58 | if relevant: 59 | commits.append(CommitInfo(sha=sha, subject=subject, files=relevant)) 60 | return commits 61 | 62 | 63 | def build_bullets(commits: Iterable[CommitInfo]) -> List[str]: 64 | seen: Set[str] = set() 65 | bullets: List[str] = [] 66 | for commit in commits: 67 | touched = ", ".join(sorted(OrderedDict.fromkeys(commit.files))) 68 | bullet = f"- {touched}: {commit.subject} ({commit.sha[:7]})" 69 | if bullet not in seen: 70 | bullets.append(bullet) 71 | seen.add(bullet) 72 | return bullets 73 | 74 | 75 | def ensure_changelog_exists() -> None: 76 | if not CHANGELOG_PATH.exists(): 77 | raise FileNotFoundError("CHANGELOG.md must exist in the repository root") 78 | 79 | 80 | def update_existing_entry(entry_text: str, bullets: Sequence[str]) -> str: 81 | import re 82 | 83 | updated_pattern = re.compile(r"(### Updated\n)(?P(?:.*?))(?=(\n### |\Z))", re.DOTALL) 84 | match = updated_pattern.search(entry_text) 85 | if match: 86 | body = match.group("body") 87 | existing_lines = [line.strip() for line in body.splitlines() if line.strip()] 88 | existing_set = {line for line in existing_lines if line.startswith("- ")} 89 | new_lines = existing_lines[:] 90 | for bullet in bullets: 91 | bullet_line = bullet.strip() 92 | if bullet_line not in existing_set: 93 | new_lines.append(bullet_line) 94 | existing_set.add(bullet_line) 95 | body_text = "\n".join(new_lines) 96 | if body_text and not body_text.endswith("\n"): 97 | body_text += "\n" 98 | start = match.start("body") 99 | end = match.end("body") 100 | return entry_text[:start] + body_text + entry_text[end:] 101 | 102 | trimmed = entry_text.rstrip() 103 | section_body = "\n".join(bullets) 104 | if section_body and not section_body.endswith("\n"): 105 | section_body += "\n" 106 | return f"{trimmed}\n\n### Updated\n{section_body}" 107 | 108 | 109 | def build_new_entry(date_stamp: str, bullets: Sequence[str]) -> str: 110 | body = "\n".join(bullets) 111 | if body and not body.endswith("\n"): 112 | body += "\n" 113 | return f"## {date_stamp}\n\n### Updated\n{body}" 114 | 115 | 116 | def insert_entry(original: str, new_entry: str) -> str: 117 | original = original.strip() 118 | new_entry = new_entry.strip() 119 | if not original: 120 | return new_entry 121 | return f"{new_entry}\n\n{original}" 122 | 123 | 124 | def update_changelog(bullets: Sequence[str]) -> bool: 125 | ensure_changelog_exists() 126 | content = CHANGELOG_PATH.read_text() 127 | header = "# Changelog" 128 | if not content.startswith(header): 129 | raise ValueError("CHANGELOG.md must start with '# Changelog'") 130 | 131 | remainder = content[len(header):].lstrip("\n") 132 | date_stamp = datetime.now(timezone.utc).strftime("%y%m%d") 133 | 134 | import re 135 | 136 | entry_pattern = re.compile(r"## (?P\d{6})\n(?P(?:.*?))(?=(\n## |\Z))", re.DOTALL) 137 | match = entry_pattern.match(remainder) 138 | 139 | if match and match.group("date") == date_stamp: 140 | entry_text = match.group(0) 141 | updated_entry = update_existing_entry(entry_text, bullets) 142 | remainder = updated_entry + remainder[len(entry_text):] 143 | else: 144 | new_entry = build_new_entry(date_stamp, bullets) 145 | remainder = insert_entry(remainder, new_entry) 146 | 147 | updated_content = f"{header}\n\n{remainder.strip()}\n" 148 | if content == updated_content: 149 | return False 150 | 151 | CHANGELOG_PATH.write_text(updated_content) 152 | return True 153 | 154 | 155 | def main() -> int: 156 | before = os.environ.get("BEFORE") 157 | after = os.environ.get("AFTER") or os.environ.get("GITHUB_SHA") 158 | 159 | if not before or not after: 160 | print("BEFORE and AFTER environment variables are required to update the changelog.") 161 | return 0 162 | 163 | commits = gather_commits(before, after) 164 | if not commits: 165 | print("No relevant commits detected; changelog unchanged.") 166 | return 0 167 | 168 | bullets = build_bullets(commits) 169 | if not bullets: 170 | print("No new bullet entries produced; changelog unchanged.") 171 | return 0 172 | 173 | changed = update_changelog(bullets) 174 | if changed: 175 | print("CHANGELOG.md updated for core script changes.") 176 | else: 177 | print("Changelog already up to date.") 178 | return 0 179 | 180 | 181 | if __name__ == "__main__": 182 | raise SystemExit(main()) 183 | -------------------------------------------------------------------------------- /README_old.md: -------------------------------------------------------------------------------- 1 | ## hdhr_VCR 2 | A pretty darn good VCR "plus" script that works on all HDHomeRun devices, and is free to use! 3 | An OSX faceless/background script that makes recording TV shows and Movies on HDHomeRun very easy. 4 | 5 | ### Latest Release: https://raw.githubusercontent.com/identd113/hdhr_VCR-AS/20230907_Release/hdhr_VCR.applescript 6 | 7 | ![Show List](show_list.png) 8 | 9 | #### Why? 10 | I wanted a quick way to record a TV show, without setting up a large system, like Plex or HDHomeRuns' own DVR software. 11 | I call it a VCR app, as while it does use guide data to pull name / season / episode number / episode name / show length, it does not present like a normal DVR. It is more of a Smart VCR 12 | 13 | #### Requirements 14 | 1. OSX 15 | 2. Due to poor planning, this will only work in the en_US region, sorry 16 | 2. [JSONHelper](https://apps.apple.com/us/app/json-helper-for-applescript/id453114608) is required, available for free. 17 | 3. A configured HDHomeRun device from https://www.silicondust.com 18 | 4. The hdhomerun device should have a static IP on the network, as we record the IP address of the tuner when we add a show. 19 | 5. hdhr_VCR will also need access to the following paths: 20 | 21 | - ~/Documents/hdhr_VCR.json 22 | - ~/Library/Caches/hdhr_VCR/ 23 | - ~/Library/Logs/hdhr_VCR.log 24 | 25 | #### Features 26 | * Auto discovery of all HDHomeRun devices on your network! 27 | * Uses built-in guide data, and lineup data, to automatically name the shows you are recording. 28 | * * The free guide data is only for the next 4-6 hours. We will attempt to pull fresh data right before a show starts, so in most cases, the information does get pulled correctly. I believe if you pay for HDHomeRuns own DVR software, the guide data is much longer, and the script would handle that. 29 | * Runs in the background, but allows easy editing of existing saved shows. 30 | * Uses caffeinate to ensure that the system does not go to sleep during a recording. 31 | * Add a show or series in 10 seconds. 32 | * Robust logging, allows you to see exactly what is happening on the script at any time. 33 | 34 | ### How to use 35 | 1. Download the file hdhr_VCR.applescript, and open this in Script Editor. 36 | 2. Choose "Export..." in the File Menu. 37 | 3. Save as "Application" and check "Stay open after run handler" **MUST** be checked for this to work. 38 | 4. Save the file with the name hdhr_VCR, and then save this in the Application Folder. 39 | 5. Now we have a compiled application, we want to open it. 40 | 41 | When you first run this, OSX will prompt multiple times for various system permissions. Please grant all of these. 42 | 43 | 6. You will then be presented with options to see the existing shows, add a show, or "Run" 44 | * More about "Run" later. 45 | 46 | Let's start with "Add", as this is the main function. 47 | 48 | ![Title Screen](title.png) 49 | 50 | 7. If you have multiple tuners, you will be asked which one you would like to use for this recording. 51 | 8. You will be presented with a channel list. Select the channel this show is on. 52 | 53 | ![Channel List](channel_list.png) 54 | 55 | 10. Once you select your channel, you will see a screen that details the shows that are on in the next ~ 4 hours. 56 | ![HDHR Guide](hdhrGRID.png) 57 | 58 | 11. You will notice that there is a "Manual Add" option. This will allow you to select a time past the 4 hours of guide data provided. If you wish to follow this route, you can skip to https://github.com/identd113/hdhr_VCR-AS#manual-add 59 | 60 | Select a show, and click "Next" 61 | 62 | ![Show Info](show_info2.png) 63 | 64 | * A "Single" is a one-off recording. Once the recording is complete, the show will be marked as inactive. 65 | * If you selected a "Series" you can select as many days of the week you would like to record. This will repeat every week. 66 | 67 | 68 | You will then select where you want the file to be saved. The default location is "/Volumes/", but you will need to select a specific location. Any attempts to select "/Volumes/" as the destination will re prompt you for a valid location. 69 | 70 | If you own a "Extend" device, or a device that has transcode capabilities, you can select which profile you wish to use. 71 | 72 | #### Manual Add 73 | If you wish to schedule a recording outside of the 4 hour guide window, you can select Manual Add, and add this show/series. 74 | 75 | You will then be asked to specify a time, it is done a bit strangely. We use 24 hour decimal time 76 | * For example, if you wanted to record a show at 6:45 PM, you would enter 18.75. (.5 of an hour, is 30 minutes. .75 of an hour is 45 minutes.) 77 | * If you attempt to use a time that has already passed for today, it will assume you mean tomorrow. 78 | * When picking a time, you can select anytime during the show time span, and we will adjust the start time to align with the real start. For example, if a certain show starts at 10:35 PM, and the show runs 62 minutes, you could enter any time between 22.56 to 23.58, and we would set the start time to 22.56 (10:35) 79 | 80 | You will now have the ability to set the recordings name. The name provided is just temporary, as we will try to pull the guide data right before the recording starts. 81 | 82 | 13. In this same window, you will also tell the script if this is a a "Single" or a "Series" 83 | 84 | * A "Series" is meant for shows that air at the same time, perhaps 1 day or week, or 7, at a certain time. 85 | 14. The next screen allows you to tell us which day you wish to record. It will default to today. 86 | * If you selected a "Series" you can select as many days as you wish. 87 | * If you select "Single" you can only select one day. 88 | 89 | This allows you to set up a recording up to a week in advance. 90 | 91 | #### END Manual Add 92 | 93 | 94 | #### What is Run? 95 | 96 | > "You told me you would tell me what "Run" is for? 97 | 98 | The button that shows "Run" in almost all dialogs, will drop you back into the idle() handler. This can be used to go back, or start over, for example if entering the incorrect information when adding a show. This allows the script to run as needed. It is important to know that the idle() is NOT running when a dialog is open. If a dialog stays open forever, we will never be able to record, or update anything in the script. Because of this, dialogs have a timeout of 60 seconds, before auto closing. The choose from list dialog can NOT be dismissed automatically. Our use case is the show info list. 99 | 100 | > "I did that, but nothing happens!" 101 | 102 | That is accurate. When the script is configured with a show, it is faceless, and you do not need to do anything, other than allow it to run. 103 | 104 | > "I want to add or edit a show" 105 | 106 | If you click the icon in the Dock, you will be presented with the main window, so you can do such things. 107 | 108 | > "How do I know something is happening? 109 | 110 | We use notifications to alert the user to recordings being started, in progress, and completing. This may cause lots of notifications to occur, if a lot of shows are scheduled. If there is a better way to be able to tell the user something, let me know. 111 | 112 | > "I need to quit the script, but I have a recording in progress" 113 | 114 | If you want to quit the script, the best way to do so is being in a "run" state (faceless) and then issuing a command q, or selecting "Quit" from the hdhr_VCR File menu. 115 | * If a show is currently recording, you will be prompted regarding if you want to cancel the recordings, before quitting. You can choose to go back to the main screen, quit, and cancel all recordings, or quit, but do not cancel the shows. Since the recording is done with "curl", hdhr_VCR does not need to be open once a recording has already started. 116 | 117 | 118 | **In almost every case, you should choose "No". ** 119 | 120 | ## Nitty gritty 121 | Uses records to store complex data sets. 122 | 123 | This is an example of a what data of a show recording contains: 124 | 125 | ``` 126 | {show_title:Curious George S01E21 Surprise Quints; Muddy Monkey, show_time:16, show_length:30, show_air_date:Monday, Tuesday, Wednesday, Thursday, Friday, show_transcode:None, show_temp_dir:alias Raid3:DVR Tests:, show_dir:alias Raid3:DVR Tests:, show_channel:2.4, show_active:true, show_id:0489dfb9fd492970694c13d25e2f457a, show_recording:false, show_last:date Tuesday, June 15, 2021 at 4:30:00 PM, show_next:date Wednesday, June 16, 2021 at 4:00:00 PM, show_end:date Wednesday, June 16, 2021 at 4:30:00 PM, notify_upnext_time:missing value, notify_recording_time:missing value, show_is_series:true, hdhr_record:105404BE} 127 | ``` 128 | 129 | Example of a tuner record: 130 | 131 | ``` 132 | {hdhr_lineup_update:missing value, hdhr_guide_update:missing value, discover_url:http://10.0.1.101/discover.json, lineup_url:http://10.0.1.101/lineup.json, device_id:DEADBEEF, does_transcode:1, hdhr_lineup:missing value, hdhr_guide:missing value, hdhr_model:missing value, channel_mapping:missing value, BaseURL:http://10.0.1.101, statusURL:http://10.0.1.101/status.json} 133 | ``` 134 | 135 | The hdhr_guide and hdhr_lineup contain the entire json result of the lineup, and guide data. We use this as a cache, so we only make a "new" API call every 2 hours, or when a show starts recording. 136 | 137 | ## Special considerations 138 | * The "heavy lifting" is done with curl, which downloads the data to a local drive. The script manages the show and device logic. 139 | * If there are multiple HDHR device on the network, you will be asked which one you want to use when adding a show. 140 | * When adding a show, we will attempt to write a test file to that location (and remove it) right away, so we can get through any of the OS X disk access prompts. This file is written/removed every 5 minutes during a recording. This will update the file size, as seen in Finder. 141 | * We use notifications to alert the user to imminent events 142 | * * 1 hour before the show, and then every 15 minutes 143 | * * Starting a recording 144 | * * Every 15 minutes during a recording 145 | * * End of a recording 146 | 147 | * If the system is restarting or shutting down, we will see that, and not prompt the user cancel the recordings, they will just be canceled. 148 | 149 | hdhr_VCR now has a logger, which by default is named hdhr_VCR.log, that gives us more information of what is happening, without flooding the notifications. 150 | 151 | 152 | I hope this can be collaborative project, so other options that you use can be added. 153 | 154 | -MikeW -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 250919 4 | 5 | ### Added 6 | - Introduced a changelog to track user-facing and behind-the-scenes updates for hdhr_VCR. 7 | 8 | ### Removed 9 | - No user-visible features or workflows were removed in this merge. 10 | 11 | ### Updated 12 | - Documented the structure to follow for future entries so upcoming merges stay consistent. 13 | 14 | ## 2025-06-17 15 | 16 | ### Added 17 | - Background queueing for SeriesID refreshes so that every completed or newly added series automatically schedules its next airing without locking up the UI.【F:hdhr_VCR.applescript†L221-L236】【F:hdhr_VCR_lib.applescript†L865-L925】 18 | - Existing SeriesID shows are queued for refresh at launch so their next airings are recalculated as soon as the idle loop runs.【F:hdhr_VCR.applescript†L221-L236】【F:hdhr_VCR_lib.applescript†L865-L925】 19 | 20 | ### Updated 21 | - Idle processing now drains the SeriesID refresh queue at the end of every loop, ensuring multi-show additions get their next airings without manual intervention.【F:hdhr_VCR.applescript†L440-L482】【F:hdhr_VCR_lib.applescript†L899-L925】 22 | - Firmware update notifications now include the firmware version string so users know which build is waiting to install.【F:hdhr_VCR.applescript†L2229-L2231】 23 | - The setup workflow always prompts to save configuration changes after maintenance tasks, reducing the chance of accidentally discarding new schedules.【F:hdhr_VCR.applescript†L1325-L1370】 24 | 25 | ### Changed 26 | - When a recording fails repeatedly, the script now records a human-readable failure reason alongside the counter to make troubleshooting easier.【F:hdhr_VCR.applescript†L2065-L2073】 27 | 28 | ### Removed 29 | - No user-facing functionality was removed in this merge. 30 | 31 | ## 2025-05-16 32 | 33 | ### Added 34 | - Guided startup flow that reports progress (loading the external library, configuring globals, setting up icons) so users know why the UI is still launching.【F:hdhr_VCR.applescript†L48-L131】 35 | - Automatic detection of Script Editor/Debugger launches enables verbose logging levels while keeping production builds quieter for end users.【F:hdhr_VCR.applescript†L113-L139】 36 | - Expanded icon set (recording states, running indicator, eject, etc.) that is reused throughout dialogs and notifications for clearer status cues.【F:hdhr_VCR.applescript†L60-L96】 37 | 38 | ### Updated 39 | - Logging now writes to the user’s `~/Library/Logs` folder, enforces dynamic log caps, and exposes additional log levels, improving supportability while keeping log sizes under control.【F:hdhr_VCR.applescript†L97-L139】 40 | - The script automatically creates its cache directory during setup, preventing the missing-cache failures seen in earlier builds.【F:hdhr_VCR.applescript†L78-L92】 41 | - Idle timers and global defaults were retuned (longer notification lead time, higher disk usage guard) to better match modern recording workloads.【F:hdhr_VCR.applescript†L113-L139】 42 | 43 | ### Changed 44 | - Core setup responsibilities were split into focused handlers (`setup_lib`, `setup_script`, `setup_globals`, `setup_logging`, `setup_icons`), making reloads and future maintenance less error-prone for end users who reinstall the script.【F:hdhr_VCR.applescript†L48-L131】 45 | 46 | ### Removed 47 | - No user-facing functionality was removed in this merge. 48 | 49 | ## 2025-04-07 50 | 51 | ### Added 52 | - Multi-select show additions now respect existing schedules by skipping duplicates and immediately editing any conflicting entries, reducing accidental overwrites when bulk-adding shows.【F:hdhr_VCR.applescript†L1668-L1735】 53 | 54 | ### Updated 55 | - Config saves are protected against writing empty files, avoiding data loss when a save happens before any shows are defined.【F:hdhr_VCR.applescript†L2034-L2071】 56 | - Channel editing prompts only appear when they can apply, minimizing unnecessary dialogs while configuring multiple recordings.【F:hdhr_VCR.applescript†L1706-L1771】 57 | 58 | ### Changed 59 | - Sports-specific logic (which never behaved correctly) was removed so single-event recordings fall back to the standard workflow and can no longer get stuck marked as “bonus time.”【F:hdhr_VCR.applescript†L420-L474】 60 | 61 | ### Removed 62 | - Legacy sports-handling branches that conflicted with the new series workflow.【F:hdhr_VCR.applescript†L420-L474】 63 | 64 | ## 2024-09-27 65 | 66 | ### Added 67 | - Standalone `hdhr_VCR_lib.applescript` that lives in the user’s Documents folder, housing shared helpers so the main app stays under AppleScript’s size ceiling while continuing to grow.【F:hdhr_VCR_lib.applescript†L1-L80】 68 | - Runtime loading of the external library during setup, enabling the app to call into the shared handlers without additional user scripting steps.【F:hdhr_VCR.applescript†L57-L75】 69 | 70 | ### Updated 71 | - Core utilities (disk checks, string helpers, SeriesID tooling) now execute from the shared library, reducing duplicate code inside the primary script and making maintenance simpler for end users who drop in updated library builds.【F:hdhr_VCR_lib.applescript†L22-L925】 72 | 73 | ### Changed 74 | - The launcher now requires the companion library to be present; missing files trigger a guided notification so users can place the script correctly.【F:hdhr_VCR.applescript†L57-L75】 75 | 76 | ### Removed 77 | - None. 78 | 79 | ## 2023-09-07 80 | 81 | ### Added 82 | - Each scheduled show now stores the authoritative recording URL provided by the HDHomeRun device, improving compatibility with tuners that serve content on non-default ports.【F:hdhr_VCR.applescript†L1672-L1790】【F:hdhr_VCR.applescript†L2051-L2061】 83 | - A “skip idle delay” pathway accelerates returning to the main UI after adding or editing shows, shortening the wait before new schedules become visible.【F:hdhr_VCR.applescript†L1706-L1742】 84 | 85 | ### Updated 86 | - Recording launch commands now reuse the stored device URL and enrich the logger output so users can trace in-progress recordings without spelunking the filesystem.【F:hdhr_VCR.applescript†L2051-L2061】【F:hdhr_VCR.applescript†L2056-L2063】 87 | - Channel list and show-add workflows were refreshed to better surface logos and metadata from the guide feed.【F:hdhr_VCR.applescript†L1672-L1790】【F:hdhr_VCR.applescript†L2417-L2433】 88 | 89 | ### Changed 90 | - Legacy URL-construction logic (which assumed a fixed port) was replaced with the tuner-provided endpoint, avoiding failures on devices with custom stream ports.【F:hdhr_VCR.applescript†L2051-L2061】【F:hdhr_VCR.applescript†L2424-L2433】 91 | 92 | ### Removed 93 | - Stale helper code that previously rebuilt stream URLs by hand, reducing script size so new functionality could fit within AppleScript limits.【F:hdhr_VCR.applescript†L2051-L2061】【F:hdhr_VCR.applescript†L2424-L2433】 94 | 95 | ## 2023-03-18 96 | 97 | ### Added 98 | - Refined recording icons and notifications that distinguish between pending, running, and completed recordings, giving clearer visual feedback while browsing the UI.【F:hdhr_VCR.applescript†L60-L96】【F:hdhr_VCR.applescript†L2000-L2070】 99 | 100 | ### Updated 101 | - Automatic cache-directory creation so poster art downloads work on first launch without manual folder setup.【F:hdhr_VCR.applescript†L100-L105】 102 | - Recording downloads now rely on the native `curl`/`caffeinate` pipeline, removing the Python 2 helper that blocked recordings on newer macOS installs.【F:hdhr_VCR.applescript†L2051-L2058】 103 | - Startup setup validates log and cache paths before continuing, surfacing permission problems earlier in the launch sequence.【F:hdhr_VCR.applescript†L100-L139】 104 | 105 | ### Changed 106 | - Startup validation now warns about missing cache or log folders up front, so users can fix permissions before attempting to add shows.【F:hdhr_VCR.applescript†L100-L139】 107 | 108 | ### Removed 109 | - Reliance on the deprecated Python 2 runtime for recording management, aligning the script with default macOS 12+ environments.【F:hdhr_VCR.applescript†L2051-L2058】 110 | 111 | ## 2021-12-22 112 | 113 | ### Added 114 | - Automatic detection of stalled recordings: if a curl session drops mid-recording, the script now restarts it and flags the issue in the UI, improving reliability for long events.【F:hdhr_VCR.applescript†L2071-L2127】 115 | 116 | ### Updated 117 | - Recording health checks run more often during active recordings, reducing the window where a stalled download could go unnoticed.【F:hdhr_VCR.applescript†L2049-L2127】 118 | 119 | ### Changed 120 | - None. 121 | 122 | ### Removed 123 | - None. 124 | 125 | ## 2021-09-05 126 | 127 | ### Added 128 | - JSON-backed configuration with automatic migration from the legacy plist format, enabling multi-show setups without manual file edits.【F:hdhr_VCR.applescript†L2034-L2108】 129 | - Ability to edit and add multiple shows at once from the main UI, including thumbnail previews during selection.【F:hdhr_VCR.applescript†L1668-L1828】 130 | - Rolling log support so long-running installs keep a bounded history instead of growing log files indefinitely.【F:hdhr_VCR.applescript†L143-L150】 131 | 132 | ### Updated 133 | - The home screen now highlights the next upcoming recordings and shows currently in progress, reducing the clicks needed to check status.【F:hdhr_VCR.applescript†L1393-L1420】【F:hdhr_VCR.applescript†L1866-L1945】 134 | - Show-add workflow now fetches and displays poster art from the guide feed for easier identification.【F:hdhr_VCR.applescript†L1768-L1783】 135 | 136 | ### Changed 137 | - Scheduler now aligns guide data to JSON-driven structures, paving the way for future automation like SeriesID tracking.【F:hdhr_VCR.applescript†L2034-L2108】 138 | 139 | ### Removed 140 | - Legacy text-based config handling that could corrupt schedules when multiple shows were added back-to-back.【F:hdhr_VCR.applescript†L2034-L2108】 141 | 142 | ## 2021-08-05 143 | 144 | ### Added 145 | - Multi-show selection for the same channel with an option to apply one set of recording settings to every show, drastically speeding up bulk subscriptions.【F:hdhr_VCR.applescript†L1668-L1762】 146 | - Notifications for shows currently recording, providing real-time confirmation when a capture begins.【F:hdhr_VCR.applescript†L2049-L2070】 147 | - Show artwork preview when picking new recordings, so users can confirm they selected the correct series/movie.【F:hdhr_VCR.applescript†L1672-L1790】 148 | 149 | ### Updated 150 | - Main screen now includes the upcoming queue directly beneath live status, surfacing schedule context without drilling into submenus.【F:hdhr_VCR.applescript†L1393-L1420】 151 | 152 | ### Changed 153 | - Bulk-add workflow now pre-validates duplicates and quietly skips ones already scheduled instead of erroring out.【F:hdhr_VCR.applescript†L1668-L1762】 154 | 155 | ### Removed 156 | - None. 157 | 158 | ## 2021-07-21 159 | 160 | ### Added 161 | - The dashboard now displays the next scheduled recordings inline, saving a trip into the Shows view for status checks.【F:hdhr_VCR.applescript†L1393-L1420】 162 | 163 | ### Updated 164 | - None. 165 | 166 | ### Changed 167 | - None. 168 | 169 | ### Removed 170 | - None. 171 | 172 | ## 2021-07-16 173 | 174 | ### Added 175 | - Refreshed UI copy and iconography throughout the script for clearer prompts and actions, aligning with the expanded icon set introduced earlier.【F:hdhr_VCR.applescript†L60-L96】 176 | - Stability improvements around tuner discovery and recording retries, reducing the number of modal errors users encounter when devices temporarily vanish.【F:hdhr_VCR.applescript†L2049-L2127】 177 | 178 | ### Updated 179 | - Dialog wording around adding shows and managing tuners now matches the new iconography, making workflows easier to follow.【F:hdhr_VCR.applescript†L1668-L1790】 180 | 181 | ### Changed 182 | - None. 183 | 184 | ### Removed 185 | - None. 186 | 187 | ## 2021-03-01 188 | 189 | ### Added 190 | - Persistent logging infrastructure that writes structured entries to disk, giving users an audit trail for each recording attempt.【F:hdhr_VCR.applescript†L100-L139】【F:hdhr_VCR.applescript†L2008-L2070】 191 | - Automated log trimming so the script self-manages log growth based on the number of configured shows.【F:hdhr_VCR.applescript†L126-L139】 192 | 193 | ### Updated 194 | - Numerous stability fixes across show validation and schedule updates, preventing off-day recordings from firing when a show isn’t supposed to run.【F:hdhr_VCR.applescript†L1856-L1959】 195 | 196 | ### Changed 197 | - None. 198 | 199 | ### Removed 200 | - None. 201 | 202 | ## 2021-02-09 203 | 204 | ### Added 205 | - Log entries now include the running version number, simplifying support requests by tying reports to a concrete build.【F:hdhr_VCR.applescript†L88-L108】 206 | 207 | ### Updated 208 | - Handler cleanup reduced redundant device discovery calls, making idle refreshes faster for end users with multiple tuners.【F:hdhr_VCR.applescript†L180-L265】 209 | 210 | ### Changed 211 | - None. 212 | 213 | ### Removed 214 | - None. 215 | 216 | ## 2021-02-08 217 | 218 | ### Added 219 | - Dedicated log file (`hdhr_VCR.log`) stored alongside user documents so day-to-day recording activity is captured for later review.【F:hdhr_VCR.applescript†L100-L139】 220 | - Automatic version-check notifications that alert users from the UI when a newer release is available.【F:hdhr_VCR.applescript†L142-L194】 221 | 222 | ### Updated 223 | - Startup routine now immediately discovers HDHomeRun tuners and restores prior show schedules before opening the main UI, making restarts seamless.【F:hdhr_VCR.applescript†L140-L206】 224 | 225 | ### Changed 226 | - None. 227 | 228 | ### Removed 229 | - None. 230 | 231 | ## 2021-02-01 232 | 233 | ### Added 234 | - Integrated “Facelift” UI with refreshed imagery and channel tiles, modernizing the experience compared to the 2021-01 builds.【F:hdhr_VCR.applescript†L1668-L1828】 235 | - Automatic tuner discovery runs on a timer to keep device lists current even when the app stays open for days.【F:hdhr_VCR.applescript†L180-L265】 236 | 237 | ### Updated 238 | - Notifications and dialogs include richer context (channel names, durations) so users can quickly confirm the right show is being configured.【F:hdhr_VCR.applescript†L1668-L1790】 239 | 240 | ### Changed 241 | - None. 242 | 243 | ### Removed 244 | - None. 245 | 246 | ## 2021-01-24 247 | 248 | ### Added 249 | - Bulk of the DVR workflow: show discovery, scheduling UI, and background idle loop that keeps recordings on track without manual intervention.【F:hdhr_VCR.applescript†L1668-L2127】 250 | - Initial support for per-show notification lead times so users can receive “up next” alerts before a recording starts.【F:hdhr_VCR.applescript†L2008-L2070】 251 | 252 | ### Updated 253 | - None. 254 | 255 | ### Changed 256 | - None. 257 | 258 | ### Removed 259 | - None. 260 | 261 | ## 2021-01-19 262 | 263 | ### Added 264 | - Ability to recover from tuner conflicts by retrying shows that were previously blocked, reducing manual babysitting of the queue.【F:hdhr_VCR.applescript†L1970-L2045】 265 | 266 | ### Updated 267 | - None. 268 | 269 | ### Changed 270 | - None. 271 | 272 | ### Removed 273 | - None. 274 | 275 | ## 2021-01-11 276 | 277 | ### Added 278 | - Initial public release of hdhr_VCR with a clickable UI for browsing HDHomeRun guide data and scheduling recordings from macOS.【F:hdhr_VCR.applescript†L140-L206】 279 | 280 | ### Updated 281 | - Version metadata surfaced in the UI to match the downloadable package name.【F:hdhr_VCR.applescript†L88-L108】 282 | 283 | ### Changed 284 | - None. 285 | 286 | ### Removed 287 | - None. 288 | -------------------------------------------------------------------------------- /docs/handler.md: -------------------------------------------------------------------------------- 1 | Handler Reference 2 | ================= 3 | 4 | Overview 5 | -------- 6 | The hdhr_VCR project packages two collaborating AppleScript files that turn an HDHomeRun tuner into a lightweight DVR. The 7 | `hdhr_VCR.applescript` file hosts the main application logic and user interface flow, while `hdhr_VCR_lib.applescript` 8 | provides reusable helpers for date math, logging, SeriesID handling, and other utilities that keep the core script tidy. This 9 | reference reflects the handlers that exist in the current sources and the values they exchange. 10 | 11 | > **Missing value semantics** – AppleScript commonly uses `missing value` to indicate "no response." Whenever a handler returns 12 | > it, the notes column below explains how the run loop reacts. 13 | 14 | --- 15 | 16 | ## `hdhr_VCR.applescript` 17 | 18 | ### Setup and app lifecycle 19 | 20 | | Handler | Inputs | Returns | Notes | 21 | | --- | --- | --- | --- | 22 | | `setup_lib` | `caller` | `boolean` | Loads the compiled library script, binds globals, and reports whether the load succeeded. | 23 | | `setup_icons` | `caller` | `boolean` | Populates emoji icons for UI prompts; later setup steps only run when this succeeds. | 24 | | `setup_script` | `caller` | `boolean` | Initializes environment data (paths, locale, caches); startup halts if `false`. | 25 | | `setup_globals` | `caller` | `boolean` | Resets global state for a fresh run; failures stop progression to runtime. | 26 | | `setup_logging` | `caller` | `boolean` | Establishes logging defaults and opens the log folder. | 27 | | `idle_change` | `caller`, `loop_delay`, `loop_delay_sec` | `missing value` | Overrides the idle delay and schedules when the override expires. | 28 | 29 | ### Native AppleScript event handlers 30 | 31 | AppleScript invokes these handlers automatically in response to system events. The script performs setup work inside the 32 | event entry points before returning control to the scheduler. 33 | 34 | | Handler | Inputs | Returns | Notes | 35 | | --- | --- | --- | --- | 36 | | `run` | none | `missing value` | Entry point that chains the setup sequence and then defers to `idle`. | 37 | | `idle` | none | `integer` | Core loop that manages recordings and returns the delay before the next idle call. | 38 | | `reopen` | none | `missing value` | Handles Dock icon reopen events by invoking `main`. | 39 | | `quit` | none | `missing value` | Handles shutdown, optionally kills active recordings, saves state, then continues quit. | 40 | 41 | ### Channel navigation and scheduling 42 | 43 | | Handler | Inputs | Returns | Notes | 44 | | --- | --- | --- | --- | 45 | | `hdhrGRID` | `caller`, `hdhr_device`, `hdhr_channel` | list of guide records, `true`, `false`, or `{""}` | Builds a channel guide list UI. Returns guide records for scheduling, `true` to jump back, `false` on cancel, or `{""}` for manual add. | 46 | | `main` | `caller`, `emulated_button_press` | `boolean` or `missing value` | Primary UI loop; returns `false` to exit or hands control back to `idle`. | 47 | | `add_show_info` | `caller`, `hdhr_device`, `hdhr_channel` | `boolean` or `missing value` | Scheduler workflow for adding shows; returns `false` on cancel. | 48 | | `setup` | `caller` | `missing value` | Guides the user through first-run configuration until complete. | 49 | | `validate_show_info` | `caller`, `show_to_check`, `should_edit` | `missing value` | Normalises existing show entries; interactive loops continue until validation passes. | 50 | | `record_start` | `caller`, `the_show_id`, `opt_show_length`, `force_update` | `missing value` | Validates prerequisites and launches recordings; callers loop through pending shows. | 51 | | `show_info_dump` | `caller`, `show_id_lookup`, `userdisplay` | `missing value` | Logging helper that dumps show metadata for debugging. | 52 | | `recordingnow_main` | `caller` | `text` | Summarises recordings in progress for UI display. | 53 | | `next_shows` | `caller` | record `{date, list, list}` | Returns the next show start plus summary lists for the main menu. | 54 | | `seriesScan` | `caller`, `seriesID`, `hdhr_device`, `thechan`, `show_id` | `missing value` | Seeds the SeriesID processing queue housed in the library. | 55 | | `seriesScanNext` | `caller`, `seriesID`, `hdhr_device`, `thechan`, `show_id`, `theoffset` | `record` or `{}` | Requests the next airing for a series; `{}` signals no match so callers can stop looping. | 56 | | `seriesScanUpdate` | `caller`, `show_id` | `missing value` | Refreshes SeriesID-managed shows after recordings complete. | 57 | | `existing_shows` | `caller` | `missing value` | Audits running helper processes tied to recordings and logs the findings. | 58 | | `check_after_midnight2` | `caller` | `boolean` | Legacy midnight-reset guard with no active callers in the script. | 59 | 60 | ### Device discovery and tuner control 61 | 62 | | Handler | Inputs | Returns | Notes | 63 | | --- | --- | --- | --- | 64 | | `tuner_overview` | `caller` | `list` | Produces human-readable tuner usage summaries. | 65 | | `tuner_ready_time` | `caller`, `hdhr_model` | `number` | Returns seconds until the specified tuner becomes free. | 66 | | `tuner_inuse` | `caller`, `device_id` | `list` or `text` | Lists remote client IPs for an in-use tuner or returns `""` when the status query times out. | 67 | | `tuner_status` | `caller`, `device_id` | `record` or `false` | Retrieves `{tunermax, tuneractive}`; callers retry on `false`. | 68 | | `tuner_mismatch` | `caller`, `device_id` | `missing value` | Audits tuner usage and corrects stale state. | 69 | | `AreWeOnline` | `caller` | `boolean` | Checks reachability of the configured tuner fleet. | 70 | | `HDHRDeviceDiscovery` | `caller`, `hdhr_device` | `missing value` | Scans for tuners, updates caches, and triggers refresh workflows. | 71 | | `HDHRDeviceSearch` | `caller`, `hdhr_device` | `integer` | Returns the index of a tuner or 0 if the device is unknown. | 72 | | `hdhr_api` | `caller`, `hdhr_ready` | `record` or `{}` | Wraps JSON Helper calls; returns `{}` when the helper cannot provide data. | 73 | | `getHDHR_Guide` | `caller`, `hdhr_device` | `missing value` | Downloads guide data for the specified tuner. | 74 | | `getHDHR_Lineup` | `caller`, `hdhr_device` | `missing value` | Refreshes the channel lineup from the HDHomeRun device. | 75 | | `channel_guide` | `caller`, `hdhr_device`, `hdhr_channel`, `hdhr_time` | `record`, `{}` or `false` | Looks up guide entries; `{}` represents lookup failures, `false` indicates missing channels. | 76 | | `tuner_dump` | `caller` | `list` | Delegates to the library to render a tuner diagnostics list. | 77 | 78 | ### Data persistence and metadata helpers 79 | 80 | | Handler | Inputs | Returns | Notes | 81 | | --- | --- | --- | --- | 82 | | `build_channel_list` | `caller`, `hdhr_device`, `cd` | `missing value` | Rebuilds the cached channel list for the active device. | 83 | | `channel2name` | `caller`, `the_channel`, `hdhr_device` | `text` or `false` | Resolves channel names; `false` signals the need for manual entry. | 84 | | `nextday` | `caller`, `the_show_id` | `date` | Computes the next airing for the provided show ID. | 85 | | `update_show` | `caller`, `the_show_id`, `force_update` | `missing value` | Syncs show metadata using guide data. | 86 | | `save_data` | `caller` | `boolean` or `missing value` | Persists configuration JSON; user cancellations return `false`. | 87 | | `showPathVerify` | `caller`, `show_id` | `boolean` | Ensures the recording folder exists for a given show. | 88 | | `checkfileexists` | `caller`, `filepath` | `boolean` | Path existence check with logging. | 89 | | `checkfileexists2` | `caller`, `filepath` | `boolean` | Currently unused; retained as a silent existence check for legacy integrations. | 90 | | `read_data` | `caller` | `boolean` or `missing value` | Loads saved configuration and triggers guided setup when missing. | 91 | | `add_record_url` | `caller`, `the_channel`, `the_device` | `text` | Retrieves the streaming URL for a channel/device pair. | 92 | | `showid2PID` | `caller`, `show_id`, `kill_pid`, `logging` | `{text, list}` | Finds associated curl processes and optionally terminates them. | 93 | | `curl2icon` | `caller`, `thelink` | `alias` | Downloads and returns a Finder alias for channel icons. | 94 | | `curl2icon2` | `caller`, `thelink` | `alias` | Currently unused fallback icon fetcher kept for manual testing compatibility. | 95 | 96 | ### Status and formatting helpers 97 | 98 | | Handler | Inputs | Returns | Notes | 99 | | --- | --- | --- | --- | 100 | | `is_channel_record` | `caller`, `hdhr_tuner`, `channelcheck`, `cd` | `text` | Builds recording-state glyphs for a channel row. | 101 | | `get_show_state` | `caller`, `hdhr_tuner`, `channelcheck`, `start_time`, `end_time` | `record` | Returns `{show_stat, the_show_id, status_icon}` describing schedule state. | 102 | | `check_version` | `caller` | `missing value` | Contacts remote version metadata and retries locally on failure. | 103 | | `check_version_dialog` | `caller` | `text` | Formats version information for UI presentation. | 104 | | `recordingnow_main` | `caller` | `text` | See table above; kept here for quick reference when formatting menus. | 105 | 106 | ### Library passthroughs 107 | These handlers exist for compatibility with older scripts. Each simply calls the identically named library handler (passing the 108 | same arguments) and returns whatever the library returns: 109 | 110 | `epoch2show_time`, `datetime2epoch`, `epoch2datetime`, `emptylist`, `stringlistflip`, `epoch`, `replace_chars`, `fixdate`, 111 | `stringToUtf8`, `isSystemShutdown`, `repeatProgress`, `ms2time`, `list_position`, `short_date`, `padnum`, `is_number`, 112 | `getTfromN`, `HDHRShowSearch`, `isModifierKeyPressed`, `date2touch`, `time_set`, `update_folder`, `show_name_fix`. 113 | 114 | The `logger` handler is implemented locally to keep log writes within the application bundle. 115 | 116 | --- 117 | 118 | ## `hdhr_VCR_lib.applescript` 119 | 120 | ### Script metadata and lifecycle 121 | 122 | | Handler | Inputs | Returns | Notes | 123 | | --- | --- | --- | --- | 124 | | `cm` | `handlername`, `caller` | `text` | Produces a `handler(caller)` tag for logging. | 125 | | `load_hdhrVCR_vars` | none | `text` | Reports the library version string back to the parent script. | 126 | 127 | ### Native AppleScript event handlers 128 | 129 | | Handler | Inputs | Returns | Notes | 130 | | --- | --- | --- | --- | 131 | | `run` | none | `missing value` | Reopens the parent script if the library is launched standalone. | 132 | 133 | ### Disk, filesystem, and environment helpers 134 | 135 | | Handler | Inputs | Returns | Notes | 136 | | --- | --- | --- | --- | 137 | | `checkDiskSpace` | `caller`, `the_path` | `{path, percent, available}` or `{path, 0, errmsg}` | Wraps the `df` command to report free space. | 138 | | `update_folder` | `caller`, `update_path` | `boolean` | Ensures directories exist before writing recordings. | 139 | | `rotate_logs` | `caller`, `filepath` | `missing value` | Renames oversized logs and starts a new file. | 140 | | `update_record_urls` | `caller`, `the_device` | `missing value` | Refreshes saved stream URLs for all shows on a device. | 141 | | `add_record_url` | `caller`, `the_channel`, `the_device` | `text` or `{…}` | Returns the streaming URL and error info on failure. | 142 | | `date2touch` | `caller`, `datetime`, `filepath` | `missing value` or `{…}` | Updates file modification times. | 143 | | `end_jsonhelper` | `caller` | `missing value` | Quits the JSON Helper app and allows the parent to restart it later. | 144 | 145 | ### Text, list, and conversion utilities 146 | 147 | | Handler | Inputs | Returns | Notes | 148 | | --- | --- | --- | --- | 149 | | `emptylist` | `caller`, `klist` | `list` or `{…}` | Removes blanks from list values. | 150 | | `stringlistflip` | `caller`, `thearg`, `delim`, `returned` | `list`, `text`, or `{…}` | Converts between delimited strings and lists. | 151 | | `replace_chars` | `thestring`, `target`, `replacement` | `text` or `{…}` | Performs character substitution without regex. | 152 | | `stringToUtf8` | `caller`, `thestring` | `text` or `{…}` | Normalises strings to UTF-8 safe values. | 153 | | `list_position` | `caller`, `this_item`, `this_list`, `is_strict` | `integer` or `{…}` | Returns the position of an item in a list. | 154 | | `padnum` | `caller`, `thenum`, `splitdot` | `text` or `{…}` | Zero pads numeric strings. | 155 | | `is_number` | `caller`, `number_string` | `boolean` or `{…}` | Tests numeric coercion. | 156 | | `itemsInString` | `caller`, `listofitems`, `thestring` | `boolean` or `{…}` | Checks if any list entry appears in a string. | 157 | | `quoteme` | `thestring` | `text` | Wraps text in AppleScript-safe quotes. | 158 | | `encode_strikethrough` | `caller`, `thedata`, `decimel_char` | `text` | Adds Unicode strikethrough markers to text. | 159 | | `convertByteSize` | `caller`, `byteSize`, `KBSize`, `decPlaces` | `text` | Formats byte counts with human-readable suffixes. | 160 | | `recordSee` | `caller`, `the_record` | `text` | Produces a text representation of a record for logs. | 161 | | `recordSee2` | `caller`, `the_record` | `text` | Variant that preserves raw error strings. | 162 | | `show_name_fix` | `caller`, `show_id`, `show_object` | `record` | Normalises show metadata imported from the guide. | 163 | | `enums2icons` | `caller`, `enumarray` | `list` or `{}` | Maps status enumeration values to emoji glyphs. | 164 | 165 | ### Date, time, and scheduling helpers 166 | 167 | | Handler | Inputs | Returns | Notes | 168 | | --- | --- | --- | --- | 169 | | `epoch` | `cd` | `date` or `{…}` | Returns the Unix epoch reference as an AppleScript date. | 170 | | `epoch2datetime` | `caller`, `epochseconds` | `date` or `{…}` | Converts epoch seconds to AppleScript date objects. | 171 | | `epoch2show_time` | `caller`, `epoch` | `text` or `{…}` | Formats epoch seconds for UI display. | 172 | | `getTfromN` | `this_number` | `number` or `{…}` | Converts AppleScript date values to seconds and back. | 173 | | `time_set` | `caller`, `adate_object`, `time_shift` | `date` or `{…}` | Adjusts dates by a given offset. | 174 | | `repeatProgress` | `caller`, `loop_delay`, `loop_total` | `missing value` or `{…}` | Animates Script Editor progress bars. | 175 | | `ms2time` | `caller`, `totalMS`, `time_duration`, `level_precision` | `text` or `{…}` | Formats durations into readable strings. | 176 | | `short_date` | `caller`, `the_date_object`, `twentyfourtime`, `show_seconds` | `text` or `{…}` | Formats timestamps for logs and dialogs. | 177 | | `check_after_midnight` | `caller` | `boolean` | Detects when a new day has started to reset daily counters. | 178 | | `nextday2` | `caller`, `the_show_id` | `date` | Calculates the next airing for a show using schedule metadata. | 179 | | `aroundDate` | `caller`, `thisdate`, `thatdate`, `secOffset` | `boolean` | Tests whether two dates are within a tolerance. | 180 | 181 | ### Device, guide, and series helpers 182 | 183 | | Handler | Inputs | Returns | Notes | 184 | | --- | --- | --- | --- | 185 | | `tuner_dump` | `caller` | `list` | Enumerates tuners, streaming URLs, and refresh timing. | 186 | | `HDHRShowSearch` | `caller`, `the_show_id` | `integer` or `0` | Finds a show index by ID. | 187 | | `match2showid` | `caller`, `hdhr_tuner`, `channelcheck`, `start_time`, `end_time` | `integer` | Resolves guide slots to show IDs. | 188 | | `showSeek` | `caller`, `start_time`, `end_time`, `chan`, `hdhr_device` | `list` or `false` | Filters `Show_info` for matching entries. | 189 | | `get_show_state2` | `caller`, `hdhr_tuner`, `channelcheck`, `start_time`, `end_time` | `record` | Legacy variant retained for reference. | 190 | | `seriesScanAdd` | `caller`, `show_id` | `missing value` | Queues show IDs for SeriesID updates. | 191 | | `seriesScanRun` | `caller`, `execute` | `missing value` | Processes the SeriesID refresh queue. | 192 | | `seriesScanList` | `caller`, `show_id`, `updateRecord` | `missing value` | Ensures SeriesID queue entries remain unique. | 193 | | `seriesScanRefresh` | `caller`, `show_id` | `missing value` | Bulk refresh of SeriesID-managed shows. | 194 | | `seriesStatusIcons` | `caller`, `show_id` | `record` | Maps show status values to icon enumerations for display. | 195 | | `show_icons` | `caller`, `hdhr_device`, `thechan` | `missing value` | Placeholder that demonstrates icon lookups; not used. | 196 | 197 | ### System integration 198 | 199 | | Handler | Inputs | Returns | Notes | 200 | | --- | --- | --- | --- | 201 | | `isSystemShutdown` | `caller` | `boolean` or `{…}` | Detects whether macOS is in the middle of shutting down. | 202 | | `corrupt_showinfo` | `caller` | `missing value` | Logging hook that fires when saved show data looks corrupted. | 203 | | `isModifierKeyPressed` | `caller`, `checkKey`, `desc` | `record` or `{…}` | Reports modifier key state for UI shortcuts. | 204 | 205 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | 10 | 11 | https://github.com/identd113/hdhr_VCR-AS 12 | 2021-12-16T17:22:06+00:00 13 | 1.00 14 | 15 | 16 | https://github.com/identd113/hdhr_VCR-AS/issues 17 | 2021-12-16T17:22:06+00:00 18 | 0.80 19 | 20 | 21 | https://github.com/identd113/hdhr_VCR-AS/pulls 22 | 2021-12-16T17:22:06+00:00 23 | 0.80 24 | 25 | 26 | https://github.com/identd113/hdhr_VCR-AS/actions 27 | 2021-12-16T17:22:06+00:00 28 | 0.80 29 | 30 | 31 | https://github.com/identd113/hdhr_VCR-AS/projects?type=beta 32 | 2021-12-16T17:22:06+00:00 33 | 0.80 34 | 35 | 36 | https://github.com/identd113/hdhr_VCR-AS/security 37 | 2021-12-16T17:22:06+00:00 38 | 0.80 39 | 40 | 41 | https://github.com/identd113/hdhr_VCR-AS/commit/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0 42 | 2021-12-16T17:22:06+00:00 43 | 0.80 44 | 45 | 46 | https://github.com/identd113/hdhr_VCR-AS/blob/master/.gitattributes 47 | 2021-12-16T17:22:06+00:00 48 | 0.80 49 | 50 | 51 | https://github.com/identd113/hdhr_VCR-AS/commit/50551576ce16c3c2cdb75f72cfec3709f5ab82b8 52 | 2021-12-16T17:22:06+00:00 53 | 0.80 54 | 55 | 56 | https://github.com/identd113/hdhr_VCR-AS/blob/master/.gitignore 57 | 2021-12-16T17:22:06+00:00 58 | 0.80 59 | 60 | 61 | https://github.com/identd113/hdhr_VCR-AS/commit/6dd5a4ad0cd2571ebeae34f783177b162dee1a28 62 | 2021-12-16T17:22:06+00:00 63 | 0.80 64 | 65 | 66 | https://github.com/identd113/hdhr_VCR-AS/blob/master/README.md 67 | 2021-12-16T17:22:06+00:00 68 | 0.80 69 | 70 | 71 | https://github.com/identd113/hdhr_VCR-AS/commit/5a0b883cce858fbff68270e46c4d9a6241e395d6 72 | 2021-12-16T17:22:06+00:00 73 | 0.80 74 | 75 | 76 | https://github.com/identd113/hdhr_VCR-AS/commit/bc38f401a3da1f2222ad5325124025efc2ca5710 77 | 2021-12-16T17:22:06+00:00 78 | 0.80 79 | 80 | 81 | https://github.com/identd113/hdhr_VCR-AS/commit/7871481d6e6941697bab159f4c5cf610311bbf05 82 | 2021-12-16T17:22:06+00:00 83 | 0.80 84 | 85 | 86 | https://github.com/identd113/hdhr_VCR-AS/blob/master/google079fb87c211e31f1.html 87 | 2021-12-16T17:22:06+00:00 88 | 0.80 89 | 90 | 91 | https://github.com/identd113/hdhr_VCR-AS/commit/123c879718d70971c6a6da77e96348137bcb7880 92 | 2021-12-16T17:22:06+00:00 93 | 0.80 94 | 95 | 96 | https://github.com/identd113/hdhr_VCR-AS/commit/f86a540a67e5384fe0c5ebb4c276a8cc8097d26b 97 | 2021-12-16T17:22:06+00:00 98 | 0.80 99 | 100 | 101 | https://github.com/identd113/hdhr_VCR-AS/blob/master/hdhr_VCR.applescript 102 | 2021-12-16T17:22:06+00:00 103 | 0.80 104 | 105 | 106 | https://github.com/identd113/hdhr_VCR-AS/commit/9ea0937bad9cb4e12d1dc79980e3884aa8c0e9b9 107 | 2021-12-16T17:22:06+00:00 108 | 0.80 109 | 110 | 111 | https://github.com/identd113/hdhr_VCR-AS/commit/c5e951d550e6245e6e8190008c5bf3a535d5f65a 112 | 2021-12-16T17:22:06+00:00 113 | 0.80 114 | 115 | 116 | https://github.com/identd113/hdhr_VCR-AS/commit/8f9ce3ed2681aa3eed4656aef9623ebfe5e36f1c 117 | 2021-12-16T17:22:06+00:00 118 | 0.80 119 | 120 | 121 | https://github.com/identd113/hdhr_VCR-AS/commit/ec8ce3946242e284b947dca401312d3990dc2c9f 122 | 2021-12-16T17:22:06+00:00 123 | 0.80 124 | 125 | 126 | https://github.com/identd113/hdhr_VCR-AS/blob/master/version.json 127 | 2021-12-16T17:22:06+00:00 128 | 0.80 129 | 130 | 131 | https://github.com/identd113/hdhr_VCR-AS/commit/58c001a7aaa2cec6c6923b6eafb6e8f3fe5e50f8 132 | 2021-12-16T17:22:06+00:00 133 | 0.80 134 | 135 | 136 | https://github.com/identd113/hdhr_VCR-AS/releases 137 | 2021-12-16T17:22:06+00:00 138 | 0.80 139 | 140 | 141 | https://github.com/identd113/hdhr_VCR-AS/labels 142 | 2021-12-16T17:22:06+00:00 143 | 0.64 144 | 145 | 146 | https://github.com/identd113/hdhr_VCR-AS/milestones 147 | 2021-12-16T17:22:06+00:00 148 | 0.64 149 | 150 | 151 | https://github.com/identd113/hdhr_VCR-AS/issues/42 152 | 2021-12-16T17:22:06+00:00 153 | 0.64 154 | 155 | 156 | https://github.com/identd113/hdhr_VCR-AS/issues/41 157 | 2021-12-16T17:22:06+00:00 158 | 0.64 159 | 160 | 161 | https://github.com/identd113/hdhr_VCR-AS/issues/40 162 | 2021-12-16T17:22:06+00:00 163 | 0.64 164 | 165 | 166 | https://github.com/identd113/hdhr_VCR-AS/issues/34 167 | 2021-12-16T17:22:06+00:00 168 | 0.64 169 | 170 | 171 | https://github.com/identd113/hdhr_VCR-AS/issues/30 172 | 2021-12-16T17:22:06+00:00 173 | 0.64 174 | 175 | 176 | https://github.com/identd113/hdhr_VCR-AS/issues/10 177 | 2021-12-16T17:22:06+00:00 178 | 0.64 179 | 180 | 181 | https://github.com/identd113/hdhr_VCR-AS/compare 182 | 2021-12-16T17:22:06+00:00 183 | 0.64 184 | 185 | 186 | https://github.com/identd113/hdhr_VCR-AS/projects 187 | 2021-12-16T17:22:06+00:00 188 | 0.64 189 | 190 | 191 | https://github.com/identd113/hdhr_VCR-AS/security/policy 192 | 2021-12-16T17:22:06+00:00 193 | 0.64 194 | 195 | 196 | https://github.com/identd113/hdhr_VCR-AS/security/advisories 197 | 2021-12-16T17:22:06+00:00 198 | 0.64 199 | 200 | 201 | https://github.com/identd113/hdhr_VCR-AS/commit/18f91987f9452ec017a90d4df9884f7e525df751 202 | 2021-12-16T17:22:06+00:00 203 | 0.64 204 | 205 | 206 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/.gitattributes 207 | 2021-12-16T17:22:06+00:00 208 | 0.64 209 | 210 | 211 | https://github.com/identd113/hdhr_VCR-AS/find/master 212 | 2021-12-16T17:22:06+00:00 213 | 0.64 214 | 215 | 216 | https://github.com/identd113/hdhr_VCR-AS/commit/9cdfa1311242cd5cb8f68bc356cc7fd340adff4d 217 | 2021-12-16T17:22:06+00:00 218 | 0.64 219 | 220 | 221 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/.gitignore 222 | 2021-12-16T17:22:06+00:00 223 | 0.64 224 | 225 | 226 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/README.md 227 | 2021-12-16T17:22:06+00:00 228 | 0.64 229 | 230 | 231 | https://github.com/identd113/hdhr_VCR-AS/blob/master/README.md?plain=1 232 | 2021-12-16T17:22:06+00:00 233 | 0.64 234 | 235 | 236 | https://github.com/identd113/hdhr_VCR-AS/commit/846adc49a42446a60a4660e2ec6806d215650265 237 | 2021-12-16T17:22:06+00:00 238 | 0.64 239 | 240 | 241 | https://github.com/identd113/hdhr_VCR-AS/commit/b09df417ed6948f6610ba5caa6228115c2ad052e 242 | 2021-12-16T17:22:06+00:00 243 | 0.64 244 | 245 | 246 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/google079fb87c211e31f1.html 247 | 2021-12-16T17:22:06+00:00 248 | 0.64 249 | 250 | 251 | https://github.com/identd113/hdhr_VCR-AS/commit/8166c9663aeb82571c922190e203b5f29eaf44aa 252 | 2021-12-16T17:22:06+00:00 253 | 0.64 254 | 255 | 256 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/hdhr_VCR.applescript 257 | 2021-12-16T17:22:06+00:00 258 | 0.64 259 | 260 | 261 | https://github.com/identd113/hdhr_VCR-AS/commit/9cb05bde10325984d78c48956f3cef26a0245cfa 262 | 2021-12-16T17:22:06+00:00 263 | 0.64 264 | 265 | 266 | https://github.com/identd113/hdhr_VCR-AS/commit/21160f9677cac7f92d46900f251aae58ef1b7751 267 | 2021-12-16T17:22:06+00:00 268 | 0.64 269 | 270 | 271 | https://github.com/identd113/hdhr_VCR-AS/commit/d57240da0e827e7ebac1cbf9bfcd0df954f66202 272 | 2021-12-16T17:22:06+00:00 273 | 0.64 274 | 275 | 276 | https://github.com/identd113/hdhr_VCR-AS/commit/398ec60c6bd72f1628298143a651093c0f27fe4c 277 | 2021-12-16T17:22:06+00:00 278 | 0.64 279 | 280 | 281 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/version.json 282 | 2021-12-16T17:22:06+00:00 283 | 0.64 284 | 285 | 286 | https://github.com/identd113/hdhr_VCR-AS/commit/df11cf1ad6a86f646ac37e96448ecd3b1018132b 287 | 2021-12-16T17:22:06+00:00 288 | 0.64 289 | 290 | 291 | https://github.com/identd113/hdhr_VCR-AS/labels?sort=name-asc 292 | 2021-12-16T17:22:06+00:00 293 | 0.51 294 | 295 | 296 | https://github.com/identd113/hdhr_VCR-AS/labels?sort=name-desc 297 | 2021-12-16T17:22:06+00:00 298 | 0.51 299 | 300 | 301 | https://github.com/identd113/hdhr_VCR-AS/labels?sort=count-desc 302 | 2021-12-16T17:22:06+00:00 303 | 0.51 304 | 305 | 306 | https://github.com/identd113/hdhr_VCR-AS/labels?sort=count-asc 307 | 2021-12-16T17:22:06+00:00 308 | 0.51 309 | 310 | 311 | https://github.com/identd113/hdhr_VCR-AS/labels/bug 312 | 2021-12-16T17:22:06+00:00 313 | 0.51 314 | 315 | 316 | https://github.com/identd113/hdhr_VCR-AS/labels/documentation 317 | 2021-12-16T17:22:06+00:00 318 | 0.51 319 | 320 | 321 | https://github.com/identd113/hdhr_VCR-AS/labels/duplicate 322 | 2021-12-16T17:22:06+00:00 323 | 0.51 324 | 325 | 326 | https://github.com/identd113/hdhr_VCR-AS/labels/enhancement 327 | 2021-12-16T17:22:06+00:00 328 | 0.51 329 | 330 | 331 | https://github.com/identd113/hdhr_VCR-AS/labels/good%20first%20issue 332 | 2021-12-16T17:22:06+00:00 333 | 0.51 334 | 335 | 336 | https://github.com/identd113/hdhr_VCR-AS/labels/help%20wanted 337 | 2021-12-16T17:22:06+00:00 338 | 0.51 339 | 340 | 341 | https://github.com/identd113/hdhr_VCR-AS/labels/invalid 342 | 2021-12-16T17:22:06+00:00 343 | 0.51 344 | 345 | 346 | https://github.com/identd113/hdhr_VCR-AS/labels/question 347 | 2021-12-16T17:22:06+00:00 348 | 0.51 349 | 350 | 351 | https://github.com/identd113/hdhr_VCR-AS/labels/wontfix 352 | 2021-12-16T17:22:06+00:00 353 | 0.51 354 | 355 | 356 | https://github.com/identd113/hdhr_VCR-AS/milestones?state=open 357 | 2021-12-16T17:22:06+00:00 358 | 0.51 359 | 360 | 361 | https://github.com/identd113/hdhr_VCR-AS/milestones?state=closed 362 | 2021-12-16T17:22:06+00:00 363 | 0.51 364 | 365 | 366 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=due_date&state=open 367 | 2021-12-16T17:22:06+00:00 368 | 0.51 369 | 370 | 371 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=due_date&state=open 372 | 2021-12-16T17:22:06+00:00 373 | 0.51 374 | 375 | 376 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=completeness&state=open 377 | 2021-12-16T17:22:06+00:00 378 | 0.51 379 | 380 | 381 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=completeness&state=open 382 | 2021-12-16T17:22:06+00:00 383 | 0.51 384 | 385 | 386 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=title&state=open 387 | 2021-12-16T17:22:06+00:00 388 | 0.51 389 | 390 | 391 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=title&state=open 392 | 2021-12-16T17:22:06+00:00 393 | 0.51 394 | 395 | 396 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=count&state=open 397 | 2021-12-16T17:22:06+00:00 398 | 0.51 399 | 400 | 401 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=count&state=open 402 | 2021-12-16T17:22:06+00:00 403 | 0.51 404 | 405 | 406 | https://github.com/identd113/hdhr_VCR-AS/issues/43 407 | 2021-12-16T17:22:06+00:00 408 | 0.51 409 | 410 | 411 | https://github.com/identd113/hdhr_VCR-AS/issues/20 412 | 2021-12-16T17:22:06+00:00 413 | 0.51 414 | 415 | 416 | https://github.com/identd113/hdhr_VCR-AS/issues/11 417 | 2021-12-16T17:22:06+00:00 418 | 0.51 419 | 420 | 421 | https://github.com/identd113/hdhr_VCR-AS/security/advisories?state=published 422 | 2021-12-16T17:22:06+00:00 423 | 0.51 424 | 425 | 426 | https://github.com/identd113/hdhr_VCR-AS/commit/0886c4510765c2d4846a06d563bc33d3f4ad8a89 427 | 2021-12-16T17:22:06+00:00 428 | 0.51 429 | 430 | 431 | https://github.com/identd113/hdhr_VCR-AS/find/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0 432 | 2021-12-16T17:22:06+00:00 433 | 0.51 434 | 435 | 436 | https://github.com/identd113/hdhr_VCR-AS/commit/2afeb773fc96ad364f40b7d5ebb777abb7dc7b67 437 | 2021-12-16T17:22:06+00:00 438 | 0.51 439 | 440 | 441 | https://github.com/identd113/hdhr_VCR-AS/blob/d1bb123c1405c2c574a20d734ebc31fb85ff4fc0/README.md?plain=1 442 | 2021-12-16T17:22:06+00:00 443 | 0.51 444 | 445 | 446 | https://github.com/identd113/hdhr_VCR-AS/issues/38 447 | 2021-12-16T17:22:06+00:00 448 | 0.51 449 | 450 | 451 | https://github.com/identd113/hdhr_VCR-AS/commit/02cfa39b624d10e4a37a71c93cf6a65d2840cc8f 452 | 2021-12-16T17:22:06+00:00 453 | 0.51 454 | 455 | 456 | https://github.com/identd113/hdhr_VCR-AS/commit/0ab1079eedf21a6c17abf8e1c89b5639b0b4be7c 457 | 2021-12-16T17:22:06+00:00 458 | 0.51 459 | 460 | 461 | https://github.com/identd113/hdhr_VCR-AS/commit/43647c5d997baeb7c4ca5d6d0be005fec76b1f80 462 | 2021-12-16T17:22:06+00:00 463 | 0.51 464 | 465 | 466 | https://github.com/identd113/hdhr_VCR-AS/commit/97413dc54735a7999443e367706a010aa9d0ddf0 467 | 2021-12-16T17:22:06+00:00 468 | 0.51 469 | 470 | 471 | https://github.com/identd113/hdhr_VCR-AS/issues/31 472 | 2021-12-16T17:22:06+00:00 473 | 0.51 474 | 475 | 476 | https://github.com/identd113/hdhr_VCR-AS/issues/32 477 | 2021-12-16T17:22:06+00:00 478 | 0.51 479 | 480 | 481 | https://github.com/identd113/hdhr_VCR-AS/commit/758a91fcd4fc338934fa4ff6df3cd6ed6a15d7c1 482 | 2021-12-16T17:22:06+00:00 483 | 0.51 484 | 485 | 486 | https://github.com/identd113/hdhr_VCR-AS/commit/f94bcd4d297427d1ac6e845e1214a12ad3033ce0 487 | 2021-12-16T17:22:06+00:00 488 | 0.51 489 | 490 | 491 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=due_date&state=closed 492 | 2021-12-16T17:22:06+00:00 493 | 0.41 494 | 495 | 496 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=due_date&state=closed 497 | 2021-12-16T17:22:06+00:00 498 | 0.41 499 | 500 | 501 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=completeness&state=closed 502 | 2021-12-16T17:22:06+00:00 503 | 0.41 504 | 505 | 506 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=completeness&state=closed 507 | 2021-12-16T17:22:06+00:00 508 | 0.41 509 | 510 | 511 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=title&state=closed 512 | 2021-12-16T17:22:06+00:00 513 | 0.41 514 | 515 | 516 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=title&state=closed 517 | 2021-12-16T17:22:06+00:00 518 | 0.41 519 | 520 | 521 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=desc&sort=count&state=closed 522 | 2021-12-16T17:22:06+00:00 523 | 0.41 524 | 525 | 526 | https://github.com/identd113/hdhr_VCR-AS/milestones?direction=asc&sort=count&state=closed 527 | 2021-12-16T17:22:06+00:00 528 | 0.41 529 | 530 | 531 | https://github.com/identd113/hdhr_VCR-AS/issues/16 532 | 2021-12-16T17:22:06+00:00 533 | 0.41 534 | 535 | 536 | https://github.com/identd113/hdhr_VCR-AS/commit/acf9038161fedc44c16a8314f6d5b775c62242a0 537 | 2021-12-16T17:22:06+00:00 538 | 0.41 539 | 540 | 541 | https://github.com/identd113/hdhr_VCR-AS/commit/baed3a0e997596a2b61384d854dffece652ab4c3 542 | 2021-12-16T17:22:06+00:00 543 | 0.41 544 | 545 | 546 | https://github.com/identd113/hdhr_VCR-AS/commit/8893e208764360901abdfd9731fa65fff486acfa 547 | 2021-12-16T17:22:06+00:00 548 | 0.41 549 | 550 | 551 | https://github.com/identd113/hdhr_VCR-AS/commit/9d9ce6925d650375b5bcb49b63cd090f8cdf2700 552 | 2021-12-16T17:22:06+00:00 553 | 0.41 554 | 555 | 556 | https://github.com/identd113/hdhr_VCR-AS/issues/39 557 | 2021-12-16T17:22:06+00:00 558 | 0.41 559 | 560 | 561 | https://github.com/identd113/hdhr_VCR-AS/commit/eb1c88e2563615ab8f34e8da3371fcfe191920a2 562 | 2021-12-16T17:22:06+00:00 563 | 0.41 564 | 565 | 566 | https://github.com/identd113/hdhr_VCR-AS/commit/ca1f67ca335cf717a400750648ff010d734ea7ca 567 | 2021-12-16T17:22:06+00:00 568 | 0.41 569 | 570 | 571 | https://github.com/identd113/hdhr_VCR-AS/issues/29 572 | 2021-12-16T17:22:06+00:00 573 | 0.41 574 | 575 | 576 | https://github.com/identd113/hdhr_VCR-AS/commit/c2a4b49515572e0d5d5dd9dca110238571e98482 577 | 2021-12-16T17:22:06+00:00 578 | 0.41 579 | 580 | 581 | https://github.com/identd113/hdhr_VCR-AS/commit/9cb51d169569a3a85db28e6da461d6e56b96d91b 582 | 2021-12-16T17:22:06+00:00 583 | 0.33 584 | 585 | 586 | https://github.com/identd113/hdhr_VCR-AS/commit/edb1d46604ba4b6106526b5c0a19715b50d87ab8 587 | 2021-12-16T17:22:06+00:00 588 | 0.33 589 | 590 | 591 | https://github.com/identd113/hdhr_VCR-AS/issues/24 592 | 2021-12-16T17:22:06+00:00 593 | 0.33 594 | 595 | 596 | https://github.com/identd113/hdhr_VCR-AS/commit/0bd945c6d60c6acc7b1f05a18778e5037edff587 597 | 2021-12-16T17:22:06+00:00 598 | 0.33 599 | 600 | 601 | https://github.com/identd113/hdhr_VCR-AS/commit/3849d979c9df74d94e998a427aacddf02bfbf865 602 | 2021-12-16T17:22:06+00:00 603 | 0.33 604 | 605 | 606 | https://github.com/identd113/hdhr_VCR-AS/commit/ee457bcf4db2d392733872a77b86a4f4a59891b9 607 | 2021-12-16T17:22:06+00:00 608 | 0.33 609 | 610 | 611 | https://github.com/identd113/hdhr_VCR-AS/commit/bdc1c7205b79426cc3988809dab02991440fd3bf 612 | 2021-12-16T17:22:06+00:00 613 | 0.33 614 | 615 | 616 | https://github.com/identd113/hdhr_VCR-AS/commit/2bdae4ba6ce74af9fbb1f5794d0a05c9253085d6 617 | 2021-12-16T17:22:06+00:00 618 | 0.26 619 | 620 | 621 | https://github.com/identd113/hdhr_VCR-AS/commit/30fbe73050d376df2757d9ad9a1780f720ad074d 622 | 2021-12-16T17:22:06+00:00 623 | 0.26 624 | 625 | 626 | https://github.com/identd113/hdhr_VCR-AS/commit/6f3e299365cb23c3b61ba21c83b745925f6b7747 627 | 2021-12-16T17:22:06+00:00 628 | 0.26 629 | 630 | 631 | https://github.com/identd113/hdhr_VCR-AS/commit/4b8620e1a7fcc9bd3adaf8e5801409c3d59db397 632 | 2021-12-16T17:22:06+00:00 633 | 0.26 634 | 635 | 636 | https://github.com/identd113/hdhr_VCR-AS/commit/1e65c927dc7b46a34db980c6ba2d05f7e9317e8a 637 | 2021-12-16T17:22:06+00:00 638 | 0.26 639 | 640 | 641 | https://github.com/identd113/hdhr_VCR-AS/issues/35 642 | 2021-12-16T17:22:06+00:00 643 | 0.26 644 | 645 | 646 | https://github.com/identd113/hdhr_VCR-AS/issues/36 647 | 2021-12-16T17:22:06+00:00 648 | 0.26 649 | 650 | 651 | https://github.com/identd113/hdhr_VCR-AS/issues/37 652 | 2021-12-16T17:22:06+00:00 653 | 0.26 654 | 655 | 656 | https://github.com/identd113/hdhr_VCR-AS/commit/8eeb7f71d2f57f9868cc248ebf41ea02df672b57 657 | 2021-12-16T17:22:06+00:00 658 | 0.26 659 | 660 | 661 | https://github.com/identd113/hdhr_VCR-AS/issues/33 662 | 2021-12-16T17:22:06+00:00 663 | 0.21 664 | 665 | 666 | https://github.com/identd113/hdhr_VCR-AS/commit/6c3fb2e20921a89b57940e8bdd4293e5c11a547d 667 | 2021-12-16T17:22:06+00:00 668 | 0.21 669 | 670 | 671 | https://github.com/identd113/hdhr_VCR-AS/commit/4a8cc57683027f8931323f6bb7ba752238ec0e16 672 | 2021-12-16T17:22:06+00:00 673 | 0.21 674 | 675 | 676 | https://github.com/identd113/hdhr_VCR-AS/commit/dbac3d8f0cd849899c2d68c2d02e2943aa83ff6e 677 | 2021-12-16T17:22:06+00:00 678 | 0.21 679 | 680 | 681 | https://github.com/identd113/hdhr_VCR-AS/commit/8d7aa68787855adbab2a58eb703c8b7c1706a34f 682 | 2021-12-16T17:22:06+00:00 683 | 0.21 684 | 685 | 686 | https://github.com/identd113/hdhr_VCR-AS/issues/26 687 | 2021-12-16T17:22:06+00:00 688 | 0.21 689 | 690 | 691 | https://github.com/identd113/hdhr_VCR-AS/commit/52a8c7281595f73e471873331a31b52a370997b0 692 | 2021-12-16T17:22:06+00:00 693 | 0.21 694 | 695 | 696 | https://github.com/identd113/hdhr_VCR-AS/commit/2f50306997dfb5118b7aac7f042167b3ac7bb672 697 | 2021-12-16T17:22:06+00:00 698 | 0.21 699 | 700 | 701 | https://github.com/identd113/hdhr_VCR-AS/commit/93f17f2703402166c6cbf3d70f4fd5936ea49f09 702 | 2021-12-16T17:22:06+00:00 703 | 0.17 704 | 705 | 706 | https://github.com/identd113/hdhr_VCR-AS/commit/17879238d9f55d2a533be6ff3bead907c43a8403 707 | 2021-12-16T17:22:06+00:00 708 | 0.17 709 | 710 | 711 | https://github.com/identd113/hdhr_VCR-AS/commit/63bd27d0f979fd0cf9cc4d9409e8dc4dfd82224e 712 | 2021-12-16T17:22:06+00:00 713 | 0.17 714 | 715 | 716 | https://github.com/identd113/hdhr_VCR-AS/commit/8306293015e668ac2e54f3a148e448760c9771c3 717 | 2021-12-16T17:22:06+00:00 718 | 0.17 719 | 720 | 721 | https://github.com/identd113/hdhr_VCR-AS/commit/c918920a523fe6a9a3af02b7211e47fc03348e03 722 | 2021-12-16T17:22:06+00:00 723 | 0.17 724 | 725 | 726 | https://github.com/identd113/hdhr_VCR-AS/commit/0054f64c941b1af7b6a2224a8237c228a19f823d 727 | 2021-12-16T17:22:06+00:00 728 | 0.13 729 | 730 | 731 | https://github.com/identd113/hdhr_VCR-AS/commit/11c9fce41cc6f07a0a00b78b39c09e0fd0c08d77 732 | 2021-12-16T17:22:06+00:00 733 | 0.13 734 | 735 | 736 | https://github.com/identd113/hdhr_VCR-AS/commit/98716a165efdd5851998bde1faccf15fe9204dc0 737 | 2021-12-16T17:22:06+00:00 738 | 0.13 739 | 740 | 741 | https://github.com/identd113/hdhr_VCR-AS/commit/ee15dfff1cf75761062896021c80ffa042ed5889 742 | 2021-12-16T17:22:06+00:00 743 | 0.13 744 | 745 | 746 | https://github.com/identd113/hdhr_VCR-AS/commit/94273e0a894a321831bb5a506e3d01206e4bae43 747 | 2021-12-16T17:22:06+00:00 748 | 0.13 749 | 750 | 751 | https://github.com/identd113/hdhr_VCR-AS/commit/594d6530e430a83b07882f8584211904a929dde0 752 | 2021-12-16T17:22:06+00:00 753 | 0.13 754 | 755 | 756 | https://github.com/identd113/hdhr_VCR-AS/commit/c2aaf53be6d75da3b3da2d170b6fb043020da85e 757 | 2021-12-16T17:22:06+00:00 758 | 0.11 759 | 760 | 761 | https://github.com/identd113/hdhr_VCR-AS/commit/6f396d2d2c1089c747ed7dda00449b1c68ae8516 762 | 2021-12-16T17:22:06+00:00 763 | 0.11 764 | 765 | 766 | https://github.com/identd113/hdhr_VCR-AS/commit/455e01c00eb961b6f69e7c93235b0a85c8b35d2f 767 | 2021-12-16T17:22:06+00:00 768 | 0.11 769 | 770 | 771 | https://github.com/identd113/hdhr_VCR-AS/commit/ba8b4c3a61104ae896b8c319f08e255786141476 772 | 2021-12-16T17:22:06+00:00 773 | 0.11 774 | 775 | 776 | https://github.com/identd113/hdhr_VCR-AS/commit/fd54256a44513203e7b0d95f5c21d4eb94fafde8 777 | 2021-12-16T17:22:06+00:00 778 | 0.11 779 | 780 | 781 | https://github.com/identd113/hdhr_VCR-AS/commit/0c5a48a4ca699bb6a632300e5fc7c35469cdcc81 782 | 2021-12-16T17:22:06+00:00 783 | 0.11 784 | 785 | 786 | https://github.com/identd113/hdhr_VCR-AS/commit/a1690f9b793a2394adf50fcd920b508f3c22e7b4 787 | 2021-12-16T17:22:06+00:00 788 | 0.09 789 | 790 | 791 | https://github.com/identd113/hdhr_VCR-AS/commit/dddbaceb6d938a0797a879143f4ced67e7dd8b15 792 | 2021-12-16T17:22:06+00:00 793 | 0.09 794 | 795 | 796 | https://github.com/identd113/hdhr_VCR-AS/commit/56f0de60c6ba8940b650989b4f9930741352ae54 797 | 2021-12-16T17:22:06+00:00 798 | 0.09 799 | 800 | 801 | https://github.com/identd113/hdhr_VCR-AS/issues/23 802 | 2021-12-16T17:22:06+00:00 803 | 0.09 804 | 805 | 806 | https://github.com/identd113/hdhr_VCR-AS/commit/6dfc6cc4c846fc9eba05bd64311a84413aa0eec6 807 | 2021-12-16T17:22:06+00:00 808 | 0.09 809 | 810 | 811 | https://github.com/identd113/hdhr_VCR-AS/commit/6f0cb7b37ca3c01f925bf780b52fcf5e4aacee9c 812 | 2021-12-16T17:22:06+00:00 813 | 0.09 814 | 815 | 816 | https://github.com/identd113/hdhr_VCR-AS/commit/34e275aa67c15c2d5359534ed8c2315803295a91 817 | 2021-12-16T17:22:06+00:00 818 | 0.09 819 | 820 | 821 | https://github.com/identd113/hdhr_VCR-AS/commit/5e1c19d553c07166e14c454d9dc14dc1bbbf6988 822 | 2021-12-16T17:22:06+00:00 823 | 0.07 824 | 825 | 826 | https://github.com/identd113/hdhr_VCR-AS/commit/b21728f67650162f47683c0da4f816e6e4f0d041 827 | 2021-12-16T17:22:06+00:00 828 | 0.07 829 | 830 | 831 | https://github.com/identd113/hdhr_VCR-AS/commit/cb4219fdf210f23aaebf5b28737940165e84f7aa 832 | 2021-12-16T17:22:06+00:00 833 | 0.07 834 | 835 | 836 | https://github.com/identd113/hdhr_VCR-AS/commit/996d936fcef230d48ce08d5fdb05af83e7029683 837 | 2021-12-16T17:22:06+00:00 838 | 0.07 839 | 840 | 841 | https://github.com/identd113/hdhr_VCR-AS/commit/71fbdf9493bd9e9337ed49bd49c02da21c37ae5e 842 | 2021-12-16T17:22:06+00:00 843 | 0.07 844 | 845 | 846 | https://github.com/identd113/hdhr_VCR-AS/commit/f7c7283ba1dc764d6034f6238a0c2a3d5b177795 847 | 2021-12-16T17:22:06+00:00 848 | 0.05 849 | 850 | 851 | https://github.com/identd113/hdhr_VCR-AS/commit/1af74a8acf9e95252485e8eea3e4e16fbfa2a0b5 852 | 2021-12-16T17:22:06+00:00 853 | 0.05 854 | 855 | 856 | https://github.com/identd113/hdhr_VCR-AS/commit/fcc0283cfb07b30b23794ed0ab2188e7e530c1cc 857 | 2021-12-16T17:22:06+00:00 858 | 0.05 859 | 860 | 861 | https://github.com/identd113/hdhr_VCR-AS/commit/1abee0cc0192d97139472f647f0a26d592f9c0ac 862 | 2021-12-16T17:22:06+00:00 863 | 0.05 864 | 865 | 866 | https://github.com/identd113/hdhr_VCR-AS/commit/9a3c3ce128a05a532e52f484a74bbbac95b5a986 867 | 2021-12-16T17:22:06+00:00 868 | 0.05 869 | 870 | 871 | https://github.com/identd113/hdhr_VCR-AS/commit/55e5b57f24772e6953c98a4c638ecd165a77416e 872 | 2021-12-16T17:22:06+00:00 873 | 0.04 874 | 875 | 876 | https://github.com/identd113/hdhr_VCR-AS/commit/dac572c7f1bfc5ce38f8cef66715ba6eac4f5b40 877 | 2021-12-16T17:22:06+00:00 878 | 0.04 879 | 880 | 881 | https://github.com/identd113/hdhr_VCR-AS/commit/75355232a3661a2055771b23aac8b8499f433059 882 | 2021-12-16T17:22:06+00:00 883 | 0.04 884 | 885 | 886 | https://github.com/identd113/hdhr_VCR-AS/commit/75b0d1f4c24178848466101329c9e052cb34e36b 887 | 2021-12-16T17:22:06+00:00 888 | 0.04 889 | 890 | 891 | https://github.com/identd113/hdhr_VCR-AS/commit/2d286d03d7b2304bd25a9234e88f90170673b086 892 | 2021-12-16T17:22:06+00:00 893 | 0.04 894 | 895 | 896 | https://github.com/identd113/hdhr_VCR-AS/commit/3580c06157cbb506727783ecd876a67f9ee2cc75 897 | 2021-12-16T17:22:06+00:00 898 | 0.04 899 | 900 | 901 | https://github.com/identd113/hdhr_VCR-AS/commit/d95c2e33e9b66cd6b1427d8db9d5b9def2f132a2 902 | 2021-12-16T17:22:06+00:00 903 | 0.04 904 | 905 | 906 | https://github.com/identd113/hdhr_VCR-AS/commit/b8d23113368918db1301b46ed6d95aed4e3ae7c7 907 | 2021-12-16T17:22:06+00:00 908 | 0.04 909 | 910 | 911 | https://github.com/identd113/hdhr_VCR-AS/commit/af958fce8472df4e26fde83c339a57cb41798702 912 | 2021-12-16T17:22:06+00:00 913 | 0.03 914 | 915 | 916 | https://github.com/identd113/hdhr_VCR-AS/commit/3cd7ac2b3e84f194bf94fcc1de9181c0cf32acb2 917 | 2021-12-16T17:22:06+00:00 918 | 0.03 919 | 920 | 921 | https://github.com/identd113/hdhr_VCR-AS/commit/77f05989aa784392e707c3fe349340ad8cc89dbf 922 | 2021-12-16T17:22:06+00:00 923 | 0.02 924 | 925 | 926 | https://github.com/identd113/hdhr_VCR-AS/commit/910f92cd178ab9819684a8f7f55a0bd0778b5d55 927 | 2021-12-16T17:22:06+00:00 928 | 0.02 929 | 930 | 931 | https://github.com/identd113/hdhr_VCR-AS/commit/1f4c800873679d134073c7bff197ece064cccade 932 | 2021-12-16T17:22:06+00:00 933 | 0.02 934 | 935 | 936 | https://github.com/identd113/hdhr_VCR-AS/commit/29d426d4d2b7d2d9e43feccc66b9df878e5749e6 937 | 2021-12-16T17:22:06+00:00 938 | 0.02 939 | 940 | 941 | https://github.com/identd113/hdhr_VCR-AS/commit/204a31aa9dc3802888d1b71846d235d5942fcd91 942 | 2021-12-16T17:22:06+00:00 943 | 0.01 944 | 945 | 946 | https://github.com/identd113/hdhr_VCR-AS/commit/cedc0a82452e81fdeb9fedbfed0e54f0bb4d75e0 947 | 2021-12-16T17:22:06+00:00 948 | 0.01 949 | 950 | 951 | https://github.com/identd113/hdhr_VCR-AS/commit/2902c54e11c480b8165f66418aad75b59a6c7f24 952 | 2021-12-16T17:22:06+00:00 953 | 0.01 954 | 955 | 956 | https://github.com/identd113/hdhr_VCR-AS/commit/193ba85a11239f5887124e63e560e3f4cbef9191 957 | 2021-12-16T17:22:06+00:00 958 | 0.01 959 | 960 | 961 | https://github.com/identd113/hdhr_VCR-AS/commit/ea9722251439d6c401d08763dafc5129c081f06d 962 | 2021-12-16T17:22:06+00:00 963 | 0.01 964 | 965 | 966 | https://github.com/identd113/hdhr_VCR-AS/commit/48bd863a8dac5fd3ad886130155a74f140cae60a 967 | 2021-12-16T17:22:06+00:00 968 | 0.01 969 | 970 | 971 | https://github.com/identd113/hdhr_VCR-AS/commit/158211a4d3c58ad8ac976baba4417448adfcf561 972 | 2021-12-16T17:22:06+00:00 973 | 0.01 974 | 975 | 976 | https://github.com/identd113/hdhr_VCR-AS/commit/f3f098e95d54ae992c8d5eca97166f495f66b2bb 977 | 2021-12-16T17:22:06+00:00 978 | 0.01 979 | 980 | 981 | https://github.com/identd113/hdhr_VCR-AS/commit/92b809b7e6e121a92e75084bac7ebd25518046a2 982 | 2021-12-16T17:22:06+00:00 983 | 0.01 984 | 985 | 986 | https://github.com/identd113/hdhr_VCR-AS/commit/a5bddc66664ced686814f485892c185157802a77 987 | 2021-12-16T17:22:06+00:00 988 | 0.01 989 | 990 | 991 | https://github.com/identd113/hdhr_VCR-AS/commit/fb5fb9dd6b1250fccec0a0283f99478e084004e0 992 | 2021-12-16T17:22:06+00:00 993 | 0.01 994 | 995 | 996 | https://github.com/identd113/hdhr_VCR-AS/commit/0dcb3f5684aa0efe3ed22c7ec879206245ea2aab 997 | 2021-12-16T17:22:06+00:00 998 | 0.00 999 | 1000 | 1001 | https://github.com/identd113/hdhr_VCR-AS/commit/27a83e196db445f9b2d5ca2383c1161f65baabdc 1002 | 2021-12-16T17:22:06+00:00 1003 | 0.00 1004 | 1005 | 1006 | https://github.com/identd113/hdhr_VCR-AS/issues/18 1007 | 2021-12-16T17:22:06+00:00 1008 | 0.00 1009 | 1010 | 1011 | https://github.com/identd113/hdhr_VCR-AS/commit/91cb1f4be9f2c5fa0839161b53ea57bca41323c8 1012 | 2021-12-16T17:22:06+00:00 1013 | 0.00 1014 | 1015 | 1016 | https://github.com/identd113/hdhr_VCR-AS/commit/e3fcd1df9b01e6c8628d7b94a8ebe3f0dc0f1dc2 1017 | 2021-12-16T17:22:06+00:00 1018 | 0.00 1019 | 1020 | 1021 | https://github.com/identd113/hdhr_VCR-AS/commit/2f82c4434c90067d384b8381efed2f957147fbf8 1022 | 2021-12-16T17:22:06+00:00 1023 | 0.00 1024 | 1025 | 1026 | https://github.com/identd113/hdhr_VCR-AS/commit/dee445d9f143a5db3f18697713a33cd9d4ebc742 1027 | 2021-12-16T17:22:06+00:00 1028 | 0.00 1029 | 1030 | 1031 | https://github.com/identd113/hdhr_VCR-AS/commit/60f23491252d0893fd113686320291ea0fba5511 1032 | 2021-12-16T17:22:06+00:00 1033 | 0.00 1034 | 1035 | 1036 | https://github.com/identd113/hdhr_VCR-AS/commit/cd33d248467951bd109df571245d7ed60f8fb7d0 1037 | 2021-12-16T17:22:06+00:00 1038 | 0.00 1039 | 1040 | 1041 | https://github.com/identd113/hdhr_VCR-AS/commit/9a77f014cc1879a302c8a8897db4fa550b2a9e32 1042 | 2021-12-16T17:22:06+00:00 1043 | 0.00 1044 | 1045 | 1046 | https://github.com/identd113/hdhr_VCR-AS/commit/9c46603e6e0df816743b5ca56f06e72d242061b5 1047 | 2021-12-16T17:22:06+00:00 1048 | 0.00 1049 | 1050 | 1051 | https://github.com/identd113/hdhr_VCR-AS/commit/37e6baa17ad6079b4d3dc6bf1f37c43ff5fb6ef0 1052 | 2021-12-16T17:22:06+00:00 1053 | 0.00 1054 | 1055 | 1056 | https://github.com/identd113/hdhr_VCR-AS/issues/4 1057 | 2021-12-16T17:22:06+00:00 1058 | 0.00 1059 | 1060 | 1061 | https://github.com/identd113/hdhr_VCR-AS/commit/6fbf46c2a9f46264e778a12807820e4652984f44 1062 | 2021-12-16T17:22:06+00:00 1063 | 0.00 1064 | 1065 | 1066 | https://github.com/identd113/hdhr_VCR-AS/commit/90923182da126f1505fb7ab4178a37b3103082a6 1067 | 2021-12-16T17:22:06+00:00 1068 | 0.00 1069 | 1070 | 1071 | https://github.com/identd113/hdhr_VCR-AS/commit/2ff93fd9e4d5d8e8c83d11fb7217fad20808c0ee 1072 | 2021-12-16T17:22:06+00:00 1073 | 0.00 1074 | 1075 | 1076 | https://github.com/identd113/hdhr_VCR-AS/issues/17 1077 | 2021-12-16T17:22:06+00:00 1078 | 0.00 1079 | 1080 | 1081 | https://github.com/identd113/hdhr_VCR-AS/commit/ac377dab21a26ba84146d526e2b26b476c25e6ed 1082 | 2021-12-16T17:22:06+00:00 1083 | 0.00 1084 | 1085 | 1086 | https://github.com/identd113/hdhr_VCR-AS/commit/824e649684acdd708d3c67e7e92ee1570904a801 1087 | 2021-12-16T17:22:06+00:00 1088 | 0.00 1089 | 1090 | 1091 | https://github.com/identd113/hdhr_VCR-AS/issues/15 1092 | 2021-12-16T17:22:06+00:00 1093 | 0.00 1094 | 1095 | 1096 | https://github.com/identd113/hdhr_VCR-AS/commit/9c32dbf9273fc4a2734e87f2bce2d80d803aa545 1097 | 2021-12-16T17:22:06+00:00 1098 | 0.00 1099 | 1100 | 1101 | https://github.com/identd113/hdhr_VCR-AS/issues/14 1102 | 2021-12-16T17:22:06+00:00 1103 | 0.00 1104 | 1105 | 1106 | https://github.com/identd113/hdhr_VCR-AS/commit/b9addf48d6895a412a13b1d024e1c07bf51d9186 1107 | 2021-12-16T17:22:06+00:00 1108 | 0.00 1109 | 1110 | 1111 | https://github.com/identd113/hdhr_VCR-AS/commit/3f443450c5be15841848a333dc180ef8adec5f34 1112 | 2021-12-16T17:22:06+00:00 1113 | 0.00 1114 | 1115 | 1116 | https://github.com/identd113/hdhr_VCR-AS/issues/12 1117 | 2021-12-16T17:22:06+00:00 1118 | 0.00 1119 | 1120 | 1121 | https://github.com/identd113/hdhr_VCR-AS/commit/39107c76540516d7ff94186a7b8afc1f4a0828c1 1122 | 2021-12-16T17:22:06+00:00 1123 | 0.00 1124 | 1125 | 1126 | https://github.com/identd113/hdhr_VCR-AS/commit/07edb17fe025fe0fab68b324e2a6d85eec2eb275 1127 | 2021-12-16T17:22:06+00:00 1128 | 0.00 1129 | 1130 | 1131 | https://github.com/identd113/hdhr_VCR-AS/commit/7d1ba068c28725a2fb541136fbfe6d886052606b 1132 | 2021-12-16T17:22:06+00:00 1133 | 0.00 1134 | 1135 | 1136 | https://github.com/identd113/hdhr_VCR-AS/commit/c72a1721771f719b6805438dc636474232f8398b 1137 | 2021-12-16T17:22:06+00:00 1138 | 0.00 1139 | 1140 | 1141 | https://github.com/identd113/hdhr_VCR-AS/commit/df44ab8908219ce6100b233d7acd8583cdc1ee3e 1142 | 2021-12-16T17:22:06+00:00 1143 | 0.00 1144 | 1145 | 1146 | https://github.com/identd113/hdhr_VCR-AS/commit/cf2f298e9cd2c7776e3298617fa5544d36bf5171 1147 | 2021-12-16T17:22:06+00:00 1148 | 0.00 1149 | 1150 | 1151 | https://github.com/identd113/hdhr_VCR-AS/commit/efb87ad23efed1a27b450bc48ed3354005252fbf 1152 | 2021-12-16T17:22:06+00:00 1153 | 0.00 1154 | 1155 | 1156 | https://github.com/identd113/hdhr_VCR-AS/commit/409b03d6cdc15b663e1c6785f5c558292796d68d 1157 | 2021-12-16T17:22:06+00:00 1158 | 0.00 1159 | 1160 | 1161 | https://github.com/identd113/hdhr_VCR-AS/commit/26e2de3608fc2ea42103ea51009acaf66c75f827 1162 | 2021-12-16T17:22:06+00:00 1163 | 0.00 1164 | 1165 | 1166 | https://github.com/identd113/hdhr_VCR-AS/commit/4f650afe11f1424d7c660c196b05b4b33b0b952b 1167 | 2021-12-16T17:22:06+00:00 1168 | 0.00 1169 | 1170 | 1171 | https://github.com/identd113/hdhr_VCR-AS/commit/d47099862e405be2ef21d34d30d1f46bdd4abd11 1172 | 2021-12-16T17:22:06+00:00 1173 | 0.00 1174 | 1175 | 1176 | https://github.com/identd113/hdhr_VCR-AS/commit/b26d23b883ce54d804495b140fe31ea8c1954b1a 1177 | 2021-12-16T17:22:06+00:00 1178 | 0.00 1179 | 1180 | 1181 | https://github.com/identd113/hdhr_VCR-AS/commit/4938ae089d44c60cf0d5e5d2562c7f2a35819df2 1182 | 2021-12-16T17:22:06+00:00 1183 | 0.00 1184 | 1185 | 1186 | https://github.com/identd113/hdhr_VCR-AS/commit/dedd109c5d6894d922713d7afe399847e32b50bb 1187 | 2021-12-16T17:22:06+00:00 1188 | 0.00 1189 | 1190 | 1191 | https://github.com/identd113/hdhr_VCR-AS/commit/497d2329167a32fcce2b95b82278792a92883418 1192 | 2021-12-16T17:22:06+00:00 1193 | 0.00 1194 | 1195 | 1196 | https://github.com/identd113/hdhr_VCR-AS/issues/7 1197 | 2021-12-16T17:22:06+00:00 1198 | 0.00 1199 | 1200 | 1201 | https://github.com/identd113/hdhr_VCR-AS/commit/74900ca0bef105f1aa0906f73e07e952c89fb450 1202 | 2021-12-16T17:22:06+00:00 1203 | 0.00 1204 | 1205 | 1206 | https://github.com/identd113/hdhr_VCR-AS/issues/8 1207 | 2021-12-16T17:22:06+00:00 1208 | 0.00 1209 | 1210 | 1211 | https://github.com/identd113/hdhr_VCR-AS/commit/adea2a8e8b52a7145090f85c40df4b6976a78b44 1212 | 2021-12-16T17:22:06+00:00 1213 | 0.00 1214 | 1215 | 1216 | https://github.com/identd113/hdhr_VCR-AS/commit/cfcf715fd2ea5dd4e56ae468a0f13a229973f68a 1217 | 2021-12-16T17:22:06+00:00 1218 | 0.00 1219 | 1220 | 1221 | https://github.com/identd113/hdhr_VCR-AS/commit/4a7db8dd635cb322ceb9a7f2784b1786af2eb32e 1222 | 2021-12-16T17:22:06+00:00 1223 | 0.00 1224 | 1225 | 1226 | https://github.com/identd113/hdhr_VCR-AS/issues/5 1227 | 2021-12-16T17:22:06+00:00 1228 | 0.00 1229 | 1230 | 1231 | https://github.com/identd113/hdhr_VCR-AS/commit/1bccf945f9f80d1b3e42ecdcb10fbc29eb0f14cd 1232 | 2021-12-16T17:22:06+00:00 1233 | 0.00 1234 | 1235 | 1236 | https://github.com/identd113/hdhr_VCR-AS/issues/6 1237 | 2021-12-16T17:22:06+00:00 1238 | 0.00 1239 | 1240 | 1241 | https://github.com/identd113/hdhr_VCR-AS/commit/07ba1671c905b88333d9473e98d6e82ff9d3acac 1242 | 2021-12-16T17:22:06+00:00 1243 | 0.00 1244 | 1245 | 1246 | https://github.com/identd113/hdhr_VCR-AS/issues/1 1247 | 2021-12-16T17:22:06+00:00 1248 | 0.00 1249 | 1250 | 1251 | https://github.com/identd113/hdhr_VCR-AS/commit/9e8bb768aa8d83547f6a7a87c32a49f077c0da33 1252 | 2021-12-16T17:22:06+00:00 1253 | 0.00 1254 | 1255 | 1256 | https://github.com/identd113/hdhr_VCR-AS/issues/3 1257 | 2021-12-16T17:22:06+00:00 1258 | 0.00 1259 | 1260 | 1261 | https://github.com/identd113/hdhr_VCR-AS/commit/7a41deeb58bfd33a94c67f5921f0df5c9d9723a2 1262 | 2021-12-16T17:22:06+00:00 1263 | 0.00 1264 | 1265 | 1266 | https://github.com/identd113/hdhr_VCR-AS/commit/ce98dfe6b19e298c4a01008e730a5bc30cba44ce 1267 | 2021-12-16T17:22:06+00:00 1268 | 0.00 1269 | 1270 | 1271 | 1272 | --------------------------------------------------------------------------------