HerzaJ commited on
Commit
6943211
·
verified ·
1 Parent(s): 1ebf2c7

Create flixer.js

Browse files
Files changed (1) hide show
  1. plugins/flixer.js +158 -0
plugins/flixer.js ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const puppeteer = require('puppeteer');
2
+
3
+ const scrapeFlixer = async (searchQuery) => {
4
+ const browser = await puppeteer.launch({
5
+ headless: true,
6
+ args: [
7
+ '--no-sandbox',
8
+ '--disable-setuid-sandbox',
9
+ '--disable-dev-shm-usage',
10
+ '--disable-gpu'
11
+ ]
12
+ });
13
+
14
+ const page = await browser.newPage();
15
+
16
+ await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
17
+
18
+ const searchUrl = `https://flixer.sh/search?q=${encodeURIComponent(searchQuery)}`;
19
+ await page.goto(searchUrl, { waitUntil: 'networkidle0', timeout: 30000 });
20
+
21
+ await page.waitForTimeout(2000);
22
+
23
+ const searchResults = await page.evaluate(() => {
24
+ const results = [];
25
+ const images = document.querySelectorAll('img[alt]');
26
+
27
+ images.forEach(img => {
28
+ const link = img.closest('a');
29
+ if (link && img.alt) {
30
+ results.push({
31
+ title: img.alt,
32
+ image: img.src,
33
+ url: link.href
34
+ });
35
+ }
36
+ });
37
+
38
+ return results;
39
+ });
40
+
41
+ if (searchResults.length === 0) {
42
+ await browser.close();
43
+ throw new Error('No results found');
44
+ }
45
+
46
+ const movieUrl = searchResults[0].url;
47
+ await page.goto(movieUrl, { waitUntil: 'networkidle0', timeout: 30000 });
48
+
49
+ await page.waitForTimeout(3000);
50
+
51
+ const servers = await page.evaluate(() => {
52
+ const serverList = [];
53
+ const buttons = document.querySelectorAll('button');
54
+
55
+ buttons.forEach(btn => {
56
+ const nameEl = btn.querySelector('.font-medium');
57
+ const statusEl = btn.querySelector('.text-green-400');
58
+
59
+ if (nameEl && statusEl && statusEl.textContent.includes('AVAILABLE')) {
60
+ serverList.push({
61
+ name: nameEl.textContent.trim(),
62
+ available: true
63
+ });
64
+ }
65
+ });
66
+
67
+ return serverList;
68
+ });
69
+
70
+ let videoUrl = null;
71
+
72
+ page.on('response', async response => {
73
+ const url = response.url();
74
+ if (url.includes('.m3u8') || url.includes('.mp4') || url.includes('stream')) {
75
+ videoUrl = url;
76
+ }
77
+ });
78
+
79
+ for (const server of servers) {
80
+ try {
81
+ await page.evaluate((serverName) => {
82
+ const buttons = Array.from(document.querySelectorAll('button'));
83
+ const btn = buttons.find(b => {
84
+ const nameEl = b.querySelector('.font-medium');
85
+ return nameEl && nameEl.textContent.trim() === serverName;
86
+ });
87
+ if (btn) btn.click();
88
+ }, server.name);
89
+
90
+ await page.waitForTimeout(5000);
91
+
92
+ const currentVideoUrl = await page.evaluate(() => {
93
+ const video = document.querySelector('video');
94
+ return video ? video.src : null;
95
+ });
96
+
97
+ if (currentVideoUrl && !currentVideoUrl.startsWith('blob:')) {
98
+ videoUrl = currentVideoUrl;
99
+ break;
100
+ }
101
+
102
+ if (videoUrl && !videoUrl.startsWith('blob:')) {
103
+ break;
104
+ }
105
+ } catch (e) {
106
+ continue;
107
+ }
108
+ }
109
+
110
+ await browser.close();
111
+
112
+ return {
113
+ title: searchResults[0].title,
114
+ image: searchResults[0].image,
115
+ movieUrl: movieUrl,
116
+ servers: servers,
117
+ videoUrl: videoUrl,
118
+ allResults: searchResults
119
+ };
120
+ };
121
+
122
+ const handler = async (req, res) => {
123
+ try {
124
+ const { q } = req.query;
125
+
126
+ if (!q) {
127
+ return res.status(400).json({
128
+ success: false,
129
+ error: 'Missing required parameter: q'
130
+ });
131
+ }
132
+
133
+ const result = await scrapeFlixer(q);
134
+ res.json({
135
+ author: "Herza",
136
+ success: true,
137
+ msg: result
138
+ });
139
+
140
+ } catch (error) {
141
+ res.status(500).json({
142
+ success: false,
143
+ error: error.message
144
+ });
145
+ }
146
+ };
147
+
148
+ module.exports = {
149
+ name: 'Flixer Search',
150
+ description: 'Search and get video from Flixer',
151
+ type: 'GET',
152
+ routes: ['api/search/flixer'],
153
+ tags: ['search', 'movie', 'tools'],
154
+ parameters: ['q', 'key'],
155
+ enabled: true,
156
+ main: ['Downloader', 'Search'],
157
+ handler
158
+ };