Compare commits
	
		
			14 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0eedf53fc8 | |||
| 1e6316f2b3 | |||
| da2c738c52 | |||
| a190acd1d8 | |||
| 93547547f1 | |||
| 050cf89b45 | |||
| 487e15e429 | |||
| cd5894429c | |||
| 108de113d1 | |||
| 57decd2fe2 | |||
| e8d4f1f329 | |||
| 21c4c64cde | |||
| 601ff195ff | |||
| f6b708b247 | 
| @@ -1,13 +1,13 @@ | |||||||
| kind: pipeline | kind: pipeline | ||||||
| name: default | name: default | ||||||
| steps: | steps: | ||||||
| - name: compile-chrome | - name: compile-extensions | ||||||
|   image: roypur/chrome-packer:latest |   image: roypur/extension-packer:latest | ||||||
|   environment: |   environment: | ||||||
|     CHROME_PRIVKEY: |     CHROME_PRIVKEY: | ||||||
|       from_secret: chrome_privkey |       from_secret: chrome_privkey | ||||||
|   commands: |   commands: | ||||||
|     - ./pack-chrome.sh |     - ./pack-browsers.sh | ||||||
| - name: gitea_release | - name: gitea_release | ||||||
|   image: plugins/gitea-release |   image: plugins/gitea-release | ||||||
|   settings: |   settings: | ||||||
| @@ -15,6 +15,6 @@ steps: | |||||||
|       from_secret: gitea_token |       from_secret: gitea_token | ||||||
|     base_url: https://git.purser.it |     base_url: https://git.purser.it | ||||||
|     title: ${DRONE_TAG} |     title: ${DRONE_TAG} | ||||||
|     files: out/proxy-stream-${DRONE_TAG}.crx |     files: out/proxy-stream-${DRONE_TAG}.crx out/proxy-stream-${DRONE_TAG}.xpi | ||||||
|   when: |   when: | ||||||
|     event: tag |     event: tag | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -11,4 +11,5 @@ android/.gradle/* | |||||||
| android/gradle/* | android/gradle/* | ||||||
| chrome/*.png | chrome/*.png | ||||||
| *.crx | *.crx | ||||||
|  | *.xpi | ||||||
| sources.json | sources.json | ||||||
|   | |||||||
| @@ -7,8 +7,9 @@ | |||||||
|         "48": "icon-48.png", |         "48": "icon-48.png", | ||||||
|         "128": "icon-128.png" |         "128": "icon-128.png" | ||||||
|     }, |     }, | ||||||
|     "version": "100.0", |     "version": "111.0", | ||||||
|     "manifest_version": 3, |     "manifest_version": 3, | ||||||
|  |     "host_permissions": ["http://127.0.0.1:4000/jsonrpc"], | ||||||
|     "permissions": ["tabs"], |     "permissions": ["tabs"], | ||||||
|     "action": { |     "action": { | ||||||
|         "default_title": "Proxy Stream", |         "default_title": "Proxy Stream", | ||||||
|   | |||||||
| @@ -4,6 +4,8 @@ | |||||||
|         <title>Proxy Stream</title> |         <title>Proxy Stream</title> | ||||||
|     </head> |     </head> | ||||||
|     <body> |     <body> | ||||||
|         <button>Proxy Stream</button> |         <button id="proxy-button">Proxy Stream</button> | ||||||
|  |         <button id="kodi-play-button">Play on kodi</button> | ||||||
|  |         <button id="kodi-queue-button">Queue on kodi</button> | ||||||
|     </body> |     </body> | ||||||
| </html> | </html> | ||||||
|   | |||||||
							
								
								
									
										143
									
								
								chrome/script.js
									
									
									
									
									
								
							
							
						
						
									
										143
									
								
								chrome/script.js
									
									
									
									
									
								
							| @@ -1,33 +1,122 @@ | |||||||
| let providers = new Map(); | let providers = new Map() | ||||||
| providers.set("www.youtube.com", "youtube"); | providers.set("www.youtube.com", "youtube") | ||||||
| providers.set("youtube.com", "youtube"); | providers.set("youtube.com", "youtube") | ||||||
| providers.set("youtu.be", "youtube"); | providers.set("youtu.be", "youtube") | ||||||
| providers.set("tv.nrk.no", "nrk"); | providers.set("tv.nrk.no", "nrk") | ||||||
| providers.set("nx12210.your-storageshare.de", "nextcloud"); | providers.set("seafile.purser.it", "seafile") | ||||||
|  |  | ||||||
|  | const random = () => { | ||||||
|  |     const arr = new Uint8Array(32) | ||||||
|  |     window.crypto.getRandomValues(arr) | ||||||
|  |     return [...arr].map(x => x.toString(16).padStart(2, "0")).join("") | ||||||
|  | } | ||||||
|  |  | ||||||
| document.addEventListener("DOMContentLoaded", () => { | document.addEventListener("DOMContentLoaded", () => { | ||||||
|     let [button] = document.getElementsByTagName("button"); |     const proxyButton = document.getElementById("proxy-button") | ||||||
|     button.addEventListener("click", (ev) => { |     const kodiPlayButton = document.getElementById("kodi-play-button") | ||||||
|         chrome.tabs.query({currentWindow: true, active: true}, (tabs) => { |     const kodiQueueButton = document.getElementById("kodi-queue-button") | ||||||
|             let oldurl = new URL(tabs[0].url); |  | ||||||
|             let newurl = new URL("https://stream.purser.it"); |     async function handleProxyButton(ev) { | ||||||
|             let search = new URLSearchParams(); |         const [tab] = chrome.tabs.query({currentWindow: true, active: true}) | ||||||
|             let hostname = oldurl.hostname.toLowerCase(); |         const oldurl = new URL(tab.url) | ||||||
|             if(providers.has(hostname)) { |         const search = new URLSearchParams() | ||||||
|                 if(hostname.includes("youtube.com")) { |         const hostname = oldurl.hostname.toLowerCase() | ||||||
|                     let newpath = oldurl.searchParams.get("v"); |         let newurl = new URL("https://stream.purser.it") | ||||||
|                     if((newpath instanceof String) || ((typeof newpath) === "string")) { |          | ||||||
|                         newurl.pathname = "/" + newpath; |         if(providers.has(hostname)) { | ||||||
|  |             if(hostname.includes("youtube.com")) { | ||||||
|  |                 let newpath = oldurl.searchParams.get("v") | ||||||
|  |                 if(newpath) { | ||||||
|  |                     newurl.pathname = "/" + newpath | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 newurl.pathname = oldurl.pathname | ||||||
|  |             } | ||||||
|  |             search.append("provider", providers.get(hostname)) | ||||||
|  |         } else { | ||||||
|  |             return | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         newurl.search = search.toString() | ||||||
|  |         const newtab = {} | ||||||
|  |         newtab.url = newurl.href | ||||||
|  |         chrome.tabs.create(newtab) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     async function handleKodiButton(ev, method, playlistid) { | ||||||
|  |         const [tab] = await chrome.tabs.query({currentWindow: true, active: true}) | ||||||
|  |         const oldurl = new URL(tab.url) | ||||||
|  |         const search = new URLSearchParams() | ||||||
|  |         const hostname = oldurl.hostname.toLowerCase() | ||||||
|  |         let newurl = new URL("https://stream.purser.it") | ||||||
|  |  | ||||||
|  |         if(providers.has(hostname)) { | ||||||
|  |             if(hostname.includes("youtube.com")) { | ||||||
|  |                 newurl = new URL("plugin://plugin.video.youtube") | ||||||
|  |                 search.append("action", "play_video") | ||||||
|  |                 const video_id = oldurl.searchParams.get("v") | ||||||
|  |                 if(video_id) { | ||||||
|  |                     search.append("videoid", video_id) | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 search.append("provider", providers.get(hostname)) | ||||||
|  |                 search.append("raw", "true") | ||||||
|  |                 newurl.pathname = oldurl.pathname | ||||||
|  |             } | ||||||
|  |         } else if(hostname == "stream.purser.it") { | ||||||
|  |             const provider = oldurl.searchParams.get("provider") | ||||||
|  |             if(provider) { | ||||||
|  |                 if(provider == "youtube") { | ||||||
|  |                     newurl = new URL("plugin://plugin.video.youtube") | ||||||
|  |                     search.append("action", "play_video") | ||||||
|  |                     const video_id = oldurl.pathname.replace("/", "") | ||||||
|  |                     if(video_id) { | ||||||
|  |                         search.append("videoid", video_id) | ||||||
|                     } |                     } | ||||||
|                 } else { |                 } else { | ||||||
|                     newurl.pathname = oldurl.pathname; |                     newurl.pathname = oldurl.pathname | ||||||
|  |                     search.append("provider", provider) | ||||||
|  |                     search.append("raw", "true") | ||||||
|                 } |                 } | ||||||
|                 search.append("provider", providers.get(hostname)); |  | ||||||
|             } |             } | ||||||
|             newurl.search = search.toString(); |         } else { | ||||||
|             let tab = {}; |             return | ||||||
|             tab.url = newurl.href; |         } | ||||||
|             chrome.tabs.create(tab); |  | ||||||
|         }); |         newurl.search = search.toString() | ||||||
|     }); |  | ||||||
| }); |         const req = { | ||||||
|  |             jsonrpc: "2.0", | ||||||
|  |             method: method, | ||||||
|  |             id:     random(), | ||||||
|  |             params: { | ||||||
|  |                 item: { | ||||||
|  |                     file: newurl.href | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if(playlistid) { | ||||||
|  |             req.params.playlistid = playlistid | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         const resp = await fetch("http://127.0.0.1:4000/jsonrpc", { | ||||||
|  |             method: "POST", | ||||||
|  |             body: JSON.stringify(req), | ||||||
|  |             headers: { | ||||||
|  |                 "Content-Type": "application/json; charset=utf-8" | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |         console.log(resp) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     kodiPlayButton.addEventListener("click", async ev => { | ||||||
|  |         await handleKodiButton(ev, "Player.Open") | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     kodiQueueButton.addEventListener("click", async ev => { | ||||||
|  |         await handleKodiButton(ev, "Playlist.Add", 1) | ||||||
|  |     }) | ||||||
|  |  | ||||||
|  |     proxyButton.addEventListener("click", handleProxyButton) | ||||||
|  | }) | ||||||
|   | |||||||
| @@ -4,6 +4,14 @@ temp_name=$(head -c 20 /dev/random | xxd -p | tr -dc a-f0-9) | |||||||
| temp_dir="/tmp/${temp_name}" | temp_dir="/tmp/${temp_name}" | ||||||
| chrome_dir="${temp_dir}/chrome" | chrome_dir="${temp_dir}/chrome" | ||||||
| 
 | 
 | ||||||
|  | if [[ ! -n "${DRONE_TAG}" ]] | ||||||
|  | then | ||||||
|  |     export DRONE_TAG=$(git describe --abbrev=0 | tr -dc v0-9) | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | mkdir -p "${dir}/out" | ||||||
|  | rm -rf "${dir}/out" | ||||||
|  | 
 | ||||||
| mkdir -p "${temp_dir}/out" | mkdir -p "${temp_dir}/out" | ||||||
| mkdir -p "${chrome_dir}" | mkdir -p "${chrome_dir}" | ||||||
| 
 | 
 | ||||||
| @@ -22,12 +30,15 @@ then | |||||||
|     dbus-daemon --session --address="${DBUS_SESSION_BUS_ADDRESS}" & |     dbus-daemon --session --address="${DBUS_SESSION_BUS_ADDRESS}" & | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
| if [[ "${DISPLAY}test" == "test" ]] | if [[ ! -n "${DISPLAY}" ]] | ||||||
| then | then | ||||||
|     export DISPLAY=:8819 |     export DISPLAY=:8819 | ||||||
|     Xvfb "${DISPLAY}" & |     Xvfb "${DISPLAY}" & | ||||||
| fi | fi | ||||||
| 
 | 
 | ||||||
|  | echo "DRONE_TAG=${DRONE_TAG}" | ||||||
|  | echo "DISPLAY=${DISPLAY}" | ||||||
|  | 
 | ||||||
| ${dir}/icons.sh | ${dir}/icons.sh | ||||||
| 
 | 
 | ||||||
| browser=$(which chromium-browser 2> /dev/null) | browser=$(which chromium-browser 2> /dev/null) | ||||||
| @@ -39,7 +50,14 @@ fi | |||||||
| release_folder="${temp_dir}/out/proxy-stream-${DRONE_TAG}" | release_folder="${temp_dir}/out/proxy-stream-${DRONE_TAG}" | ||||||
| cp -r "${dir}/chrome" "${release_folder}" | cp -r "${dir}/chrome" "${release_folder}" | ||||||
| 
 | 
 | ||||||
| ${browser} --disable-gpu --no-sandbox --user-data-dir=${chrome_dir} --pack-extension="${temp_dir}/out/proxy-stream-${DRONE_TAG}" --pack-extension-key="${temp_dir}/privkey.pem" | (cd "${release_folder}" && zip -r "${temp_dir}/out/proxy-stream-${DRONE_TAG}.xpi" .) | ||||||
|  | 
 | ||||||
|  | if grep "/proc/1/cgroup" -q -F -e docker | ||||||
|  | then | ||||||
|  |     ${browser} --disable-gpu --no-sandbox --user-data-dir=${chrome_dir} --pack-extension="${temp_dir}/out/proxy-stream-${DRONE_TAG}" --pack-extension-key="${temp_dir}/privkey.pem" | ||||||
|  | else | ||||||
|  |     ${browser} --user-data-dir=${chrome_dir} --pack-extension="${temp_dir}/out/proxy-stream-${DRONE_TAG}" --pack-extension-key="${temp_dir}/privkey.pem" | ||||||
|  | fi | ||||||
| 
 | 
 | ||||||
| rm -rf "${release_folder}" | rm -rf "${release_folder}" | ||||||
| mv "${temp_dir}/out" "${dir}/out" | mv "${temp_dir}/out" "${dir}/out" | ||||||
		Reference in New Issue
	
	Block a user