Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 202 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
# This is a basic workflow to help you get started with Actions

name: build

# Controls when the workflow will run
on:
push:
branches:
- master
- ytdl-ci
pull_request:
branches: [master]



# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
vanilla:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf pkg-config libtool ninja-build python3-pip \
python3-setuptools unzip openssl ca-certificates nasm
sudo pip3 install meson
- name: set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup Android SDK
uses: android-actions/setup-android@v2
- name: remove old ndk
run: sdkmanager --uninstall "ndk;21.4.7075529"
rm -rf sdkmanager /usr/local/lib/android/sdk/ndk-bundle
- name: Install NDK
run: sdkmanager "ndk;24.0.8215888"
- name: download-deps
working-directory: ./buildscripts
run: |
export mpvarchoverride=armv7l
chmod +x github-prepare.sh
./github-prepare.sh
- name: build-apk
working-directory: ./buildscripts
run: |
./buildall.sh -n
- name: relocate apks
run: |
mkdir -p app/build/outputs/apk/release
cp "./app/build/outputs/apk/default/release/app-default-release-unsigned.apk" app/build/outputs/apk/release/mpv-default.apk
cp "./app/build/outputs/apk/api29/release/app-api29-release-unsigned.apk" app/build/outputs/apk/release/mpv-api29.apk
cp "./app/build/outputs/apk/api29/debug/app-api29-debug.apk" app/build/outputs/apk/release/mpv-api29-debug.apk
cp "./app/build/outputs/apk/default/debug/app-default-debug.apk" app/build/outputs/apk/release/mpv-default-debug.apk
- name: Sign APK
uses: r0adkll/sign-android-release@v1
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
# keyPassword: ${{ secrets.KEY_PASSWORD }}
- name : upload APKs
uses: actions/upload-artifact@v2
with:
name: Vanilla-Build
path: |
app/build/outputs/apk/release/mpv-default-signed.apk
app/build/outputs/apk/release/mpv-api29-signed.apk
app/build/outputs/apk/release/mpv-default-debug-signed.apk
app/build/outputs/apk/release/mpv-api29-debug-signed.apk


