Added all changes since last year

master
lanxu 2022-04-03 22:54:40 +03:00
parent dccfecec74
commit a101b152eb
49 changed files with 646 additions and 20 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.log
*.old
*.swp
__pycache__
temp

View File

@ -1,7 +0,0 @@
.log
.old
.swp
__pycache__
temp
.scr
fetchers

View File

@ -1,6 +1,10 @@
# Script collection by lanxu :muscle: # Script collection by lanxu :muscle:
This is a general collection of useful scripts used by me. Most of the scripts are written or modified by me. This is a general collection of useful scripts used by me. Most of the scripts are written or modified by me.
## Disclaimer
Totally out-of-date. Will be updated in the future!
## Scripts by others ## Scripts by others
Script | Description Script | Description
@ -40,4 +44,3 @@ There are a few scripts that are just thrown into the mix in case I need them at
convertAtlasXMLToJson.php (convert sprite atlases to json) convertAtlasXMLToJson.php (convert sprite atlases to json)
sortPackagesBySize.sh (pacman script to sort packages by used size) sortPackagesBySize.sh (pacman script to sort packages by used size)

View File

@ -0,0 +1,10 @@
[Desktop Entry]
Type=Application
Name=itch (XWayland)
Exec=env GDK_BACKEND=x11 itch %U
Icon=itch
Terminal=false
Categories=Game;
MimeType=x-scheme-handler/itchio;x-scheme-handler/itch;
X-GNOME-Autostart-enabled=true
Comment=Install and play itch.io games easily (uses X11 for games)

View File

@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=lf-terminal
Comment=Launches the lf file manager
Icon=utilities-terminal
Exec=kitty -e lf
Categories=System;FileTools;FileManager
MimeType=inode/directory;

View File

@ -0,0 +1,9 @@
[Desktop Entry]
Name=Mullvad VPN (XWayland)
Exec=env GDK_BACKEND=x11 "/opt/Mullvad VPN/mullvad-vpn" %U
Terminal=false
Type=Application
Icon=mullvad-vpn
StartupWMClass=Mullvad VPN
Comment=Mullvad VPN client
Categories=Network;

11
attic/btpower.sh Normal file
View File

@ -0,0 +1,11 @@
#!/bin/sh
DEVICES=$(upower -e)
for device in $DEVICES; do
info=$(upower -i $device)
echo "$info"
model=$(echo "$info" | grep -oP 'model: \K\w+[a-zA-Z0-9 ]*$')
battery=$(echo "$info" | grep -oP 'percentage: [0-9 ]*%')
echo "$model: $battery"
done

9
attic/checkupdates.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/bash
#UPDATES=$(checkupdates | sed ':a;N;$!ba;s/\n/ /g')
CHECKUPDATES=$(checkupdates)
UPDATES=$(echo "${CHECKUPDATES}" | sed 's/->/-\>/g' | sed ':a;N;$!ba;s/\n/<br>/g')
NUM_UPDATES=$(echo "${CHECKUPDATES}" | wc -l)
#echo "{\"text\": \"${NUM_UPDATES}\", \"tooltip\":\"$UPDATES\"}"
printf "{\"text\": \"%s\", \"tooltip\": \"%s\"}" $(checkupdates | wc -l) "$(checkupdates | tr '\n' '\r')"

View File

@ -3,8 +3,10 @@
appname=$1 appname=$1
sound="message" sound="message"
if [ "$appname" = "Telegram-desktop" ]; then if [ $appname = "Telegram Desktop" ]; then
sound="window-attention" sound="window-attention"
fi fi
echo "$1" >> /tmp/test
echo "$sound" >> /tmp/test
mpv --no-terminal /usr/share/sounds/freedesktop/stereo/$sound.oga& mpv --no-terminal /usr/share/sounds/freedesktop/stereo/$sound.oga&

View File

