19 Commits

Author SHA1 Message Date
Gitea Actions
4e280796b9 Update manifest version to 3.1.2 [▶️] 2026-01-09 14:51:04 +00:00
a54f52b04e Update README.md
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m50s
2026-01-09 14:46:04 +00:00
Gitea Actions
40fe720d3f Update manifest version to 3.1.1 [▶️] 2026-01-09 14:42:53 +00:00
65639a2f04 Update public/index.html
Some checks failed
Build, Push, Publish / Build & Release (push) Has been cancelled
2026-01-09 14:42:41 +00:00
Gitea Actions
f74d9038b7 Sync README from template [▶️] 2026-01-01 04:01:51 +00:00
Gitea Actions
14acaf3c62 Sync README from template [▶️] 2025-12-28 04:02:51 +00:00
Gitea Actions
d475f88ab9 Update manifest version to 3.1.0 [▶️] 2025-12-22 05:32:22 +00:00
465c0c11e9 fix release build, add readme update for some repo
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m6s
2025-12-22 01:43:50 -03:00
Gitea Actions
cf860814c5 Sync README from template [▶️] 2025-12-22 04:02:04 +00:00
Gitea Actions
633ce7c550 Update manifest version to 3.0.5 [▶️] 2025-12-22 03:00:21 +00:00
e458f278b1 Merge branch 'main' of https://git.icc.gg/ivancarlos/devicetester
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m9s
2025-12-21 23:33:49 -03:00
efb940fc8c update actions 2025-12-21 23:33:45 -03:00
Gitea Actions
053427d46d Update manifest version to 3.0.4 [▶️] 2025-12-14 03:47:51 +00:00
8094287f97 remove Pro title
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 10m3s
2025-12-14 03:47:39 +00:00
Gitea Actions
1b99769918 Update manifest version to 3.0.3 [▶️] 2025-12-13 19:47:03 +00:00
bd39dd2b3f Update public/index.html
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 9m58s
2025-12-13 19:46:51 +00:00
Gitea Actions
45fb07bc8b Update manifest version to 3.0.2 [▶️] 2025-12-13 19:28:02 +00:00
5cea0866ae Merge branch 'main' of https://git.icc.gg/ivancarlos/devicetester
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 9m56s
2025-12-13 16:27:45 -03:00
cb87f1908e improvements
Add language selector, flags, add footer with links, fix battery detection text
2025-12-13 16:27:36 -03:00
5 changed files with 151 additions and 57 deletions

View File

@@ -5,9 +5,6 @@ on:
branches: branches:
- main - main
workflow_dispatch: workflow_dispatch:
schedule:
- cron: '28 5 * * *'
# workflow_run support in Gitea can be tricky, keeping it but might need adjustment
workflow_run: workflow_run:
workflows: ["Sync Repo"] workflows: ["Sync Repo"]
types: types:
@@ -265,6 +262,11 @@ jobs:
git commit -m "Update manifest version to ${{ steps.version.outputs.VERSION }} [▶️]" || echo "Nothing to commit" git commit -m "Update manifest version to ${{ steps.version.outputs.VERSION }} [▶️]" || echo "Nothing to commit"
git push origin main git push origin main
- name: 🛠 Install zip
if: steps.check_commits.outputs.commit_count != '0'
run: |
apt-get update && apt-get install -y zip
- name: 📦 Create ZIP package (excluding certain files) - name: 📦 Create ZIP package (excluding certain files)
if: steps.check_commits.outputs.commit_count != '0' if: steps.check_commits.outputs.commit_count != '0'
run: | run: |
@@ -319,11 +321,10 @@ jobs:
ZIP_NAME="${{ steps.version.outputs.ZIP_NAME }}" ZIP_NAME="${{ steps.version.outputs.ZIP_NAME }}"
FILE_PATH="./$ZIP_NAME" FILE_PATH="./$ZIP_NAME"
curl -s -X POST "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/$RELEASE_ID/assets" \ curl --fail -s -X POST "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/$RELEASE_ID/assets?name=$ZIP_NAME" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Content-Type: application/zip" \ -H "Content-Type: application/zip" \
--data-binary @"$FILE_PATH" \ --data-binary @"$FILE_PATH"
-o /dev/null
# ----- Docker steps ----- # ----- Docker steps -----
- name: Clone Upstream Code (if needed) - name: Clone Upstream Code (if needed)

