Init
This commit is contained in:
		
						commit
						bc043b9173
					
				
							
								
								
									
										9
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					## Usage
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					python vvvvget.py
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The output is a file called `index.html` containing all scraped video sources.
 | 
				
			||||||
 | 
					Player.html use the javascript HLS library to play the sources using the `<video>` element in browsers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Please do not abuse this script for profit: it has been made because the original site is a pain to use because of the heavy UI and Flash Player.
 | 
				
			||||||
							
								
								
									
										27
									
								
								player.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								player.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
				
			|||||||
 | 
					<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
					    <meta charset="utf-8">
 | 
				
			||||||
 | 
					    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
				
			||||||
 | 
					    <title>Anime Player | lsd.cat</title>
 | 
				
			||||||
 | 
					    <link rel="icon" sizes="16x16" type="image/png" href="/icon.png" />
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    <style type="text/css">body{margin:40px auto;max-width: 900px;padding:0 10px;background-color: #171a1c}video{width:100% !important; height:auto !important}</style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>
 | 
				
			||||||
 | 
					    <script src="hls.js"></script>
 | 
				
			||||||
 | 
					    <video controls id="video"></video>
 | 
				
			||||||
 | 
					    <script>
 | 
				
			||||||
 | 
					      if(Hls.isSupported()) {
 | 
				
			||||||
 | 
					        var video = document.getElementById('video');
 | 
				
			||||||
 | 
					        var hls = new Hls();
 | 
				
			||||||
 | 
					        hls.loadSource(window.location.hash.substring(1));
 | 
				
			||||||
 | 
					        hls.attachMedia(video);
 | 
				
			||||||
 | 
					        hls.on(Hls.Events.MANIFEST_PARSED,function() {
 | 
				
			||||||
 | 
					          video.play();
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					     </script>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
							
								
								
									
										138
									
								
								vvvvget.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138
									
								
								vvvvget.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,138 @@
 | 
				
			|||||||
 | 
					import json
 | 
				
			||||||
 | 
					import requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def ds(h):
 | 
				
			||||||
 | 
					    g = "MNOPIJKL89+/4567UVWXQRSTEFGHABCDcdefYZabstuvopqr0123wxyzklmnghij"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def f(m):
 | 
				
			||||||
 | 
					        l = []
 | 
				
			||||||
 | 
					        o = 0
 | 
				
			||||||
 | 
					        b = False
 | 
				
			||||||
 | 
					        m_len = len(m)
 | 
				
			||||||
 | 
					        while ((not b) and o < m_len):
 | 
				
			||||||
 | 
					            n = m[o] << 2
 | 
				
			||||||
 | 
					            o += 1
 | 
				
			||||||
 | 
					            k = -1
 | 
				
			||||||
 | 
					            j = -1
 | 
				
			||||||
 | 
					            if o < m_len:
 | 
				
			||||||
 | 
					                n += m[o] >> 4
 | 
				
			||||||
 | 
					                o += 1
 | 
				
			||||||
 | 
					                if o < m_len:
 | 
				
			||||||
 | 
					                    k = (m[o - 1] << 4) & 255
 | 
				
			||||||
 | 
					                    k += m[o] >> 2
 | 
				
			||||||
 | 
					                    o += 1
 | 
				
			||||||
 | 
					                    if o < m_len:
 | 
				
			||||||
 | 
					                        j = (m[o - 1] << 6) & 255
 | 
				
			||||||
 | 
					                        j += m[o]
 | 
				
			||||||
 | 
					                        o += 1
 | 
				
			||||||
 | 
					                    else:
 | 
				
			||||||
 | 
					                        b = True
 | 
				
			||||||
 | 
					                else:
 | 
				
			||||||
 | 
					                    b = True
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                b = True
 | 
				
			||||||
 | 
					            l.append(n)
 | 
				
			||||||
 | 
					            if k != -1:
 | 
				
			||||||
 | 
					                l.append(k)
 | 
				
			||||||
 | 
					            if j != -1:
 | 
				
			||||||
 | 
					                l.append(j)
 | 
				
			||||||
 | 
					        return l
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c = []
 | 
				
			||||||
 | 
					    for e in h:
 | 
				
			||||||
 | 
					        c.append(g.index(e))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c_len = len(c)
 | 
				
			||||||
 | 
					    for e in range(c_len * 2 - 1, -1, -1):
 | 
				
			||||||
 | 
					        a = c[e % c_len] ^ c[(e + 1) % c_len]
 | 
				
			||||||
 | 
					        c[e % c_len] = a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c = f(c)
 | 
				
			||||||
 | 
					    d = ''
 | 
				
			||||||
 | 
					    for e in c:
 | 
				
			||||||
 | 
					        d += chr(e)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return d
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_settings():
 | 
				
			||||||
 | 
						settings = requests.get('https://www.vvvvid.it/vvvvid/settings')
 | 
				
			||||||
 | 
						return settings.json()['data']['defaultStreamingServer']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def login():
 | 
				
			||||||
 | 
						login = requests.get('https://www.vvvvid.it/user/login')
 | 
				
			||||||
 | 
						return login.json()['data']['conn_id']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_info(show_id, conn_id):
 | 
				
			||||||
 | 
						info = requests.get('https://www.vvvvid.it/vvvvid/ondemand/' + str(show_id) + '/info/?conn_id=' + conn_id)
 | 
				
			||||||
 | 
						info.encoding = 'utf-8'
 | 
				
			||||||
 | 
						if info.json()['result'] == 'ok':
 | 
				
			||||||
 | 
								return info.json()['data']
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_seasons(show_id, conn_id):
 | 
				
			||||||
 | 
						seasons = requests.get('https://www.vvvvid.it/vvvvid/ondemand/' + str(show_id) + '/seasons/?conn_id=' + conn_id)
 | 
				
			||||||
 | 
						if seasons.json()['result'] == 'ok' and seasons.json()['data'] and seasons.json()['data'][0]['episodes']:
 | 
				
			||||||
 | 
							return seasons.json()['data']
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def get_episodes(season_id, show_id, conn_id):
 | 
				
			||||||
 | 
						episodes = requests.get('https://www.vvvvid.it/vvvvid/ondemand/' + str(show_id) + '/season/' +str(season_id) + '?conn_id=' + conn_id)
 | 
				
			||||||
 | 
						if episodes.json()['result'] == 'ok' and episodes.json()['data'] and episodes.json()['data'][0]['embed_info']:
 | 
				
			||||||
 | 
							return episodes.json()['data']
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vvvvid_stream_url = get_settings()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					with open('index.html', 'a') as out:
 | 
				
			||||||
 | 
						out.write('''<!DOCTYPE html>
 | 
				
			||||||
 | 
					<html>
 | 
				
			||||||
 | 
					<head>
 | 
				
			||||||
 | 
						<meta charset="utf-8">
 | 
				
			||||||
 | 
						<meta name="viewport" content="width=device-width, initial-scale=1">
 | 
				
			||||||
 | 
						<title>Anime | lsd.cat</title>
 | 
				
			||||||
 | 
						<link rel="icon" sizes="16x16" type="image/png" href="/icon.png" />
 | 
				
			||||||
 | 
						<style type="text/css">body{margin:40px auto;max-width:740px;line-height:1.6;color:#444;padding:0 10px}h1,h2,h3{line-height:1.2;font-size:18px;}li{font-size:12px;}</style>
 | 
				
			||||||
 | 
					</head>
 | 
				
			||||||
 | 
					<body>''')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					stream_url = get_settings()
 | 
				
			||||||
 | 
					conn_id = login()
 | 
				
			||||||
 | 
					for i in range(0,1000):
 | 
				
			||||||
 | 
						info = get_info(i, conn_id)
 | 
				
			||||||
 | 
						if info:
 | 
				
			||||||
 | 
							seasons = get_seasons(i, conn_id)
 | 
				
			||||||
 | 
							if seasons:
 | 
				
			||||||
 | 
								for j in seasons:
 | 
				
			||||||
 | 
									episodes = get_episodes(j['season_id'], i, conn_id)
 | 
				
			||||||
 | 
									if episodes:
 | 
				
			||||||
 | 
										header = '\t<h3>' + str(info['show_id']) + ': ' + info['title'] + ' Tipo: ' + j['name'] + ' Id: ' + str(j['season_id'])+'</h3>\n\t<ul>\n'
 | 
				
			||||||
 | 
										with open('index.html', 'a') as out:
 | 
				
			||||||
 | 
					    						out.write(header.encode('utf-8'))
 | 
				
			||||||
 | 
										for k in episodes:
 | 
				
			||||||
 | 
											if k['embed_info']:
 | 
				
			||||||
 | 
												if k['video_type'] == 'video/rcs':
 | 
				
			||||||
 | 
													embed_info = ds(k['embed_info'])
 | 
				
			||||||
 | 
													embed_info = 'https' + embed_info[4:30] + 'i' + embed_info[31:-12] + 'master.m3u8'
 | 
				
			||||||
 | 
												elif k['video_type'] == 'video/vvvvid':
 | 
				
			||||||
 | 
													embed_info = 'https' + vvvvid_stream_url[4:] + ds(k['embed_info']) + '/playlist.m3u8'
 | 
				
			||||||
 | 
												elif k['video_type'] == 'video/youtube':
 | 
				
			||||||
 | 
													embed_info = ds(k['embed_info'])
 | 
				
			||||||
 | 
												elif k['video_type'] == 'video/kenc':
 | 
				
			||||||
 | 
													#requires flash, skipping
 | 
				
			||||||
 | 
													embed_info = '[FLASH ONLY] ' + ds(k['embed_info'])
 | 
				
			||||||
 | 
												else:
 | 
				
			||||||
 | 
													print(k['video_type'])
 | 
				
			||||||
 | 
													print(ds(k['embed_info']))
 | 
				
			||||||
 | 
													print('Unknown video source!')
 | 
				
			||||||
 | 
													exit()
 | 
				
			||||||
 | 
											with open('index.html', 'a') as out:
 | 
				
			||||||
 | 
												out.write('\t\t<li><a href="player.html#' + embed_info + '">' + embed_info + '</a></li>\n')
 | 
				
			||||||
 | 
										with open('index.html', 'a') as out:
 | 
				
			||||||
 | 
											out.write('\t</ul>\n')
 | 
				
			||||||
 | 
					with open('index.html', 'a') as out:
 | 
				
			||||||
 | 
						out.write('\n</body>\n</html>')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user