@ -0,0 +1,31 @@
#!/bin/python
import requests
import sys
import re
def get_urls(text):
text = text.replace('\n', ' ').replace('\r', '')
#r = re.compile("\"(https:([^<>]*))\">", re.I|re.M)
urls = []
matches = re.findall("\"(https:([^<>]*))\">", text)
if matches:
for m in matches:
urls.append(m[0])
return urls
if __name__ == "__main__":
url = sys.argv[1]
jar = requests.cookies.RequestsCookieJar()
jar.set('_groupees_session', 'OWFWT1ZVTVZtdkFJU2NUUW5ZM2kwblNtTkFYVW0xdUhSWlVpdmROZE9ITWE0UDJIQlV5bmRpcXZLOTF5S1B1Z2lQZ08zUkJpT05FeVRaL0xQcDJJL1hKaVMvOWJPQUVvTTNzVjlaVERXQ2s5RE9WeEc4aWk1ZU9zMGVJd0tscGhLazZvSjVCQWZPMEdFWmVEdXZSYWNld3lTWDlyY1ZYdGdXOG54OXkrOUYyRjB4UXBpVUJJTXloZkN2REhYNTlwZ0s0NlVtbVNBclBRSXZEYVRmZXo1dz09LS0rOEkxVmUvR0ZCUEY1d3Y1RDVXSHd3PT0%3D--fc3a4f506f7c4a283a5d105ae9cb400b604a7fc8', domain='.groupees.com', path="/")
r = requests.get(url, cookies=jar)
urls = get_urls(r.text)
file_urls = [u for u in urls if "https://storage.groupees.com" in u]
cookie = jar.get('_groupees_session')
print("header=\"Cookie:_groupees_session=%s;\"" % cookie)
for file_url in file_urls:
print("remote-header-name")
print("remote-name")
print("url=\"%s\"" % (file_url))

View File

@ -2,12 +2,19 @@
import re import re
import logging import logging
from logging.handlers import RotatingFileHandler
import subprocess import subprocess
from subprocess import check_output from subprocess import check_output
import lib.helpers as helpers import lib.helpers as helpers
FORMAT = "%(asctime)s %(levelname)s %(message)s" log_formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
logging.basicConfig(format=FORMAT, filename=__file__+'.log', level=logging.DEBUG)
log_handler = RotatingFileHandler(__file__+'.log', maxBytes=1024*1024*10, mode='a', backupCount=0, encoding=None, delay=0)
log_handler.setFormatter(log_formatter)
log_handler.setLevel(logging.DEBUG)
logger = logging.getLogger('root')
logger.setLevel(logging.DEBUG)
logger.addHandler(log_handler)
ATICONFIG_AVAILABLE = helpers.is_exe("/usr/bin/aticonfig") ATICONFIG_AVAILABLE = helpers.is_exe("/usr/bin/aticonfig")
SENSORS_AVAILABLE = helpers.is_exe("/usr/bin/sensors") SENSORS_AVAILABLE = helpers.is_exe("/usr/bin/sensors")
@ -16,7 +23,7 @@ def get_temperature():
command = None command = None
if SENSORS_AVAILABLE: if SENSORS_AVAILABLE:
commands = ["sensors amdgpu-pci-0800 | grep edge", commands = ["sensors amdgpu-pci-0a00 | grep edge",
"sensors radeon-pci-* | grep temp1", "sensors radeon-pci-* | grep temp1",
"sensors thinkpad-isa-0000 | grep ATI"] "sensors thinkpad-isa-0000 | grep ATI"]
@ -48,8 +55,8 @@ def get_temperature():
m = re.search(r'- (.*) C', return_value.decode("utf-8")) m = re.search(r'- (.*) C', return_value.decode("utf-8"))
temp = m.group(1) temp = m.group(1)
else: else:
logging.info('wat') logger.info('wat')
logging.info(temp) logger.info(temp)
return temp return temp
print(get_temperature()) print(get_temperature())

View File

47
i3/xscreensaverstopper.sh Executable file
View File