View File

@@ -0,0 +1,59 @@
name: Update README
permissions:
contents: write
on:
workflow_dispatch:
schedule:
- cron: "0 4 * * *" # Every day at 4 AM UTC
jobs:
update-readme:
runs-on: ubuntu-latest
container:
image: catthehacker/ubuntu:act-latest
env:
SOURCE_REPO: ivancarlos/.gitea
SOURCE_BRANCH: main
steps:
- name: Checkout current repository
uses: actions/checkout@v4
- name: Checkout source README template
uses: actions/checkout@v4
with:
repository: ${{ env.SOURCE_REPO }}
ref: ${{ env.SOURCE_BRANCH }}
token: ${{ secrets.CR_PAT }}
path: source_readme
- name: Update README.md (footer only)
run: |
set -e
# --- Extract footer block from source (everything from <!-- footer --> onward) ---
FOOTER=$(awk '/<!-- footer -->/{flag=1}flag' source_readme/README.md)
# --- Replace everything after <!-- footer --> with FOOTER ---
awk -v footer="$FOOTER" '
/<!-- footer -->/ {
print footer
found=1
exit
}
{ print }
' README.md > README.tmp && mv README.tmp README.md
- name: Remove source_readme from git index
run: rm -rf source_readme
- name: Commit and push changes
run: |
git config user.name "Gitea Actions"
git config user.email "actions@git.icc.gg"
git add README.md
git commit -m "Sync README from template [▶️]" || echo "Nothing to commit"
git push origin ${{ github.ref_name }}

View File