x86_64:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf pkg-config libtool ninja-build python3-pip \
python3-setuptools unzip openssl ca-certificates nasm
sudo pip3 install meson
- name: set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup Android SDK
uses: android-actions/setup-android@v2
- name: remove old ndk
run: sdkmanager --uninstall "ndk;21.4.7075529"
rm -rf sdkmanager /usr/local/lib/android/sdk/ndk-bundle
- name: Install NDK
run: sdkmanager "ndk;24.0.8215888"
- name: download-deps
working-directory: ./buildscripts
run: |
export mpvarchoverride=x86_64
chmod +x github-prepare.sh
./github-prepare.sh x86_64
- name: build-apk
working-directory: ./buildscripts
run: |
./buildall.sh -n
- name: relocate apks
run: |
mkdir -p app/build/outputs/apk/release
cp "./app/build/outputs/apk/default/release/app-default-release-unsigned.apk" app/build/outputs/apk/release/mpv-default.apk
cp "./app/build/outputs/apk/api29/release/app-api29-release-unsigned.apk" app/build/outputs/apk/release/mpv-api29.apk
cp "./app/build/outputs/apk/api29/debug/app-api29-debug.apk" app/build/outputs/apk/release/mpv-api29-debug.apk
cp "./app/build/outputs/apk/default/debug/app-default-debug.apk" app/build/outputs/apk/release/mpv-default-debug.apk
- name: Sign APK
uses: r0adkll/sign-android-release@v1
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name : upload APKs
uses: actions/upload-artifact@v2
with:
name: x86_64-Build
path: |
app/build/outputs/apk/release/mpv-default-signed.apk
app/build/outputs/apk/release/mpv-api29-signed.apk
app/build/outputs/apk/release/mpv-default-debug-signed.apk
app/build/outputs/apk/release/mpv-api29-debug-signed.apk
Arm86:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf pkg-config libtool ninja-build python3-pip \
python3-setuptools unzip openssl ca-certificates nasm
sudo pip3 install meson
- name: set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
cache: gradle
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Setup Android SDK
uses: android-actions/setup-android@v2
- name: remove old ndk
run: sdkmanager --uninstall "ndk;21.4.7075529"
rm -rf sdkmanager /usr/local/lib/android/sdk/ndk-bundle
- name: Install NDK
run: sdkmanager "ndk;24.0.8215888"
- name: download-deps
working-directory: ./buildscripts
run: |
export mpvarchoverride=arm64
chmod +x github-prepare.sh
./github-prepare.sh arm64
- name: build-apk
working-directory: ./buildscripts
run: |
./buildall.sh -n
- name: relocate apks
run: |
mkdir -p app/build/outputs/apk/release
cp "./app/build/outputs/apk/default/release/app-default-release-unsigned.apk" app/build/outputs/apk/release/mpv-default.apk
cp "./app/build/outputs/apk/api29/release/app-api29-release-unsigned.apk" app/build/outputs/apk/release/mpv-api29.apk
cp "./app/build/outputs/apk/api29/debug/app-api29-debug.apk" app/build/outputs/apk/release/mpv-api29-debug.apk
cp "./app/build/outputs/apk/default/debug/app-default-debug.apk" app/build/outputs/apk/release/mpv-default-debug.apk
- name: Sign APK
uses: r0adkll/sign-android-release@v1
# ID used to access action output
id: sign_app
with:
releaseDirectory: app/build/outputs/apk/release
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
alias: ${{ secrets.ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
- name : upload APKs
uses: actions/upload-artifact@v2
with:
name: Arm-Build
path: |
app/build/outputs/apk/release/mpv-default-signed.apk
app/build/outputs/apk/release/mpv-api29-signed.apk
app/build/outputs/apk/release/mpv-default-debug-signed.apk
app/build/outputs/apk/release/mpv-api29-debug-signed.apk
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ obj
build
local.properties
*~
app/src/main/assets/ytdl/python*
6 changes: 5 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ android {

defaultConfig {
minSdkVersion 21
targetSdkVersion 30
targetSdkVersion 28
versionCode 28
versionName "2022-03-23-release"
vectorDrawables.useSupportLibrary = true
Expand All @@ -26,6 +26,10 @@ android {
buildFeatures {
viewBinding = true
}

lintOptions {
disable 'ExpiredTargetSdkVersion'
}
}

dependencies {
Expand Down
75 changes: 75 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,81 @@
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<!-- various URL intent filters for popular youtube-dl extractors -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="*.youtube.com" />
<data android:pathPattern="/watch.*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="youtube.com" />
<data android:pathPattern="/watch.*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="youtu.be" />
<data android:pathPattern=".*" />
</intent-filter>

<intent-filter> <!-- FIXME: all following patterns are suboptimal because they also match the homepages -->
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="www.vimeo.com" />
<data android:pathPattern=".*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="vimeo.com" />
<data android:pathPattern=".*" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="twitch.tv" />
<data android:pathPattern=".*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="m.twitch.tv" />
<data android:pathPattern=".*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" />
<data android:scheme="https" />
<data android:host="clips.twitch.tv" />
<data android:pathPattern=".*" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
Expand Down
36 changes: 36 additions & 0 deletions app/src/main/assets/ytdl/setup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import sys, os, urllib.request

scriptdest = "../youtube-dl"
targets = {
"youtube-dl": "https://youtube-dl.org/downloads/latest/youtube-dl",
"yt-dlp": "https://github.com/yt-dlp/yt-dlp/releases/latest/download/yt-dlp",
}

# Clean up old files first
try:
os.unlink(scriptdest)
except:
pass
for name in targets.keys():
try:
os.unlink(name)
except:
pass

name = sys.argv[1].lower()
url = targets[name]
print("Downloading '%s'..." % url)
try:
urllib.request.urlretrieve(url, name)
except urllib.error.HTTPError as e:
print(e)
exit(1)
except urllib.error.ContentTooShortError as e:
print("Download interrupted!")
exit(1)
print("OK.")

# Write wrapper script
with open(scriptdest, "w") as f:
f.write("""#!/system/bin/sh\nexec "$(dirname "$0")/ytdl/wrapper" %s "$@"\n""" % name)
os.chmod(scriptdest, 0o700)
5 changes: 5 additions & 0 deletions app/src/main/assets/ytdl/wrapper
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/system/bin/sh
cd $(dirname "$0")
export PYTHONHOME=.
export SSL_CERT_FILE=$PWD/../cacert.pem
exec ./python3 "$@"
10 changes: 10 additions & 0 deletions app/src/main/java/is/xyz/mpv/MPVActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,16 @@ class MPVActivity : AppCompatActivity(), MPVLib.EventObserver, TouchGesturesObse
return
}

// Remind user if they forgot to set up youtube-dl
if (!filepath.startsWith("/") && !filepath.substringAfterLast('/').contains('.')) {
if (!File("${filesDir.path}/youtube-dl").exists()) {
with (Toast.makeText(this, R.string.toast_need_ytdl, Toast.LENGTH_LONG)) {
setGravity(toast.gravity, 0, 0)
show()
}
}
}

player.initialize(applicationContext.filesDir.path)
player.addObserver(this)
player.playFile(filepath)
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/java/is/xyz/mpv/MPVView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,14 @@ internal class MPVView(context: Context, attrs: AttributeSet) : SurfaceView(cont
MPVLib.setOptionString("vd-lavc-skiploopfilter", "nonkey")
}

MPVLib.setOptionString("ytdl", "yes")
sharedPreferences.getString("video_ytdl_format", "")?.also {
if (it.isNotEmpty())
MPVLib.setOptionString("ytdl-format", it)
}

// set basic options

MPVLib.setOptionString("vo", "gpu")
MPVLib.setOptionString("gpu-context", "android")
MPVLib.setOptionString("hwdec", hwdec)
Expand Down
Loading