Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b75965ffa2
|
||
|
|
9113ed8ab1
|
||
|
|
b1a86e2d19
|
||
|
|
f1b4bc3cb2
|
No files matched your search
@@ -1,94 +0,0 @@
|
||||
const fs = require('fs');
|
||||
|
||||
async function main() {
|
||||
const token = process.env.GITEA_TOKEN;
|
||||
const url = process.env.GITEA_URL || 'http://gitea:3000';
|
||||
const repo = process.env.REPO;
|
||||
const tag = process.env.TAG;
|
||||
const filePath = 'dist/gq-to-org-redirector.zip';
|
||||
const fileName = 'gq-to-org-redirector.zip';
|
||||
|
||||
if (!token || !repo || !tag) {
|
||||
throw new Error(`Missing required env vars: GITEA_TOKEN, REPO, TAG`);
|
||||
}
|
||||
|
||||
if (!fs.existsSync(filePath)) {
|
||||
throw new Error(`File not found: ${filePath}`);
|
||||
}
|
||||
|
||||
const apiBase = `${url}/api/v1/repos/${repo}`;
|
||||
const headers = {
|
||||
'Authorization': `token ${token}`,
|
||||
'Content-Type': 'application/json'
|
||||
};
|
||||
|
||||
console.log(`Checking release for tag ${tag} at ${apiBase}...`);
|
||||
|
||||
// 1. Get or create release
|
||||
let release;
|
||||
const getRes = await fetch(`${apiBase}/releases/tags/${encodeURIComponent(tag)}`, { headers });
|
||||
if (getRes.ok) {
|
||||
release = await getRes.json();
|
||||
console.log(`Found existing release: ID ${release.id}`);
|
||||
} else {
|
||||
console.log(`Release not found. Creating release for tag ${tag}...`);
|
||||
const createRes = await fetch(`${apiBase}/releases`, {
|
||||
method: 'POST',
|
||||
headers,
|
||||
body: JSON.stringify({
|
||||
tag_name: tag,
|
||||
name: `Release ${tag}`,
|
||||
body: `Automated release of ${fileName} for ${tag}`,
|
||||
draft: false,
|
||||
prerelease: false
|
||||
})
|
||||
});
|
||||
if (!createRes.ok) {
|
||||
throw new Error(`Failed to create release: ${createRes.status} ${await createRes.text()}`);
|
||||
}
|
||||
release = await createRes.json();
|
||||
console.log(`Created release: ID ${release.id}`);
|
||||
}
|
||||
|
||||
// 2. Remove existing asset with same name if already uploaded
|
||||
const assetsRes = await fetch(`${apiBase}/releases/${release.id}/assets`, { headers });
|
||||
if (assetsRes.ok) {
|
||||
const assets = await assetsRes.json();
|
||||
for (const asset of assets) {
|
||||
if (asset.name === fileName) {
|
||||
console.log(`Deleting existing asset: ${asset.name} (ID: ${asset.id})`);
|
||||
await fetch(`${apiBase}/releases/${release.id}/assets/${asset.id}`, {
|
||||
method: 'DELETE',
|
||||
headers
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Upload new asset
|
||||
console.log(`Uploading ${fileName} (${fs.statSync(filePath).size} bytes)...`);
|
||||
const fileBuffer = fs.readFileSync(filePath);
|
||||
const blob = new Blob([fileBuffer], { type: 'application/zip' });
|
||||
const formData = new FormData();
|
||||
formData.append('attachment', blob, fileName);
|
||||
|
||||
const uploadRes = await fetch(`${apiBase}/releases/${release.id}/assets?name=${encodeURIComponent(fileName)}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': `token ${token}`
|
||||
},
|
||||
body: formData
|
||||
});
|
||||
|
||||
if (!uploadRes.ok) {
|
||||
throw new Error(`Failed to upload asset: ${uploadRes.status} ${await uploadRes.text()}`);
|
||||
}
|
||||
|
||||
const uploaded = await uploadRes.json();
|
||||
console.log(`Release published successfully! Asset: ${uploaded.name} (Download URL: ${uploaded.browser_download_url})`);
|
||||
}
|
||||
|
||||
main().catch(err => {
|
||||
console.error('Error during release publication:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
+18
-10
@@ -15,22 +15,30 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Package Extension
|
||||
env:
|
||||
CRX_KEY: ${{ secrets.CRX_PRIVATE_KEY }}
|
||||
run: |
|
||||
which zip >/dev/null 2>&1 || (apt-get update && apt-get install -y zip)
|
||||
mkdir -p dist
|
||||
zip -r dist/gq-to-org-redirector.zip manifest.json rules.json README.md
|
||||
if [ -n "$CRX_KEY" ]; then
|
||||
printf "%s\n" "$CRX_KEY" > /tmp/key.pem
|
||||
npx -y crx3 -p /tmp/key.pem -o dist/gq-to-org-redirector.crx -z dist/gq-to-org-redirector.zip manifest.json rules.json
|
||||
rm -f /tmp/key.pem
|
||||
else
|
||||
echo "::warning::CRX_PRIVATE_KEY secret is not set, generating ephemeral key"
|
||||
npx -y crx3 -o dist/gq-to-org-redirector.crx -z dist/gq-to-org-redirector.zip manifest.json rules.json
|
||||
fi
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: gq-to-org-redirector
|
||||
path: dist/gq-to-org-redirector.zip
|
||||
path: dist/
|
||||
|
||||
- name: Publish to Gitea Releases
|
||||
- name: Publish Release
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GITEA_URL: http://gitea:3000
|
||||
REPO: ${{ github.repository }}
|
||||
TAG: ${{ github.ref_name }}
|
||||
run: node .gitea/release.js
|
||||
uses: akkuman/gitea-release-action@v1
|
||||
with:
|
||||
files: |
|
||||
dist/gq-to-org-redirector.crx
|
||||
dist/gq-to-org-redirector.zip
|
||||
name: Release ${{ github.ref_name }}
|
||||
@@ -0,0 +1,4 @@
|
||||
*.pem
|
||||
*.crx
|
||||
dist/
|
||||
node_modules/
|
||||
@@ -1,13 +1,34 @@
|
||||
# GQ to ORG Redirector
|
||||
|
||||
Простое и ультралегкое расширение для Google Chrome (Manifest V3), которое автоматически перенаправляет запросы с доменов `.gq` на соответствующие `.org` (например, `rutracker.gq` -> `rutracker.org`).
|
||||
Простое и ультралегкое расширение для Google Chrome и Chromium-браузеров (Manifest V3), которое автоматически перенаправляет запросы с доменов `.gq` на соответствующие `.org` (например, `rutracker.gq` -> `rutracker.org`).
|
||||
|
||||
## Особенности
|
||||
- **Работает до обращения к сети:** перехват происходит на уровне движка Chromium (`declarativeNetRequest`), поэтому не возникает проблем с DNS, HSTS или отсутствующими SSL-сертификатами.
|
||||
- **Сохраняет структуру ссылок:** сохраняет все пути и GET-параметры запроса (`?t=...`).
|
||||
- **0 МБ оперативной памяти:** не использует фоновые сервисы (`service_worker`).
|
||||
|
||||
## Установка в Google Chrome
|
||||
1. Откройте `chrome://extensions/`.
|
||||
2. Включите **«Режим разработчика»** (Developer mode) в правом верхнем углу.
|
||||
3. Нажмите **«Загрузить распакованное»** (Load unpacked) и выберите папку с этим расширением.
|
||||
## Установка готового расширения из Релизов
|
||||
|
||||
Перейдите в [Релизы репозитория](https://git.them4x.net/m4xx1m/gq-to-org-redirector/releases). Доступно два варианта:
|
||||
|
||||
### Вариант 1: Пакет `.crx` (Рекомендуется)
|
||||
1. Скачайте `gq-to-org-redirector.crx` из последнего релиза.
|
||||
2. Откройте в браузере `chrome://extensions/` и включите **«Режим разработчика»** (Developer mode) в правом верхнем углу.
|
||||
3. Перетащите (drag-and-drop) скачанный файл `gq-to-org-redirector.crx` на страницу `chrome://extensions/`.
|
||||
4. Нажмите **«Установить расширение»** (Add extension).
|
||||
5. Если в разделе Safety Check появится предупреждение о неизвестном источнике, в выпадающем меню выберите **«Оставить это расширение»** (Keep this extension).
|
||||
|
||||
### Вариант 2: Распакованный архив `.zip`
|
||||
1. Скачайте архив `gq-to-org-redirector.zip` и распакуйте в постоянную папку.
|
||||
2. В `chrome://extensions/` (с включенным «Режимом разработчика») нажмите **«Загрузить распакованное»** (Load unpacked) и выберите папку.
|
||||
|
||||
### Настройка инкогнито (Опционально)
|
||||
Если вы открываете ссылки в приватных окнах: нажмите **«Сведения»** на карточке расширения и включите тумблер **«Разрешить использование в режиме инкогнито»**.
|
||||
|
||||
## Установка из исходного кода (для разработки)
|
||||
|
||||
1. Клонируйте репозиторий:
|
||||
```bash
|
||||
git clone git@git.them4x.net:m4xx1m/gq-to-org-redirector.git
|
||||
```
|
||||
2. Откройте `chrome://extensions/`, включите «Режим разработчика», нажмите «Загрузить распакованное» и выберите папку репозитория.
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"manifest_version": 3,
|
||||
"name": "GQ to ORG Redirector",
|
||||
"version": "1.0",
|
||||
"version": "1.0.3",
|
||||
"description": "Мгновенно перенаправляет запросы с .gq на .org до отправки в сеть",
|
||||
"permissions": [
|
||||
"declarativeNetRequest"
|
||||
|
||||
Reference in new issue
Block a user