@@ -1,24 +1,25 @@
# Device Tester # Device Tester
A simple and useful webcam, microphone and audio output tester. A simple and useful webcam, microphone and audio output tester.
<!-- buttons -->
[![Stars](https://img.shields.io/github/stars/ivancarlosti/devicetester?label=⭐%20Stars&color=gold&style=flat)](https://github.com/ivancarlosti/devicetester/stargazers)
[![Watchers](https://img.shields.io/github/watchers/ivancarlosti/devicetester?label=Watchers&style=flat&color=red)](https://github.com/sponsors/ivancarlosti)
[![Forks](https://img.shields.io/github/forks/ivancarlosti/devicetester?label=Forks&style=flat&color=ff69b4)](https://github.com/sponsors/ivancarlosti)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/ivancarlosti/devicetester?label=Activity)](https://github.com/ivancarlosti/devicetester/pulse)
[![GitHub Issues](https://img.shields.io/github/issues/ivancarlosti/devicetester?label=Issues&color=orange)](https://github.com/ivancarlosti/devicetester/issues)
[![License](https://img.shields.io/github/license/ivancarlosti/devicetester?label=License)](LICENSE)
[![GitHub last commit](https://img.shields.io/github/last-commit/ivancarlosti/devicetester?label=Last%20Commit)](https://github.com/ivancarlosti/devicetester/commits)
[![Security](https://img.shields.io/badge/Security-View%20Here-purple)](https://github.com/ivancarlosti/devicetester/security)
[![Code of Conduct](https://img.shields.io/badge/Code%20of%20Conduct-2.1-4baaaa)](https://github.com/ivancarlosti/devicetester?tab=coc-ov-file)
[![GitHub Sponsors](https://img.shields.io/github/sponsors/ivancarlosti?label=GitHub%20Sponsors&color=ffc0cb)][sponsor]
<!-- endbuttons -->
## Notes ## Notes
1. Project inspired in multiple device complex testers across the web. 1. Project inspired in multiple device complex testers across the web.
2. The music used on test is royalty free and generated by AI. 2. The music used on test is royalty free and generated by AI.
3. The page was co-created by AI. 3. The page was co-created by AI.
## Docker Compose suggestion
```
name: devicetester
services:
devicetester:
image: git.icc.gg/ivancarlos/devicetester:latest
container_name: devicetester
restart: unless-stopped
ports:
- "3987:80"
```
<!-- footer --> <!-- footer -->
--- ---
@@ -29,17 +30,9 @@ A simple and useful webcam, microphone and audio output tester.
## 🩷 Project support ## 🩷 Project support
| If you found this project helpful, consider | | If you found this project helpful, consider |
| :---: | | :---: |
[**buying me a coffee**][buymeacoffee], [**donate by paypal**][paypal], [**sponsor this project**][sponsor] or just [**leave a star**](../..)⭐ [**buying me a coffee**][buymeacoffee] or [**supporting me on Patreon**][patreon]
|Thanks for your support, it is much appreciated!| |Thanks for your support, it is much appreciated!|
[cc]: https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/adding-a-code-of-conduct-to-your-project [ivancarlos]: https://ivancarlos.me
[contributing]: https://docs.github.com/en/articles/setting-guidelines-for-repository-contributors
[security]: https://docs.github.com/en/code-security/getting-started/adding-a-security-policy-to-your-repository
[support]: https://docs.github.com/en/articles/adding-support-resources-to-your-project
[it]: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser
[prt]: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository
[funding]: https://docs.github.com/en/articles/displaying-a-sponsor-button-in-your-repository
[ivancarlos]: https://ivancarlos.it
[buymeacoffee]: https://www.buymeacoffee.com/ivancarlos [buymeacoffee]: https://www.buymeacoffee.com/ivancarlos
[paypal]: https://icc.gg/donate [patreon]: https://patreon.com/ivancarlos
[sponsor]: https://github.com/sponsors/ivancarlosti

View File

@@ -1,4 +1,4 @@
{ {
"version": "3.0.1", "version": "3.1.2",
"author": "Ivan Carlos" "author": "Ivan Carlos"
} }

View File

@@ -1,9 +1,10 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<title>Device Tester Pro</title> <title>Device Tester</title>
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
@@ -51,6 +52,14 @@
margin-bottom: 30px; margin-bottom: 30px;
} }
#ipv4, #ipv6 {
word-break: break-all;
overflow-wrap: anywhere;
display: inline-block;
max-width: 100%;
vertical-align: top;
}
/* Shared styles for header buttons */ /* Shared styles for header buttons */
.theme-toggle, .theme-toggle,
.icon-btn { .icon-btn {
@@ -124,11 +133,6 @@
border-radius: 12px; border-radius: 12px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
border: 1px solid var(--border-color); border: 1px solid var(--border-color);
transition: transform 0.2s;
}
.test-card:hover {
transform: translateY(-2px);
} }
h2 { h2 {
@@ -244,6 +248,27 @@
pointer-events: none; pointer-events: none;
text-align: center; text-align: center;
} }
footer {
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid var(--border-color);
text-align: center;
font-size: 0.9rem;
color: var(--text-color);
opacity: 0.8;
}
footer a {
color: var(--text-color);
text-decoration: none;
transition: color 0.2s;
}
footer a:hover {
color: var(--primary);
text-decoration: underline;
}
</style> </style>
</head> </head>
@@ -252,11 +277,14 @@
<div class="container"> <div class="container">
<header> <header>
<div class="header-top"> <div class="header-top">
<h1 data-i18n="app_title">Device Tester Pro</h1> <h1 data-i18n="app_title">Device Tester</h1>
<div class="header-controls"> <div class="header-controls">
<button class="icon-btn" onclick="changeLanguage('en')" id="btn-en" aria-label="English">🇺🇸</button> <button class="icon-btn" onclick="changeLanguage('en')" id="btn-en" aria-label="English"><img
<button class="icon-btn" onclick="changeLanguage('pt')" id="btn-pt" aria-label="Português">🇧🇷</button> src="https://flagcdn.com/24x18/us.png" alt="US" width="24" height="18"></button>
<button class="icon-btn" onclick="changeLanguage('es')" id="btn-es" aria-label="Español">🇲🇽</button> <button class="icon-btn" onclick="changeLanguage('pt')" id="btn-pt" aria-label="Português"><img
src="https://flagcdn.com/24x18/br.png" alt="BR" width="24" height="18"></button>
<button class="icon-btn" onclick="changeLanguage('es')" id="btn-es" aria-label="Español"><img
src="https://flagcdn.com/24x18/mx.png" alt="MX" width="24" height="18"></button>
<div style="width: 1px; height: 24px; background: var(--border-color); margin: 0 4px;"></div> <div style="width: 1px; height: 24px; background: var(--border-color); margin: 0 4px;"></div>
<button class="theme-toggle" onclick="toggleTheme()" data-i18n="theme_toggle">🌓 Theme</button> <button class="theme-toggle" onclick="toggleTheme()" data-i18n="theme_toggle">🌓 Theme</button>
</div> </div>
@@ -277,7 +305,7 @@
<!-- Battery --> <!-- Battery -->
<div class="test-card"> <div class="test-card">
<h2 data-i18n="battery_title">🔋 Battery</h2> <h2 data-i18n="battery_title">🔋 Battery</h2>
<p id="battery-status" data-i18n="detecting">Detecting...</p> <p id="battery-status">Detecting...</p>
<div class="bar-container"> <div class="bar-container">
<div id="battery-bar" class="bar-fill" style="background-color: var(--primary);"></div> <div id="battery-bar" class="bar-fill" style="background-color: var(--primary);"></div>
</div> </div>
@@ -339,6 +367,13 @@
</div> </div>
</div> </div>
<footer>
<p>
<a href="https://icc.gg/privacidade" target="_blank" data-i18n="privacy_policy">Privacy Policy</a>
<a href="https://icc.gg/termos" target="_blank" data-i18n="terms_conditions">Terms and Conditions</a>
</p>
</footer>
</div> </div>
<!-- Overlay para teste de tela --> <!-- Overlay para teste de tela -->
@@ -350,7 +385,7 @@
// i18n Dictionary // i18n Dictionary
const dictionary = { const dictionary = {
en: { en: {
app_title: "Device Tester Pro", app_title: "Device Tester",
theme_toggle: "🌓 Theme", theme_toggle: "🌓 Theme",
network_title: "📡 Network & Browser", network_title: "📡 Network & Browser",
user_agent_label: "User Agent:", user_agent_label: "User Agent:",
@@ -386,7 +421,9 @@
device_unknown: "Unknown Device", device_unknown: "Unknown Device",
default_output: "Default Output", default_output: "Default Output",
ipv4_unavailable: "Unavailable", ipv4_unavailable: "Unavailable",
ipv6_not_detected: "Not detected" ipv6_not_detected: "Not detected",
privacy_policy: "Privacy Policy",
terms_conditions: "Terms and Conditions"
}, },
pt: { pt: {
app_title: "Teste de Dispositivos", app_title: "Teste de Dispositivos",
@@ -425,7 +462,9 @@
device_unknown: "Dispositivo não identificado", device_unknown: "Dispositivo não identificado",
default_output: "Saída Padrão", default_output: "Saída Padrão",
ipv4_unavailable: "Indisponível", ipv4_unavailable: "Indisponível",
ipv6_not_detected: "Não detectado" ipv6_not_detected: "Não detectado",
privacy_policy: "Política de Privacidade",
terms_conditions: "Termos e Condições"
}, },
es: { es: {
app_title: "Prueba de Dispositivos", app_title: "Prueba de Dispositivos",
@@ -464,7 +503,9 @@
device_unknown: "Dispositivo desconocido", device_unknown: "Dispositivo desconocido",
default_output: "Salida Predeterminada", default_output: "Salida Predeterminada",
ipv4_unavailable: "No disponible", ipv4_unavailable: "No disponible",
ipv6_not_detected: "No detectado" ipv6_not_detected: "No detectado",
privacy_policy: "Política de Privacidad",
terms_conditions: "Términos y Condiciones"
} }
}; };