@ -0,0 +1,47 @@
#!/bin/bash
# xscreensaverstopper.sh
# This script is licensed under GNU GPL version 2.0 or above
# Uses elements from lightsOn.sh
# Copyright (c) 2011 iye.cba at gmail com
# url: https://github.com/iye/lightsOn
# This script is licensed under GNU GPL version 2.0 or above
# Description: Restarts xscreensaver's idle countdown while
# full screen applications are running.
# Checks every 30 seconds to see if a full screen application
# has focus, if so then the xscreensaver is told to restart
# its idle countdown.
# enumerate all the attached screens
displays=""
while read id
do
displays="$displays $id"
done< <(xvinfo | sed -n 's/^screen #\([0-9]\+\)$/\1/p')
checkFullscreen()
{
# loop through every display looking for a fullscreen window
for display in $displays
do
#get id of active window and clean output
activ_win_id=`DISPLAY=$DISPLAY.${display} xprop -root _NET_ACTIVE_WINDOW`
activ_win_id=${activ_win_id:40:9}
# Check if Active Window (the foremost window) is in fullscreen state
isActivWinFullscreen=`DISPLAY=$DISPLAY.${display} xprop -id $activ_win_id | grep _NET_WM_STATE_FULLSCREEN`
if [[ "$isActivWinFullscreen" == *NET_WM_STATE_FULLSCREEN* ]];then
xscreensaver-command -deactivate
fi
done
}
while sleep $((30)); do
checkFullscreen
done
exit 0

17
import-gsettings Executable file
View File

@ -0,0 +1,17 @@
#!/bin/sh
# By default wayland only reads settings from gsettings and not from settings.ini
# usage: import-gsettings
config="${XDG_CONFIG_HOME:-$HOME/.config}/gtk-3.0/settings.ini"
if [ ! -f "$config" ]; then exit 1; fi
gnome_schema="org.gnome.desktop.interface"
gtk_theme="$(grep 'gtk-theme-name' "$config" | sed 's/.*\s*=\s*//')"
icon_theme="$(grep 'gtk-icon-theme-name' "$config" | sed 's/.*\s*=\s*//')"
cursor_theme="$(grep 'gtk-cursor-theme-name' "$config" | sed 's/.*\s*=\s*//')"
font_name="$(grep 'gtk-font-name' "$config" | sed 's/.*\s*=\s*//')"
gsettings set "$gnome_schema" gtk-theme "$gtk_theme"
gsettings set "$gnome_schema" icon-theme "$icon_theme"
gsettings set "$gnome_schema" cursor-theme "$cursor_theme"
gsettings set "$gnome_schema" font-name "$font_name"

View File

@ -12,7 +12,7 @@ case $op in
;; ;;
lock) lock)
#loginctl lock-session #loginctl lock-session
swaylock -f -c 221122 swaylock -f -c 000000
;; ;;
logout) logout)
swaymsg exit swaymsg exit

5
run-xhost Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
echo "$@"
xhost +si:lanxu:root
pkexec "$@"
xhost -si:lanxu:root

View File

@ -10,16 +10,22 @@ export XKB_DEFAULT_MODEL=pc105
# configure wayland backend # configure wayland backend
export GDK_BACKEND=wayland export GDK_BACKEND=wayland
export QT_QPA_PLATFORM=wayland # wayland-egl? export QT_QPA_PLATFORM=wayland # wayland-egl?
export QT_WAYLAND_DISABLE_WINDOWDECORATION=1
export QT_AUTO_SCREEN_SCALE_FACTOR=1
export CLUTTER_BACKEND=wayland export CLUTTER_BACKEND=wayland
export SDL_VIDEODRIVER=wayland export SDL_VIDEODRIVER=wayland
export EWOL_BACKEND=wayland export EWOL_BACKEND=wayland
# firefox # firefox
export MOZ_ENABLE_WAYLAND=1 export MOZ_ENABLE_WAYLAND=1
export MOZ_DBUS_REMOTE=1 export MOZ_DBUS_REMOTE=1
# auth # auth
eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh) #eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK #export SSH_AUTH_SOCK
# start! # start!
sway XDG_CURRENT_DESKTOP=sway XDG_SESSION_TYPE=wayland sway
#XDG_CURRENT_DESKTOP=kde XDG_SESSION_TYPE=wayland dbus-run-session startplasma-wayland
#XDG_CURRENT_DESKTOP=gnome XDG_SESSION_TYPE=wayland dbus-run-session gnome-shell --wayland

3
steam
View File

