{"id":51035265,"url":"https://github.com/nonecode4u/kishor-publisher","last_synced_at":"2026-06-22T05:01:59.865Z","repository":{"id":359536719,"uuid":"1203482309","full_name":"nOneCode4u/kishor-publisher","owner":"nOneCode4u","description":"Automated Telegram channel uploader for Kishor Marathi monthly magazine. Detects new issues on ebalbharati.in and publishes them.","archived":false,"fork":false,"pushed_at":"2026-06-20T15:00:27.000Z","size":66,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T17:03:32.895Z","etag":null,"topics":["automation","cron-job","github-actions","kishor","magazine","marathi","pdf","pyrogram","python","scheduled-uploads","telegram","telegram-bot"],"latest_commit_sha":null,"homepage":"https://t.me/KishorMarathiMonthlyMagazine","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nOneCode4u.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"none123","buy_me_a_coffee":null}},"created_at":"2026-04-07T04:39:02.000Z","updated_at":"2026-06-20T15:00:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/nOneCode4u/kishor-publisher","commit_stats":null,"previous_names":["nonecode4u/kishor-publisher"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/nOneCode4u/kishor-publisher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nOneCode4u%2Fkishor-publisher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nOneCode4u%2Fkishor-publisher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nOneCode4u%2Fkishor-publisher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nOneCode4u%2Fkishor-publisher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nOneCode4u","download_url":"https://codeload.github.com/nOneCode4u/kishor-publisher/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nOneCode4u%2Fkishor-publisher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34635038,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","cron-job","github-actions","kishor","magazine","marathi","pdf","pyrogram","python","scheduled-uploads","telegram","telegram-bot"],"created_at":"2026-06-22T05:01:58.708Z","updated_at":"2026-06-22T05:01:59.855Z","avatar_url":"https://github.com/nOneCode4u.png","language":"Python","funding_links":["https://ko-fi.com/none123"],"categories":[],"sub_categories":[],"readme":"# Kishor Publisher\n\nAutomated Telegram channel uploader for [Kishor monthly magazine](https://kishor.ebalbharati.in/Archives/).\n\nDetects new issues, schedules uploads with 1-hour gaps, and publishes each as a properly named PDF to your Telegram channel — with Marathi+English filename, caption, and cover thumbnail.\n\n---\n\n## How It Works\n\n| Workflow       | What it does                                                                                                                                   |\n| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |\n| `checker.yml`  | Runs once daily. Scans the website for new issues. If found, builds the upload queue and creates scheduled upload jobs. Silent if nothing new. |\n| `uploader.yml` | Uploads one queued file per run. Triggered automatically at the scheduled time. No cron — zero runs when queue is empty.                       |\n| `bot.yml`      | Polls Telegram for owner commands.                                                                                                             |\n\n**Upload schedule:** Files found on day D → first upload at 00:00 IST on day D+1, one file per hour.\n\u003e To change run times, edit the `cron:` lines in `.github/workflows/checker.yml` and `.github/workflows/bot.yml`.\n\n---\n\n## Repository Structure\n\n```\nkishor-publisher/\n├── .github/workflows/\n│   ├── checker.yml          # Daily detection + queue building\n│   ├── uploader.yml         # Per-file upload (dispatch-only, no cron)\n│   └── bot.yml              # Telegram command polling\n├── scripts/\n│   ├── checker.py           # Website scanner + dynamic job scheduler\n│   ├── uploader.py          # Download + upload + cleanup\n│   ├── bot.py               # Command handler + smart /resume\n│   └── utils/\n│       ├── naming.py        # Marathi/English filename builder\n│       ├── state.py         # State I/O + IST helpers + git\n│       ├── notifications.py # All Telegram message templates\n│       ├── thumbnail.py     # PDF → JPEG thumbnail (quality=100)\n│       ├── telegram_client.py  # Pyrogram MTProto uploader (up to 2 GB)\n│       ├── github_api.py    # GitHub REST API + workflow dispatch\n│       └── cronjob_api.py   # cron-job.org REST API (create/delete jobs)\n├── state/\n│   ├── last_uploaded.txt    # Last successfully uploaded filename\n│   ├── pending_queue.json   # Upload queue with scheduled times\n│   ├── uploader_status.txt  # active / paused\n│   ├── upload_history.md    # Full upload log (auto-appended)\n│   └── bot_offset.txt       # Telegram update offset (auto-managed)\n└── requirements.txt\n```\n\n---\n\n## Requirements\n\n**GitHub Secrets** (repo → Settings → Secrets and variables → Actions):\n\n| Secret                   | Description                                        |\n| ------------------------ | -------------------------------------------------- |\n| `TELEGRAM_API_ID`        | From \u003chttps://my.telegram.org/apps\u003e                |\n| `TELEGRAM_API_HASH`      | From \u003chttps://my.telegram.org/apps\u003e                |\n| `TELEGRAM_BOT_TOKEN`     | From @BotFather                                    |\n| `TELEGRAM_OWNER_CHAT_ID` | Your personal Telegram chat ID                     |\n| `TELEGRAM_CHANNEL_ID`    | Your channel's numeric ID                          |\n| `GH_PAT`                 | GitHub Personal Access Token (Actions: read+write) |\n| `CRON_JOB_ORG_API_KEY`   | API key from cron-job.org (free account)           |\n\n**External service:** One job on [cron-job.org](https://cron-job.org) (free) to trigger the bot workflow every minute.\n\n---\n\n## Bot Commands\n\n| Command    | What it does                                   |\n| ---------- | ---------------------------------------------- |\n| `/status`  | Current status, last uploaded file, queue size |\n| `/queue`   | Full upload queue with IST schedule            |\n| `/last`    | Last successfully uploaded issue               |\n| `/history` | Last 30 lines of upload history                |\n| `/pause`   | Pause checker and uploader                     |\n| `/resume`  | Resume + re-trigger any overdue uploads        |\n| `/help`    | List all commands                              |\n\n---\n\n## Checking Logs\n\nRepo → **Actions** tab → click any run → click the job name → expand steps.\n\n---\n\n## Resuming After an Error\n\nThe bot sends a detailed error notification with full traceback. Send `/resume` to your bot after fixing the issue. It automatically re-dispatches overdue uploads and re-creates any missing scheduled jobs.\n\n---\n\n## Notes\n\n- All uploads go to the **channel only**. The bot sends text notifications to the owner's private chat.\n- Thumbnail is generated from the first PDF page at quality=100 (no compression, no blur).\n- Pyrogram (MTProto) supports files up to 2 GB, bypassing the Bot API 50 MB limit.\n- SHA-256 hash verified for every download and logged in `state/upload_history.md`.\n\n---\n\n## License\n\n[MIT](LICENSE)\n\n---\n\n## ☕ Support\n\nThis project is free and always will be. If it helped you or someone you know access\nKishor magazine, a small contribution helps keep it running.\n\n**All donors:**\n\n[![Ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/none123)\n\nAll contributions are voluntary and deeply appreciated. ❤️\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnonecode4u%2Fkishor-publisher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnonecode4u%2Fkishor-publisher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnonecode4u%2Fkishor-publisher/lists"}