├── .github └── workflows │ └── nightly-bump.yml ├── .gitignore ├── .nvmrc ├── README.md ├── package.json └── src ├── date.txt └── index.js /.github/workflows/nightly-bump.yml: -------------------------------------------------------------------------------- 1 | name: 'Nightly Bump' 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: '0 1 * * *' # every night at 1 am UTC 7 | 8 | jobs: 9 | bump: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout main branch 13 | uses: actions/checkout@v3 14 | # create a file at src/date.txt with the current date 15 | - name: Create date file 16 | run: | 17 | mkdir -p src 18 | echo $(date) > src/date.txt 19 | # commit the file 20 | - name: Commit date file 21 | run: | 22 | git config --local user.name "GitHub Actions" 23 | git config --local user.email "actions@github.com" 24 | git add src/date.txt 25 | git commit -m "Update date.txt" 26 | # push the commit 27 | - name: Push commit 28 | uses: ad-m/github-push-action@master 29 | with: 30 | github_token: ${{ secrets.GITHUB_TOKEN }} 31 | branch: ${{ github.ref }} 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v18/* 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 |

6 | 7 |

8 | 9 |
10 | 11 | 12 | 13 |
14 |
15 | YouTube Play Generator Bot is a free software that generates plays on your YouTube videos 16 |