@ -1,4 +1,5 @@
#!/bin/sh #!/bin/sh
XDG_CURRENT_DESKTOP=XFCE xdg-dbus-proxy "$DBUS_SESSION_BUS_ADDRESS" "$XDG_RUNTIME_DIR/steam-bus-proxy" --filter --call="org.freedesktop.DBus.*=*" --call="org.freedesktop.IBus.*=*" --call="org.freedesktop.portal.*=*" --call="com.feralinteractive.GameMode.*=*" --call="com.canonical.*=*" --broadcast="*=*" --call="org.kde.*=*" --call="org.gtk.*=*" & #XDG_CURRENT_DESKTOP=XFCE xdg-dbus-proxy "$DBUS_SESSION_BUS_ADDRESS" "$XDG_RUNTIME_DIR/steam-bus-proxy" --filter --call="org.freedesktop.DBus.*=*" --call="org.freedesktop.IBus.*=*" --call="org.freedesktop.portal.*=*" --call="com.feralinteractive.GameMode.*=*" --call="com.canonical.*=*" --broadcast="*=*" --call="org.kde.*=*" --call="org.gtk.*=*" &
xdg-dbus-proxy "$DBUS_SESSION_BUS_ADDRESS" "$XDG_RUNTIME_DIR/steam-bus-proxy" --filter --call="org.freedesktop.DBus.*=*" --call="org.freedesktop.IBus.*=*" --call="org.freedesktop.portal.*=*" --call="com.feralinteractive.GameMode.*=*" --call="com.canonical.*=*" --broadcast="*=*" --call="org.kde.*=*" --call="org.gtk.*=*" &
DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/steam-bus-proxy" /usr/bin/steam DBUS_SESSION_BUS_ADDRESS="unix:path=$XDG_RUNTIME_DIR/steam-bus-proxy" /usr/bin/steam
kill %1 kill %1

View File

@ -0,0 +1,6 @@
[Unit]
Description=fullscreen inhibiter for sway
[Service]
Type=oneshot
ExecStart=/bin/sh /home/lanxu/Scripts/sway/fullscreen-inhibiter.sh

10
sway/fullscreen-inhibiter.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
# Get all open windows from sway
IN_FULLSCREEN=$(swaymsg -t get_tree | jq '[[recurse(.nodes[]) | del(.nodes)] | .[] | select((.window_properties.class) or (.app_id)) | {app_id: .app_id, class: .window_properties.class, fullscreen_mode: .fullscreen_mode}]' | jq 'any(.fullscreen_mode == 1)')
if [ $IN_FULLSCREEN = "true" ]; then
dunstctl set-paused true
else
dunstctl set-paused false
fi

View File

@ -0,0 +1,9 @@
[Unit]
Description=Fullscreen inhibiter for Sway timer
[Timer]
OnUnitActiveSec=10s
OnBootSec=10s
[Install]
WantedBy=timers.target

3
setup_table_sway.sh → sway/setup-tablet.sh Normal file → Executable file
View File

@ -5,7 +5,8 @@
# Get ouputs # Get ouputs
# swaymsg -t get_outputs # swaymsg -t get_outputs
PAD_ID="9580:110:HID_256c:006e_Pad" #PAD_ID="9580:110:HID_256c:006e_Pad"
PAD_ID="9580:110:HID_256c:006e"
OUTPUT="DP-2" OUTPUT="DP-2"
echo "swaymsg 'input $PAD_ID map_to_output $OUTPUT'" echo "swaymsg 'input $PAD_ID map_to_output $OUTPUT'"

9
sway/take_screenshot.sh Executable file
View File

@ -0,0 +1,9 @@
#!/bin/sh
MODE=$1
FILENAME=$(xdg-user-dir PICTURES)/$(date +%F_%T_grim.png)
case $MODE in "region-copy") grim -g "$(slurp)" - | wl-copy;;
"region") grim -g "$(slurp)" $FILENAME && notify-send -i "$FILENAME" "Screenshot saved";;
*) grim $FILENAME && notify-send -i "$FILENAME" "Screenshot saved";;
esac

6
sway_screensaver.sh Executable file
View File

@ -0,0 +1,6 @@
#!/usr/bin/env bash
swayidle -w \
timeout 30 'swaylock -f -c 000000' \
timeout 60 'swaymsg "output * dpms off"' \
resume 'swaymsg "output * dpms on"' \
before-sleep 'swaylock -f -c 000000'

9
testing/run_zandronum.sh Normal file
View File

