commit db491716fbf2d14a8dfef63419f3b3a0f572f5ef Author: konsthol Date: Sat Sep 10 03:38:00 2022 +0300 Your heart's been aching but you're too shy to say it diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..153d416 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8f21df5 --- /dev/null +++ b/README.md @@ -0,0 +1,74 @@ +# GrPopPro + +Watch movies and series with greek subtitles using mpv + +In order to change menus just leave the relevant menu uncommented + +In order to change player to vlc just replace the player variable to vlc in the relevant part of the code + +If you want to run on termux make sure [mpv](https://f-droid.org/en/packages/is.xyz.mpv/) is installed on your device and fzf will be installed automatically if not already installed via `pkg install fzf` or `apt install fzf` + +## Demo + +[Interactive menu for series](./assets/video-220502-0258-55.mp4) + +[Running on termux](./assets/ScreenRecord-20220502-032628.mp4) + +## Installation + +```sh +git clone https://git.konsthol.eu/konsthol/GrPopPro +cd GrPopPro +sudo cp grpoppro /usr/bin/ +(Or cp grpoppro anywhere in your $PATH) +``` + +## Usage + +To watch a movie `grpoppro "Name of movie"` + +To watch a series `grpoppro "Name of series" season episode` + +> Episodes must be in formatted as 01 02 03 +** + +To watch a series interactively + +```sh +grpoppro --menu +``` + +To continue a series interactively + +```sh +grpoppro --resume +``` + +To continue unfinished series episode + +```sh +grpoppro --finish +``` + +## Dependencies + +* curl +* mpv +* grep +* awk +* sed +* rofi or dmenu or fzf + +## Credits go to + +* [Drew](https://gitlab.com/uoou) + +As this script is based on his [pop](https://gitlab.com/uoou/dotfiles/-/raw/master/stow/bin/home/drew/.local/bin/pop) script + +* [CoverApi](https://coverapi.store/) + +As they provide the movie and series database + +* [IMDB](https://www.imdb.com/) + +As they provide the ids diff --git a/assets/ScreenRecord-20220502-032628.mp4 b/assets/ScreenRecord-20220502-032628.mp4 new file mode 100644 index 0000000..42ebf56 Binary files /dev/null and b/assets/ScreenRecord-20220502-032628.mp4 differ diff --git a/assets/video-220502-0258-55.mp4 b/assets/video-220502-0258-55.mp4 new file mode 100644 index 0000000..4a0ac88 Binary files /dev/null and b/assets/video-220502-0258-55.mp4 differ diff --git a/grpoppro b/grpoppro new file mode 100755 index 0000000..fcdf7d6 --- /dev/null +++ b/grpoppro @@ -0,0 +1,170 @@ +#!/usr/bin/env bash + +GRPOPPRO_DATA_DIR=~/.local/share/grpoppro +#GRPOPPRO_DATA_DIR=${XDG_DATA_HOME:-$HOME/.local/}/grpoppro +GRPOPPRO_DATA_FILE=$GRPOPPRO_DATA_DIR/lastPlayed +INTERACTIVE="on" +menu="rofi -show -dmenu -p seasonXepisode" +#menu="fzf -i --prompt=seasonXepisode" +#menu="dmenu -i -l 10 -p seasonXepisode" +apiurl="https://coverapi.store" +player="mpv" + +function getFzfForTermux { +if command -v fzf >/dev/null 2>&1; then + echo -e "\n" +else + apt install -y fzf +fi +} + +[[ "$OSTYPE" != "linux-gnu" ]] && INTERACTIVE="off" && menu="fzf -i --prompt=seasonXepisode" && player="am start -n is.xyz.mpv/.MPVActivity -a android.intent.action.VIEW -d" && getFzfForTermux + +function getMovieStreamUrl() { +streamurl=$(curl -s 'https://coverapi.store/engine/ajax/controller.php' \ + -H 'Connection: keep-alive' \ + -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="98"' \ + -H 'Accept: application/json, text/javascript, */*; q=0.01' \ + -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ + -H 'X-Requested-With: XMLHttpRequest' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36' \ + -H 'sec-ch-ua-platform: "Linux"' \ + -H 'Origin: https://coverapi.store' \ + -H 'Sec-Fetch-Site: same-origin' \ + -H 'Sec-Fetch-Mode: cors' \ + -H 'Sec-Fetch-Dest: empty' \ + -H 'Referer: '$simpleurl'' \ + -H 'Accept-Language: en-GB,en;q=0.9,el;q=0.8' \ + -H 'Cookie: PHPSESSID=6be2a34628cde3aeefbfed1020a10127' \ + --data-raw 'mod=players&news_id='$movieid'' \ + --compressed | awk '{print $12}' | awk -F, '{print $1}' | sed 's/\\//g' | awk -F\" '{print $2}') +} + +function getMovieID() { +movieid=$(curl -s $simpleurl | grep news_id | awk '{print $5}' | awk -F\' '{print $2}') +} + +function getSeriesID_URL { +getMovieID "$simpleurl" +seriesid=$movieid +seriesurl=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt') +} + +function getIMDBID() { +imdbid=$(curl -s "https://www.imdb.com/find?ref_=nv_sr_fn&s=all&q=$title" | grep -io '"); + then [[ "$INTERACTIVE" == "on" ]] && notify-send -t 2000 "No file found" || echo -e "\n\tNo file found" && exit + fi + [[ "$player" == "mpv" ]] && player="mpv --save-position-on-quit --fs" + [[ "$OSTYPE" != "linux-gnu" ]] && INTERACTIVE="off" && streamurl=$(echo $streamurl | sed 's/https/http/g') + $player $streamurl +} +function dumpData() { + echo $title > ~/.local/share/grpoppro/lastPlayed + echo $seasonEpisode >> ~/.local/share/grpoppro/lastPlayed + echo $streamurl >> ~/.local/share/grpoppro/lastPlayed + [[ "$INTERACTIVE" == "on" ]] && notify-send -t 2000 "Last Played -> $seasonEpisode" || echo "Last Played -> $seasonEpisode" + +} +function sourceData { +[ -f "$GRPOPPRO_DATA_FILE" ] && lastSeasonEpisodePlayed="$(sed -n 2p $GRPOPPRO_DATA_FILE)" && lastSeriesPlayed="$(sed -n 1p $GRPOPPRO_DATA_FILE)" && lastEpisodePlayedURL="$(sed -n 3p $GRPOPPRO_DATA_FILE)" +} +[[ "$#" -lt 1 ]] && usage +[[ "$#" -gt 3 ]] && usage +[[ "$#" -eq 2 ]] && usage +#Standard Stuff +function basics() { +title=$(echo "$1" | sed 's/ /%20/g') +getIMDBID "$title" +simpleurl=$apiurl/embed/$imdbid/ +} + +function menuSearch { +[[ "$INTERACTIVE" == "on" ]] && title=$(rofi -dmenu -i -no-fixed-num-lines -p "Search Series") +[[ "$INTERACTIVE" == "off" ]] && [[ -z "$title" ]] && read -p "Search Series: " title +[[ -z "$title" ]] && exit +title=$(echo $title | sed 's/ /%20/g') +getIMDBID "$title" +simpleurl=$apiurl/embed/$imdbid/ +getSeriesID_URL +seasonEpisode=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt' | grep "mp4" | awk -F\" '{print $8}' | awk -F/ '{print $NF}' | awk -F. '{print $1}' | $menu) +if [[ -z "$seasonEpisode" ]]; then + [[ "$INTERACTIVE" == "on" ]] && notify-send -t 2000 "Nothing Selected" || echo "Nothing Selected" + exit +fi +streamurl=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt' | grep "mp4" | grep "${seasonEpisode}" | head -n 1 | awk -F\" '{print $8}') +mkdir -p ~/.local/share/grpoppro +dumpData "$title" "$seasonEpisode" +play +resume +} + +function resume { +sourceData +title=$lastSeriesPlayed +getIMDBID "$title" +while true +do + sourceData + simpleurl=$apiurl/embed/$imdbid/ + getSeriesID_URL + seasonEpisode=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt' | grep "mp4" | awk -F\" '{print $8}' | awk -F/ '{print $NF}' | awk -F. '{print $1}' | sed -n -e "0,/$lastSeasonEpisodePlayed/!p" | $menu) + if [[ -z "$seasonEpisode" ]]; then + [[ "$INTERACTIVE" == "on" ]] && notify-send "Nothing Selected" || echo "Nothing Selected" + exit + fi + streamurl=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt' | grep "mp4" | grep "${seasonEpisode}" | head -n 1 | awk -F\" '{print $8}') + dumpData "$title" "$seasonEpisode" + play +done +} +function resumeUnfinishedEpisode { +sourceData +streamurl=$lastEpisodePlayedURL +[[ "$OSTYPE" != "linux-gnu" ]] && INTERACTIVE="off" && streamurl=$(echo $streamurl | sed 's/https/http/g') +[[ "$player" == "mpv" ]] && player="mpv --resume-playback --fs" +$player $streamurl +resume +} + +[[ "$1" == "--menu" ]] && menuSearch +[[ "$1" == "--resume" ]] && resume +[[ "$1" == "--finish" ]] && resumeUnfinishedEpisode + +if [[ "$1" == *"tt"* ]] && [[ "$#" -eq 1 ]] && [[ "$1" != "--menu" ]] && [[ "$1" != "--resume" ]];then + simpleurl=$1 + getMovieID "$simpleurl" + getMovieStreamUrl "$movieid" + play + exit +fi +# Series URL +if [[ "$#" -eq 3 ]];then + basics "$1" + getSeriesID_URL + season=$2 + episode=$3 + streamurl=$(curl -s 'https://coverapi.store/uploads/playlists/'$seriesid'.txt' | grep "mp4" | grep "${season}x${episode}" | head -n 1 | awk -F\" '{print $8}') + play + exit +fi +# Movies URL +if [[ "$#" -eq 1 ]] && [[ "$1" != "--menu" ]] && [[ "$1" != "--resume" ]];then + basics "$1" + getMovieID "$simpleurl" + getMovieStreamUrl "$movieid" + play + exit +fi