17 | 18 | # 🦄 YouTube Bot 19 | ## 💻 Installation 20 | ### Direct link 21 | [![Windows](https://img.shields.io/badge/-Windows_x64-blue.svg?style=for-the-badge&logo=windows)](https://somiibo.com/download?download=windows) 22 | [![MacOS](https://img.shields.io/badge/-MacOS-lightblue.svg?style=for-the-badge&logo=apple)](https://somiibo.com/download?download=macos) 23 | [![Unix](https://img.shields.io/badge/-Linux/BSD-red.svg?style=for-the-badge&logo=linux)](https://somiibo.com/download?download=linux) 24 | [![All versions](https://img.shields.io/badge/-All_Versions-lightgrey.svg?style=for-the-badge)](https://somiibo.com/download?download=null) 25 | 26 | ### Command line 27 | Clone this repo then run the following commands: 28 | ```shell 29 | cd 30 | npm install 31 | npm start 32 | ``` 33 | 34 | ## 🎉 Features 35 | - Generate views on your YouTube videos 36 | - Proxy scraper automatically gets fresh proxies 24/7 37 | - Choose target countries 38 | - User agents randomized (or set your own!) 39 | - HTTP Referrer randomized (or set your own!) 40 | 41 | ## 🙋‍♂️ Want to contribute? 42 | Want to contribute? Great! All contributions are welcome, from code to documentation to graphics to design suggestions to bug reports. 43 | 44 | [Join our Discord server](https://somiibo.com/discord) to participate 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "somiibo-downloader", 3 | "version": "1.0.0", 4 | "description": "Download Somiibo, a free social media automation platform that organically grows your online presence and gets you more followers.", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "start": "node -e \"require('app-downloader')()\"" 8 | }, 9 | "engines": { 10 | "node": ">=18" 11 | }, 12 | "downloads": { 13 | "darwin": "https://github.com/somiibo/download-server/releases/download/installer/Somiibo.dmg", 14 | "win32": "https://github.com/somiibo/download-server/releases/download/installer/Somiibo-Setup.exe", 15 | "linux": "https://github.com/somiibo/download-server/releases/download/installer/Somiibo_amd64.deb" 16 | }, 17 | "repository": { 18 | "type": "git", 19 | "url": "git+https://github.com/somiibo/download-server.git" 20 | }, 21 | "keywords": [ 22 | "management", 23 | "backend", 24 | "frontend", 25 | "productivity" 26 | ], 27 | "author": "Somiibo", 28 | "license": "ISC", 29 | "bugs": { 30 | "url": "https://github.com/somiibo/somiibo-microservice-template/issues" 31 | }, 32 | "homepage": "https://somiibo.com", 33 | "dependencies": { 34 | "app-downloader": "^1.0.0" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/date.txt: -------------------------------------------------------------------------------- 1 | Fri Jun 6 02:44:41 UTC 2025 2 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | // Modules 2 | const os = require('os'); 3 | const fs = require('fs-jetpack'); 4 | const path = require('path'); 5 | const fetch = require('wonderful-fetch'); 6 | const downloads = require('downloads-folder'); 7 | const powertools = require('node-powertools'); 8 | 9 | // Main 10 | module.exports = async function () { 11 | const interval = setInterval(() => { 12 | log('Still downloading, please be patient! :)'); 13 | }, 3000); 14 | 15 | try { 16 | // Clear 17 | clear(); 18 | 19 | // Download 20 | await download(); 21 | 22 | // Launch 23 | launch(); 24 | 25 | return 26 | } catch (e) { 27 | error('Failed to download:', e); 28 | error('Ensure you are using the right Node.js version'); 29 | error('Alternatively, download the app manually from:', getURL()); 30 | } finally { 31 | clearInterval(interval); 32 | } 33 | }; 34 | 35 | if (require.main === module) { 36 | module.exports(); 37 | } 38 | 39 | function clear() { 40 | const location = getDownloadPath(); 41 | 42 | log(`Clearing ${location}`) 43 | 44 | fs.remove(location); 45 | } 46 | 47 | function download(location) { 48 | return new Promise(async function(resolve, reject) { 49 | const location = getDownloadPath(); 50 | const url = getURL(); 51 | 52 | log(`Downloading app to ${location} from ${url}`); 53 | 54 | // Process 55 | const res = await fetch(url); 56 | const fileStream = fs.createWriteStream(location); 57 | 58 | await new Promise((resolve, reject) => { 59 | res.body.pipe(fileStream); 60 | res.body.on('error', reject); 61 | 62 | fileStream.on('finish', resolve); 63 | }) 64 | .then((r) => { 65 | log('Download finished!'); 66 | }) 67 | .catch((e) => { 68 | error('Download failed!', e); 69 | }) 70 | 71 | return resolve(); 72 | }); 73 | } 74 | 75 | function getDownloadPath() { 76 | const url = getURL(); 77 | 78 | return path.join(downloads(), url.split('/').slice(-1)[0]); 79 | } 80 | 81 | function getURL() { 82 | const name = os.type(); 83 | 84 | if (name === 'Darwin') { 85 | return 'https://github.com/somiibo/download-server/releases/download/installer/Somiibo.dmg' 86 | } else if (name === 'Windows_NT') { 87 | return 'https://github.com/somiibo/download-server/releases/download/installer/Somiibo-Setup.exe' 88 | } else { 89 | return 'https://github.com/somiibo/download-server/releases/download/installer/Somiibo_amd64.deb' 90 | } 91 | } 92 | 93 | function launch() { 94 | const location = getDownloadPath(); 95 | const name = os.type(); 96 | 97 | log(`Launching app at ${location}`) 98 | 99 | try { 100 | if (name === 'Darwin') { 101 | powertools.execute(`open "${location}"`) 102 | .then(() => { 103 | log('Drag the app to your Applications folder to install it'); 104 | }) 105 | } else if (name === 'Windows_NT') { 106 | powertools.execute(`"${location}"`) 107 | .then(() => { 108 | 109 | }) 110 | } else { 111 | powertools.execute(`sudo apt install "${location}"`) 112 | .then(() => { 113 | powertools.execute(`restart-manager`).catch(e => {console.error(e)}) 114 | }) 115 | } 116 | } catch (e) { 117 | error('Application failed to execute:', e); 118 | console.log('\n\n\n') 119 | log(`Please launch the app manually: ${location}`); 120 | } 121 | } 122 | 123 | function log() { 124 | console.log(`[${new Date().toLocaleTimeString()}]`, ...arguments) 125 | } 126 | 127 | function error() { 128 | console.error(`[${new Date().toLocaleTimeString()}]`, ...arguments) 129 | } 130 | --------------------------------------------------------------------------------