@ -0,0 +1,9 @@
docker run -it \
--rm \
-p 10666:10666 \
-v /usr/share/games/doom/:/wads:ro \
--name=zandronum-server \
frozenfoxx/zandronum-server:latest \
-cooperative \
-lan \
-private

3
testing/sheet_process.sh Normal file
View File

@ -0,0 +1,3 @@
mogrify -format png *.tga
rm *.tga
mogrify -crop 256x400+0+0 +repage *.png

100
tools/24-bit-color.sh Normal file
View File

@ -0,0 +1,100 @@
#!/bin/bash
# This file was originally taken from iterm2 https://github.com/gnachman/iTerm2/blob/master/tests/24-bit-color.sh
#
# This file echoes a bunch of 24-bit color codes
# to the terminal to demonstrate its functionality.
# The foreground escape sequence is ^[38;2;<r>;<g>;<b>m
# The background escape sequence is ^[48;2;<r>;<g>;<b>m
# <r> <g> <b> range from 0 to 255 inclusive.
# The escape sequence ^[0m returns output to default
setBackgroundColor()
{
#printf '\x1bPtmux;\x1b\x1b[48;2;%s;%s;%sm' $1 $2 $3
printf '\x1b[48;2;%s;%s;%sm' $1 $2 $3
}
resetOutput()
{
echo -en "\x1b[0m\n"
}
# Gives a color $1/255 % along HSV
# Who knows what happens when $1 is outside 0-255
# Echoes "$red $green $blue" where
# $red $green and $blue are integers
# ranging between 0 and 255 inclusive
rainbowColor()
{
let h=$1/43
let f=$1-43*$h
let t=$f*255/43
let q=255-t
if [ $h -eq 0 ]
then
echo "255 $t 0"
elif [ $h -eq 1 ]
then
echo "$q 255 0"
elif [ $h -eq 2 ]
then
echo "0 255 $t"
elif [ $h -eq 3 ]
then
echo "0 $q 255"
elif [ $h -eq 4 ]
then
echo "$t 0 255"
elif [ $h -eq 5 ]
then
echo "255 0 $q"
else
# execution should never reach here
echo "0 0 0"
fi
}
for i in `seq 0 127`; do
setBackgroundColor $i 0 0
echo -en " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor $i 0 0
echo -en " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor 0 $i 0
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor 0 $i 0
echo -n " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor 0 0 $i
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor 0 0 $i
echo -n " "
done
resetOutput
for i in `seq 0 127`; do
setBackgroundColor `rainbowColor $i`
echo -n " "
done
resetOutput
for i in `seq 255 -1 128`; do
setBackgroundColor `rainbowColor $i`
echo -n " "
done
resetOutput

119
tools/gif_anim_montage.sh Executable file
View File

@ -0,0 +1,119 @@
#!/bin/sh
#
# gif_anim_montage [options] animation.gif [output_image]
#
# Convert a GIF animation into a strip showing each sub-frame of the
# animation with a black border, positioned in the larger canvas context
# of the animation. Also include a label defining the size and position,
# and disposal setting of each frame in the animation.
#
# OPTIONS:
# -u Underlay a dimmed coaleased image (context for frame)
# -c Add checkerboard background for transparent areas
# -g Use granite for background
# -w Use a white background
# -b Use a black background
# -t image Use this image (or color image) for background
# -r Use a red border color rather than black
# #x# tile the images (default one single row)
# -n Don't label the animation frames (not important)
#
####
#
# WARNING: Input arguments are NOT tested for correctness.
# This script represents a security risk if used ONLINE.
# I accept no responsiblity for misuse. Use at own risk.
#
# Anthony Thyssen Feburary 2006
#
PROGNAME=`type $0 | awk '{print $3}'` # search for executable on path
PROGDIR=`dirname $PROGNAME` # extract directory of program
PROGNAME=`basename $PROGNAME` # base name of program
Usage() { # output the script comments as docs
echo >&2 "$PROGNAME:" "$@"
sed >&2 -n '/^###/q; /^#/!q; s/^#//; s/^ //; 3s/^/Usage: /; 2,$ p' \
"$PROGDIR/$PROGNAME"
exit 10;
}
border=black
thickness=1x1
pointsize=10
tile='-tile x1'
montage_opts=""
method=1
background=none
# Figure out the montage label to use
# Does IM understand %T as the frame time delay?
label='%s: %D\n%wx%h%O'
case `identify -format %T rose:` in
0) label="%D, %Tcs\n%wx%h%O"
esac
while [ $# -gt 0 ]; do
case "$1" in
--help|--doc*) Usage ;;
-u) method=2 ;; # add disposal image context
-n) label='' ;; # don't label the montage
-c) tile_image="pattern:checkerboard" ;;
-g) tile_image="granite:" ;;
-w) background="white" ;;
-b) background="black" ;;
-r) border=red ;;
[0-9]*x*[0-9]|[0-9]*x|x*[0-9])
X=`expr "$1" : '\([0-9]*\)x'`
Y=`expr "$1" : '[0-9]*x\([0-9]*\)$'`
tile="-tile ${X}x${Y}"
;;
-) break ;; # stdin filename
--) shift; break ;; # end of user options
-*) Usage "Unknown option \"$1\"" ;;
*) break ;; # end of user options
esac
shift # next option
done
input="$1"
[ $# -eq 0 ] && Usage "Missing Animation to Montage"
[ $# -eq 1 ] && output='show:'
[ $# -eq 2 ] && output="$2"
[ $# -gt 2 ] && Usage "Too Many Arguments"
if [ "$tile_image" ]; then
montage_opts="$montage_opts -texture $tile_image"
fi
if [ "$background" ]; then
montage_opts="$montage_opts -background $background"
fi
case "$method" in
1) # Montage only method
convert "$input" -set background none -alpha on -set label "$label" \
-compose Copy -bordercolor $border -border $thickness \
-set dispose Background -coalesce miff:- |\
montage - -frame 4 -geometry '+1+1' $tile \
-bordercolor none -pointsize $pointsize \
$montage_opts "$output"
;;
2) # Montage with a disposed image underlay
# Still need some way to make the underlay partically transparent
convert "$input" -set label "$label" -write mpr:a \
-coalesce -bordercolor none -border $thickness \
-channel A -evaluate divide 2 +channel null: \
\( mpr:a -bordercolor none -mattecolor $border -frame $thickness \
\) -layers Composite \
miff:- | \
montage - -frame 4 -geometry '+1+1' $tile \
-bordercolor none -pointsize $pointsize \
$montage_opts "$output"
;;
3) # convert only method -- no montage labels :-(
convert -dispose Background "$input" \
-compose Copy -bordercolor $border -border $thickness \
-compose Over -coalesce -bordercolor none -frame 4x4+1+1 \
-bordercolor none -border 2x2 +append -set delay 0 \
$montage_opts "$output"
esac

81
tools/updateorigin.sh Normal file
View File

@ -0,0 +1,81 @@
#!/bin/bash
PATH32="drive_c/Program Files/Origin"
PATH64="drive_c/Program Files (x86)/Origin"
UPDATEPATH=""
update() {
local DIR="$1"
if which aria2c; then
command="aria2c -x8 -c"
else
command="wget"
fi
echo "Downloading latest Origin setup file:"
if $command "https://download.dm.origin.com/origin/live/OriginSetup.exe"; then
echo "Extracting the installation file:"
unzip OriginSetup.exe 'update/*.zip'
unzip -o ./update/*.zip -d "$DIR"
echo "Cleaning up..."
rm -r ./update
rm OriginSetup.exe
echo "Done!"
fi
}
if [[ ! -z "$WINEPREFIX" ]];
then
# exit if no Origin folder can be found in the WINEPREFIX
if [[ ! -e "$WINEPREFIX/$PATH32" ]] && [[ ! -e "$WINEPREFIX/$PATH64" ]];
then
echo "Origin not found in WINEPREFIX!"
echo "Please run this script again with the correct WINEPREFIX"
echo "or cd to your Origin directory and run the script there."
exit 1
fi
# check which installation of Origin is present. If both are (dunno why), then 64bit is being used
if [[ -e "$WINEPREFIX/$PATH32" ]];
then
UPDATEPATH=$PATH32
echo "Found a 32bit installation of Origin, going to use this:"
fi
if [[ -e "$WINEPREFIX/$PATH64" ]];
then
UPDATEPATH=$PATH64
echo "Found a 64bit installation of Origin, going to use this:"
fi
# ouput the folder, so that the user has confirmation
echo "=> $WINEPREFIX/$UPDATEPATH"
# now we do our magic!
update "$WINEPREFIX/$UPDATEPATH"
exit 0
fi
if [[ -z $WINEPREFIX ]]
then
echo "WINEPREFIX not passed, checking working directory..."
if [[ -w "$PWD/Origin.exe" ]];
then
update "$PWD"
exit 0
fi
if [[ ! -w "$PWD/Origin.exe" ]];
then
echo "Origin.exe not found in working directory!"
echo "Please enter your Origin installation path:"
read -e path
if [[ -w "$path/Origin.exe" ]];
then
update "$path"
fi
if [[ ! -w "$path/Origin.exe" ]];
then
echo "This path does not contain Origin.exe!"
fi
fi
fi

105
tools/vimeo-audio-and-video.py Executable file
View File

@ -0,0 +1,105 @@
#!/usr/bin/env python3
import argparse
import base64
import os
import re
import requests
import subprocess
from tqdm import tqdm
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--url-list', help='List of URL/filename pairs, delimited by tabs')
args = parser.parse_args()
for line in open(args.url_list):
output_file, master_json_url = line.rstrip().split('\t')
print('\n\n\nProcessing %s' % output_file)
# Extract some stuff
base_url = master_json_url[:master_json_url.rfind('/', 0, -26) + 1]
resp = requests.get(master_json_url)
content = resp.json()
# Video download here
heights = [(i, d['height']) for (i, d) in enumerate(content['video'])]
idx = max(heights, key=lambda x: x[1])[0]
video = content['video'][idx]
video_base_url = base_url + content['base_url'] + video['base_url']
print('Base url:', video_base_url)
filenameVideo = 'video_%s.mp4' % video['id']
print('Saving VIDEO to %s' % filenameVideo)
video_file = open(filenameVideo, 'wb')
init_segment = base64.b64decode(video['init_segment'])
video_file.write(init_segment)
for segment in tqdm(video['segments']):
segment_url = video_base_url + segment['url']
print(segment_url + '\n')
print(video_base_url+ '\n')
print(segment['url']+ '\n')
resp = requests.get(segment_url, stream=True)
if resp.status_code != 200:
print('not 200!')
print(resp)
print(segment_url)
break
for chunk in resp:
video_file.write(chunk)
video_file.flush()
video_file.close()
# Audio download here
bitrate = [(i, d['bitrate']) for (i, d) in enumerate(content['audio'])]
print('Bitrate', bitrate)
idx = max(bitrate, key=lambda x: x[1])[0]
audio = content['audio'][idx]
audio_base_url = base_url + content['base_url'] + audio['base_url']
print('Base url:', audio_base_url)
filenameAudio = 'audio_%s.mp4' % audio['id']
print('Saving AUDIO to %s' % filenameAudio)
audio_file = open(filenameAudio, 'wb')
init_segment = base64.b64decode(audio['init_segment'])
audio_file.write(init_segment)
for segment in tqdm(audio['segments']):
segment_url = audio_base_url + segment['url']
segment_url = re.sub(r'/[a-zA-Z0-9_-]*/\.\./',r'/',segment_url.rstrip())
resp = requests.get(segment_url, stream=True)
if resp.status_code != 200:
print('not 200!')
print(resp)
print(segment_url)
break
for chunk in resp:
audio_file.write(chunk)
audio_file.flush()
audio_file.close()
# Combine audio and video here
print('Combining video and audio...')
cmd = 'ffmpeg -y -i '
cmd += filenameAudio
cmd += ' -i '
cmd += filenameVideo
cmd += ' ' + output_file
subprocess.call(cmd, shell=True)
print('Mixing Done!')
# Delete the remaining single audio and video files
# os.remove(filenameAudio)
# os.remove(filenameVideo)
# print("Temporary files removed!")
# Log the conclusion of the operations
print("*** VIDEO DOWNLOADED SUCCESSFULLY ***")
print(video['base_url'])

View File

@ -0,0 +1,4 @@
#!/bin/sh
# First, set flatpak overrides
flatpak override --user --socket=wayland io.freetubeapp.FreeTube